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 a | a が偽なら真 |
| a and b | a と b がともに真なら真 |
| a or b | a または b が真なら真 |
| a nand b | a または b が偽なら真 |
| a nor b | a と b がともに偽なら真 |
| a xor b | a と b のどちらか一方だけ真なら真 |
| a xnor b | a と 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番目のプロセスが各更新後に条件を評価し、適切なメッセージを出力していることが確認できます。
まとめ
- If-Then 単独で使うか、Elsif / Else と組み合わせてすべてのシナリオをカバーします。
- 条件には関係演算子、論理演算子、算術式を含められます。
次のチュートリアルへ »
VHDL
- カッターグラインダー技術の習得:実践ガイド
- モリブデンが現代産業を形作る仕組み:用途、利点、需給動向
- VHDLで文字列リストを作成する: ベスト・プラクティスと実装例
- VHDLテストベンチ・シミュレーションを優雅に終了させる方法
- VHDLでPWMコントローラを実装: 設計、シミュレーション、FPGAデモ
- VHDLで乱数生成: 一様分布からOSVVMまで
- プロセス内プロシージャでVHDLステートマシンをクリーンに設計
- VHDLにおける不純関数の活用:FSMの可読性と保守性向上
- VHDL関数マスター:効率的な設計のための実践ガイド
- VHDLで有限ステートマシンを設計:信号機の実践例
- VHDLプロシージャ活用:再利用可能なコードで設計をシンプルに