entity CONV is
port (
ia, ib, ic, id, ie: in Bit;
oa, ob, oc, od, oe: out Bit
);
end CONV;
architecture BEH of CONV is
signal t: bit_vector(0 to 4);
subtype fivebit is bit_vector(0 to 4);
begin
EVALUATE:
process (ia, ib, ic, id, ie)
begin
case fivebit(ia & ib & ic & id & ie) is
when "00010" => t <= "00011";
when "00101" => t <= "00101";
when "01000" => t <= "00110";
when "01011" => t <= "01001";
when "01110" => t <= "01010";
when "10001" => t <= "01100";
when "10100" => t <= "10001";
when "10111" => t <= "10010";
when "11010" => t <= "10100";
when "11101" => t <= "11000";
when others => t <= "00000";
end case;
end process;
OUTPUT:
(oa , ob , oc , od , oe) <= t;
end architecture BEH;
case ステートメントで評価される式は、ローカルに静的なサブタイプを持つオブジェクトの名前 (Russell の vector_in)、ローカルに静的なインデックスを持つインデックス名、ローカルに静的な範囲を持つスライス名、返す関数呼び出しのいずれかでなければなりません。ローカルに静的なサブタイプ、またはローカルに静的な型マークを使用した修飾式または型変換 (表示)。
その考えは、アナライザー (局所的に静的は分析時間を意味する) が、式内の要素の数とその型を決定して、ケース カバレッジを決定できるということです。
同時シグナル割り当ての集約ターゲットは、集約の要素 (oa 、 ob 、 oc 、 od 、 oe) を右辺の t の要素 (ビット) に個別に関連付けます。各要素の関連付けは 1 回だけ行うことができます。
case ステートメントは、順次ステートメントであるため、処理 (並行ステートメント) に含まれます。また、混乱を避けるために、順次および同時の両方の信号割り当てステートメントがあります。VHDL は並行ステートメントを使用して並列処理を提供します。
テストベンチの場合:
entity conv_test is
end entity;
architecture test of conv_test is
signal ia, ib, ic, id, ie: bit;
signal oa, ob, oc, od, oe: bit;
signal t: bit_vector (0 to 4);
signal input: bit_vector (0 to 4);
begin
DUT:
entity work.CONV
port map (
ia => ia, ib => ib, ic => ic, id => id, ie => ie,
oa => oa, ob => ob, oc => oc, od => od, oe => oe
)
;
TEST:
process
begin
wait for 10 ns; -- bit defaults to '0', others case
(ia, ib, ic, id, ie) <= bit_vector'("00010"); -- first case
wait for 10 ns;
(ia, ib, ic, id, ie) <= bit_vector'("00101");
wait for 10 ns;
(ia, ib, ic, id, ie) <= bit_vector'("01000");
wait for 10 ns;
(ia, ib, ic, id, ie) <= bit_vector'("01011");
wait for 10 ns;
(ia, ib, ic, id, ie) <= bit_vector'("01110");
wait for 10 ns;
(ia, ib, ic, id, ie) <= bit_vector'("10001");
wait for 10 ns;
(ia, ib, ic, id, ie) <= bit_vector'("10100");
wait for 10 ns;
(ia, ib, ic, id, ie) <= bit_vector'("10111");
wait for 10 ns;
(ia, ib, ic, id, ie) <= bit_vector'("11010");
wait for 10 ns;
(ia, ib, ic, id, ie) <= bit_vector'("11101");
wait for 10 ns;
(ia, ib, ic, id, ie) <= bit_vector'("11111"); -- others case
wait for 10 ns;
wait; -- one time only
end process;
SIM_INPUT:
input <= (ia & ib & ic & id & ie); -- for ease of viewing in waveform display
RESULT:
t <= (oa & ob & oc & od & oe);
end architecture;
コンバージョンをテストできます:
TEST プロセスは、以下を使用して、集約 (ia、ib、ic、id、ie) の代わりに入力に割り当てて、はるかに簡単に書き直すことができることに注意してください。
(ia , ib , ic , id , ie) <= input;
SIM_INPUT ステートメントで:
TEST:
process
begin
wait for 10 ns; -- bit defaults to '0', others case
input <= "00010"; -- first case
wait for 10 ns;
input <= "00101";
wait for 10 ns;
input <= "01000";
wait for 10 ns;
input <= "01011";
wait for 10 ns;
input <= "01110";
wait for 10 ns;
input <= "10001";
wait for 10 ns;
input <= "10100";
wait for 10 ns;
input <= "10111";
wait for 10 ns;
input <= "11010";
wait for 10 ns;
input <= "11101";
wait for 10 ns;
input <= "11111"; -- others case
wait for 10 ns;
wait; -- one time only
end process;
SIM_INPUT:
(ia, ib, ic, id, ie) <= input; -- for ease of viewing in waveform display
そして同じ波形表示を得る