Modelsim未编译VHDL代码

Modelsim未编译VHDL代码,vhdl,Vhdl,编写了我的第一个VHDL代码,编译Modelsim时产生了这些错误 错误:E:\Digital Logic\ModelSim\myxor.vhd(10):前缀运算符“xor”没有可行的条目。 **错误:E:\Digital Logic\ModelSim\myxor.vhd(10):将前缀表达式“xor”解析为ieee.std\u Logic\u 1164.std\u Logic类型时出错。 **错误:E:\Digital Logic\ModelSim\myxor.vhd(11):VHDL编译器正

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

错误:E:\Digital Logic\ModelSim\myxor.vhd(10):前缀运算符“xor”没有可行的条目。
**错误:E:\Digital Logic\ModelSim\myxor.vhd(10):将前缀表达式“xor”解析为ieee.std\u Logic\u 1164.std\u 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;
ieee库;使用ieee.std_logic_1164.all;
实体xorgate是
端口(a:标准逻辑向量(3到0);
y:输出标准(U逻辑);
终止
xorgate的架构合成是
开始

你应该用a1,a2,a3,a4,然后你应该用,。。y=a1或a2或a3或a4。 你不能用。。。y正如所建议的,您必须在VHDL 2008中使用一元异或。Modelsim的
vcom
编译器的
-2008
选项将您置于2008模式。对于合成,请查看您的工具的文档,但要注意,它们中的许多还没有完全支持2008

如果您需要此一元
xor
但无法在2008模式下工作,您可以自己定义
xor\u 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);

y库IEEE,std_logic_1164包包含std_logic_矢量的运算符重载函数。在IEEE Std 1076-2008std_逻辑中,扩展了Std_1164,以包括一元异或运算符,其签名为[Std_ulogic_向量返回Std_ulogic]。该过载操作员在之前不可用。这告诉我们您缺少一个调用2008 VHDL的选项。您还可以确定您的合成工具是否支持一元异或。谢谢。编译器设置为2002年。问题已解决。我通常相信您的“最新的合成器”能够将循环语句中的XOR平坦化(并行化),以匹配任何其他表示。还有
使用ieee.numeric\u std.all;。。。谢谢大家的反馈。Modelsim编译器设置为2002。将其更改为2008年并进行了编译。谢谢@user1155120:a
的异或归约告诉您它的二进制表示是由奇数还是偶数组成,即奇偶校验<代码>“mod”(无符号(a),2)(0)
告诉您被视为无符号整数的
a是奇数还是偶数。完全不同。顺便说一句,
a(a'right)
也是这样。现在我到底为什么要把mod和hamming weight混淆呢?