Carry Save-multiplier

De MediaWiki do Campus São José
Revisão de 11h14min de 3 de julho de 2016 por Kamila.r (discussão | contribs) (Criou página com '<syntaxhighlight lang=vhdl> ------------------------------------------------------------------------------------------ ---------------------------------------------------------------------------...')
(dif) ← Edição anterior | Revisão atual (dif) | Versão posterior → (dif)
Ir para navegação Ir para pesquisar
------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------
--Book: GUIDE/
--Carry save multiplier


architecture carry_save_mult of multiplier is

  signal u: std_logic_vector (n-1 downto 0);
  constant v : std_logic_vector (n-1 downto 0) := (others => '0');
  TYPE matrix IS ARRAY (0 TO n-1) OF STD_LOGIC_VECTOR(n-1 DOWNTO 0);
  SIGNAL c, d, e, f: matrix;
  SIGNAL first_operand: STD_LOGIC_VECTOR(n-2 DOWNTO 0);
  SIGNAL second_operand: STD_LOGIC_VECTOR(n-1 DOWNTO 0);
BEGIN
  
  u <= cin;
  main_iteration: FOR i IN 0 TO n-1 GENERATE
    internal_iteration: FOR j IN 0 TO n-1 GENERATE
      f(i)(j) <= (a(j) AND b(i)) XOR c(i)(j) XOR d(i)(j);
      e(i)(j) <= (a(j) AND b(i) AND c(i)(j)) OR (a(j) AND b(i) AND d(i)(j)) OR (c(i)(j) AND d(i)(j));
    END GENERATE;
  END GENERATE;

  connections1: FOR j IN 0 TO n-1 GENERATE 
    c(0)(j) <= u(j); 
  END GENERATE;
  connections2: FOR i IN 1 TO n-1 GENERATE
    connections3: FOR j IN 0 TO n-2 GENERATE 
      c(i)(j) <= f(i-1)(j+1); 
    END GENERATE;
    c(i)(n-1) <= '0';
  END GENERATE;
  
  connections4: FOR j IN 0 TO n-1 GENERATE 
    d(0)(j) <= v(j); 
  END GENERATE;
  connections5: FOR j IN n TO n-1 GENERATE 
    d(0)(j) <= '0'; 
  END GENERATE;
  connections6: FOR i IN 1 TO n-1 GENERATE
    connections7: FOR j IN 0 TO n-1 GENERATE 
      d(i)(j) <= e(i-1)(j); 
    END GENERATE;
  END GENERATE;

  outputs: FOR j IN 0 TO n-1 GENERATE 
    prod(j) <= f(j)(0); 
  END GENERATE;
  first_operand<= f(n-1)(n-1 DOWNTO 1);
  second_operand <= e(n-1);
  prod(n+n-1 DOWNTO n) <= first_operand + second_operand;
  
end architecture;