Carry Chain

De MediaWiki do Campus São José
Revisão de 11h11min 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: 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;