Modelsim没有编译VHDL代码

时间:2016-08-02 23:57:51

标签: vhdl

写了我的第一个VHDL代码,编译时Modelsim生成了这些错误

  

错误:E:\ Digital Logic \ ModelSim \ myxor.vhd(10):前缀运算符" xor"没有可行的条目。

  **错误:E:\ Digital Logic \ ModelSim \ myxor.vhd(10):输入错误解析前缀表达式" xor"类型ieee.std_logic_1164.STD_LOGIC。
  **错误:E:\ Digital Logic \ ModelSim \ myxor.vhd(11):VHDL编译器退出

我不明白为什么它无法解决xor问题。 xor在ieee库中定义。不知道我做错了什么。

library ieee; use ieee.std_logic_1164.all;

entity xorgate is
    port (a : in std_logic_vector (3 downto 0);
          y : out std_logic);
end;

architecture synth of xorgate is
begin
    y <= xor a;
end;

2 个答案:

答案 0 :(得分:4)

根据user1155120的建议,您必须使用VHDL 2008才能使用一元xor。 Modelsim的-2008编译器的vcom选项使您处于2008模式。有关综合,请查看工具的文档,但要注意其中很多尚未完全支持2008。

如果你需要这个一元xor但无法在2008模式下工作,你可以自己定义一个xor_reduce函数:

function xor_reduce(v: std_logic_vector) return std_logic is
    constant n: natural := v'length;
    constant t: std_logic_vector(n - 1 downto 0) := v;
begin
    if n = 0 then
        return '0';
    elsif n = 1 then
        return t(0);
    else
        return xor_reduce(t(n - 1 downto n / 2)) xor xor_reduce(t(n / 2 - 1 downto 0));
    end if;
end function xor_reduce;

并使用函数调用的语法而不是运算符的语法:

y <= xor_reduce(a);

注意:例如,使用for循环有更简单,更自然的方式来描述它。上面显示的递归样式有两个有趣的属性:

  • 它说明了递归,它有时是描述操作的最优雅的方式,并且可以通过合适的近期合成器完美地合成。
  • 它描述的二叉树结构比线性结构更有效,因为它导致log(n)而不是n的最差情况传播延迟,其中n是输入值长度。如果您的合成器不够智能,无法从线性描述推断树结构,这将有所帮助。

答案 1 :(得分:0)

你应该使用a1,a2,a3,a4然后你应该使用,.. y = a1 xor a2 xor a3 xor a4。 你不能使用... y&lt; = xor a ....这是错误的声明。