2017-07-17 66 views
-1

我需要幫助,我想剪輯我的值在+2048和-2048之間,但這是在std_logic_vector ie(「111111111111100000000000000000000000」和「000000000000100000000000000000000000」),我來自軟件背景,我認爲就是爲什麼我有這個問題,我重視我的代碼片段vhdl關係操作

--Saturate the output to -2048 to +2048 

saturate1:process (x1,x2) 
--variable sum, tmp :std_logic_vector(WWidth downto 0); 
begin 
    y11 <= x1+x2; 

if y11 >= "000000000000100000000000000000000000" then 
    y <= "000000000000100000000000000000000000"; 
elsif y11 >= "111111111111100000000000000000000000" then 
    y <= "111111111111100000000000000000000000"; 
else 
    y <= y2fullwidth; 
end if; 
end process saturate1; 

Y11,X1,X2和y都是類型std_logic_vector。 謝謝。

回答

1

i)"000000000000100000000000000000000000"不是二進制的2048。這是16,772,216。二)你似乎在做數學。因此,我會建議使用numeric_std包和使用類型signed

iii)您還需要將您的過程分成兩部分。您不能驅動信號y11,然後在同一過程中對其進行採樣。 (在進程暫停之前它不會被更新)。如果你對此感到驚訝(而不是僅僅是一個錯字),你需要了解更多關於VHDL的工作原理。

如果使用類型signed則比較運營商(<=>=等)的重載與類型signedinteger工作:

y11 <= x1+x2; 

saturate1:process (y11) 
--variable sum, tmp :signed(WWidth downto 0); 
begin  
    if y11 >= 2048 then 
    y <= 2048; 
    elsif y11 <= -2048 then 
    y <= -2048; 
    else 
    y <= y2fullwidth; 
    end if; 
end process saturate1; 
+0

你沒看錯... –

+0

謝謝@Matthew泰勒,我能夠使用變量來解決它,你的方法不會像前面那樣給出同樣的錯誤,但我很欣賞這種努力。 – Dammy