VHDLのWait文を極める:Wait On、Wait Until、およびそれらの組み合わせ
前回のチュートリアルでは、VHDLにおける信号と変数の違いを学び、信号はプロセスを超えてスコープを持つのに対し、変数は単一プロセス内に限定されることを確認しました。次の疑問は、複数のプロセスを信号でどう連携させるかです。
おなじみの wait;(無限待機)と wait for(時間指定待機)に加え、VHDLにはイベント駆動の同期に使える2つの強力な文があります:Wait On と Wait Until。これらは wait for と組み合わせて、より洗練された制御フローを作れます。
Wait On
wait on 文は、リストアップされた信号のいずれかが値を変えるまでプロセスを休止させます。
wait on <signal_name1>, <signal_name2>, ...;
Wait Until
wait until 文は、指定したブール条件が真になるまで実行を一時停止します。
wait until <condition>;
Wait文の組み合わせ
これら3つの構造を組み合わせると、細かなタイミング制御が可能です:
wait on <signal_name1> until <condition> for <time_value>;
例:次の行は、10 ns経過するか、signal1 が変化して signal2 = signal3 が真になるまで待機します。
wait on signal1 until signal2 = signal3 for 10 ns;
実践例:プロセス間通信
以下は、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 ...
解説
最初のプロセスは CountUp と CountDown を毎10 ns同時に更新します。信号代入は wait 文に達した時点でしか反映されないため、両カウンタは各シミュレーションステップで一緒に更新されます。
2番目のプロセスは wait on CountUp, CountDown; で、いずれかのカウンタが変化するまで休止します。出力の通り、初期更新の0 nsと、以降の信号変化のたびにトリガーされます。
3番目のプロセスは wait until CountUp = CountDown; を使用します。信号変化のたびにウェイクアップしますが、等式が真のときだけ先に進みます。したがって、「Jackpot!」メッセージは両カウンタが5になる40 nsの瞬間に一度だけ表示されます。
まとめ
- Wait On:指定した信号のいずれかが変化するまで待機。
- Wait Until:信号変化でウェイクアップするが、条件が真のときのみ継続。
wait on、wait until、wait forの3つを組み合わせて粒度の細かい制御が可能。
より深いVHDL同期の知見を得るには、次のチュートリアルへ進んでください。
VHDL
- PIC18マイクロコントローラ:特徴、性能、使い方
- リファレンスデシグネータの理解:PCBアセンブリ接続をラベル付けする方法
- プロセス内プロシージャでVHDLステートマシンをクリーンに設計
- VHDLにおける不純関数の活用:FSMの可読性と保守性向上
- VHDL関数マスター:効率的な設計のための実践ガイド
- VHDLプロシージャ活用:再利用可能なコードで設計をシンプルに
- VHDLで定数とジェネリックマップを活用し柔軟なモジュール設計を実現
- VHDLポートマップインスタンス化マスター:実践ガイド
- VHDLのCase-When文マスター:効率的なマルチプレクサ設計
- VHDLのsigned/unsigned型マスター:実践ガイド
- 無料VHDLシミュレータ&エディタ導入ガイド:学生向けステップバイステップ