VHDLにおける信号と変数の違いを理解する
前回のチュートリアルでは、プロセス内で変数を宣言する方法を学びました。変数はローカルなアルゴリズム処理に適していますが、そのプロセスの外からは見えません。設計の他の部分と値を共有する必要があるときは 信号(signal) を使います。
信号はアーキテクチャの宣言領域、すなわち architecture <architecture_name> of <entity_name> is と begin キーワードの間で宣言します。
本記事は「Basic VHDL Tutorials」シリーズの一部です。
信号宣言の構文:signal <name> : <type>;
初期値を与える場合:signal <name> : <type> := <initial_value>;
演習:信号の宣言と変数との違い
ビデオチュートリアルでは、信号の宣言方法と、変数との本質的な違いを学びます。
本チュートリアルで作成した最終コード:
entity T06_SignalTb is end entity;
architecture sim of T06_SignalTb is
signal MySignal : integer := 0;
begin
process is
variable MyVariable : integer := 0;
begin
report "*** Process begin ***";
MyVariable := MyVariable + 1;
MySignal <= MySignal + 1;
report "MyVariable=" & integer'image(MyVariable) & ", MySignal=" & integer'image(MySignal);
MyVariable := MyVariable + 1;
MySignal <= MySignal + 1;
report "MyVariable=" & integer'image(MyVariable) & ", MySignal=" & integer'image(MySignal);
wait for 10 ns;
report "MyVariable=" & integer'image(MyVariable) & ", MySignal=" & integer'image(MySignal);
end process;
end architecture;
シミュレータコンソール出力(ModelSim)
VSIM 2> run # ** Note: *** Process begin *** # Time: 0 ns Iteration: 0 Instance: /t06_signaltb # ** Note: MyVariable=1, MySignal=0 # Time: 0 ns Iteration: 0 Instance: /t06_signaltb # ** Note: MyVariable=2, MySignal=0 # Time: 0 ns Iteration: 0 Instance: /t06_signaltb # ** Note: MyVariable=2, MySignal=1 # Time: 10 ns Iteration: 0 Instance: /t06_signaltb # ** Note: *** Process begin *** # Time: 10 ns Iteration: 0 Instance: /t06_signaltb # ** Note: MyVariable=3, MySignal=1 # Time: 10 ns Iteration: 0 Instance: /t06_signaltb # ** Note: MyVariable=4, MySignal=1 # Time: 10 ns Iteration: 0 Instance: /t06_signaltb # ** Note: MyVariable=4, MySignal=2 # Time: 20 ns Iteration: 0 Instance: /t06_signaltb ...
解説
同じ初期値0で信号と変数を作り、プロセス内で同じように扱いましたが、コンソール出力は明確に異なる振る舞いを示しています。主な違いは以下の通りです。
- 変数は
:=演算子で即座に更新されます。 - 信号は
<=演算子を使い、新しい値がスケジュールされ、プロセスが休止(例:wait文)した時点で反映されます。 - プロセスが休止する前に同じ信号へ複数回代入すると、最後の代入だけが有効になります(先のスケジュール値は上書きされます)。
この例では、最初の2回の MySignal インクリメントは、wait for 10 ns; でプロセスが休止する前に上書きされたため失われました。休止後のインクリメントだけが正しく反映されています。
まとめ
- 即座のローカル更新が必要な一時値には変数を使用。
- 他のプロセスやコンポーネントに変更を通知する必要がある場合は信号を使用。
- 信号代入はスケジュールされ、プロセスが休止するときにのみコミットされる。休止なしで複数回代入すると最後の値だけが生き残る。
次のチュートリアルへ »
VHDL
- 北斗衛星ナビゲーションシステム解説:GPSとの違いと独自の強み
- クラウドコンピューティング vs 従来型コンピューティング:実践的比較
- VHDLにおけるSignedとUnsigned型の使い分け:実践的洞察
- VHDL変数の解説:実践例と信頼性設計のためのルール
- VHDLで文字列リストを作成する: ベスト・プラクティスと実装例
- VHDLテストベンチ・シミュレーションを優雅に終了させる方法
- VHDLでPWMコントローラを実装: 設計、シミュレーション、FPGAデモ
- VHDLで乱数生成: 一様分布からOSVVMまで
- プロセス内プロシージャでVHDLステートマシンをクリーンに設計
- VHDLにおける不純関数の活用:FSMの可読性と保守性向上
- VHDL関数マスター:効率的な設計のための実践ガイド