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 .
true である式の例 MyCounter の場合 は 10 未満です:
MyCounter < 10 関係演算子:
| = | 等しい |
| /= | 等しくない |
| < | 未満 |
| <= | 以下 |
| > | より大きい |
| >= | 以上 |
論理演算子:
| しない a | a の場合は true は偽です |
| a そして b | a の場合は true そしてb 本当です |
| a または b | a の場合は true または b 本当です |
| a ナンド b | a の場合は true または b 偽です |
| a も b | a の場合は true そしてb 偽です |
| a xor b | a のうちの 1 つである場合は true または b 本当です |
| a xnor b | a の場合は true そしてb 等しい |
エクササイズ
このビデオ チュートリアルでは、VHDL で If-Then-Elsif-Else ステートメントを使用する方法を学習します。
このチュートリアルで作成した最終的なコード:
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 ごとにまったく同時に変更します。これが発生すると、プログラムは常に wait on CountUp, CountDown; で待機するため、2 番目のプロセスがトリガーされます。 ライン。 If-Then-Elsif-Else およびレポート ステートメントはシミュレーション時間を消費しないため、プログラムは常にそこで待機します。
If-Then-Elsif-Else ステートメントにより、プログラムは作成した 3 つの分岐のいずれかを取ります。最初の 2 つの分岐は、2 つのカウンターの値が異なる場合をカバーします。単一の else を削除できた可能性があります 、および使用された elsif CountUp = CountDown then 同じ結果が得られたでしょう。しかし、すべてのブランチと else をカバーすることは良い設計方法です。 この条項は、意図的および予期しないすべてのケースをカバーしています。
プリントアウトからわかるように、2 番目のプロセスは、カウンターが変化するたびに 3 つの分岐のいずれかを取ります。
テイクアウト
- If-Then は、単独で使用することも、Elsif や Else と組み合わせて使用することもできます。
- 式には、リレーショナルおよび論理比較と数学的計算が含まれる場合があります
次のチュートリアルに進む »
VHDL