2016-12-04 6 views
0

ich erhalte diesen Fehler in diesem Code: ter.vhd (31): Kann nicht indizierte (Art ieee.std_logic_1164.STD_ULOGIC) als Typ std.STANDARD.BOOLEAN lösen. irgendeine Idee, wie man es repariert? ich sincerly nicht bekommen, was falsch ist, versucht mit einer Websuche, aber nichts. danke im voraus!VHDL indexiert Name Ausgabe

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

Deklarieren 'a' als ein Array von booleans ein Weg sein würde, damit es funktioniert, aber man müßte auch einige andere Sachen zu beheben. Oder erfahren Sie, wie std_ulogic-Werte normalerweise getestet werden. Tatsächlich haben Sie bereits ein Beispiel dafür im selben Prozess. –

+0

@BrianDrummond Die Anweisung ** WENN a (Größe-1) THEN ** richtig ist? So etwas habe ich noch nie erlebt. Bedeutet dies, dass "wenn ein (Größe-1) WAHR ist"? Außerdem sollte die Größenvariable nicht initialisiert worden sein. – Arkoudinos

+0

'wenn dann 'ist in Ordnung. Also, "WENN a (Größe-1) DANN" ist richtig, wenn "a" ist ein Array von Boolean, was es sein könnte, aber derzeit nicht ist. Es ist auch richtig, wenn Sie die implizite Konvertierung Operatoren in VHDL-2008 verwenden, die ich persönlich nicht mögen, weil sie den Unterschied zwischen physischen Ebenen '‚0'' und '‘ 1'' und logische Ebenen 'true' und' false' Unschärfe B. wenn Sie negative Logik haben. –

Antwort

0

Siehe IEEE Std 1076-2008, 10,8 If-Anweisung

Für die Ausführung eines if-Anweisung, die Bedingung nach Angabe, ob und alle Bedingungen nach elsif angegeben, werden nacheinander ausgewertet (Behandlung eine letzte else als TRUE dann), bis man TRUE ergibt oder alle Bedingungen ausgewertet werden und FALSE ergeben. Wenn eine Bedingung zu TRUE ausgewertet wird, wird die entsprechende Folge von Anweisungen ausgeführt. ...

TRUE und FALSE sind in 16.3 Paket STANDARD als Werte des Typs BOOLEAN definiert.

Dies erfordert und Ausdruck in der Bedingung entweder WAHR oder FALSCH zu bewerten. Wir können das mit einem Gleichheitsoperator ("=") tun, der ein BOOLEAN zurückgibt (siehe 9.2.3 Relationale Operatoren).

Ihr Code modifiziert, um einen BOOLEAN Zustand zur Verfügung zu stellen:

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; 

Analysen erfolgreich (kompiliert).