VHDL で Wait On と Wait until を使用する方法
前のチュートリアルでは、シグナルと変数の主な違いを学びました。シグナルは、1 つのプロセス内でしかアクセスできない変数よりも広い範囲を持っていることがわかりました。では、複数のプロセス間の通信にシグナルを使用するにはどうすればよいでしょうか?
wait;
の使い方はすでに学習済みです。 無限に待ち、wait for
特定の時間待機すること。 VHDL にはさらに 2 種類の待機ステートメントが存在します。
このブログ投稿は、基本的な VHDL チュートリアル シリーズの一部です。
Wait On ステートメントは、指定されたシグナルのいずれかが変化するまでプロセスを一時停止します:wait on <signal_name1>, <signal_name2> ...;
Wait Until ステートメントは、イベントによって条件が真になるまで一時停止します:wait until <condition>;
実際、Wait On、Wait until、Wait For を組み合わせることができます。wait on <signal_name1> until <condition> for <time_value>;
この例では、10 ナノ秒、または signal1
まで一時停止します。 変更と signal2
signal3
に等しい :wait on signal1 until signal2 = signal3 for 10 ns;
エクササイズ
このビデオ チュートリアルでは、VHDL でのプロセス間通信に Wait On および Wait until ステートメントを使用する方法を学習します。
このチュートリアルで作成した最終的なコード:
entity T07_WaitOnUntilTb is end entity; architecture sim of T07_WaitOnUntilTb is signal CountUp : integer := 0; signal CountDown : integer := 10; begin process is begin CountUp <= CountUp + 1; CountDown <= CountDown - 1; wait for 10 ns; end process; process is begin wait on CountUp, CountDown; report "CountUp=" & integer'image(CountUp) & " CountDown=" & integer'image(CountDown); end process; process is begin wait until CountUp = CountDown; report "Jackpot!"; end process; end architecture;
ModelSim で実行ボタンを押したときのシミュレータ コンソールへの出力:
VSIM 2> run # ** Note: CountUp=1 CountDown=9 # Time: 0 ns Iteration: 1 Instance: /t07_waitonuntiltb # ** Note: CountUp=2 CountDown=8 # Time: 10 ns Iteration: 1 Instance: /t07_waitonuntiltb # ** Note: CountUp=3 CountDown=7 # Time: 20 ns Iteration: 1 Instance: /t07_waitonuntiltb # ** Note: CountUp=4 CountDown=6 # Time: 30 ns Iteration: 1 Instance: /t07_waitonuntiltb # ** Note: CountUp=5 CountDown=5 # Time: 40 ns Iteration: 1 Instance: /t07_waitonuntiltb # ** Note: Jackpot! # Time: 40 ns Iteration: 1 Instance: /t07_waitonuntiltb # ** Note: CountUp=6 CountDown=4 # Time: 50 ns Iteration: 1 Instance: /t07_waitonuntiltb # ** Note: CountUp=7 CountDown=3 # Time: 60 ns Iteration: 1 Instance: /t07_waitonuntiltb # ** Note: CountUp=8 CountDown=2 # Time: 70 ns Iteration: 1 Instance: /t07_waitonuntiltb # ** Note: CountUp=9 CountDown=1 # Time: 80 ns Iteration: 1 Instance: /t07_waitonuntiltb # ** Note: CountUp=10 CountDown=0 # Time: 90 ns Iteration: 1 Instance: /t07_waitonuntiltb # ** Note: CountUp=11 CountDown=-1 # Time: 100 ns Iteration: 1 Instance: /t07_waitonuntiltb
分析
最初のプロセスは CountUp
をインクリメントします カウンターし、CountDown
を減らします カウンター。それらは同時に更新されます。 2 つのシグナルのシグナル割り当てはプロセス内の別の行にありますが、割り当てられたシグナル値は、プログラムが Wait ステートメントにヒットしたときにのみ有効になります。プロセスは、シミュレーションの開始時にこの操作を実行し、その後は 10 ナノ秒ごとに実行します。
2 番目のプロセスの最初の行は wait on CountUp, CountDown;
です .プログラムは、シグナルの一方または両方が変化するまで、この行で待機します。プリントアウトからわかるように、これはカウンタが最初に変更された 0 ns のシミュレーション時間で発生し、その後変更されるたびに発生します。
3 番目のプロセスの最初の行は wait until CountUp = CountDown;
です .プログラムは、最初のプロセスと同様に、2 つのシグナルのいずれかが変化するたびに起動します。ただし、式が true
と評価された場合にのみ続行されます 、それ以外の場合はスリープ状態に戻ります。印刷物からわかるように、「ジャックポット!」両方のカウンターが同じ値を持つ場合、40 ns で 1 回だけ出力されます。
テイクアウト
- Wait On は信号の 1 つが変化するまで待機します
- Wait Until は、信号の 1 つが変化すると起動しますが、式が
true
の場合にのみ続行します - Wait On、Wait until、Wait For は組み合わせることができます
次のチュートリアルに進む »
VHDL