VHDL の信号と変数の違い
前のチュートリアルでは、プロセスで変数を宣言する方法を学びました。変数は、プロセス内でアルゴリズムを作成するのに適していますが、外部からアクセスすることはできません。変数のスコープが 1 つのプロセス内にのみある場合、他のロジックとどのようにやり取りできるでしょうか?これに対する解決策は シグナル です .
シグナルは architecture <architecture_name> of <entity_name> is
の間で宣言されます 行と begin
VHDL ファイルのステートメント。これは、アーキテクチャの宣言部分と呼ばれます。
このブログ投稿は、基本的な VHDL チュートリアル シリーズの一部です。
シグナルを宣言するための構文は次のとおりです。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 を持つ信号と変数を作成しました。このプロセスでは、それらをまったく同じ方法で処理しましたが、出力では動作が異なることがわかります。最初に、VHDL では変数と信号への代入の表記が異なることがわかりました。変数の割り当ては :=
を使用します 演算子 while シグナル割り当ては <=
を使用します
MyVariable
変数の振る舞いを期待するように振る舞います。ループの最初の繰り返しで、1 にインクリメントされ、次に 2 にインクリメントされます。最初の繰り返しからの最後の出力は、予想どおり、その値がまだ 2 であることを示しています。
MySignal
挙動が若干異なります。最初の +1 の増分は効果がないようです。プリントアウトは、その値がまだ初期値である 0 であることを示しています。 2 回目の +1 インクリメントの後も同様です。 MyVariable
の値 は 2 ですが、値は MySignal
です wait for 10 ns;
の後 3 番目の出力は、MySignal
の値を示しています。 は現在 1 です。その後の出力もこのパターンに従います。
この魔法は何ですか? wait for 10 ns;
という手がかりを教えます それと何か関係があります。シグナルは、プロセスが一時停止されたときにのみ更新されます。私たちのプロセスは、wait for 10 ns;
の 1 か所だけを一時停止します。 .したがって、信号値は、この行がヒットするたびにのみ変化します。 10 ナノ秒は任意の値であり、0 ナノ秒であってもかまいません。試してみてください!
もう 1 つの重要な観測結果は、シグナルが wait
の前に 2 回インクリメントされたものの、そのイベントです。 、その値は一度だけ増加します。これは、プロセス内のシグナルに割り当てるときに、最後の割り当てが「勝つ」ためです。 <=
オペレーターは新しい値をシグナルにスケジュールするだけで、wait
まで変更されません。 .したがって、MySignal
の 2 回目のインクリメントで 、old に 1 が追加されます 価値。再びインクリメントすると、最初のインクリメントは完全に失われます。
テイクアウト
- 変数は 1 つのプロセス内で使用できますが、シグナルはより広いスコープを持ちます
- 変数の割り当てはすぐに有効になりますが、信号はプロセスが一時停止したときにのみ更新されます
- シグナルが
wait
なしで複数回割り当てられた場合 、最後の割り当てが「勝つ」
次のチュートリアルに進む »
VHDL