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

VHDLの条件分岐をマスター:If-Then-Elsif-Else の完全解説

前回のチュートリアルでは、wait until 文と条件式を組み合わせて、2つのカウンタ信号が一致したときだけプロセスを起動する方法を学びました。では、入力値に応じて異なるアクションを取らせたい場合はどうすればよいでしょうか?

If-Then-Elsif-Else 構文を使えば、ロジックを分岐させられます。変数の値や式の評価結果に応じて、プログラムは異なるパスをたどります。

本記事は「Basic VHDL Tutorials」シリーズの一部です。

基本構文

if <condition> then
elsif <condition> then
else
end if;

elsif と else は省略可能で、elsif は複数記述できます。<condition> にはブールリテラルや、true / false に評価される式を指定します。

例: MyCounter < 10 は MyCounter が10未満のときに真になります。

関係演算子

=等しい
/=等しくない
<より小さい
<=以下
>より大きい
>=以上

論理演算子

not aa が偽なら真
a and ba と b がともに真なら真
a or ba または b が真なら真
a nand ba または b が偽なら真
a nor ba と b がともに偽なら真
a xor ba と b のどちらか一方だけ真なら真
a xnor ba と b が等しければ真

演習:If-Then-Elsif-Else の動作例

以下は、If-Then-Elsif-Else 構文の動作を示す完全なVHDL例です。

最終コード:

entity T08_IfTb is end entity;
architecture sim of T08_IfTb 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
    if CountUp > CountDown then
      report "CountUp is larger";
    elsif CountUp < CountDown then
      report "CountDown is larger";
    else
      report "They are equal";
    end if;
    wait on CountUp, CountDown;
  end process;
end architecture;

シミュレータコンソール出力(ModelSim)

VSIM 2> run
# ** Note: CountDown is larger
# Time: 0 ns Iteration: 0 Instance: /t08_iftb
# ** Note: CountDown is larger
# Time: 0 ns Iteration: 1 Instance: /t08_iftb
# ** Note: CountDown is larger
# Time: 10 ns Iteration: 1 Instance: /t08_iftb
# ** Note: CountDown is larger
# Time: 20 ns Iteration: 1 Instance: /t08_iftb
# ** Note: CountDown is larger
# Time: 30 ns Iteration: 1 Instance: /t08_iftb
# ** Note: They are equal
# Time: 40 ns Iteration: 1 Instance: /t08_iftb
# ** Note: CountUp is larger
# Time: 50 ns Iteration: 1 Instance: /t08_iftb
# ** Note: CountUp is larger
# Time: 60 ns Iteration: 1 Instance: /t08_iftb
...

解説

CountDown を10、CountUp を0で初期化し、最初のプロセスで両カウンタを毎10 ns同時に更新します。2番目のプロセスはこれらの信号を wait on で待機しているため、信号が変化するたびに起動します。If-Then-Elsif-Else ブロックは、CountUp > CountDown、CountUp < CountDown、CountUp = CountDown の3分岐から適切なメッセージを選択します。明示的な else は必須ではありませんが、すべてのケースを網羅するために記述するのがベストプラクティスです。

コンソールのトレースから、2番目のプロセスが各更新後に条件を評価し、適切なメッセージを出力していることが確認できます。

まとめ

次のチュートリアルへ »

VHDL

  1. カッターグラインダー技術の習得:実践ガイド
  2. モリブデンが現代産業を形作る仕組み:用途、利点、需給動向
  3. VHDLで文字列リストを作成する: ベスト・プラクティスと実装例
  4. VHDLテストベンチ・シミュレーションを優雅に終了させる方法
  5. VHDLでPWMコントローラを実装: 設計、シミュレーション、FPGAデモ
  6. VHDLで乱数生成: 一様分布からOSVVMまで
  7. プロセス内プロシージャでVHDLステートマシンをクリーンに設計
  8. VHDLにおける不純関数の活用:FSMの可読性と保守性向上
  9. VHDL関数マスター:効率的な設計のための実践ガイド
  10. VHDLで有限ステートマシンを設計:信号機の実践例
  11. VHDLプロシージャ活用:再利用可能なコードで設計をシンプルに