VHDL何时出错

VHDL何时出错,vhdl,Vhdl,我是新来的VHDL,有一些简单的错误。我正在尝试使用whenelse构造创建MUX。错误有两种类型: Error(10500):lab13.vhd(21)文本“when”附近的VHDL语法错误;应为“;” Error(10500):lab13.vhd(21)文本“else”附近的VHDL语法错误;VHDL-2008中引入了条件变量或信号分配的顺序语句中的时,应为“:”,或“,这在Altera Quartus中不完全支持 相反,可以通过信号来实现,而无需过程,如: architecture log

我是新来的
VHDL
,有一些简单的错误。我正在尝试使用
when
else
构造创建MUX。错误有两种类型:

Error(10500):lab13.vhd(21)文本“when”附近的VHDL语法错误;应为“;”


Error(10500):lab13.vhd(21)文本“else”附近的VHDL语法错误;VHDL-2008中引入了条件变量或信号分配的顺序语句中的
时,应为“:”,或“,这在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;
如果类似于VHDL-2008之前方便使用的
when
,则
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));

“WHEN”关键字在VHDL中有2个上下文,从VHDL 1993起都适用: 1.它用作流程/程序中“案例”陈述的一部分:

CASE xyz IS
  WHEN val1 =>  some sequential statements;
  WHEN val2 =>  some sequential statements;
  WHEN OTHERS => NULL;
END CASE;
通过替换进程开始/结束之间的代码,无论您使用的是变量还是信号,都将得到正确的结果

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

    结果“0”)


  • 这也将返回所需的结果,但不在流程/过程中,这将要求“结果”为信号或共享变量。

    您使用的是什么工具链?@BRANY_jeff Quartus II 13.0Hm,我对此不太熟悉,但我认为问题是您需要查看合成或项目选项并设置VHD将VHDL模式转换为VHDL-2008或VHDL-200x。查看是否可以找到类似的内容。您正在尝试使用顺序条件赋值语句(在进程中)在Quartus II的特定版本中似乎不支持。或者,您可以使用一个进程并切换到if语句,而不是条件赋值语句。将进程数从赋值数减少到一个的想法将更快地模拟。并发赋值意味着单独的进程。
    a(0) := tern(SW(15) = '0', SW(0), SW(3));
    
    CASE xyz IS
      WHEN val1 =>  some sequential statements;
      WHEN val2 =>  some sequential statements;
      WHEN OTHERS => NULL;
    END CASE;