verilog 实现8位有符号加法器
一、有符号加法器
对于同一个加法器来说,其实输入无论是有符号数还是无符号数都是可以的。以我之前写的8位二进制加法器:传送门 为例,第一张图我们选radix
是unsigned
,表示无符号加法,第二张图我们选radix
是signed
,表示有符号数,从图中可知结果都是正确的。
假设二进制数是n位,则对于无符号数来说,表示范围是(0,2 ^ n -1)
,对于有符号数,表示的范围是(-2 ^ (n-1),2^(n-1) - 1)
。
二、添加溢出标志的8位有符号加法器
1、RTL代码
module adder_1bit(a,b,cin,sum,cout);
input a,b,cin;
output sum,cout;
sum sum1(a,b,cin,sum);
carry carry1(a,b,cin,cout);
endmodule
module sum(a,b,cin,sum);
input a,b,cin;
output sum;
assign sum=a+b+cin;
endmodule
module carry(a,b,cin,cout);
input a,b,cin;
output cout;
wire [1:0] sum;
assign sum = a+b+cin;
assign cout=sum[1];
endmodule
module adder_8bit(a,b,cin,sum,cout,overflow);
input[7:0] a,b;
input cin;
output[7:0] sum;
output cout,overflow;
wire c1,c2,c3,c4,c5,c6,c7;
adder_1bit u1(a[0],b[0],cin,sum[0],c1);
adder_1bit u2(a[1],b[1],c1,sum[1],c2);
adder_1bit u3(a[2],b[2],c2,sum[2],c3);
adder_1bit u4(a[3],b[3],c3,sum[3],c4);
adder_1bit u5(a[4],b[4],c4,sum[4],c5);
adder_1bit u6(a[5],b[5],c5,sum[5],c6);
adder_1bit u7(a[6],b[6],c6,sum[6],c7);
adder_1bit u8(a[7],b[7],c7,sum[7],cout);
assign overflow = (a[7]&b[7]&~sum[7])|(~a[7]&~b[7]&sum[7]);
endmodule
2、仿真程序
module tb_adder_8bit();
reg signed[7:0] a,b;
reg cin;
wire signed[7:0] sum;
wire cout,overflow;
initial
begin
#400 $finish;
end
initial
begin
a=-1;
b=0;
cin=0;
forever
begin
#5 a=a-3;b=b+1;
end
end
adder_8bit U1(
.a(a),
.b(b),
.cin(cin),
.sum(sum),
.cout(cout),
.overflow(overflow)
);
endmodule
3、仿真结果
可以看到,当计算结果出现异常,也即超出正常范围的时候,溢出标志被置为了1,测试结果是正确的。