2016-12-04 71 views
0

我在此代碼中得到此錯誤:ter.vhd(31):無法解析索引名稱(類型ieee.std_logic_1164.STD_ULOGIC)作爲類型std.STANDARD.BOOLEAN。 任何想法如何解決它? 我真誠地沒有得到什麼錯誤,嘗試用網絡搜索,但沒有。 在此先感謝!VHDL索引名稱問題

LIBRARY ieee; 
USE ieee.std_logic_1164.ALL; 

ENTITY inverter IS 
GENERIC(size: integer); 
PORT ( 
    a : IN std_ulogic_vector(size-1 DOWNTO 0); 
    b : OUT std_ulogic_vector(size-1 DOWNTO 0); 
    carry : OUT std_ulogic; 
    mode : IN std_ulogic 
    ); 
END ENTITY inverter; 


ARCHITECTURE behavioral OF inverter IS 
COMPONENT alu IS 
GENERIC(size: integer); 
Port (X : in std_ulogic_VECTOR (size-1 downto 0); 
     Y : in std_ulogic_VECTOR (size-1 downto 0); 
     SUM : out std_ulogic_VECTOR (size-1 downto 0); 
     CARRY : out std_ulogic); 
end COMPONENT; 

SIGNAL z, c : std_ulogic_VECTOR(size-1 downto 0); 

BEGIN 
start: process(a,mode) 
begin 
z <= (others => '0'); 

IF a(size-1) THEN 
c <= not a; 
z(0) <= '1'; 
ELSIF (mode = '1') THEN 
c <= not a; 
z(0) <= '1'; 
ELSE 
c <= a; 
END IF; 
end process; 
alu1: alu 
generic map(size) 
PORT MAP(x => c, y => z, sum => b, carry => carry); 


END ARCHITECTURE behavioral; 
+0

將'a'聲明爲一組布爾值將是使其工作的一種方法,但是您也必須修復其他一些東西。或者學習如何正常測試std_ulogic值。其實你已經在同一個過程中有一個例子。 –

+0

@BrianDrummond聲明**如果一個(大小-1)THEN **是正確的?我以前沒有遇到過這樣的事情。這是否轉化爲「如果(大小-1)爲真」?另外,size變量不應該被初始化? – Arkoudinos

+0

'if if then' are fine。所以,如果'a'是一組布爾值,那麼'如果一個(大小爲1)那麼'是正確的,它可能是,但目前不是。如果你在VHDL-2008中使用隱式轉換運算符也是正確的,我個人不喜歡它,因爲它們模糊了物理層「0」和「1」與邏輯層「真」和「假」之間的區別。 ,例如,如果你正在處理負邏輯,會產生荒謬混亂的代碼。 –

回答

0

參見IEEE標準一○七六年至2008年,10.8 If語句

對於的執行if語句,條件後,如果指定,並且後ELSIF指定的任何條件下,連續進行評價(治療那麼最後的else爲真),直到一個評估爲TRUE或所有條件被評估併產生FALSE。如果一個條件評估爲TRUE,則執行相應的語句序列; ...

TRUE和FALSE在16.3 Package STANDARD中定義爲BOOLEAN類型的值。

這需要和表達條件來評估爲TRUE或FALSE。我們可以用一個返回BOOLEAN的等號運算符(「=」)來實現(參見9.2.3關係運算符)。

您的代碼修改,以提供一個布爾條件:

LIBRARY ieee; 
USE ieee.std_logic_1164.ALL; 

ENTITY inverter IS 
GENERIC(size: integer); 
PORT ( 
    a : IN std_ulogic_vector(size-1 DOWNTO 0); 
    b : OUT std_ulogic_vector(size-1 DOWNTO 0); 
    carry : OUT std_ulogic; 
    mode : IN std_ulogic 
    ); 
END ENTITY inverter; 


ARCHITECTURE behavioral OF inverter IS 
COMPONENT alu IS 
GENERIC(size: integer); 
Port (X : in std_ulogic_VECTOR (size-1 downto 0); 
     Y : in std_ulogic_VECTOR (size-1 downto 0); 
     SUM : out std_ulogic_VECTOR (size-1 downto 0); 
     CARRY : out std_ulogic); 
end COMPONENT; 

SIGNAL z, c : std_ulogic_VECTOR(size-1 downto 0); 

BEGIN 
start: process(a,mode) 
begin 
z <= (others => '0'); 

IF to_bit(a(size-1)) = '1' THEN 
c <= not a; 
z(0) <= '1'; 
ELSIF (mode = '1') THEN 
c <= not a; 
z(0) <= '1'; 
ELSE 
c <= a; 
END IF; 
end process; 
alu1: alu 
generic map(size) 
PORT MAP(x => c, y => z, sum => b, carry => carry); 


END ARCHITECTURE behavioral; 

成功分析(編譯)。