2017-07-06 229 views
0

我正在使用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

我还可以尝试做什么工作?

+0

那么你可以[尊重类型](https://i.stack.imgur.com/5z9aA.jpg),但它不清楚为什么你这样做。 – user1155120

+0

@ user1155120我真的不明白为什么你不把它放在答案中......而是你只是链接到一个有答案的代码图像!为什么尽管所有这些努力,但仍拒绝发布答案? – JHBonarius

回答

4

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

2

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中的+运算符函数的签名,您将看到没有定义+运算符,它们组合了SIGNEDUNSIGNED类型。因此,在你的情况下,编译器没有函数调用和重载失败。

您需要仔细思考您希望实施的算法,然后将所有内容转换为SIGNEDUNSIGNED,如果您认为合适的话。因为SIGNEDUNSIGNED是密切相关的类型(它们都是由整数索引的std_logic的数组),所以使用类型转换很容易。

相关问题