工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Industrial programming >> VHDL

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の瞬間に一度だけ表示されます。

まとめ

より深いVHDL同期の知見を得るには、次のチュートリアルへ進んでください。

VHDL

  1. PIC18マイクロコントローラ:特徴、性能、使い方
  2. リファレンスデシグネータの理解:PCBアセンブリ接続をラベル付けする方法
  3. プロセス内プロシージャでVHDLステートマシンをクリーンに設計
  4. VHDLにおける不純関数の活用:FSMの可読性と保守性向上
  5. VHDL関数マスター:効率的な設計のための実践ガイド
  6. VHDLプロシージャ活用:再利用可能なコードで設計をシンプルに
  7. VHDLで定数とジェネリックマップを活用し柔軟なモジュール設計を実現
  8. VHDLポートマップインスタンス化マスター:実践ガイド
  9. VHDLのCase-When文マスター:効率的なマルチプレクサ設計
  10. VHDLのsigned/unsigned型マスター:実践ガイド
  11. 無料VHDLシミュレータ&エディタ導入ガイド:学生向けステップバイステップ