2009-11-16 14 views
1

J'écris actuellement une ALU 32 bits (Add/Sub) en VHDL. J'ai un problème avec le bit de débordement. Je ne vois pas quand régler le dépassement en fonction de l'opération (addition, soustraction) et des valeurs d'entrée.Bit de débordement 32Bit ALU VHDL

Pouvez-vous m'aider?

meilleures salutations, Andre

Répondre

1

Qu'est-ce que les spécifications disent qu'il devrait faire? Il devrait y avoir une description des conditions dans lesquelles le drapeau de débordement devrait être défini. Classiquement, le bit de débordement est défini lorsque la sortie est trop grande pour le stockage. Vous pourriez considérer cela comme un 33ème bit dans la réponse de la somme de deux nombres de 32 bits. En arithmétique signée, cela peut arriver si l'ampleur du résultat de l'opération est trop grande, quel que soit le signe. Avec l'arithmétique du complément 2-s, vous devez être un peu prudent car le plus grand nombre négatif est légèrement plus négatif que le plus grand nombre positif que vous pouvez représenter dans un nombre donné de bits.

En ce qui concerne en fait le faire, il suffit de créer un vecteur numeric_std qui est 1 peu plus large que les entrées, faites

a<=b+c;

et laissez le synthétiseur créer la logique. Vous n'avez alors pas à vous soucier des détails.

Le MSB de « a » peut être enlevé (en utilisant a(a'high) et l'utiliser comme le trop-plein.

3

Juste pour ajouter un peu d'information supplémentaire à la réponse de Martin, vous devez faire attention à la détection du débordement avec Par exemple, si vous avez des valeurs signées à 3 bits représentées au format complémentaire à deux et que vous voulez détecter un dépassement, vous devez signer étendre dans le bit supplémentaire, puis regarder si le bit supplémentaire est différent du bit recherché le plus significatif:

Par exemple, si vous voulez pour calculer a = b + c:

--Declare the signals 
signal overflow : std_logic; 
signal a : signed(2 downto 0); 
signal b : signed(2 downto 0); 
signal c : signed(2 downto 0); 

-- Declare some additional signals with one more MSB than the original signals 
signal a_extended : std_logic(3 downto 0); 
signal b_extended : std_logic(3 downto 0); 
signal c_extended : std_logic(3 downto 0); 

-- Sign extend the MSB 
b_extended <= b(2) & b; 
c_extended <= c(2) & c; 

-- Perform the addition 
a_extended <= b_extended + c_extended; 

-- Detect the overflow case 
overflow <= '1' when a_extended(3) /= a_extended(2) else '0'; 

-- Calculate the answer 
-- Limit to 100 (-4) or 011 (+3) in the case of overflow 
process(a_extended) 
begin 
    if a_extended(3) /= a_extended(2) then 
     if a_extended(3) = '1' then 
     a <= "100"; 
     else 
     a <= "011"; 
     end if; 
    else 
     a <= a_extended(2 downto 0); 
    end if; 
end process; 
+0

Vous faites un point important au sujet de trop-plein complément à deux ... – Marty

+0

Pour ajouter à la réponse de Justin (ce qui en fait de bons points :) il y a des fonctions pour le redimensionnement des vecteurs dans le ieee.numeric_std bibliothèque. L'addition pourrait être écrite comme 'a <= redimensionner (b, a'length) + redimensionner (b, a'length)'. En outre, limiter la réponse n'est généralement pas ce que vous voulez faire en cas de débordement - cela coûte plus de logique. Si le report est utilisé pour des ajouts multi-mots, vous * ne * voulez pas saturer l'arithmétique. –