它似乎很简单,但我无法超越它
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对于这类运算符来说是完美的类型吗?
答案 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;
条件操作会自动应用于if
,elsif
,until
,
assert
,以及类似的地方,如果表达式未评估为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
但请注意,因为代码可能对其他人的可读性降低 如果使用这样的技巧,则更容易出错;但这是可能的。