VHDL で Case-When ステートメントを使用する方法
Case-When ステートメントにより、プログラムはシグナル、変数、または式の値に応じて、複数の異なるパスから 1 つを選択します。これは、複数の Elsif を持つ If-Then-Elsif-Else ステートメントのよりエレガントな代替手段です。
他のプログラミング言語にも同様の構造があり、switch などのキーワードを使用します。 、ケース 、または選択 .特に、Case-When ステートメントは、VHDL でマルチプレクサを実装するためによく使用されます。続きを読むか、ビデオを見て方法を確認してください!
このブログ投稿は、基本的な VHDL チュートリアル シリーズの一部です。
Case-When ステートメントの基本的な構文は次のとおりです。case <expression> is
when <choice> =>
code for this branch
when <choice> =>
code for this branch
...
end case;
<expression>
通常、変数または信号です。 Case ステートメントには、複数の when
を含めることができます ただし、1 つの選択肢のみが選択されます。
<choice>
"11"
のような一意の値の場合があります :when "11" =>
または、5 to 10
のような範囲にすることもできます :when 5 to 10 =>
1|3|5
のような複数の値を含めることができます :when 1|3|5 =>
そして最も重要なのは、others
選択。他の選択肢が一致しなかった場合は常に選択されます:when others =>
others
選択は Else
と同等です If-Then-Elsif-Else ステートメントの分岐。
エクササイズ
このビデオ チュートリアルでは、VHDL で Case-When ステートメントを使用してマルチプレクサを作成する方法を学習します。
このチュートリアルで作成した最終的なコード:
library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity T14_CaseWhenTb is end entity; architecture sim of T14_CaseWhenTb is signal Sig1 : unsigned(7 downto 0) := x"AA"; signal Sig2 : unsigned(7 downto 0) := x"BB"; signal Sig3 : unsigned(7 downto 0) := x"CC"; signal Sig4 : unsigned(7 downto 0) := x"DD"; signal Sel : unsigned(1 downto 0) := (others => '0'); signal Output1 : unsigned(7 downto 0); signal Output2 : unsigned(7 downto 0); begin -- Stimuli for the selector signal process is begin wait for 10 ns; Sel <= Sel + 1; wait for 10 ns; Sel <= Sel + 1; wait for 10 ns; Sel <= Sel + 1; wait for 10 ns; Sel <= Sel + 1; wait for 10 ns; Sel <= "UU"; wait; end process; -- MUX using if-then-else process(Sel, Sig1, Sig2, Sig3, Sig4) is begin if Sel = "00" then Output1 <= Sig1; elsif Sel = "01" then Output1 <= Sig2; elsif Sel = "10" then Output1 <= Sig3; elsif Sel = "11" then Output1 <= Sig4; else -- 'U', 'X', '-' etc. Output1 <= (others => 'X'); end if; end process; -- Equivalent MUX using a case statement process(Sel, Sig1, Sig2, Sig3, Sig4) is begin case Sel is when "00" => Output2 <= Sig1; when "01" => Output2 <= Sig2; when "10" => Output2 <= Sig3; when "11" => Output2 <= Sig4; when others => -- 'U', 'X', '-', etc. Output2 <= (others => 'X'); end case; end process; end architecture;
[実行] を押してタイムラインを拡大した後の ModelSim の波形ウィンドウ:
ModelSim で実行ボタンを押したときのシミュレータ コンソールへの出力:
VSIM 2> run # ** Warning: NUMERIC_STD."=": metavalue detected, returning FALSE # Time: 50 ns Iteration: 1 Instance: /t14_casewhentb # ** Warning: NUMERIC_STD."=": metavalue detected, returning FALSE # Time: 50 ns Iteration: 1 Instance: /t14_casewhentb # ** Warning: NUMERIC_STD."=": metavalue detected, returning FALSE # Time: 50 ns Iteration: 1 Instance: /t14_casewhentb # ** Warning: NUMERIC_STD."=": metavalue detected, returning FALSE # Time: 50 ns Iteration: 1 Instance: /t14_casewhentb
分析
まず、シグナル Sig1
の 1 つを転送する If-Then-Elsif-Else を使用するプロセスを作成しました。 、 Sig2
、 Sig3
、または Sig4
、セレクター信号 Sel
の値に基づく .
次に、Case-When ステートメントを使用して、まったく同じことを行うプロセスを作成しました。波形から、2 つのプロセス Output1
からの出力信号であることがわかります。 と Output2
、まったく同じように動作します。
この例では、Sel
signal には 4 つの有効な値しかありません。しかし、より多くの可能性があった場合、Case-When ステートメントがコードをより読みやすくするのに役立つことが容易にわかります。これは、ほとんどの VHDL 設計者がこのようなコンポーネントを作成する際に推奨する方法です。
マルチプレクサの理解 がこの演習のボーナス ポイントでした。マルチプレクサ、または略して MUX は、デジタル設計の中心的なコンポーネントです。複数の入力から 1 つを選択し、それを出力に転送する単純なスイッチです。
これは、MUX が選択された入力信号を転送する方法を示しています。
others
を使用しました Sel
のすべての値をキャッチする句 1でも0でもありませんでした。 std_logic チュートリアルで学んだように、これらの信号は '0'
以外の多くの値を持つことができます または '1'
. 'X'
を出力してこれらの値を処理することは、良い設計方法です。 .これは、この信号の値が不明であることを示しており、下流のロジックでも表示されます。
Sel
信号が赤くなりました、Output1
と Output2
"XX"
にも変更 . when others =>
です
さらに、ModelSim のコンソール出力には、Sel
が原因で警告が表示されます。 "UU"
に設定されている信号 . 「** 警告:NUMERIC_STD.」=「:メタ値が検出され、FALSE を返す」というメッセージが 50 ns のシミュレーション時間に表示されます。これは信号が赤に変わる正確な時間です。
テイクアウト
- 複数の If-Then-Elsif ステートメントの代わりに Case-When を使用できます
when others =>
デフォルトの選択を実装するために使用できます- マルチプレクサは Case-When ステートメントを使用して作成することをお勧めします
次のチュートリアルに進む »
VHDL