1

我是 VHDL 语言的新手,所以也许这是个愚蠢的问题,但我没有找到任何关于这个问题的参考资料。因此,我正在研究将 5 位的特定组合转换为其他组合的位转换器。问题在于 case 语句,我不知道如何将五个位放入一个条件中。

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;
  begin
  case 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;
t => oa & ob & oc & od & oe;
  end beh;
4

3 回答 3

1

试试这个:

architecture BEH of CONV is
signal vector_in  : bit_vector(4 downto 0);
signal vector_out : bit_vector(4 downto 0);
begin
case vector_in is
  when  "00010"  =>  vector_out <= "00011";
  when  "00101"  =>  vector_out <= "00101";
  when  "01000"  =>  vector_out <= "00110";
  when  "01011"  =>  vector_out <= "01001";
  when  "01110"  =>  vector_out <= "01010";     
  when  "10001"  =>  vector_out <= "01100";
  when  "10100"  =>  vector_out <= "10001";
  when  "10111"  =>  vector_out <= "10010";
  when  "11010"  =>  vector_out <= "10100";
  when  "11101"  =>  vector_out <= "11000";
  when  others   =>  vector_out <= "00000";
end case;

vector_in <= (ia & ib & ic & id & ie);

oa <= vector_out(4);
ob <= vector_out(3);
oc <= vector_out(2); 
od <= vector_out(1); 
oe <= vector_out(0);

有道理?

于 2013-10-04T17:36:45.500 回答
1
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

并得到相同的波形显示

于 2013-10-04T23:33:38.753 回答
1

您可以像@Russell 所说的那样将所有输入放入一个位向量中。然后位向量中的每个位代表一个输入。这使事情变得容易得多。

case语句是顺序语句(即它们必须放入一个进程过程函数中)。

entity CONV is
  port (inp : in  Bit_Vector(4 downto 0);    -- [ai, bi, ci, di, ei]
        outp: out Bit_Vector(4 downto 0));   -- [ao, bo, co, do, eo]
end CONV;

architecture BEH of CONV is
begin
  process (inp)
  begin           
    case inp is 
      when  "00010"  =>  outp <= "00011";
      when  "00101"  =>  outp <= "00101";
      when  "01000"  =>  outp <= "00110";
      when  "01011"  =>  outp <= "01001";
      when  "01110"  =>  outp <= "01010";     
      when  "10001"  =>  outp <= "01100";
      when  "10100"  =>  outp <= "10001";
      when  "10111"  =>  outp <= "10010";
      when  "11010"  =>  outp <= "10100";
      when  "11101"  =>  outp <= "11000";
      when  others   =>  outp <= "00000";
    end case;
  end process;
end beh;

如果您真的想出于可读性或其他原因使用单个位,只需在进程之外连接并中断它们。
对于引脚规划,您只需要连接aiinp[4]biinp[3]等。

于 2013-10-05T02:53:13.353 回答