1. Requirement: write 1-bit full adder module
module add1 ( input a, input b, input cin, output sum, output cout );
2. 想法1:画出真值表,列出逻辑表达式,化简
sum = abc + abc‘ + ab’c+a‘bc;
cout = abc + ab’c‘ + a’b‘c + a’bc‘;
a | b | cin | sum | cout |
1 | 1 | 1 | 1 | 1 |
1 | 1 | 0 | 0 | 1 |
1 | 0 | 0 | 1 | 0 |
1 | 0 | 1 | 0 | 1 |
0 | 1 | 1 | 0 | 1 |
0 | 1 | 0 | 1 | 0 |
0 | 0 | 1 | 1 | 0 |
0 | 0 | 0 | 0 | 0 |
3. 想法2:用两个半加器组合
半加器只有两个input,经过两个add_half组合得到sum,两个进位相或得到最终的进位。
感觉这种方法更好理解些。
module add_half (input a, input b, output sum, output cout);
assign sum = a ^ b;
assign cout = a & b;
endmodule
module add1 ( input a, input b, input cin, output sum, output cout );
wire cout_lo, sum_lo, cout_hi;
add_half add_lo(a, b, sum_lo, cout_lo);
add_half add_hi(cin, sum_lo, sum, cout_hi);
assign cout = cout_lo | cout_hi;
endmodule