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>は以下の形式を取れます:
- 単一値、例:
when "11" => - 範囲、例:
when 5 to 10 => - 値リスト、例:
when 1|3|5 => othersキーワード、明示的にリストされていないすべての値にマッチ。
実践演習: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
重要なポイント
- 長い
if-then-elsifチェーンをcase文で置き換え、可読性向上。 when others =>でデフォルトパスを実装し、予期せぬ値を処理。- マルチプレクサはVHDLで
case構文で最もクリーンに表現可能。
次のチュートリアルでより高度なVHDL概念を学習します。
VHDL
- カッターグラインダー技術の習得:実践ガイド
- モリブデンが現代産業を形作る仕組み:用途、利点、需給動向
- VHDLプロシージャ例:std_logic_vectorのインクリメント
- VHDLで文字列リストを作成する: ベスト・プラクティスと実装例
- VHDLテストベンチ・シミュレーションを優雅に終了させる方法
- VHDLでPWMコントローラを実装: 設計、シミュレーション、FPGAデモ
- VHDLで乱数生成: 一様分布からOSVVMまで
- プロセス内プロシージャでVHDLステートマシンをクリーンに設計
- VHDLにおける不純関数の活用:FSMの可読性と保守性向上
- VHDL関数マスター:効率的な設計のための実践ガイド
- VHDLで有限ステートマシンを設計:信号機の実践例