VHDLで条件文を使用する方法:If-Then-Elsif-Else
前のチュートリアルでは、Wait Untilステートメントで条件式を使用しました。 この式は、2つのカウンタ信号が等しい場合にのみプロセスがトリガされることを保証しました。 しかし、プロセス内のプログラムが異なる入力に基づいて異なるアクションを実行したい場合はどうなりますか?
If-Then-Elsif-Elseステートメントを使用して、プログラム内にブランチを作成できます。 変数の値、または式の結果に応じて、プログラムは異なるパスを取ることができます。
このブログ記事は、基本的なVHDLチュートリアルシリーズの一部です。
基本的な構文は次のとおりです:
if <condition> then
elsif <condition> then
else
end if;
elsif
とelse
は任意であり、elsif
は複数回使用することができます。 <condition>
は、ブール値true
またはfalse
、またはtrue
またはfalse
と評価される式にすることができます。
MyCounter
がより小さい場合、true
である式の例10:
MyCounter < 10
関係演算子:
= | イコール |
/= | 等しくない |
< | より少し |
<= | 以下以下 |
> | より大きい |
>= | より大きいか等しいか |
論理演算子:
ではないaがfalseの場合はtrue | |
aとbが真であれば真 | |
aまたはb | aまたはbがtrueの場合はtrue |
a nand b | aまたはbがfalseの場合はtrue |
aとbが偽の場合、aまたはb | 真 |
a xor b | aまたはbのいずれかが真であれば真 |
a xnor b | aとbが等しい場合はtrue |
VhdlでIf-Then-Elsif-Elseステートメントを使用する方法を学びます。
このチュートリアルで作成した最後のコード:
entity T08_IfTb isend 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でrunボタンを押したときのsimulatorコンソールへの出力:
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を与えました。 最初のプロセスは、10nsごとにまったく同じ時間に両方のカウンタ値を変更します。 これが発生すると、プログラムは常にwait on CountUp, CountDown;
行で待機しているため、2番目のプロセスがトリガーされます。 If-Then-Elsif-Elseステートメントとreportステートメントはシミュレーション時間がゼロになるため、プログラムは常にそこで待機します。
If-Then-Elsif-Elseステートメントは、プログラムが作成した三つのブランチのいずれかを取るようになります。 最初の2つの分岐は、2つのカウンタが異なる値を持つ場合をカバーします。 単一のelse
を落として、同じ結果を持つelsif CountUp = CountDown then
を使用することができました。 しかし、すべてのブランチをカバーすることは良い設計方法であり、else
句は意図的および予期しないすべてのケースをカバーします。
プリントアウトからわかるように、第二のプロセスは、カウンタが変更されるたびに三つの分岐のいずれかを取ります。
持ち帰り
- If-Thenは単独で、またはElsifやElseと組み合わせて使用できます。
- 式には、関係比較と論理比較と数学的計算が含まれている可能性があります
次のチュートリアル”