VHDL无法在用户定义的函数中匹配to_unsigned的调用上下文
我正在使用Quartus Prime Pro。
我负责的一个功能,例如:VHDL无法在用户定义的函数中匹配to_unsigned的调用上下文
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;
但我得到的错误:
Error(13643): VHDL error at file.vhd(109): can't determine definition of operator ""+"" -- found 0 possible definitions
所以我改变了问题的孩子这样的:
c := to_unsigned(a + to_signed(2**(b-2), a'length), a'length);
但我得到以下错误:
Error(13815): VHDL Qualified Expression error at cpmmod.vhd(110): to_unsigned type specified in Qualified Expression must match signed type that is implied for expression by context
我还可以尝试做什么工作?
您正试图添加一个带符号值的无符号数。在添加变量之前,可以将其中的一个转换为变量中的相同类型。
Nathanael是正确的。
要明白发生了什么,你需要了解两个概念:
I)运营商在VHDL是功能
当您使用操作员,你真的调用一个函数。在numeric_std
包中,各种运营商有很多定义。例如,+
运营商的一个定义是
function "+" (L, R: UNSIGNED) return UNSIGNED;
II)VHDL使用超载
如果在numeric_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
类型。因此,在你的情况下,编译器没有函数调用和重载失败。
您需要仔细思考您希望实施的算法,然后将所有内容转换为SIGNED
或UNSIGNED
,如果您认为合适的话。因为SIGNED
和UNSIGNED
是是密切相关的类型(它们都是由整数索引的std_logic
的数组),所以使用类型转换很容易。
那么你可以[尊重类型](https://i.stack.imgur.com/5z9aA.jpg),但它不清楚为什么你这样做。 – user1155120
@ user1155120我真的不明白为什么你不把它放在答案中......而是你只是链接到一个有答案的代码图像!为什么尽管所有这些努力,但仍拒绝发布答案? – JHBonarius