verilog 实现8位有符号加法器

一、有符号加法器

对于同一个加法器来说,其实输入无论是有符号数还是无符号数都是可以的。以我之前写的8位二进制加法器:传送门 为例,第一张图我们选radixunsigned,表示无符号加法,第二张图我们选radixsigned,表示有符号数,从图中可知结果都是正确的。

假设二进制数是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,测试结果是正确的。

posted @ 2020-10-03 22:29  耐心的小黑  阅读(986)  评论(0编辑  收藏  举报