工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Industrial programming >> VHDL

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 を使用するプロセスを作成しました。 、 Sig2Sig3 、または 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 信号が赤くなりました、Output1Output2 "XX" にも変更 . when others => です

さらに、ModelSim のコンソール出力には、Sel が原因で警告が表示されます。 "UU" に設定されている信号 . 「** 警告:NUMERIC_STD.」=「:メタ値が検出され、FALSE を返す」というメッセージが 50 ns のシミュレーション時間に表示されます。これは信号が赤に変わる正確な時間です。

テイクアウト

次のチュートリアルに進む »


VHDL

  1. プロシージャ ステートメント - VHDL の例
  2. モリブデンはどのように使用しますか?
  3. VHDL で文字列のリストを作成する方法
  4. VHDL テストベンチでシミュレーションを停止する方法
  5. VHDL で PWM コントローラーを作成する方法
  6. VHDL で乱数を生成する方法
  7. VHDL のプロセスでプロシージャを使用する方法
  8. VHDL で不純な関数を使用する方法
  9. VHDL で関数を使用する方法
  10. VHDL で有限ステート マシンを作成する方法
  11. カッターグラインダーの使い方