2011-02-08 64 views
0

我有這樣的VHDL代碼哪些錯誤與此VHDL代碼

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 
use IEEE.STD_LOGIC_ARITH.ALL; 
use IEEE.STD_LOGIC_UNSIGNED.ALL; 


entity addDecoder is 
port(addrInput : in real; 
    ROM_sel_n, RAM_sel_n, PIO_sel_n, SIO_sel_n, INT_sel_n : out bit); 
end addDecoder; 

architecture Behavioral of addDecoder is 

begin 
AddSelect : process(addrInput) is 
begin 
    if(addrInput <= X'3FFF') then 
     ROM_sel_n <= '1'; 
    elsif(addrInput > X'3FFF' and addrInput <= X'5FFF') then 
     RAM_sel_n <= '1'; 
    elsif(addrInput > X'5FFF' and addrInput <= X'8FFF') then 
     PIO_sel_n <= '1'; 
    elsif(addrInput > X'8FFF' and addrInput <= X'9FFF') then 
     SIO_sel_n <= '1'; 
    elsif(addrInput > X'9FFF' and addrInput <= X'FFFF') then 
     INT_sel_n <= '1'; 
end process AddSelect; 
end Behavioral; 

有什麼不妥的地方。我在比較十六進制值時遇到錯誤。我沒有正確地做這件事嗎?錯誤是:解析錯誤,意外的INTEGER_LITERAL,期望OPENPAR或IDENTIFIER

+1

檢查addrInput的數據類型;我懷疑你打算使用std_logic_vector,而不是真實的。而且,地址解碼通過屏蔽比特來實現,而不是整數比較。 – 2011-02-08 03:07:14

+0

謝謝我會研究掩蔽位。 – JC2 2011-02-08 03:38:37

回答

4

正如Philippe所說,不要使用std_logic_arith/unsigned。使用numeric_stdI've written about why...

如果你想繼續與向量比較(以及使用"而不是'周圍的值),你應該讓你的addrInputunsigned載體。

if addrInput < X"1FFF" then 

或者使它成爲一個natural和比較反對整數值:

if addrInput < 8191 then 

此外,由於使用的是elsif,你可以這樣簡化您的語句:

if addrInput <= X"3FFF" then 
    ROM_sel_n <= '1'; 
elsif addrInput <= X"5FFF" then 
    RAM_sel_n <= '1'; 
-- etc 

最後,降() s在你的if條件下,它使你看起來像一個C程序員:)

4

幾個語法錯誤。

位字符串文字應該用雙引號寫成:X"0000",而不是單引號X'0000'

你忘了關if語句:end if;

另外,我建議你最好use ieee.numeric_std.all;而不是非標準庫STD_LOGIC_ARITH和STD_LOGIC_UNSIGNED。