Sei sulla pagina 1di 11

`timescale 1ns / 1ps

module hadder(s,c,a,b);

input a,b;

output s,c;

xor (s,a,b);

and (c,a,b);

endmodule

module fadder(s,c,a,b,c);

input x,y,z;

output s,c;

assign s=x^y^z;

assign c=(x^y)&z|(x&y);

endmodule

module vedic_2_x_2(a,b,c);

input [1:0]a;

input [1:0]b;

output [3:0]c;

wire [3:0]c;

wire [3:0]temp;

//stage 1

// four multiplication operation of bits accourding to vedic logic done using and gates

assign c[0]=a[0]&b[0];

assign temp[0]=a[1]&b[0];

assign temp[1]=a[0]&b[1];

assign temp[2]=a[1]&b[1];
//stage two

// using two half adders

hadder z1(c[1],temp[3],temp[0],temp[1]);

hadder z2(c[2],c[3],temp[2],temp[3]);

endmodule

module add_4_bit(

output [3:0] Sum,

output Cout,

input [3:0] A,B,

input Cin

);

wire c1,c2,c3;

fadder FA1(Sum[0],c1,A[0],B[0],Cin),

FA2(Sum[1],c2,A[1],B[1],c1),

FA3(Sum[2],c3,A[2],B[2],c2),

FA4(Sum[3],Cout,A[3],B[3],c3);

endmodule
module add_6_bit(

output [5:0] Sum,

output Cout,

input [5:0] A,B,

input Cin

);

wire c1,c2,c3,c4,c5;

fadder FA1(Sum[0],c1,A[0],B[0],Cin),

FA2(Sum[1],c2,A[1],B[1],c1),

FA3(Sum[2],c3,A[2],B[2],c2),

FA4(Sum[3],c4,A[3],B[3],c3),

FA4(Sum[4],c5,A[4],B[4],c4),

FA4(Sum[5],Cout,A[5],B[5],c5);

endmodule

module vedic_4_x_4(

a,b,c

);

input [3:0]a;

input [3:0]b;

output [7:0]c;

wire [3:0]q0;

wire [3:0]q1;
wire [3:0]q2;

wire [3:0]q3;

wire [7:0]c;

wire [3:0]temp1;

wire [5:0]temp2;

wire [5:0]temp3;

wire [5:0]temp4;

wire [3:0]q4;

wire [5:0]q5;

wire [5:0]q6;

// using 4 2x2 multipliers

vedic_2_x_2 z1(a[1:0],b[1:0],q0[3:0]);

vedic_2_x_2 z2(a[3:2],b[1:0],q1[3:0]);

vedic_2_x_2 z3(a[1:0],b[3:2],q2[3:0]);

vedic_2_x_2 z4(a[3:2],b[3:2],q3[3:0]);

// stage 1 adders

assign temp1 ={2'b0,q0[3:2]};

add_4_bit z5(q1[3:0],temp1,q4);

assign temp2 ={2'b0,q2[3:0]};

assign temp3 ={q3[3:0],2'b0};

add_6_bit z6(temp2,temp3,q5);

assign temp4={2'b0,q4[3:0]};

// stage 2 adder

add_6_bit z7(temp4,q5,q6);

// fnal output assignment

assign c[1:0]=q0[1:0];

assign c[7:2]=q6[5:0];
endmodule

module add_8_bit(

output [7:0] Sum,

output Cout,

input [7:0] A,B,

input Cin

);

wire c1,c2,c3,c4,c5,c6,c7;

fadder FA1(Sum[0],c1,A[0],B[0],Cin),

FA2(Sum[1],c2,A[1],B[1],c1),

FA3(Sum[2],c3,A[2],B[2],c2),

FA4(Sum[3],c4,A[3],B[3],c3),

FA5(Sum[4],c5,A[4],B[4],c4),

FA6(Sum[5],c6,A[5],B[5],c5),FA7(Sum[6],c7,A[6],B[6],c6),FA8(Sum[7],Cout,A[7],B[7],c7);

endmodule

module add_12_bit(

output [11:0] Sum,

output Cout,

input [11:0] A,B,

input Cin

);
wire c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11;

fadder FA1(Sum[0],c1,A[0],B[0],Cin),

FA2(Sum[1],c2,A[1],B[1],c1),

FA3(Sum[2],c3,A[2],B[2],c2),

FA4(Sum[3],c4,A[3],B[3],c3),

FA5(Sum[4],c5,A[4],B[4],c4),

FA6(Sum[5],c6,A[5],B[5],c5),FA7(Sum[6],c7,A[6],B[6],c6),FA8(Sum[7],c8,A[7],B[7],c7),

FA9(Sum[8],c9,A[8],B[8],c8), FA10(Sum[9],c10,A[9],B[9],c9),
FA11(Sum[10],c11,A[10],B[10],c10),

FA12(Sum[11],Carry,A[11],B[11],c11);

endmodule

module vedic_8X8(a,b,c

);

input [7:0]a;

input [7:0]b;

output [15:0]c;

wire [15:0]q0;

wire [15:0]q1;

wire [15:0]q2;

wire [15:0]q3;

wire [15:0]c;

wire [7:0]temp1;
wire [11:0]temp2;

wire [11:0]temp3;

wire [11:0]temp4;

wire [7:0]q4;

wire [11:0]q5;

wire [11:0]q6;

// using 4 4x4 multipliers

vedic_4_x_4 z1(a[3:0],b[3:0],q0[15:0]);

vedic_4_x_4 z2(a[7:4],b[3:0],q1[15:0]);

vedic_4_x_4 z3(a[3:0],b[7:4],q2[15:0]);

vedic_4_x_4 z4(a[7:4],b[7:4],q3[15:0]);

// stage 1 adders

assign temp1 ={4'b0,q0[7:4]};

add_8_bit z5(q1[7:0],temp1,q4);

assign temp2 ={4'b0,q2[7:0]};

assign temp3 ={q3[7:0],4'b0};

add_12_bit z6(temp2,temp3,q5);

assign temp4={4'b0,q4[7:0]};

// stage 2 adder

add_12_bit z7(temp4,q5,q6);

// fnal output assignment

assign c[3:0]=q0[3:0];

assign c[15:4]=q6[11:0];
endmodule

module add_16_bit(

output [15:0] Sum,

output Cout,

input [15:0] A,B,

input Cin

);

wire c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11,c12,c13,c14,c15;

fadder FA1(Sum[0],c1,A[0],B[0],Cin),

FA2(Sum[1],c2,A[1],B[1],c1),

FA3(Sum[2],c3,A[2],B[2],c2),

FA4(Sum[3],c4,A[3],B[3],c3),

FA5(Sum[4],c5,A[4],B[4],c4),

FA6(Sum[5],c6,A[5],B[5],c5),FA7(Sum[6],c7,A[6],B[6],c6),FA8(Sum[7],c8,A[7],B[7],c7),

FA9(Sum[8],c9,A[8],B[8],c8), FA10(Sum[9],c10,A[9],B[9],c9),
FA11(Sum[10],c11,A[10],B[10],c10),

FA12(Sum[11],c12,A[11],B[11],c11),FA13(Sum[12],c13,A[12],B[12],c12),

FA14(Sum[13],c14,A[13],B[13],c13),FA15(Sum[14],c15,A[14],B[14],c14),

FA16(Sum[15],Carry,A[15],B[15],c15);

endmodule

module add_24_bit(

output [23:0] Sum,

output Cout,
input [23:0] A,B,

input Cin

);

wire c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11,c12,c13,c14,c15,c16,c17,c18,c19,c20,c21,c22,c23;

fadder FA1(Sum[0],c1,A[0],B[0],Cin),

FA2(Sum[1],c2,A[1],B[1],c1),

FA3(Sum[2],c3,A[2],B[2],c2),

FA4(Sum[3],c4,A[3],B[3],c3),

FA5(Sum[4],c5,A[4],B[4],c4),

FA6(Sum[5],c6,A[5],B[5],c5),FA7(Sum[6],c7,A[6],B[6],c6),FA8(Sum[7],c8,A[7],B[7],c7),

FA9(Sum[8],c9,A[8],B[8],c8), FA10(Sum[9],c10,A[9],B[9],c9),
FA11(Sum[10],c11,A[10],B[10],c10),

FA12(Sum[11],c12,A[11],B[11],c11),FA13(Sum[12],c13,A[12],B[12],c12),

FA14(Sum[13],c14,A[13],B[13],c13),FA15(Sum[14],c15,A[14],B[14],c14),

FA16(Sum[15],c16,A[15],B[15],c15),

FA417(Sum[16],c17,A[16],B[16],c16),

FA18(Sum[17],c18,A[17],B[17],c17),

FA19(Sum[18],c19,A[18],B[18],c18),

FA20(Sum[19],c20,A[19],B[19],c19),

FA21(Sum[20],c21,A[20],B[20],c20),

FA22(Sum[21],c22,A[21],B[21],c21),

FA23(Sum[22],c23,A[22],B[22],c22),

FA24(Sum[23],Carry,A[23],B[23],c23) ;

endmodule

module vedic_16x16 (a,b,c);

input [15:0]a;

input [15:0]b;
output [31:0]c;

wire [15:0]q0;

wire [15:0]q1;

wire [15:0]q2;

wire [15:0]q3;

wire [31:0]c;

wire [15:0]temp1;

wire [23:0]temp2;

wire [23:0]temp3;

wire [23:0]temp4;

wire [15:0]q4;

wire [23:0]q5;

wire [23:0]q6;

// using 4 8x8 multipliers

vedic_8X8 z1(a[7:0],b[7:0],q0[15:0]);

vedic_8X8 z2(a[15:8],b[7:0],q1[15:0]);

vedic_8X8 z3(a[7:0],b[15:8],q2[15:0]);

vedic_8X8 z4(a[15:8],b[15:8],q3[15:0]);

// stage 1 adders

assign temp1 ={8'b0,q0[15:8]};

add_16_bit z5(q1[15:0],temp1,q4);

assign temp2 ={8'b0,q2[15:0]};

assign temp3 ={q3[15:0],8'b0};

add_24_bit z6(temp2,temp3,q5);

assign temp4={8'b0,q4[15:0]};
//stage 2 adder

add_24_bit z7(temp4,q5,q6);

// fnal output assignment

assign c[7:0]=q0[7:0];

assign c[31:8]=q6[23:0];

endmodule