题解 | #串行进位加法器#
串行进位加法器
https://www.nowcoder.com/practice/83c5850805004b6d8c48742f582f304a
`timescale 1ns/1ns
module add_4(
input [3:0] A ,
input [3:0] B ,
input Ci ,
output wire [3:0] S ,
output wire Co
);
wire C0;//第一个全加器的进位
wire C1;//第二个全加器的进位
wire C2;//第三个全加器的进位
//A[0]+B[0]+Ci
add_full add_full_0(
.A(A[0]),
.B(B[0]),
.Ci(Ci),
.S(S[0]),
.Co(C0)
);
//A[1]+B[1]+C0
add_full add_full_1(
.A(A[1]),
.B(B[1]),
.Ci(C0),
.S(S[1]),
.Co(C1)
);
//A[2]+B[2]+C1
add_full add_full_2(
.A(A[2]),
.B(B[2]),
.Ci(C1),
.S(S[2]),
.Co(C2)
);
//A[3]+B[3]+C2
add_full add_full_3(
.A(A[3]),
.B(B[3]),
.Ci(C2),
.S(S[3]),
.Co(Co)
);
endmodule
/*****************************一位半加器*********************************************/
module add_half(
input A ,
input B ,
output wire S ,
output wire C
);
assign S = A ^ B;
assign C = A & B;
endmodule
/*************************一位全加器**************************************/
module add_full(
input A ,
input B ,
input Ci ,
output wire S ,
output wire Co
);
wire c_1;
wire c_2;
wire sum_1;
add_half add_half_1(
.A (A),
.B (B),
.S (sum_1),
.C (c_1)
);
add_half add_half_2(
.A (sum_1),
.B (Ci),
.S (S),
.C (c_2)
);
assign Co = c_1 | c_2;
endmodule