VHDLで条件文を使用する方法:If-Then-Elsif-Else

前のチュートリアルでは、Wait Untilステートメントで条件式を使用しました。 この式は、2つのカウンタ信号が等しい場合にのみプロセスがトリガされることを保証しました。 しかし、プロセス内のプログラムが異なる入力に基づいて異なるアクションを実行したい場合はどうなりますか?

If-Then-Elsif-Elseステートメントを使用して、プログラム内にブランチを作成できます。 変数の値、または式の結果に応じて、プログラムは異なるパスを取ることができます。

このブログ記事は、基本的なVHDLチュートリアルシリーズの一部です。

基本的な構文は次のとおりです:

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

elsifelseは任意であり、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と組み合わせて使用できます。
  • 式には、関係比較と論理比較と数学的計算が含まれている可能性があります

次のチュートリアル”