m.E vlsi lab
m.E vlsi lab
`timescale 1ns/100ps
module MAC_UNIT(clk,rst,a,b,z);
input clk,rst;
input [15:0] a,b;
output [31:0] z;
wire [31:0] w,x;
wire ci,co;
vedic_16x16 U1(.a(a),.b(b),.result(w));
brent_kung_adder U2(.A(w),.B(z),.Ci(ci),.S(x),.Co(co));
pipo U3(.din(x), .clk(clk),.rst(rst),.dout(z));
endmodule
//VERILOG CODE FOR 16-BIT VEDIC MULTIPLIER:
endmodule
endmodule
endmodule
wire [3:0] w;
assign result[0]= a[0]&b[0];
assign w[0] = a[1]&b[0];
assign w[1] = a[0]&b[1];
assign w[2] = a[1]&b[1];
endmodule
module halfAdder(a,b,sum,carry);
input a,b;
output sum, carry;
assign sum = a ^ b;
assign carry = a & b;
endmodule
module adder4(a,b,sum);
assign sum = a + b;
endmodule
module adder6(a,b,sum);
assign sum = a + b;
endmodule
module adder8(a,b,sum);
assign sum = a + b;
endmodule
module adder12(a,b,sum);
endmodule
module adder16(a,b,sum);
assign sum = a + b;
endmodule
module adder24(a,b,sum);
assign sum = a + b;
endmodule
module brent_kung_adder(
input [31:0] A, B,
input Ci,
output [31:0] S,
output Co
// output [15:0] G2,P2,
// output [7:0] G3, P3,
// output [3:0] G4,P4,
// output [1:0] G5,P5
);
wire [31:0] P1, G1;
wire [32:1] C;
wire [15:0] G2,P2;
wire [7:0] G3, P3;
wire [3:0] G4,P4;
wire [1:0] G5,P5;
wire G6, P6;
//////// Generating carry which can be calculated directly from input carry /////
assign C[1] = G1[0] | (P1[0] & Ci);
assign C[2] = G2[0] | (P2[0] & Ci);
assign C[4] = G3[0] | (P3[0] & Ci);
assign C[8] = G4[0] | (P4[0] & Ci);
assign C[16] = G5[0] | (P5[0] & Ci);
assign C[32] = G6 | (P6 & Ci);
///////////////////////
assign S = P1 ^ {C[31:1],Ci};
assign Co = C[32];
endmodule
module pipo(din,clk,rst,dout);
input [31:0] din;
input clk,rst;
output [31:0] dout;
wire [31:0] din;
wire clk,rst;
reg [31:0] dout;
always @(posedge clk or negedge rst)
begin
if(!rst)
begin
dout <= 32'b0;
end
else
begin
dout <= din;
end
end
endmodule
RESULT: