Conditional sum adder01. Mar '14
Conditional sum adder attempts to calculate both results simultanously. Multiplexers are used to choose the right result.
library ieee;
use ieee.std_logic_1164.all;
entity conditonal_sum_adder is
port (
a : in std_logic_vector (7 downto 0);
b : in std_logic_vector (7 downto 0);
s : out std_logic_vector (7 downto 0));
end conditonal_sum_adder;
architecture behavioral of conditonal_sum_adder is
-- Carries
signal c0 : std_logic_vector(7 downto 0);
signal c1 : std_logic_vector(7 downto 0);
signal d0 : std_logic_vector(3 downto 0);
signal d1 : std_logic_vector(3 downto 0);
signal e0 : std_logic_vector(1 downto 0);
signal e1 : std_logic_vector(1 downto 0);
-- Sums
signal s0 : std_logic_vector(7 downto 1);
signal s1 : std_logic_vector(7 downto 1);
signal t0 : std_logic_vector(7 downto 0);
signal t1 : std_logic_vector(7 downto 0);
signal u0 : std_logic_vector(4 downto 0);
signal u1 : std_logic_vector(4 downto 0);
signal v : std_logic_vector(4 downto 0);
begin
-- Result generators
s(0) <= a(0) xor b(0);
c0(0) <= a(0) and b(0);
c1(0) <= c0(0);
rg_loop: for i in 1 to 7 generate
s0(i) <= a(i) xor b(i);
s1(i) <= not s0(i);
c0(i) <= a(i) and b(i);
c1(i) <= a(i) or b(i);
end generate;
-- First stage carry selectors
d1(3) <= (c1(6) and c1(7)) or (not c1(6) and c0(7));
d0(3) <= (c0(6) and c1(7)) or (not c0(6) and c0(7));
d1(2) <= (c1(4) and c1(5)) or (not c1(4) and c0(5));
d0(2) <= (c0(4) and c1(5)) or (not c0(4) and c0(5));
d1(1) <= (c1(2) and c1(3)) or (not c1(2) and c0(3));
d0(1) <= (c0(2) and c1(3)) or (not c0(2) and c0(3));
d1(0) <= (c1(0) and c1(1)) or (not c1(0) and c0(1));
d0(0) <= (c0(0) and c1(1)) or (not c0(0) and c0(1));
-- Second stage carry selectors
e1(1) <= (d1(2) and d1(3)) or (not d1(2) and d0(3));
e0(1) <= (d0(2) and d1(3)) or (not d0(2) and d0(3));
e1(0) <= (d1(0) and d1(1)) or (not d1(0) and d0(1));
e0(0) <= (d0(0) and d1(1)) or (not d0(0) and d0(1));
-- First stage sum selectors
t1(3) <= (c1(6) and s1(7)) or (not c1(6) and s0(7));
t0(3) <= (c0(6) and s1(7)) or (not c0(6) and s0(7));
t1(2) <= (c1(4) and s1(5)) or (not c1(4) and s0(5));
t0(2) <= (c0(4) and s1(5)) or (not c0(4) and s0(5));
t1(1) <= (c1(2) and s1(3)) or (not c1(2) and s0(3));
t0(1) <= (c0(2) and s1(3)) or (not c0(2) and s0(3));
t1(0) <= (c1(0) and s1(1)) or (not c1(0) and s0(1));
s(1) <= (c0(0) and s1(1)) or (not c0(0) and s0(1));
-- Second stage sum selectors
u1(3) <= (d1(2) and t1(3)) or (not d1(2) and t0(3));
u0(3) <= (d0(2) and t1(3)) or (not d0(2) and t0(3));
u1(2) <= (d1(2) and s1(6)) or (not d1(2) and s0(6));
u0(2) <= (d0(2) and s1(6)) or (not d0(2) and s0(6));
s(3) <= (d0(0) and t1(1)) or (not d0(0) and t0(1));
s(2) <= (d0(0) and s1(2)) or (not d0(0) and s0(2));
-- Third stage sum selectors
s(7) <= (e0(0) and u1(3)) or (not e0(0) and u0(3));
s(6) <= (e0(0) and u1(2)) or (not e0(0) and u0(2));
s(5) <= (e0(0) and t1(2)) or (not e0(0) and t0(2));
s(4) <= (e0(0) and s1(4)) or (not e0(0) and s0(4));
end behavioral;
Metrics for Xilinx Spartan 3E XC3S500E:
Latency of critical path: 8.419ns
Number of inputs: 16 (2x 8-bit operands)
Number of outputs: 8 (8-bit sum)
Number of 4-input LUTs: 14
This approach yields higher area but better latency:
Pad to Pad
---------------+---------------+---------+
Source Pad |Destination Pad| Delay |
---------------+---------------+---------+
a<0> |s<0> | 4.830|
a<0> |s<1> | 4.830|
a<0> |s<2> | 5.542|
a<0> |s<3> | 6.254|
a<0> |s<4> | 6.966|
a<0> |s<5> | 7.678|
a<0> |s<6> | 8.390|
a<0> |s<7> | 8.419|
a<1> |s<1> | 4.830|
a<1> |s<2> | 5.542|
a<1> |s<3> | 6.254|
a<1> |s<4> | 6.966|
a<1> |s<5> | 7.678|
a<1> |s<6> | 8.390|
a<1> |s<7> | 8.419|
a<2> |s<2> | 4.830|
a<2> |s<3> | 5.542|
a<2> |s<4> | 6.254|
a<2> |s<5> | 6.966|
a<2> |s<6> | 7.678|
a<2> |s<7> | 7.707|
a<3> |s<3> | 4.830|
a<3> |s<4> | 5.542|
a<3> |s<5> | 6.254|
a<3> |s<6> | 6.966|
a<3> |s<7> | 6.995|
a<4> |s<4> | 4.830|
a<4> |s<5> | 5.542|
a<4> |s<6> | 6.254|
a<4> |s<7> | 6.283|
a<5> |s<5> | 4.830|
a<5> |s<6> | 5.542|
a<5> |s<7> | 5.571|
a<6> |s<6> | 4.830|
a<6> |s<7> | 5.108|
a<7> |s<7> | 5.108|
b<0> |s<0> | 4.830|
b<0> |s<1> | 4.830|
b<0> |s<2> | 5.542|
b<0> |s<3> | 6.254|
b<0> |s<4> | 6.966|
b<0> |s<5> | 7.678|
b<0> |s<6> | 8.390|
b<0> |s<7> | 8.419|
b<1> |s<1> | 4.830|
b<1> |s<2> | 5.542|
b<1> |s<3> | 6.254|
b<1> |s<4> | 6.966|
b<1> |s<5> | 7.678|
b<1> |s<6> | 8.390|
b<1> |s<7> | 8.419|
b<2> |s<2> | 4.830|
b<2> |s<3> | 5.542|
b<2> |s<4> | 6.254|
b<2> |s<5> | 6.966|
b<2> |s<6> | 7.678|
b<2> |s<7> | 7.707|
b<3> |s<3> | 4.830|
b<3> |s<4> | 5.542|
b<3> |s<5> | 6.254|
b<3> |s<6> | 6.966|
b<3> |s<7> | 6.995|
b<4> |s<4> | 4.830|
b<4> |s<5> | 5.542|
b<4> |s<6> | 6.254|
b<4> |s<7> | 6.283|
b<5> |s<5> | 4.830|
b<5> |s<6> | 5.542|
b<5> |s<7> | 5.571|
b<6> |s<6> | 4.830|
b<6> |s<7> | 5.108|
b<7> |s<7> | 5.108|
---------------+---------------+---------+