Home >
VHDL >
Arithmetic Circuits >
n bit adder
Structural implementation of the N-bit adder :
library IEEE;
use IEEE.std_logic_1164.all;
entity adderN is
generic(N : integer := 16); -- The width of the adder is determined by generic N
port (a : in std_logic_vector(N downto 1);
b : in std_logic_vector(N downto 1);
cin : in std_logic;
sum : out std_logic_vector(N downto 1);
cout : out std_logic);
end adderN;
architecture structural of adderN is
component adder
port (a : in std_logic;
b : in std_logic;
cin : in std_logic;
sum : out std_logic;
cout : out std_logic);
end component;
signal carry : std_logic_vector(0 to N);
begin
carry(0) <= cin;
cout <= carry(N);
-- instantiate a single-bit adder N times
gen: for I in 1 to N generate
add: adder port map(a => a(I), b => b(I), cin => carry(I - 1), sum => sum(I), cout => carry(I));
end generate;
end structural;
Behavioral implementation of the N-bit adder :
library IEEE;
use IEEE.std_logic_1164.all;
entity adderN is
generic(N : integer := 16); -- The width of the adder is determined by generic N
port (a : in std_logic_vector(N downto 1);
b : in std_logic_vector(N downto 1);
cin : in std_logic;
sum : out std_logic_vector(N downto 1);
cout : out std_logic);
end adderN;
architecture behavioral of adderN is
begin
p1: process(a, b, cin)
variable vsum : std_logic_vector(N downto 1);
variable carry : std_logic;
begin
carry := cin;
for i in 1 to N loop
vsum(i) := (a(i) xor b(i)) xor carry;
carry := (a(i) and b(i)) or (carry and (a(i) or b(i)));
end loop;
sum <= vsum;
cout <= carry;
end process p1;
end behavioral;