Half adder
创建一个半加法器。半加器将两位相加(没有进位)并产生和和进位。
Create a half adder. A half adder adds two bits (with no carry-in) and produces a sum and carry-out.
module top_module(
input a, b,
output cout, sum );
assign cout = a&b;
assign sum = a^b;
endmodule
思路解析:sum作为保存和的数,cout作为保存进位的数 ,计算表如下:
a b cout sum
1 1 1 0 此时需要进位
0 1 0 1
1 0 0 1
0 0 0 0
Full adder
Create a full adder. A full adder adds three bits (including carry-in) and produces a sum and carry-out..
思路:三个数相加,其中的某个bit位中,若三个数的那个bit位全为1,则sum为1,cout也为1。
a b cin cout sum
1 1 1 1 1 此时需要进位
0 1 1 1 0
1 0 1 1 0
0 0 1 0 1
分析真值表逻辑 得以下关系式: sum = a^b^cin;
cout = (a&b)|(b&cin)|(a&cin);
再利用assign赋值语句即可
signed addition overflow
假设您有两个 8 位 的补码,a[7:0] 和 b[7:0]。这些数字相加产生 s[7:0]。还要计算是否发生了(有符号的)溢出。
计算相加直接 assign s = a+ b
计算判断是不是有溢出,看最高位,如果a[7] b[7]同时为1,说明两个数都为负数,相加最后s[7]却为0,符号位反而变成了正数,说明有溢出;如果a[7] b[7]同时为0,说明两个数都为正数,相加最后s[7]却为1,符号位反而变成了负数,说明有溢出
assign overflow = (a[7] &b[7]&~s[7])|(~a[7] &~b[7]&s[7])