Adder 8 bits, sortie illogique
j'ai créé un adder 8 bits avec une fulladder. Comme vous pouvez le voir, j'ai commencé à ajouter les bits de droite à gauche avec les bits correspondants et pour cin les signaux t1 et t2 et cout le t2 et t1 dans l'ordre. Le premier cin est défini à l'entrée adder cin. Je ne vois aucun problème dans mon implémentation, mais quand je l'exécute, j'obtiens la ligne rouge pour le signal de sortie O.Quelqu'un peut-il me dire ce qui ne va pas?(j'ai testé la fulladder et je vous renvoie les bons résultats.)
Merci.
voici le code:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity adder8bit is
Port ( a : in STD_LOGIC_VECTOR (7 downto 0);
b : in STD_LOGIC_VECTOR (7 downto 0);
cin : in STD_LOGIC;
o : out STD_LOGIC_VECTOR (7 downto 0);
cout : out STD_LOGIC);
end adder8bit;
architecture Behavioral of adder8bit is
component fulladder is
Port ( a : in STD_LOGIC;
b : in STD_LOGIC;
cin : in STD_LOGIC;
o : out STD_LOGIC;
cout : out STD_LOGIC);
end component;
signal t1,t2:std_logic:='0';
begin
C1: fulladder port map( a => a(0), b => b(0), cin => cin, o => o(0), cout => t1 );
C2: fulladder port map( a => a(1), b => b(1), cin => t1, o => o(1), cout => t2 );
C3: fulladder port map( a => a(2), b => b(2), cin => t2, o => o(2), cout => t1 );
C4: fulladder port map( a => a(3), b => b(3), cin => t1, o => o(3), cout => t2 );
C5: fulladder port map( a => a(4), b => b(4), cin => t2, o => o(4), cout => t1 );
C6: fulladder port map( a => a(5), b => b(5), cin => t1, o => o(5), cout => t2 );
C7: fulladder port map( a => a(6), b => b(6), cin => t2, o => o(6), cout => t1 );
C8: fulladder port map( a => a(7), b => b(7), cin => t1, o => o(7), cout => cout );
end Behavioral;
2 réponses
il me semble, que vous supposez que vos instances C1 ... C8
sont exécutées séquentiellement et donc vous alternez les deux signaux t1
et t2
comme s'il s'agissait d'un programme où les variables peuvent être réutilisées.
cependant vous créez une structure avec des connexions ici et t1
sera le même signal pour toutes les 8 instances sur lesquelles vous l'utilisez. Par conséquent, vous avez 4 pilotes C1, C3, C5
et C7
pour t1
(et de la même façon pour t2
) et ce code ne serait probablement pas synthétisable.
ce que vous pouvez faire est d'utiliser 8 signaux de distribution dans une configuration comme suit:
signal c: std_logic_vector(7 downto 1) := (others => '0');
-- ...
C1: fulladder port map( a => a(0), b => b(0), cin => cin, o => o(0), cout => c(1) );
C2: fulladder port map( a => a(1), b => b(1), cin => c(1), o => o(1), cout => c(2) );
C3: fulladder port map( a => a(2), b => b(2), cin => c(2), o => o(2), cout => c(3) );
-- ...
C8: fulladder port map( a => a(7), b => b(7), cin => c(7), o => o(7), cout => cout );
en outre, vous pourriez avoir un regard sur foor-generate-loops pour réduire la quantité de répétition dans votre code. Si vous étendez le vecteur de portage pour inclure cin
et cout
, toutes les 8 lignes alors regarder le même (à l'exception de l'augmentation index.)
signal c: std_logic_vector(8 downto 0) := (others => '0');
-- ...
c(0) <= cin;
cout <= c(8);
-- ...
-- your for-generate loop here...
probablement vos signaux t1
et t2
devraient être de type std_logic_vector
au lieu de std_logic
.