2015-11-23 29 views
0

我有下一個ROM內存的結構VHDL定義。當我嘗試編譯它時,我得到了「rom_4x4_structural.vhd(13)上的VHDL錯誤:標識符」q「的類型與它的用法不符合」std_logic「類型」錯誤。任何人都可以向我解釋這個問題背後的原因嗎?標識符的類型與其用法不一致

LIBRARY ieee; USE ieee.std_logic_1164.all; 
LIBRARY lpm; USE lpm.lpm_components.all; 

ENTITY rom_4x4_structural IS 
    PORT(address : IN STD_LOGIC_VECTOR(3 DOWNTO 0); 
     q  : OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); 
END rom_4x4_structural; 

ARCHITECTURE rom_4x4_structural_arch OF rom_4x4_structural IS 
BEGIN 
    inst_1: LPM_ROM 
    GENERIC MAP (LPM_WIDTH=>4, LPM_WIDTHAD=>4, LPM_FILE=>"rom_4x4_structural.mif") 
    PORT MAP (address, q); 
END rom_4x4_structural_arch; 
+0

LPM_ROM的實體或組件聲明會回答該問題。命名關聯可能會使錯誤更容易被發現。事實上,我認爲即使編譯不是直接實例化,也沒有組件聲明,我甚至不相信這一點。 –

+0

@BrianDrummond所以我需要聲明組件或什麼?它實際上編譯的那麼遠。 –

+0

您不必聲明組件。請參閱「直接實體實例化」的語法。 –

回答

1

包lpm_components提供LPM_ROM一個組件聲明與q如在口岸報關的最後一個接口對象:

port (address : in STD_LOGIC_VECTOR(lpm_widthad-1 downto 0); 
       inclock : in STD_LOGIC := '0'; 
       outclock : in STD_LOGIC := '0'; 
       memenab : in STD_LOGIC := '1'; 
       q : out STD_LOGIC_VECTOR(lpm_width-1 downto 0)); 

您所遇到的問題來自於這是爲了完成位置的關聯,以及q與第二個接口對象聲明的類型不匹配。

與位置關聯q1 would be associated with inclock` 它有一個類型std_logic,因此在錯誤消息中的引用。

相反命名關聯位置的關聯使用:

PORT MAP (address => address, q => q); 

的模式其餘的端口都提供的默認值(和你顯然不會使用計時ROM,不需要啓用) 。

你可以同時使用位置和命名的關聯,因爲address是第一個端口:

PORT MAP (address, q => q); 

見IEEE標準1076至2008年,6.5.7協會名單,6.5.7.1一般。

還有保留字開放其作爲實際中的關聯元素中使用,可以保留位置時:

PORT MAP (address, open, open, open, q); -- inclock, outclock, memenab unconnected 

按照您的評論:

我見下段: 當連接inclock和outclock時都會發生完全異步存儲器操作。輸出q []是異步的,並反映內存中地址[]指向的數據。那麼我怎麼能聲明它沒有連接?

見6.5.6.3端口條款,第8段:

如果形端口與實際端口,信號,或表達相關聯,則正規端口被說成是連接。如果正式端口與保留字開放相關聯,則正式端口被認爲是未連接。除非其聲明包含缺省表達式(見6.5.2),否則中模式的端口未連接(見6.5.6.3)或未關聯(見6.5.7.3)是錯誤的。如果中的以外的任何其他模式的端口未連接或未關聯,並且其類型爲無約束或部分約束的複合類型,則是錯誤的。如果複合正式端口的某些子元素已連接,而其他子元素未連接或未關聯,則是錯誤的。

在這種情況下是不相關聯或不連接的影響是相同的,存在用於inclock, outclock and memenab`提供默認值默認表達式。

相關問題