2017-05-03 3 views
0

J'apprends le VHDL en utilisant Altera Max V et Quartus pour faire quelques exemples et j'ai un problème en utilisant l'instruction "Avec Select when". J'ai un décodeur simple, 2-4 comme suit:VHDL: erreur lors de l'utilisation de "With Select When" Statement

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; 

Et je reçu le message d'erreur:

texte près "avec"; attendre « fin », ou « (», ou un identifer (« avec » est un mot-clé réservé), pr une déclaration séquentielle

J'ai essayé de vérifier mon code, mais n'a pas pu trouver le problème?

+1

Quelle version de Quartus vous utilisez? Avec-sélectionnez-le VHDL-2008 construire et non pris en charge par l'ancienne version de l'outil. Assurez-vous également d'activer VHDL-2008 pour le fichier si vous utilisez une version plus récente de Quartus. – FritzDC

+2

'with ... select' n'est pas une construction VHDL-2008, mais c'est nouveau pour autoriser' with ... select' dans le code séquentiel (par exemple un processus). Vous devez soit supprimer le processus pour rendre simultanées 'with ... select' ou activer la compilation avec les fonctions 2008 si votre outil les prend en charge. – Paebbels

Répondre

2

la déclaration with ... select est une instruction d'affectation de signal simultané utilisé en dehors d'un processus.

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; 

J'ai également ajouté le signal en dans l'instruction d'affectation de sortie

Remarque: je n'ai pas simulé cet extrait de code.

+4

Il existe également une instruction d'affectation de signal sélectionnée séquentielle dans VHDL 2008. Voir IEEE Std 1076-2008 10.5 Affectation de signal et 10.5.4 Affectations de signal sélectionnées. Malheureusement pas une fonctionnalité prise en charge par [Quartus® Prime] (http://quartushelp.altera.com/current/index.htm#hdl/vhdl/vhdl_list_2008_vhdl_support.htm) pour la synthèse. – user1155120

+2

Pourquoi avez-vous ajouté le signal 'en' dans l'instruction de sortie? Il n'y a rien dans la question pour suggérer que c'était nécessaire. –

+1

Eh bien, il y a un port d'entrée 'en' sur la liste des ports et il est assez facile de deviner à quoi il est destiné. Ce n'est certainement pas un bogue de déclarer des ports d'entrée qui ne sont pas utilisés dans l'architecture, mais les outils de synthèse/lintage peuvent s'en plaindre. Donc, je recommande soit d'utiliser le port ou le retirer de la liste des ports. – Juergen