Carry Save-multiplier
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;