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
demandé sur user2279268 2013-11-03 21:01:32

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...
3
répondu mbschenkel 2013-11-03 18:26:52

probablement vos signaux t1 et t2 devraient être de type std_logic_vector au lieu de std_logic .

0
répondu rick 2013-11-03 17:18:36