VHDL中CASE语句中的多个赋值

Plu*_*ler 1 case vhdl assign

我还是VHDL的新手.我需要在CASE语句中为多个信号赋值,如下所示:

CASE input24 IS
WHEN "00" THEN 
                    output0 <= '1' ;
                    output1 <= '0' ;
                    output2 <= '0' ;
                    output3 <= '0' ;

WHEN "01" THEN 
                    output0 <= '0' ;
                    output1 <= '1' ;
                    output2 <= '0' ;
                    output3 <= '0' ;

WHEN "10" THEN 
                    output0 <= '0' ;
                    output1 <= '0' ;
                    output2 <= '1' ;
                    output3 <= '0' ;

WHEN "11" THEN 
                    output0 <= '0' ;
                    output1 <= '0' ;
                    output2 <= '0' ;
                    output3 <= '1' ;
Run Code Online (Sandbox Code Playgroud)

在尝试这个之前,我尝试在这样的单行中分配值

WHEN "00" => output0 <= '1', output1 <= '0', output2 <= '0', output3 <= '0' ;
Run Code Online (Sandbox Code Playgroud)

第二个出错了

found '0' definitions of operator "<=", cannot determine exact 
overloaded matching definition for "<="
Run Code Online (Sandbox Code Playgroud)

而第一个语法错误.

我哪里错了?

有没有办法为单个案例为多个信号分配值?

谢谢

Mor*_*mer 5

当使用CASE语法时WHEN "00" =>,因此没有使用THEN.因此代码是:

CASE input24 IS
  WHEN "00" =>
    output0 <= '1' ;
    output1 <= '0' ;
    output2 <= '0' ;
    output3 <= '0' ;
...
Run Code Online (Sandbox Code Playgroud)

如果input24std_logic_vector你必须在一个WHEN OTHERS =>处理剩余编码的情况下input24.代码是:

WHEN OTHERS =>
  output0 <= 'X' ;
  output1 <= 'X' ;
  output2 <= 'X' ;
  output3 <= 'X' ;
Run Code Online (Sandbox Code Playgroud)

对于在单个类似中编写赋值,仍然使用;as语句分隔符,因此不在,问题代码中显示,然后只删除空格.代码是:

WHEN "01" => output0 <= '0'; output1 <= '1'; ...
Run Code Online (Sandbox Code Playgroud)

为了在一个语句中分配多个信号,VHDL-2008支持聚合分配,因此如果您使用的是VHDL-2008,则可以编写:

WHEN "10" =>
  (output3, output2, output1, output0) <= std_logic_vector'("0100");
Run Code Online (Sandbox Code Playgroud)

对于VHDL-2003,解决方案可能是创建一个中间output信号 std_logic_vector,然后分配给它.代码可以是:

  ...
  signal output : std_logic_vector(3 downto 0);
begin
  ...
      WHEN "11" =>
        output <= "1000";
  ...
  output0 <= output(0);
  output1 <= output(1);
  output2 <= output(2);
  output3 <= output(3);
Run Code Online (Sandbox Code Playgroud)

如果output使用了,那么case用于设置具有给定数字的位的确切实现input24可以使用:

LIBRARY IEEE;
USE IEEE.NUMERIC_STD.ALL;

ARCHITECTURE syn OF mdl IS

  SIGNAL output : STD_LOGIC_VECTOR(3 DOWNTO 0);

BEGIN

  PROCESS (input24) IS
  BEGIN
    output <= (OTHERS => '0');
    output(TO_INTEGER(UNSIGNED(input24))) <= '1';
  END PROCESS;

  output0 <= output(0);
  output1 <= output(1);
  output2 <= output(2);
  output3 <= output(3);

END ARCHITECTURE;
Run Code Online (Sandbox Code Playgroud)

否则,如果output没有使用该信号,那么case仍然可以通过默认赋值将其简化为输出的'0',因此代码如下:

ARCHITECTURE syn OF mdl IS
BEGIN

  PROCESS (input24) IS
  BEGIN
    output0 <= '1' ;
    output1 <= '0' ;
    output2 <= '0' ;
    output3 <= '0' ;
    CASE input24 IS
      WHEN "00" => output0 <= '1' ;
      WHEN "01" => output1 <= '1';
      WHEN "10" => output2 <= '1' ;
      WHEN "11" => output3 <= '1' ;
      WHEN OTHERS => output0 <= 'X'; output1 <= 'X'; output2 <= 'X'; output3 <= 'X';
    END CASE;
  END PROCESS;

END ARCHITECTURE;
Run Code Online (Sandbox Code Playgroud)