Carry Chain
Ir para navegação
Ir para pesquisar
------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------
--Book: Arithmetic/292
-- Carry chain
architecture adder_carry_chain of adder is
constant mb: natural := 2;
subtype digit is natural range 0 to mb-1;
type digit_vector is array (natural range <>) of digit;
signal p, g: std_logic_vector(n-1 downto 0);
signal q: std_logic_vector(n downto 0);
signal x, y: digit_vector(n-1 downto 0);
signal z: digit_vector(n-1 downto 0);
begin
-- converte de std_logic_vector para digit_vector e vice versa
conv_dv2slv: for i in x'range generate
x(i) <= 1 when a(i)='1' else 0;
y(i) <= 1 when b(i)='1' else 0;
sum(i) <= '1' when z(i)=1 else '0';
end generate;
q(0) <= cin;
iterative_step: for i in 0 to n-1 generate
p(i) <= '1' when x(i) + y(i) = mb-1 else '0';
g(i) <= '1' when x(i) + y(i) > mb-1 else'0';
with p(i) select q(i+1) <= q(i) when '1', g(i) when others;
z(i) <= (x(i) + y(i) + conv_integer(q(i))) mod mb;
end generate;
--cout <= q(n);
end architecture;