You are on page 1of 2

module bcd_1digit_adder(x,y,cin,z,cout);

input [3:0] x,y;


input cin;
output [3:0] z;
output cout;
wire[4:1] ci;
wire[3:1]zi;
wire[1:0]ci2;
fac
fac
fac
fac

i1(.x(x[0]),.y(y[0]),.cin(cin),.z(z[0]),.cout(ci[1]));
i2(.x(x[1]), .y(y[1]), .cin(ci[1]), .z(zi[1]), .cout(ci[2]));
i3(.x(x[2]), .y(y[2]), .cin(ci[2]), .z(zi[2]), .cout(ci[3]));
i4(.x(x[3]), .y(y[3]), .cin(ci[3]), .z(zi[3]), .cout(ci[4]));

assign cout = ci[4] | (zi[3]&zi[2]) | (zi[3]&zi[1]);


hac i5(.x(zi[1]), .y(cout), .z(z[1]), .cout(ci2[0]));
fac i6(.x(zi[2]), .y(cout), .cin(ci2[0]), .z(z[2]), .cout(ci2[1]));
assign z[3] = zi[3]^ci2[1];
endmodule

/*

BCD N DIGIT ADDER */

module bcd_adder(x,y,cin,z,cout);
parameter n=4;
input [4*n-1:0] x,y;
input cin;
output [4*n-1:0] z;
output cout;
wire [n:0] c;
genvar k;
assign c[0]=cin;
generate
for(k=0;k<n;k=k+1) begin:array
bcd_1digit_adder inst(.x(x[4*k+3:4*k]) , .y(y[4*k+3:4*k]) , .cin(c[k]) ,
.z(z[4*k+3:4*k]) , .cout(c[k+1]));
end
endgenerate
assign cout=c[n];
endmodule

You might also like