题解 | #全加器#
全加器
https://www.nowcoder.com/practice/d04c046febb74e72949baee9aa99d958
对于半加器,只有输入a,b,输出和进位表示为:
S=a^b; ①
C=a&b; ②
全加器,在a,b的基础上增加了进位ci输入:
S=a^b^ci; ③
C=a&b+ci(a^b);④
先将全加器中的a,b放入半加器中例化,将输入分别代入①②得到:
S1=a^b; ⑤
C1=a&b; ⑥
接下来将S1和Ci放入半加器进行例化,将输入分别代入①②得到:
S2=S1^ci=a^b^ci; ⑦
C2=S1&ci=(a^b)&ci; ⑧
⑦⑧为例化两次的输出,③④是真正全加器的输出,③和⑦完全相等,因此例化两次后的输出可以作为全加器的输出;
⑧是全加器④的后半部分,还需要加上⑥,才组成一个完整的全加器进位输出,这就是为什么最后C需要把前两次的进位结果或在一起;
`timescale 1ns/1ns
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 s1;
wire c1;
wire s2;
wire c2;
add_half u1(
.A(A),
.B(B),
.S(s1),
.C(c1)
);
add_half u2(
.A(s1),
.B(Ci),
.S(s2),
.C(c2)
);
assign S=s2;
assign Co=c1|c2;
endmodule
