2017-04-13 2 views
0

J'ai besoin de 32 bits de données à HPS via l'interface mappée mémoire avalon. Le 1er et le 2ème cas ont bien fonctionné. Et j'ai eu des données sur HPS. Mais dans le 3ème cas, WHEN '2' => avs_s0_readdata = count_x (31 downto 0); il montre une erreur comme '' 2 '' n'est pas déclaré qu'est-ce que cela signifie. Vhdl a été fait dans Altera quartus 16.1 et le système HPS a été fait dans Qsys.Erreur lors de l'écriture dans le 3ème cas de l'interface mappée FPGA HPS FPGA

architecture behavior of encorder is 
signal count : STD_LOGIC_VECTOR(31 DOWNTO 0); 
signal countx : STD_LOGIC_VECTOR(31 DOWNTO 0); 
signal count_y : STD_LOGIC_VECTOR(31 DOWNTO 0):= x"00000000"; 


begin 

    PROCESS(avs_s0_read) 
    BEGIN 
    IF avs_s0_read = '1' THEN 
    CASE(avs_s0_address) IS 


WHEN '2' => avs_s0_readdata <= count_x(31 downto 0); 

WHEN others => avs_s0_readdata <= x"00000000"; 
END CASE; 
ELSE 
avs_s0_readdata <= x"00000000"; 

END IF; 
END PROCESS;` 
+1

Bienvenue à SO. Vous pouvez aider la personne qui abandonne le temps pour vous aider. Votre code est incomplet. Nous ne savons pas quel est le type 'avs_s0_address' (' '2' 'est de type 'character'.' Avs_s0_address' ne sera pas de ce type). Veuillez poster un [MCVE] (http://stackoverflow.com/help/mcve). –

+1

Sans voir de déclaration pour avs_s0_address, il semblerait que '2' ne soit pas une valeur d'énumération de son type. Veuillez fournir un [exemple minimal, complet et vérifiable] (https://stackoverflow.com/help/mcve). Votre problème ne peut pas être dupliqué (ou plus précisément quelqu'un pourrait créer un exemple autour de votre extrait qui ne présente pas de problème de syntaxe). Si le type avait été std_logic (type de base std_ulogic) ses valeurs d'énumération seraient constituées des littéraux de caractère 'U', 'X', '0', '1', 'Z', 'W', 'L', 'H' , et '-'. Notez que la condition if n'a pas généré d'erreur. – user1155120

+0

Un autre outil peut donner un message d'erreur plus descriptif - 'encorder.vhdl: 34: 6: erreur: impossible de faire correspondre le caractère littéral '2' avec le type std_ulogic'. std_logic est un sous-type résolu de std_ulogic - ('U', 'X', '0', '1', 'Z', 'W', 'L', 'H' et '-'). '2' n'est pas un choix valide dans une instruction case, ne représentant pas une valeur de std_logic. – user1155120

Répondre

1

L'adresse avs_s0 est de type STD_LOGIC. Ce type n'inclut pas '2' comme valeur possible, c'est pourquoi il a dit qu'il n'est pas déclaré. Std_logic est généralement utilisé pour décrire seulement deux valeurs logiques d'un bit, avec « 0 » et « 1 » Vous pouvez trouver toutes les options par exemple here

Depuis que je ne travaille pas avec Avalon (je travaille avec Xilinx FPGA) , Je ne sais pas exactement comment cela fonctionne, mais votre bus d'adresse semble être un peu long. Le type de cette entrée devrait probablement être std_logic_vector, de sorte que vous avez plus d'un bit de bus d'adresse. Ensuite, vous pouvez ajouter le signal de type entier:

signal avs_s0_address_int : integer; 

et dans le corps d'architecture, vous pouvez ajouter la ligne comme ceci:

avs_s0_address_int <= to_integer(unsigned(avs_s0_address)); 

ayant une valeur d'adresse type entier, ce qui est plus facile à comparer à déclaration de cas.

+0

Si cette réponse vous convient, veuillez la marquer comme acceptée. – Staszek