VHDL中没有运算符+错误的函数声明

时间:2013-12-29 16:11:09

标签: vhdl

在这段代码中,我得到了带<+ 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 +

的函数声明

我该如何解决这个问题?我也为“=”得到类似的错误。

3 个答案:

答案 0 :(得分:1)

这是因为您尝试将natural添加到bit_vector,但由于它们属于不同类型,因此无效。所以你必须使用转换器,例如如图所示here在其中一个函数中。另一种方法是坚持所有相同的类型,但这并不总是可行。

答案 1 :(得分:1)

代码的一些初始问题是VHDL注释标记是--,而不是 //,并指定result变量必须使用:=,因为<=用于分配 发信号。

然后,出错的原因是:

  

没有关于operator +

的函数声明

是VHDL是一种强类型语言,所以不可能只添加一个 在natural中尝试的bit_vector类型和result <= bv1 + temp类型。 相反,您需要使用包numeric_bit_unsigned,例如 在添加之前使用函数tempbit_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及其子类型