在这段代码中,我得到了带<+ p>的行的错误
function func (bv1 : in bit_vector; bv2 : in integer) return bit_vector is
variable temp : natural := 2**bv2;
variable result : bit_vector(1 to 32);
begin
report "asd" & natural'image(temp);
result <= bv1 + temp; // this line causes the error
return result;
end func;
错误是:
没有关于operator +
的函数声明
我该如何解决这个问题?我也为“=”得到类似的错误。
答案 0 :(得分:1)
这是因为您尝试将natural
添加到bit_vector
,但由于它们属于不同类型,因此无效。所以你必须使用转换器,例如如图所示here在其中一个函数中。另一种方法是坚持所有相同的类型,但这并不总是可行。
答案 1 :(得分:1)
代码的一些初始问题是VHDL注释标记是--
,而不是
//
,并指定result
变量必须使用:=
,因为<=
用于分配
发信号。
然后,出错的原因是:
没有关于operator +
的函数声明
是VHDL是一种强类型语言,所以不可能只添加一个
在natural
中尝试的bit_vector
类型和result <= bv1 + temp
类型。
相反,您需要使用包numeric_bit_unsigned
,例如
在添加之前使用函数temp
将bit_vector
转换为to_bitvector
。
结果代码可以是:
library ieee;
use ieee.numeric_bit_unsigned.all;
...
function func (bv1 : in bit_vector; bv2 : in integer) return bit_vector is
variable temp : natural := 2**bv2;
variable result : bit_vector(1 to 32);
begin
report "asd" & natural'image(temp);
result := bv1 + to_bitvector(temp, result'length); -- this line causes the error
return result;
end func;
您应该检查长度是否足以处理所需的值。
但是,您可以考虑使用bit_vector
类型,而不是std_logic_vector
类型
std_logic_vector
(因设计而定),因为{{1}}有
附加值可能揭示模拟中的设计问题。
答案 2 :(得分:1)
不要将bit_vectors
(或std_logic_vector
s)用于任何你想要算术运算的东西。
使用ieee.numeric_std库,然后将您的信号(或其他)转换为类型signed
ot unsigned
,具体取决于您想要的矢量类型。 (当然,您可以使用integer
及其子类型