2016-05-19 23 views
-1
library IEEE; 
use IEEE.STD_LOGIC_1164.all; 

entity paralel_reg is 
    generic (default : positive := 4); 
    port(C, notR, E: in std_logic; D: in std_logic_vector(default downto 1); 
    Q: out std_logic_vector(default downto 1)); 
end paralel_reg; 

architecture paralel_reg of paralel_reg is 
signal q : std_logic_vector(default downto 1); 
begin 
process (C, notR) 
begin 
    if notR = '0' then q <= (others => '0'); 
    else if rising_edge(C) then q <= D; 
    end if; 
end process; --# Error: COMP96_0019: paralel_register.vhd : (18, 5): Keyword "if" expected. 
    --# Error: COMP96_0015: paralel_register.vhd : (18, 5): ';' expected. 

process (E, q) --# Error: COMP96_0019: paralel_register.vhd : (24, 2): Keyword "end" expected. 
begin 
    if E = '0' then Q <= (others => '0'); 
    else Q <= q;  --# Error: COMP96_0019: paralel_register.vhd : (24, 2): Keyword "end" expected. 
      --# Error: COMP96_0016: paralel_register.vhd : (24, 7): Design unit declaration expected. 
    end if; 
end process; 
end paralel_reg; 

# Error: COMP96_0019: paralel_register.vhd : (18, 5): Keyword "if" expected. # Error: COMP96_0015: paralel_register.vhd : (18, 5): ';' expected. # Error: COMP96_0019: paralel_register.vhd : (21, 1): Keyword "end" expected. # Error: COMP96_0019: paralel_register.vhd : (24, 2): Keyword "end" expected. # Error: COMP96_0016: paralel_register.vhd : (24, 7): Design unit declaration expected.Warum wird Code nicht kompiliert?

Antwort

0

Dieses:

process (C, notR) begin 
    if notR = '0' then q <= (others => '0'); 
    else if rising_edge(C) then q <= D; 
    end if; end process; 

sollte dies sein:

process (C, notR) 
begin 
    if notR = '0' then q <= (others => '0'); 
    elsif rising_edge(C) then q <= D; 
    end if; 
end process; 

Die VHDL if Anweisung hat dies Format:

if ... then 
    ... 
elsif ... then 
    ... 
elsif ... then 
    ... 
else 
    ... 
end if; 

Alle VHDL-Anweisungen enden mit einem Semikolon. Das obige ist eine Aussage, die mit end if; endet. VHDL-Anweisungen können in einem anderen eingebettet werden. So können Sie eine weitere if Anweisung innerhalb einer if Anweisung eingebettet, und das ist, was Sie tun, wenn Sie else if verwenden, anstatt elsif:

if ... then 
    ... 
elsif ... then 
    ... 
elsif ... then 
    ... 
else 
    IF ... THEN 
    ... 
    ELSIF ... THEN 
    ... 
    ELSE 
    ... 
    END IF; 
end if; 

Jede if Anweisung in VHDL ein end if; erfordert. Beachten Sie, dass in dem oben, mit einer if Anweisung eingebettet in einem anderen, gibt es zwei end if s. So konnten Sie geschrieben haben:

process (C, notR) begin 
    if notR = '0' then q <= (others => '0'); 
    else if rising_edge(C) then q <= D; 
    end if; 
    end if; end process; 

aber ich würde immer elsif statt else if empfehlen, weil Sie weniger end if s benötigen.

1

"Else If" nicht in VHDL existieren, müssen Sie schreiben:

IF ... THEN 
ELSIF ... THEN 
ELSE 
END IF; 
+2

Sie können 'else if' verwenden, aber dann müssen Sie genauer auf den Kontrollfluss achten und passende 'end if'-Anweisungen haben. 'q' und' Q' sind in VHDL lexikalisch identisch und es gibt zwei Deklarationen. Vorkommen von 'q' zu' qi' ändern (inkl. Der Sensitivitätsliste) und ein zweites Ende hinzufügen wenn (oder mit elsif) und die Codeanalysen (compiles). Die Botschaft hier ist, dass eine Antwort bewiesen werden sollte. Nicht sicher, was "E" soll. – user1155120

Verwandte Themen