为什么我不能在类型“std_logic_vector”上使用XNOR?

时间:2013-12-04 10:35:54

标签: vhdl

它似乎很简单,但我无法超越它

            din : in std_logic_vector(13 downto 0);
            sin : in std_logic_vector(3 downto 0);
            .
            .
            .

            if ( din(idx downto idx-3) XNOR sin(3 downto 0) ) then

我得到了

  

**错误:Z:/lab_dig_2/1/prep/additionalQ/additionalQ.vhd(30):键入错误,将中缀表达式“xnor”解析为类型std.STANDARD.BOOLEAN。

错误

是否有一个特殊的向量运算符?我记得std_logic_vector对于这类运算符来说是完美的类型吗?

1 个答案:

答案 0 :(得分:3)

表达式中的xnor以两个std_logic_vector类型运行,因此返回另一个std_logic_vector类型,但if表达式需要boolean类型。< / p>

如果您希望在xnor结果不是全零的条件时为true,则可能需要将表达式更改为以下内容:

if (din(idx downto idx-3) XNOR sin(3 downto 0)) /= "0000" then

编辑:有关VHDL-2008中隐式类型转换的更多信息

VHDL是一种强类型语言,设计人员通常必须明确表达 类型转换,以便结果匹配所需的类型,否则出现错误 生成。

但是,VHDL-2008添加了一些隐式类型转换,特别是 条件运算符??,可以转换为boolean类型。运营商是 在std_logic_1164系统包中声明为:

function "??" (l : std_ulogic) return boolean;

条件操作会自动应用于ifelsifuntilassert,以及类似的地方,如果表达式未评估为boolean 类型。因此,如果您使用的是VHDL-2008,则可以编写:

signal test_sl : std_logic;
...
if test_sl then
  ...

由此隐式应用条件运算符??,如下所示:

if ?? test_sl then

等同于以下,在VHDL-2002中也有效:

if (test_sl = '1') or (test_sl = 'H') then

??运算符仅在std_ulogic类型的标准VHDL-2008中声明, 因此也适用于std_logic类型。但是,操作员可以 在用户声明的函数中重载以申请std_logic_vector,其中包含:

-- Or operation of ?? for all elements in arg
function "??" (arg : std_ulogic_vector) return boolean is
  variable res_v : boolean;
begin
  res_v := FALSE;
  for idx in arg'range loop
    res_v := res_v or (?? arg(idx));
  end loop;
  return res_v;
end function;

如果声明了上述内容,则可以使用隐式转换 std_logic_vector语句中的if布尔值,如:

signal test_slv : std_logic_vector(3 downto 0);
...
if test_slv then
  ....

甚至:

if din(idx downto idx-3) XNOR sin(3 downto 0) then

但请注意,因为代码可能对其他人的可读性降低 如果使用这样的技巧,则更容易出错;但这是可能的。