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

VHDLのCase-When文マスター:効率的なマルチプレクサ設計

Case-When文は、信号、変数、式に基づいてVHDLプログラムを複数のパスのいずれかに誘導します。特に複数の離散値を扱う場合、長いif-then-elsif-elseチェーンよりもクリーンで読みやすい代替手段を提供します。

多くのプログラミング言語がswitchやcase構造を使用しますが、VHDLではcase構文がマルチプレクサや他の選択ロジック構築の定番です。

この記事はBasic VHDL Tutorialsシリーズの一部です。

基本構文

case文の標準構造:

case <expression> is
  when <choice> => -- この分岐のコード
  when <choice> => -- この分岐のコード
  ...
end case;

<expression>は通常シグナルまたは変数。caseには多くのwhen分岐を含められますが、シミュレーション中に実行されるのは1つだけです。

各<choice>は以下の形式を取れます:

実践演習:4対1マルチプレクサの構築

以下は、if-then-elsifとcaseの両アプローチで実装した4対1マルチプレクサを示す完全なVHDLコードです。

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
  -- セレクタ信号の刺激
  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;
  -- if-then-elseによるMUX
  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 Output1 <= (others => 'X');
    end if;
  end process;
  -- case文による同等MUX
  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 => Output2 <= (others => 'X');
    end case;
  end process;
end architecture;

ModelSimでシミュレーション実行後、波形はOutput1とOutput2が同一振る舞いを示します。セレクタSelが未定義値(例:"UU")を取ると、when others =>節が'X'を出力し、未知状態を通知します。

コンソール出力には50nsでのメタ値比較警告が含まれます:

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

重要なポイント

次のチュートリアルでより高度なVHDL概念を学習します。

VHDL

  1. カッターグラインダー技術の習得:実践ガイド
  2. モリブデンが現代産業を形作る仕組み:用途、利点、需給動向
  3. VHDLプロシージャ例:std_logic_vectorのインクリメント
  4. VHDLで文字列リストを作成する: ベスト・プラクティスと実装例
  5. VHDLテストベンチ・シミュレーションを優雅に終了させる方法
  6. VHDLでPWMコントローラを実装: 設計、シミュレーション、FPGAデモ
  7. VHDLで乱数生成: 一様分布からOSVVMまで
  8. プロセス内プロシージャでVHDLステートマシンをクリーンに設計
  9. VHDLにおける不純関数の活用:FSMの可読性と保守性向上
  10. VHDL関数マスター:効率的な設計のための実践ガイド
  11. VHDLで有限ステートマシンを設計:信号機の実践例