2017-07-06 233 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的數組),所以使用類型轉換很容易。

相關問題