Download as pdf or txt
Download as pdf or txt
You are on page 1of 6

EE671 Project:

Multiply and Accumulate

Aayush Shrivastava
19D070002
05/09/2022

Question 1)

Dadda Algorithm for 16-bit MAC

Code file:

library ieee;
use ieee.std_logic_1164.all;
library work;
use work.Gates.all;
entity mac_8bit is

port (A,B: in std_logic_vector(7 downto 0);


C: in std_logic_vector(15 downto 0);
mac_out : out std_logic_vector(15 downto 0)
);

end entity mac_8bit;


architecture Struct of mac_8bit is

type dataout1 is array (7 downto 0,7 downto 0) of std_logic;


signal matrix1 : dataout1 := (others=>'0');

type dataout2 is array (8 downto 0,15 downto 0) of std_logic;


signal matrix2 : dataout2 := (others=>'0');

type dataout3 is array (5 downto 0,15 downto 0) of std_logic;


signal matrix3 : dataout3 := (others=>'0');

type dataout4 is array (3 downto 0,15 downto 0) of std_logic;


signal matrix4 : dataout4 := (others=>'0');

type dataout5 is array (2 downto 0,15 downto 0) of std_logic;


signal matrix5 : dataout5 := (others=>'0');

type dataout6 is array (1 downto 0,15 downto 0) of std_logic;


signal matrix6 : dataout6 := (others=>'0');

signal coutbuf: std_logic;


signal a1,b1: std_logic_vector(15 downto 0);

begin

--generating partial products

lp1 : for i in 0 to 7 generate


lp2 : for j in 0 to 7 generate
l1: andgate port map (A => A(j), B => B(i), prod => matrix1(i,j));
end generate;
end generate;

---weight 9

stg1: for i in 0 to 15 generate


matrix2(0,i) <= C(i);
end generate;

stg2: for i in 0 to 7 generate


matrix2(1,i) <= matrix1(0,i);
matrix2(2,i+1) <= matrix1(1,i);
matrix2(3,i+2) <= matrix1(2,i);
matrix2(4,i+3) <= matrix1(3,i);
matrix2(5,i+4) <= matrix1(4,i);
matrix2(6,i+5) <= matrix1(5,i);
matrix2(7,i+6) <= matrix1(6,i);
matrix2(8,i+7) <= matrix1(7,i);
end generate;

--first reduction weight 6--------------------------------------------------


stg3: for i in 0 to 5 generate
matrix3(i,0) <= matrix2(i,0);
matrix3(i,1) <= matrix2(i,1);
matrix3(i,2) <= matrix2(i,2);
matrix3(i,3) <= matrix2(i,3);
matrix3(i,4) <= matrix2(i,4);
end generate;

matrix3(0,5) <= matrix2(0,5);


matrix3(1,5) <= matrix2(1,5);
matrix3(2,5) <= matrix2(2,5);
matrix3(3,5) <= matrix2(3,5);
matrix3(4,5) <= matrix2(4,5);
x1: half_add port map (A=>matrix2(5,5), B=>matrix2(6,5), sum=>matrix3(5,5), cout=>matrix3(3,6));

matrix3(0,6) <= matrix2(0,6);


matrix3(1,6) <= matrix2(1,6);
matrix3(2,6) <= matrix2(2,6);
x2: full_add port map (A=>matrix2(3,6), B=>matrix2(4,6), C=>matrix2(5,6), sum=>matrix3(4,6), cout=>matrix3(0,7));
x3: half_add port map (A=>matrix2(6,6), B=>matrix2(7,6), sum=>matrix3(5,6), cout=>matrix3(1,7));

matrix3(2,7) <= matrix2(0,7);


x4: full_add port map (A=>matrix2(1,7), B=>matrix2(2,7), C=>matrix2(3,7), sum=>matrix3(3,7), cout=>matrix3(0,8));
x5: full_add port map (A=>matrix2(4,7), B=>matrix2(5,7), C=>matrix2(6,7), sum=>matrix3(4,7), cout=>matrix3(1,8));
x6: half_add port map (A=>matrix2(7,7), B=>matrix2(8,7), sum=>matrix3(5,7), cout=>matrix3(2,8));

x7: full_add port map (A=>matrix2(0,8), B=>matrix2(2,8), C=>matrix2(3,8), sum=>matrix3(3,8), cout=>matrix3(0,9));


x8: full_add port map (A=>matrix2(4,8), B=>matrix2(5,8), C=>matrix2(6,8), sum=>matrix3(4,8), cout=>matrix3(1,9));
x9: half_add port map (A=>matrix2(7,8), B=>matrix2(8,8), sum=>matrix3(5,8), cout=>matrix3(2,9));

matrix3(3,9) <= matrix2(0,9);


x10: full_add port map (A=>matrix2(3,9), B=>matrix2(4,9), C=>matrix2(5,9), sum=>matrix3(4,9), cout=>matrix3(0,10));
x11: full_add port map (A=>matrix2(6,9), B=>matrix2(7,9), C=>matrix2(8,9), sum=>matrix3(5,9), cout=>matrix3(1,10));

matrix3(2,10) <= matrix2(0,10);


matrix3(3,10) <= matrix2(4,10);
matrix3(4,10) <= matrix2(5,10);
x12: full_add port map (A=>matrix2(6,9), B=>matrix2(7,9), C=>matrix2(8,9), sum=>matrix3(4,9), cout=>matrix3(0,10));

matrix3(1,11) <= matrix2(0,11);


matrix3(2,11) <= matrix2(5,11);
matrix3(3,11) <= matrix2(6,11);
matrix3(4,11) <= matrix2(7,11);
matrix3(5,11) <= matrix2(8,11);

matrix3(0,12) <= matrix2(0,12);


matrix3(1,12) <= matrix2(6,12);
matrix3(2,12) <= matrix2(7,12);
matrix3(3,12) <= matrix2(8,12);

matrix3(0,13) <= matrix2(0,13);


matrix3(1,13) <= matrix2(7,13);
matrix3(2,13) <= matrix2(8,13);

matrix3(0,14) <= matrix2(0,14);


matrix3(1,14) <= matrix2(8,14);

matrix3(0,15) <= matrix2(0,15);

--second reduction weight 4--------------------------------------------------

stg4: for i in 0 to 3 generate


matrix4(i,0) <= matrix3(i,0);
matrix4(i,1) <= matrix3(i,1);
matrix4(i,2) <= matrix3(i,2);
end generate;

matrix4(0,3) <= matrix3(0,3);


matrix4(1,3) <= matrix3(1,3);
matrix4(2,3) <= matrix3(2,3);
x21: half_add port map (A=>matrix3(3,3), B=>matrix3(4,3), sum=>matrix4(3,3), cout=>matrix4(0,4));

matrix4(1,4) <= matrix3(0,4);


x22: full_add port map (A=>matrix3(1,4), B=>matrix3(2,4), C=>matrix3(3,4), sum=>matrix4(2,4), cout=>matrix4(0,5));
x23: half_add port map (A=>matrix3(4,4), B=>matrix3(5,4), sum=>matrix4(3,4), cout=>matrix4(1,5));

x24: full_add port map (A=>matrix3(0,5), B=>matrix3(1,5), C=>matrix3(2,5), sum=>matrix4(2,5), cout=>matrix4(0,6));


x25: full_add port map (A=>matrix3(3,5), B=>matrix3(4,5), C=>matrix3(5,5), sum=>matrix4(3,5), cout=>matrix4(1,6));

x26: full_add port map (A=>matrix3(0,6), B=>matrix3(1,6), C=>matrix3(2,6), sum=>matrix4(2,6), cout=>matrix4(0,7));


x27: full_add port map (A=>matrix3(3,6), B=>matrix3(4,6), C=>matrix3(5,6), sum=>matrix4(3,6), cout=>matrix4(1,7));

x28: full_add port map (A=>matrix3(0,7), B=>matrix3(1,7), C=>matrix3(2,7), sum=>matrix4(2,7), cout=>matrix4(0,8));


x29: full_add port map (A=>matrix3(3,7), B=>matrix3(4,7), C=>matrix3(5,7), sum=>matrix4(3,7), cout=>matrix4(1,8));

x30: full_add port map (A=>matrix3(0,8), B=>matrix3(1,8), C=>matrix3(2,8), sum=>matrix4(2,8), cout=>matrix4(0,9));


x31: full_add port map (A=>matrix3(3,8), B=>matrix3(4,8), C=>matrix3(5,8), sum=>matrix4(3,8), cout=>matrix4(1,9));

x32: full_add port map (A=>matrix3(0,9), B=>matrix3(1,9), C=>matrix3(2,9), sum=>matrix4(2,9), cout=>matrix4(0,10));


x33: full_add port map (A=>matrix3(3,9), B=>matrix3(4,9), C=>matrix3(5,9), sum=>matrix4(3,9), cout=>matrix4(1,10));

x34: full_add port map (A=>matrix3(0,10), B=>matrix3(1,10), C=>matrix3(2,10), sum=>matrix4(2,10), cout=>matrix4(0,11));


x35: full_add port map (A=>matrix3(3,10), B=>matrix3(4,10), C=>matrix3(5,10), sum=>matrix4(3,10), cout=>matrix4(1,11));

x36: full_add port map (A=>matrix3(0,11), B=>matrix3(1,11), C=>matrix3(2,11), sum=>matrix4(2,11), cout=>matrix4(0,12));


x37: full_add port map (A=>matrix3(3,11), B=>matrix3(4,11), C=>matrix3(5,11), sum=>matrix4(3,11), cout=>matrix4(1,12));

matrix4(2,12) <= matrix3(0,12);


x38: full_add port map (A=>matrix3(1,12), B=>matrix3(2,12), C=>matrix3(3,12), sum=>matrix4(3,12), cout=>matrix4(0,13));

matrix4(1,13) <= matrix3(0,13);


matrix4(2,13) <= matrix3(1,13);
matrix4(3,13) <= matrix3(2,13);

matrix4(0,14) <= matrix3(0,14);


matrix4(1,14) <= matrix3(1,14);
matrix4(0,15) <= matrix3(0,15);

--third reduction weight 3--------------------------------------------------

stg4: for i in 0 to 2 generate


matrix5(i,0) <= matrix4(i,0);
matrix5(i,1) <= matrix4(i,1);
end generate;

matrix5(0,3) <= matrix4(0,3);


matrix5(1,3) <= matrix4(1,3);
x41: half_add port map (A=>matrix4(2,3), B=>matrix3(3,3), sum=>matrix5(2,3), cout=>matrix5(0,4));

matrix5(1,4) <= matrix4(0,4);


x42: full_add port map (A=>matrix4(1,4), B=>matrix4(2,4), C=>matrix4(3,4), sum=>matrix5(2,4), cout=>matrix5(0,5));

matrix5(1,5) <= matrix4(0,5);


x1: full_add port map (A=>matrix4(1,5), B=>matrix4(2,5), C=>matrix4(3,5), sum=>matrix5(2,5), cout=>matrix5(0,6));

matrix5(1,6) <= matrix4(0,6);


x43: full_add port map (A=>matrix4(1,6), B=>matrix4(2,6), C=>matrix4(3,6), sum=>matrix5(2,6), cout=>matrix5(0,7));

matrix5(1,7) <= matrix4(0,7);


x44: full_add port map (A=>matrix4(1,7), B=>matrix4(2,7), C=>matrix4(3,7), sum=>matrix5(2,7), cout=>matrix5(0,8));

matrix5(1,8) <= matrix4(0,8);


x45: full_add port map (A=>matrix4(1,8), B=>matrix4(2,8), C=>matrix4(3,8), sum=>matrix5(2,8), cout=>matrix5(0,9));

matrix5(1,9) <= matrix4(0,9);


x46: full_add port map (A=>matrix4(1,9), B=>matrix4(2,9), C=>matrix4(3,9), sum=>matrix5(2,9), cout=>matrix5(0,10));

matrix5(1,10) <= matrix4(0,10);


x47: full_add port map (A=>matrix4(1,10), B=>matrix4(2,10), C=>matrix4(3,10), sum=>matrix5(2,10), cout=>matrix5(0,11));

matrix5(1,11) <= matrix4(0,11);


x48: full_add port map (A=>matrix4(1,11), B=>matrix4(2,11), C=>matrix4(3,11), sum=>matrix5(2,11), cout=>matrix5(0,12));

matrix5(1,12) <= matrix4(0,12);


x49: full_add port map (A=>matrix4(1,12), B=>matrix4(2,12), C=>matrix4(3,12), sum=>matrix5(2,12), cout=>matrix5(0,13));

matrix5(1,13) <= matrix4(0,13);


x50: full_add port map (A=>matrix4(1,13), B=>matrix4(2,13), C=>matrix4(3,13), sum=>matrix5(2,13), cout=>matrix5(0,14));

matrix5(1,14) <= matrix4(0,14);


matrix5(2,14) <= matrix4(1,14);

matrix5(0,15) <= matrix4(0,15);

--fourthreduction weight 2--------------------------------------------------

matrix6(0,0) <= matrix5(0,0);


matrix6(1,0) <= matrix5(1,0);
matrix6(1,1) <= matrix5(2,1);
x51: half_add port map (A=>matrix5(0,1), B=>matrix5(1,1), sum=>matrix6(0,1), cout=>matrix6(0,2));

x52: full_add port map (A=>matrix5(0,2), B=>matrix5(1,2), C=>matrix5(2,2), sum=>matrix6(1,2), cout=>matrix6(0,3));

x53: full_add port map (A=>matrix5(0,3), B=>matrix5(1,3), C=>matrix5(2,3), sum=>matrix6(1,3), cout=>matrix6(0,4));

x54: full_add port map (A=>matrix5(0,4), B=>matrix5(1,4), C=>matrix5(2,4), sum=>matrix6(1,4), cout=>matrix6(0,5));

x55: full_add port map (A=>matrix5(0,5), B=>matrix5(1,5), C=>matrix5(2,5), sum=>matrix6(1,5), cout=>matrix6(0,6));

x56: full_add port map (A=>matrix5(0,6), B=>matrix5(1,6), C=>matrix5(2,6), sum=>matrix6(1,6), cout=>matrix6(0,7));

x57: full_add port map (A=>matrix5(0,7), B=>matrix5(1,7), C=>matrix5(2,7), sum=>matrix6(1,7), cout=>matrix6(0,8));

x58: full_add port map (A=>matrix5(0,8), B=>matrix5(1,8), C=>matrix5(2,8), sum=>matrix6(1,8), cout=>matrix6(0,9));

x59: full_add port map (A=>matrix5(0,9), B=>matrix5(1,9), C=>matrix5(2,9), sum=>matrix6(1,9), cout=>matrix6(0,10));

x60: full_add port map (A=>matrix5(0,10), B=>matrix5(1,10), C=>matrix5(2,10), sum=>matrix6(1,10), cout=>matrix6(0,11));

x61: full_add port map (A=>matrix5(0,11), B=>matrix5(1,11), C=>matrix5(2,11), sum=>matrix6(1,11), cout=>matrix6(0,12));

x62: full_add port map (A=>matrix5(0,12), B=>matrix5(1,12), C=>matrix5(2,12), sum=>matrix6(1,12), cout=>matrix6(0,13));

x63: full_add port map (A=>matrix5(0,13), B=>matrix5(1,13), C=>matrix5(2,13), sum=>matrix6(1,13), cout=>matrix6(0,14));

x64: full_add port map (A=>matrix5(0,14), B=>matrix5(1,14), C=>matrix5(2,14), sum=>matrix6(1,14), cout=>matrix6(0,15));

matrix6(1,15) <= matrix5(0,15);

stg454: for i in 0 to 15 generate


a1(i) <= matrix6(0,i);
b1(i) <= matrix6(1,i);
end generate;
------------------------------------------------------------------
--final stage, logarithmic adder

fstage: adder port map (A=>a1, B=>b1, Cin=>'0', Sum=>mac_out, Cout=>coutbuf);


end Struct;

You might also like