2017-05-03 1 views
0

Ich lerne VHDL mit Altera Max V und Quartus, um einige Beispiele zu tun, und ich habe ein Problem bei der Verwendung "With Select wenn" -Anweisung. Ich habe eine einfache 2-4-Decoder wie folgt:VHDL: Fehler bei der Verwendung von "With Select When" Anweisung

library ieee; 
use ieee.std_logic_1164.all; 

entity lesson9 is 
    port(
     x: in std_logic_vector(1 downto 0); 
     en: in std_logic; 
     y: out std_logic_vector(3 downto 0) 
    ); 
end lesson9; 

architecture rtl of lesson9 is 

signal outputBuff: std_logic_vector(3 downto 0); 

begin 
    decoder2to4: process(x) 
    begin 
     with x select 
      outputBuff <= "0001" when "00", 
          "0010" when "01", 
          "0100" when "10", 
          "1000" when "11"; 
    end process decoder2to4; 

    y <= outputBuff; 
end rtl; 

Und ich habe die Fehlermeldung:

in der Nähe von Text "mit"; „Ende“ oder „(“ oder eine identifer erwartet („mit“ ist ein reserviertes Schlüsselwort), eine sequentielle Anweisung pr

Ich habe versucht, meinen Code zu überprüfen, konnte aber das Problem nicht finden?

+1

Welche Version von Quartus verwenden Sie? With-Select es VHDL-2008 Konstrukt und nicht von älteren Tool-Version unterstützt. Stellen Sie außerdem sicher, dass VHDL-2008 für die Datei aktiviert wird, wenn Sie die aktuellere Quartus-Version verwenden. – FritzDC

+2

'with ... select' ist kein VHDL-2008-Konstrukt, aber es ist neu,' 'mit ... select' in sequentiellem Code (z. B. einem Prozess) zuzulassen. Sie müssen entweder den Prozess entfernen, um gleichzeitig 'with ... select' zu erstellen oder die Kompilierung mit 2008-Features zu aktivieren, wenn Ihr Tool dies unterstützt. – Paebbels

Antwort

2

with ... select die Anweisung ist eine gleichzeitige Signalzuweisung außerhalb eines Prozesses verwendet.

architecture rtl of lesson9 is 

signal outputBuff: std_logic_vector(3 downto 0); 

begin 
    with x select 
     outputBuff <= "0001" when "00", 
         "0010" when "01", 
         "0100" when "10", 
         "1000" when "11"; 

    y <= outputBuff when en='1' else (others=>'0'); 
end rtl; 

I auch das en Signal in der Ausgangszuweisungsanweisung hinzugefügt

Hinweis: Ich habe dieses Code-Snippet nicht simuliert.

+4

In VHDL 2008 gibt es auch eine sequenziell ausgewählte Signalzuweisungsanweisung. Siehe IEEE Std 1076-2008 10.5 Signalzuweisungsanweisung und 10.5.4 Ausgewählte Signalzuweisungen. Leider keine Funktion von [Quartus® Prime] (http://quartushelp.altera.com/current/index.htm#hdl/vhdl/vhdl_list_2008_vhdl_support.htm) für die Synthese. – user1155120

+2

Warum haben Sie in der Ausgabeanweisung das Signal 'en' hinzugefügt? Es gibt nichts in der Frage zu sagen, dass das notwendig war. –

+1

Nun, es gibt einen 'en' Eingangsport in der Portliste und es ist ziemlich einfach zu erraten, wofür er gedacht ist. Es ist sicherlich kein Fehler, Eingabeports zu deklarieren, die nicht in der Architektur verwendet werden, aber Synthesis/Linting-Tools könnten sich darüber beklagen. Daher empfehle ich, entweder den Port zu verwenden oder ihn aus der Portliste zu entfernen. – Juergen

Verwandte Themen