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 的元素(位)单独关联。每个元素关联只能出现一次。
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;
您可以测试转换:

请注意,可以通过使用更简单地分配给输入而不是聚合(ia,ib,ic,id,ie)来重写 TEST 过程
(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
并得到相同的波形显示