VHDL时 - 其他错误

时间:2016-06-13 09:41:34

标签: vhdl

我是VHDL中的新人并且有简单的错误。我尝试使用when else构造创建MUX。错误有两种类型:

Error (10500): VHDL syntax error at lab13.vhd(21) near text "when"; expecting ";"

Error (10500): VHDL syntax error at lab13.vhd(21) near text "else"; expecting ":=", or "<="

这些错误适用于when else的每个字符串。

以下是代码:

entity lab13 is
port (SW : in  STD_LOGIC_VECTOR (17 downto 0);
LEDG : out STD_LOGIC_VECTOR (2 downto 0);
LEDR : out STD_LOGIC_VECTOR (17 downto 0));
end lab13;



architecture logicFunc of lab13 is
begin  
    process
variable a, b, c : STD_LOGIC_VECTOR (2 downto 0) :=0;
begin
    a(0) := SW(0) when (SW(15) = '0') else SW(3);
    b(0) := SW(6) when (SW(15) = '0') else SW(9);
    c(0) := a(0) when (SW(16) = '0') else b(0);
    LEDG(0) <= c(0) when (SW(17) = '0') else SW(12);

    a(1) := SW(1) when (SW(15) = '0') else SW(4);
    b(1) := SW(7) when (SW(15) = '0') else SW(10);
    c(1) := a(1) when (SW(16) = '0') else b(1);
    LEDG(1) <= c(1) when (SW(17) = '0') else SW(13);

    a(2) := SW(2) when (SW(15) = '0') else SW(5);
    b(2) := SW(8) when (SW(15) = '0') else SW(11);
    c(2) := a(2) when (SW(16) = '0') else b(2);
    LEDG(2) <= c(2) when (SW(17) = '0') else SW(14);
end process;
   LEDR <= SW;
end logicFunc;

那么,如何解决这些问题?

2 个答案:

答案 0 :(得分:2)

VHDL-2008中引入了条件变量或信号分配的顺序语句中的when,Altera Quartus并不完全支持。

实现可以用信号进行,而不是进程,如:

architecture logicFunc of lab13 is
  signal a, b, c : STD_LOGIC_VECTOR (2 downto 0);
begin

  a(0) <= SW(0) when (SW(15) = '0') else SW(3);
  b(0) <= SW(6) when (SW(15) = '0') else SW(9);
  c(0) <= a(0) when (SW(16) = '0') else b(0);
  LEDG(0) <= c(0) when (SW(17) = '0') else SW(12);

  a(1) <= SW(1) when (SW(15) = '0') else SW(4);
  b(1) <= SW(7) when (SW(15) = '0') else SW(10);
  c(1) <= a(1) when (SW(16) = '0') else b(1);
  LEDG(1) <= c(1) when (SW(17) = '0') else SW(13);

  a(2) <= SW(2) when (SW(15) = '0') else SW(5);
  b(2) <= SW(8) when (SW(15) = '0') else SW(11);
  c(2) <= a(2) when (SW(16) = '0') else b(2);
  LEDG(2) <= c(2) when (SW(17) = '0') else SW(14);

  LEDR <= SW;

end architecture;

abc的初始化值不是必需的,否则必须使用以下内容进行初始化:

variable a, b, c : std_logic_vector (2 downto 0) := (others => '0');

如果when之类的内容在VHDL-2008之前很方便,那么tern函数可以写成:

function tern(cond : boolean; res_true, res_false : std_logic) return std_logic is
begin
  if cond then
    return res_true;
  else
    return res_false;
  end if;
end function;

然后用作:

a(0) := tern(SW(15) = '0', SW(0), SW(3));

答案 1 :(得分:0)

'WHEN'关键字在VHDL中具有2个上下文,并且从VHDL 1993开始都适用: 1.它用作流程/过程中“ CASE”语句的一部分:

CASE xyz IS
  WHEN val1 =>  some sequential statements;
  WHEN val2 =>  some sequential statements;
  WHEN OTHERS => NULL;
END CASE;

通过使用此代码替换过程的BEGIN / END之间的代码,无论使用变量还是信号,都将获得正确的结果。

  1. 它可以用作“ WHEN-ELSE”并发语句(不在流程/过程中):

    结果<= val1当某些条件为真ELSE时           val2其他条件为真ELSE时(OTHERS =>'0');

这还将返回所需的结果,但由于不在过程/过程中,因此要求“结果”为信号或共享变量。