VHDL can';t匹配用户定义函数中未签名的to_调用的上下文

VHDL can';t匹配用户定义函数中未签名的to_调用的上下文,vhdl,unsigned,quartus,Vhdl,Unsigned,Quartus,我正在使用Quartus Prime Pro。 我正在处理这样一个函数: library ieee ; use ieee.std_logic_1164.all; use ieee.numeric_std.all; function round_resize (a : unsigned; b : integer) return unsigned is variable c : signed (a'length - 1 downto 0); --problem child variable

我正在使用Quartus Prime Pro。
我正在处理这样一个函数:

library ieee ;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

function round_resize (a : unsigned; b : integer) return unsigned is
  variable c : signed (a'length - 1 downto 0); --problem child
  variable d : signed (b - 1 downto 0);
begin
  c := a + to_signed(2**(b-2), a'length);
  d := to_unsigned(c(c'length-2 downto (c'length-b-1)));
  return d;
end function;
但我得到了一个错误:

错误(13643):文件中存在VHDL错误。vhd(109):无法确定运算符“+”的定义--找到了0个可能的定义

因此,我将问题儿童改为:

c := to_unsigned( a + to_signed(2**(b-2), a'length), a'length);
但我得到了以下错误:

错误(13815):cpmmod处的VHDL限定表达式错误。vhd(110):限定表达式中指定的to_无符号类型必须与上下文为表达式暗示的有符号类型匹配


我还可以尝试做些什么呢?

您正在尝试添加一个带符号值的无符号值。在添加变量之前,您可以将两个变量中的一个转换为相同的变量类型。

您正在尝试添加带符号值的无符号变量。在添加变量之前,可以将两个变量中的一个转换为相同的类型。

Nathanel是正确的

要了解正在发生的事情,您需要了解两个概念:

i)VHDL中的运算符是函数

使用运算符时,实际上是在调用函数。在
numeric\u std
包中,有许多不同运算符的定义。例如,
+
运算符的一个定义是

  function "+" (L, R: UNSIGNED) return UNSIGNED;
ii)VHDL使用重载

如果查看
numeric\u std
包,您将看到许多
+
运算符的定义:

  function "+" (L, R: UNSIGNED) return UNSIGNED;
  function "+" (L, R: SIGNED) return SIGNED;
  function "+" (L: UNSIGNED; R: NATURAL) return UNSIGNED;
  function "+" (L: NATURAL; R: UNSIGNED) return UNSIGNED;
  function "+" (L: INTEGER; R: SIGNED) return SIGNED;
  function "+" (L: SIGNED; R: INTEGER) return SIGNED;
每种类型都有不同的参数类型和返回类型组合。编译器可以通过这个组合(称为签名)确定调用哪一个。这种想法被称为过载。只有当只有一个可能的函数可调用时,它才起作用。如果有多个,编译器不知道调用哪一个;如果少于一个,则编译器没有要调用的函数

…这就是你的问题。如果查看上面列出的
numeric_std
中的
+
运算符函数的签名,您将看到没有定义组合了
有符号
无符号
类型的
+
运算符。因此,在您的情况下,编译器没有可调用的函数,重载失败

您需要仔细考虑要实现的算法,然后将所有内容转换为您认为合适的
有符号
无符号
。使用类型转换很容易做到这一点,因为
有符号
无符号
是密切相关的类型(它们都是由整数索引的
标准逻辑
数组)。

Nathanel是正确的

要了解正在发生的事情,您需要了解两个概念:

i)VHDL中的运算符是函数

使用运算符时,实际上是在调用函数。在
numeric\u std
包中,有许多不同运算符的定义。例如,
+
运算符的一个定义是

  function "+" (L, R: UNSIGNED) return UNSIGNED;
ii)VHDL使用重载

如果查看
numeric\u std
包,您将看到许多
+
运算符的定义:

  function "+" (L, R: UNSIGNED) return UNSIGNED;
  function "+" (L, R: SIGNED) return SIGNED;
  function "+" (L: UNSIGNED; R: NATURAL) return UNSIGNED;
  function "+" (L: NATURAL; R: UNSIGNED) return UNSIGNED;
  function "+" (L: INTEGER; R: SIGNED) return SIGNED;
  function "+" (L: SIGNED; R: INTEGER) return SIGNED;
每种类型都有不同的参数类型和返回类型组合。编译器可以通过这个组合(称为签名)确定调用哪一个。这种想法被称为过载。只有当只有一个可能的函数可调用时,它才起作用。如果有多个,编译器不知道调用哪一个;如果少于一个,则编译器没有要调用的函数

…这就是你的问题。如果查看上面列出的
numeric_std
中的
+
运算符函数的签名,您将看到没有定义组合了
有符号
无符号
类型的
+
运算符。因此,在您的情况下,编译器没有可调用的函数,重载失败


您需要仔细考虑要实现的算法,然后将所有内容转换为您认为合适的
有符号
无符号
。使用类型转换很容易做到这一点,因为
SIGNED
UNSIGNED
是密切相关的类型(它们都是
std_logic
的数组,由整数索引)。

当然可以,但不清楚为什么要这么做。@user1155120我真的不明白为什么你不把这一点放在答案中。。。相反,您只是链接到一个有答案的代码图像!为什么做了这么多努力,但仍然拒绝发布答案?你可以,但不清楚你为什么要这么做。@user1155120我真的不明白你为什么不在答案中添加这些。。。相反,您只是链接到一个有答案的代码图像!为什么尽管做了这么多努力,但仍然拒绝发布答案?