2013-11-26 72 views
5

這是一個非常簡單的問題,但我還沒有能夠完成這項工作,也沒有任何搜索谷歌或在這裏出現任何真正有用的東西。VHDL - 將兩個8位向量添加到一個9位向量中

我想要做的就是添加兩個8位向量並將結果存儲在9位向量中。

signal operand1, operand2 : STD_LOGIC_VECTOR(7 downto 0); 

signal sum : STD_LOGIC_VECTOR(8 downto 0); 

sum <= operand1 + operand2; 

但是我得到警告:

Width mismatch. <sum> has a width of 9 bits but assigned expression is 8-bit wide. 

不應該VHDL有某種內置的例程來了解一個額外的比特是必要的除了溢出?

我有這些軟件包包括:

use IEEE.STD_LOGIC_1164.ALL; 
use IEEE.STD_LOGIC_UNSIGNED.ALL; 

也許STD_LOGIC_VECTOR總是簽署?如果是這樣,那麼我需要將它們的明確定義爲無符號?

回答

11

如果你的目標是做算術上的信號,進入更好的適合類型的工作,宣佈他們的習慣:unsignedinteger是不錯的選擇你的情況。

注意防止溢出,你必須連接一個領先的「0」到每個操作數,而不是它做的結果是:

sum <= ('0' & operand1) + ('0' & operand2); 
+4

用於通用解決方案也可以使用SIGNED類型,您可以使用numeric_std庫中的RESIZE(例如sum <= RESIZE(operand1,operand1'LENGTH + 1)+ RESIZE(operand2,operand2'LENGTH + 1)) – sbell

+0

@sbell +1解! – rick

-6

試試這個:在將結果寫入更長的向量之前,將結果與邏輯上的'0'向量合併。對我來說,它的工作。

sum <= '0' & (operand1 + operand2); 

希望幫助:)

+0

早些時候,我嘗試了'sum <=「0」&operand1 +「0」&operand2',但是這個技巧!謝謝。儘管如此,如果數值溢出到9位,但至少代碼不抱怨,VHDL會做什麼仍然讓我困惑。 – krb686

+2

該代碼存在問題:只要總和大於255,它就會溢出並給出錯誤的結果。防止溢出,您必須將前導'0'連接到每個操作數,而不是對結果執行:'sum <=('0'&operand1)+('0'&operand2);' – rick

1

上面的建議是正確的:使用簽名簽署當實現算術電路時(請記住在您的代碼中包含numeric_std包)時,請鍵入

因爲你的情況總和有一個額外的位(比最大的操作數),下面可以做:

1)如果系統是無符號:

sum <= ('0' & operand1) + ('0' & operand2); 

2)如果系統簽署(需要符號擴展):

sum <= (operand1(N-1) & operand1) + (operand2(N-1) & operand2); 
+0

你也可以使用整數(你不必使用矢量類型),它們也可以更快地模擬。 –

+0

出於興趣...你是這個佩德羅尼:http://books.google.co.uk/books/about/Circuit_Design_with_VHDL.html?id=b5NEgENaEn4C –

3

Use the standard ieee.numeric_std library.

然後,讓你的號碼要麼unsignedsigned型,並利用方便的調整大小功能:

answer <= resize(operand1, answer'length) + resize(operand2, answer'length); 

而且要記住,很多時候更容易只使用需要,無需轉換整數,算術並不要求你跳過任何調整大小的箍環!