2010-10-26 30 views
0

Je tente de combiner plusieurs ALU 1 bit dans une ALU 4 bits. Je suis confus sur la façon de le faire en VHDL. Voici le code pour l'ALU 1bit que j'utilise:Création d'une ALU 4 bits à partir de plusieurs ALU 1 bit

component alu1 -- define the 1 bit alu component 
    port(a, b: std_logic_vector(1 downto 0); 
    m: in std_logic_vector(1 downto 0); 
    result: out std_logic_vector(1 downto 0)); 
end alu1; 

architecture behv1 of alu1 is 
begin 
    process(a, b, m) 
    begin 
    case m is 
    when "00" => 
     result <= a + b; 
     when "01" => 
     result <= a + (not b) + 1; 
     when "10" => 
     result <= a and b; 
     when "11" => 
     result <= a or b; 
    end case 
    end process 
end behv1 

Je suppose que je définis ALU1 en tant que composante de la alu4 entité plus grande, mais comment puis-je les attacher ensemble?

Répondre

0

Vous ne pouvez pas (facilement) enchaîner ces ALU à 1 bit dans une version à plusieurs bits fonctionnelle. Il n'y a aucun moyen de gérer le carry in/out nécessaire pour que vos modes add et subtract fonctionnent correctement (le bitwise et & ou devrait fonctionner correctement, cependant).

Ignorer le problème de transport pour le moment, vous le feriez habituellement juste installer un pour générer des boucles et instancier plusieurs copies de votre logique binaire, éventuellement boîtier spécial la première et/ou derniers éléments, à savoir:

MyLabel : for bitindex in 0 to 3 generate 
begin 
    alu_x4 : entity work.alu1 
    port map (
    a => input_a(bitindex), 
    b => input_b(bitindex), 
    m => mode, 
    result => result_x4(bitindex)); 
end generate; 
1

Intéressant, vous poseriez même cette question. Les synthétiseurs VHDL sont tout à fait capables d'inférer n'importe quel additionneur que vous aimez. Vous pouvez taper ce que vous avez besoin:

use ieee.numeric_std.all; 
... 
signal r : unsigned(3 downto 0); 
signal a : unsigned(2 downto 0); 
signal b : unsigned(2 downto 0); 
signal c : unsigned(2 downto 0); 
... 
r <= a + b + c; 

Ensuite, vous pouvez couper r pour répondre à vos besoins:

result <= std_logic_vector(r(2 downto 0));