adder5f.vhd


--
-- full adder
--

library ieee;
use ieee.std_logic_1164.all;

entity fa is
     port( a : in std_logic;
         b : in std_logic;
         ci : in std_logic;
         co : out std_logic;
         s : out std_logic);
end fa;

architecture rtl of fa is
begin

     co <= (a and b) or ( (a or b) and ci);
     s <= a xor b xor ci;

end rtl;

--
-- 5-bit adder (use for-generate loop)
--

library ieee;
use ieee.std_logic_1164.all;

entity adder5f is
     port( a : in std_logic_vector(4 downto 0);
         b : in std_logic_vector(4 downto 0);
         ci : in std_logic;
         co : out std_logic;
         s : out std_logic_vector(4 downto 0) );
end adder5f;

architecture rtl of adder5f is

     component fa
            port( a : in std_logic;
                b : in std_logic;
                ci : in std_logic;
                co : out std_logic;
                s : out std_logic);
     end component;

     signal interCarry : std_logic_vector(4 downto 1);

begin

     mod4 : fa port map(
           a => a(4),
           b => b(4),
           ci => interCarry(4),
           co => co,
           s => s(4) );

     gen : for j in 3 downto 1 generate
           mod1 : fa port map(
                 a => a(j),
                 b => b(j),
                 ci => interCarry(j),
                 co => interCarry(j+1),
                 s => s(j) );
     end generate;

     mod0 : fa port map(
          a => a(0),
          b => b(0),
          ci => ci,
          co => interCarry(1),
          s => s(0) );

end rtl;