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;
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
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