2013-04-18 5 views
1

J'ai un projet où je suis supposé développer un microprocesseur RISC. cela implique de créer une ALU dans un modèle comportemental. Cependant, il semble y avoir des problèmes/erreurs/avertissements lors de la simulation de la conception. La plupart des opérations fonctionnent correctement, sauf:8 bits ALU pour microprocesseur

COMPARAISON DES 2 ENTREES: lorsque les nombres sont égaux, le drapeau zéro n'est pas défini. (les nombres inégaux fonctionnent correctement).

Attention: Il y a un 'U' | 'X' | 'W' | 'Z' | '' dans un opérande arithmétique, le résultat sera 'X' (es).

(cela semble tout 1 ps, probablement en raison de la déclaration d'attente dans le processus)

Je souhaite travailler avec std_logic_vector, même si je lis qu'ils sont très en désordre.

également, il y a un problème lorsque j'essaie d'utiliser des commandes de comparaison (qui mettent à jour les indicateurs mais ne stockent pas la différence dans le registre de sortie). Comment sont si les commandes exécutées en VHDL ?? sont-ils exécutés en même temps? ou ligne par ligne ??

CODE CI-DESSOUS:

LIBRARY IEEE; 
USE IEEE.STD_LOGIC_1164.ALL; 
USE IEEE.STD_LOGIC_ARITH.ALL; 
USE IEEE.STD_LOGIC_UNSIGNED.ALL; 

ENTITY ALU IS 
    PORT(
     INPUT1 , INPUT2: IN STD_LOGIC_VECTOR(7 DOWNTO 0) ; 
     CARRYIN : IN STD_LOGIC ; 
     ZERO,CARRYOUT : OUT STD_LOGIC ; 
     OUTPUT : OUT STD_LOGIC_VECTOR(7 DOWNTO 0) ; 
     CONTROL : IN STD_LOGIC_VECTOR(7 DOWNTO 0) 
     ) ; 
END ALU ; 

ARCHITECTURE OPERATION OF ALU IS 
SIGNAL TMP : STD_LOGIC_VECTOR(8 DOWNTO 0) ; 
BEGIN 
PROCESS 
BEGIN 
    IF(CONTROL = "00110000" OR CONTROL(7 DOWNTO 3) = "00001") THEN TMP <= CARRYIN & (INPUT1 AND INPUT2) ; 
    ELSIF(CONTROL(7 DOWNTO 3) = "00010") THEN TMP <= CARRYIN & (INPUT1 OR INPUT2) ; 
    ELSIF(CONTROL(7 DOWNTO 3) = "00011") THEN TMP <= CARRYIN & (INPUT1 XOR INPUT2) ; 
    ELSIF(CONTROL(7 DOWNTO 3) = "00100") THEN TMP <= CONV_STD_LOGIC_VECTOR( (CONV_INTEGER(INPUT1)+1) , 9) ; 
    ELSIF(CONTROL(7 DOWNTO 3) = "00101") THEN TMP <= CONV_STD_LOGIC_VECTOR( (CONV_INTEGER(INPUT1)-1) , 9) ; 
    ELSIF(CONTROL = "10001100") THEN TMP <= '0' & (NOT INPUT1) ; 
    ELSIF(CONTROL(7 DOWNTO 3) = "11000" OR CONTROL(7 DOWNTO 2) = "110010" OR CONTROL = "110-11--") THEN TMP <= CONV_STD_LOGIC_VECTOR( (CONV_INTEGER(INPUT1)+CONV_INTEGER(INPUT2)) , 9) ; 
    ELSIF(CONTROL(7 DOWNTO 3) = "11100" OR CONTROL(7 DOWNTO 2) = "111010" OR CONTROL = "111-11--" OR CONTROL(7 DOWNTO 3) = "00000" OR CONTROL = "00111000") THEN TMP <= CONV_STD_LOGIC_VECTOR( (CONV_INTEGER(INPUT1)-CONV_INTEGER(INPUT2)) , 9) ; 
    ELSIF(CONTROL(7 DOWNTO 3) = "11010" OR CONTROL(7 DOWNTO 2) = "110110") THEN TMP <= CONV_STD_LOGIC_VECTOR( (CONV_INTEGER(INPUT1)+CONV_INTEGER(INPUT2)+CONV_INTEGER(CARRYIN)) , 9) ; 
    ELSIF(CONTROL(7 DOWNTO 3) = "11110" OR CONTROL(7 DOWNTO 2) = "111110") THEN TMP <= CONV_STD_LOGIC_VECTOR( (CONV_INTEGER(INPUT1)-CONV_INTEGER(INPUT2)-CONV_INTEGER(CARRYIN)) , 9) ; 
    END IF ; 
    IF (TMP(7 DOWNTO 0) = "00000000") THEN ZERO <= '1' ; 
    ELSE ZERO <= '0' ;  
    END IF ; 
     IF(CONTROL(7 DOWNTO 3) = "00000" OR CONTROL = "00111000") THEN 
     TMP(7 DOWNTO 0) <= INPUT1 ; 
     END IF ; 
     OUTPUT <= TMP(7 DOWNTO 0) ; 
    CARRYOUT <= TMP(8) ; 
     WAIT FOR 1 PS; 
END PROCESS ; 
END OPERATION ; 

Code testbench

LIBRARY ieee; 
USE ieee.std_logic_1164.ALL; 
USE ieee.std_logic_unsigned.all; 


ENTITY test_tb IS 
END test_tb; 

ARCHITECTURE behavior OF test_tb IS 
    COMPONENT ALU 
    PORT(
     INPUT1 , INPUT2: IN STD_LOGIC_VECTOR(7 DOWNTO 0) ; 
     CARRYIN : IN STD_LOGIC ; 
     ZERO,CARRYOUT : OUT STD_LOGIC ; 
     OUTPUT : OUT STD_LOGIC_VECTOR(7 DOWNTO 0) ; 
     CONTROL : IN STD_LOGIC_VECTOR(7 DOWNTO 0) 
     ) ; 
END COMPONENT ; 


    signal i1,i2,ctrl,opt : std_logic_vector(7 downto 0) := "00000000" ; 
    signal cin,cout,zero : std_logic := '0'; 


BEGIN 


    uut: alu PORT MAP (i1,i2,cin,zero,cout,opt,ctrl) ; 


    stim_proc: process 
    begin   

     i1 <= "10000000" ; 
     i2 <= "10000000" ; 
     ctrl <= "11011010" ; 
     cin <= '0' ; 
     wait for 5 ps; 
     ctrl <= "00111000" ; 
     wait for 5 ps ; 
     wait; 
    end process; 

END; 
+0

I Je ne peux pas reproduire votre problème.J'utilise un banc d'essai fournissant toutes les entrées à l'ALU.Vérifiez si vos vecteurs d'entrée sont correctement définis.Si cela ne fonctionne toujours pas, ajoutez votre code testbench à la question! – baldyHDL

+0

TMP semble que vous l'utilisez plus comme une variable qu'un signal. Id suggère également une liste de sensibilité pour le processus. – Voider

Répondre

0

Malheureusement, ce morceau de code ne fait pas ce que vous attendez:

CONTROL = "111-11--" 

Il compare en fait CONTROL pour voir si elle a le 4, 6ème et 7ème bits mis à -, plutôt que de les utiliser comme "ne se soucient pas" correspond! Ahurissants, mais c'est la façon dont il a été spécifié pour fonctionner pendant des années :(

Qu'est-ce que vous voulez est

std_match(CONTROL, "111-11--") 

qui fera une comparaison de soins comme ne pas vous attendez.

0

le problème réside dans les déclarations de la forme CONTROL = "111-11--" et la manière dont 'U' | 'X' | 'W' | 'Z' | '-' sont traités dans les fonctions de la bibliothèque que vous utilisez.

  1. CONTROL = "111-11--" appelle la fonction '=' de std_logic_unsigned (en comparant deux std_logic_vectors) ...
  2. cela appelle la fonction '=' de std_logic_arith (comparer deux valeurs non signées). ..
  3. cela appelle CONV_UNSIGNED de std_logic_arith ...
  4. ce qui appelle MAKE_BINARY de std_logic_arith ...
  5. et cette fonction, enfin, vérifie si un bit est réglé sur 'U' | 'X' | » W '|' Z '|' - '. Si oui, il donne l'avertissement que vous voyez

-> message court de réponse longue: éviter d'utiliser 'U' | 'X' | 'W' | 'Z' | '-'. utiliser la comparaison explicite de « 0 » et « 1 » bits au lieu