经典加法器Verilog实现

简介

加法器是数字系统最基础的计算单元,用来产生两个数的和,加法器是以二进制做运算,负数是用二进制的补码来表示计算的,减法器也是加法器。

8bite并行加法器

并行加法器就是利用多个全加器实现两个操作数各位同时相加,并行加法器中全加器的个数与操作数的位数相同,常用的并行加法器有行波进位加法器,超前进位加法器,进位选择加法器,容易实现,运算速度快,但是资源耗的多

Verilog代码

module parallel_adder(
    input [7:0] din_a ,     //data in a
    input [7:0] din_b ,     //data in b
    input        cin  ,     //carry in 
    output wire [ 7:0] sum ,    //sum
    output wire cout           // carry out 
);
assign {cout , sum } = din_a + din_b +cin ;
endmodule

8 bit超前进位加法器

超前进位加法器是由全加器发展而来,目的提高运算速度,当加法器的级数提高时,高位的进位信号需要从低级逐级传递,为了缩短这个时间,我们可以从低级的输入信号确定一个组合逻辑电路,唯一确定一个高位的进位信号,从而提高运行速度,超前进位加法器也称为快速进位加法器,目的是缩短进位信号的生成时间

4bit全加器原理图

 从图中可以很好的理解加法器的组成,但是等下一级将进位计算完成传递上来,每一位都这样计算,需要时间很长。所以我们可以想可不可以不等后级把进位算完再传过来,我们直接通过输入的数据把这个进位直接算出来发给每一级不就好了。我们看看怎么实现这样的想法.

简单的一级加法器的进位信号的计算方式:

 4级的加法器进位信息如下:

module Carry_Look_ahead_adder (
	input [7:0] 		din_a 	,    	// data in a
	input [7:0] 		din_b 	, 		// data in b
	input 				cin 	, 	 	// carry in 
	output  wire 		cout 	, 		// carry out 
	output 	wire [7:0]	sum 			// summation of a ,b
);

wire [7:0]	G  	;
wire [7:0]	P 	;
wire [7:0] 	C 	;


assign G[0] 	= din_a[0] & din_b[0]	;		//bit 0
assign P[0]		= din_a[0] | din_b[0]	;
assign C[0]		= cin 					;
assign sum[0]	= G[0] ^ P[0] ^ C[0]	;


assign G[1] 	= din_a[1] & din_b[1]	;		//bit 1
assign P[1]		= din_a[1] | din_b[1]	;
assign C[1]		= G[0] | (P[0] & cin) 	;
assign sum[1]	= G[1] ^ P[1] ^ C[1]	;


assign G[2] 	= din_a[2] & din_b[2]	;		//bit 2
assign P[2]		= din_a[2] | din_b[2]	;
assign C[2]		= G[1] | (P[1] & C[1]) 	;
assign sum[2]	= G[2] ^ P[2] ^ C[2]	;


assign G[3] 	= din_a[3] & din_b[3]	;		//bit 3
assign P[3]		= din_a[3] | din_b[3]	;
assign C[3]		= G[2] | (P[2] & C[2]) 	;
assign sum[3]	= G[3] ^ P[3] ^ C[3]	;

assign G[4] 	= din_a[4] & din_b[4]	;		//bit 4
assign P[4]		= din_a[4] | din_b[4]	;
assign C[4]		= G[3] | (P[3] & C[3]) 	;
assign sum[4]	= G[4] ^ P[4] ^ C[4]	;


assign G[5] 	= din_a[5] & din_b[5]	;		//bit 5
assign P[5]		= din_a[5] | din_b[5]	;
assign C[5]		= G[4] | (P[4] & C[4]) 	;
assign sum[5]	= G[5] ^ P[5] ^ C[5]	;


assign G[6] 	= din_a[6] & din_b[6]	;		//bit 6
assign P[6]		= din_a[6] | din_b[6]	;
assign C[6]		= G[5] | (P[5] & C[5]) 	;
assign sum[6]	= G[6] ^ P[6] ^ C[6]	;

assign G[7] 	= din_a[7] & din_b[7]	;		//bit 7
assign P[7]		= din_a[7] | din_b[7]	;
assign C[7]		= G[6] | (P[6] & C[6]) 	;
assign sum[7]	= G[7] ^ P[7] ^ C[7]	;

assign cout = G[7] | (P[7] & C[7])		;
endmodule 

8bit流水线加法器

流水线设计可以调高效率

Verilog代码


module Pipeline_adder (
	input [7:0]			din_a		,   // data in a
	input [7:0]			din_b		, 	// data in b
	input 				cin 		,	// Carry in
	input 				clk 		,	// Clock
	output 	reg [7:0]	sum 		,	// Sum
	output	reg 		cout 			// Carry out	
);

	reg 	[7:0]	a_t ;
	reg 	[7:0]	b_t ;

//carry in & out
	reg 	ci_t 	;
	reg 	p1co 	;
	reg 	p2co 	;
	reg 	p3co 	;

	reg [5:0]	p1a ;
	reg [5:0]	p1b ;
	reg [1:0] 	p1s ;

	reg [3:0]	p2a ;
	reg [3:0] 	p2b ;
	reg [3:0]	p2s ;

	reg [1:0] 	p3a ;
	reg [1:0]	p3b ;
	reg [5:0]	p3s ;


always@(posedge clk) begin
		a_t 	<=   din_a 	;
		b_t 	<= 	 din_b 	;
		ci_t 	<=	 cin 	;
end


always@(posedge  clk )	begin
	{p1co,p1s}  <= a_t[1:0]	+ b_t[1:0] + ci_t	;
	p1a 		<= a_t[7:2]	;
	p1b 		<= b_t[7:2]	;
end


always@(posedge  clk )	begin
	{p2co,p2s}  <= p1a[1:0]	+ p1b[1:0] + p1co + p1s	;
	p2a 		<= p1a[5:2]	;
	p2b 		<= p1b[5:2]	;
end

always@(posedge  clk )	begin
	{p3co,p3s}  <= p2a[1:0]	+ p2b[1:0] + p2co + p2s	;
	p3a 		<= p1a[3:2]	;
	p3b 		<= p1b[3:2]	;
end

always@(posedge  clk )	begin
	{cout,sum}		<=	p3a[1:0] + p3b[1:0]	+ p3co + p3s ;
end

endmodule 

8bit级联加法器

级联加法器的结构简单,N位级联加法器的延时是一位全加器的N倍,延时主要是由于进位信号级联造成的,避免在高新能要求设计中使用。


// -----------------------------------------------------------------------------
module Cascade_adder(

	input  	[7:0] 		a 		, 	 	//data in a
	input 	[7:0]		b 		, 		//data in b
	input 				cin 	,		//carry in
	output wire  		cout 	,		//carry out
	output wire [7:0]	sum 			//sum
	);

//signal 
wire cin1 	;
wire cin2 	;
wire cin3 	;
wire cin4 	;
wire cin5 	;
wire cin6 	;
wire cin7 	;

// inst cascade desc

full_add1 f0(
	.a 		(a[0]	),
	.b 	 	(b[0]	),
	.cin  	(cin 	),
	.cout 	(cin1 	),
	.sum 	(sum[0] )
	);

full_add1 f1(
	.a 		(a[1]	),
	.b 	 	(b[1]	),
	.cin  	(cin1 	),
	.cout 	(cin2 	),
	.sum 	(sum[1] )
	);

full_add1 f2(
	.a 		(a[2]	),
	.b 	 	(b[2]	),
	.cin  	(cin2 	),
	.cout 	(cin3 	),
	.sum 	(sum[2] )
	);

full_add1 f3(
	.a 		(a[3]	),
	.b 	 	(b[3]	),
	.cin  	(cin3 	),
	.cout 	(cin4 	),
	.sum 	(sum[3] )
	);


full_add1 f4(
	.a 		(a[4]	),
	.b 	 	(b[4]	),
	.cin  	(cin4 	),
	.cout 	(cin5 	),
	.sum 	(sum[4] )
	);

full_add1 f5(
	.a 		(a[5]	),
	.b 	 	(b[5]	),
	.cin  	(cin5 	),
	.cout 	(cin6 	),
	.sum 	(sum[5] )
	);

full_add1 f6(
	.a 		(a[6]	),
	.b 	 	(b[6]	),
	.cin  	(cin6 	),
	.cout 	(cin7 	),
	.sum 	(sum[6] )
	);

full_add1 f7(
	.a 		(a[7]	),
	.b 	 	(b[7]	),
	.cin  	(cin7 	),
	.cout 	(cout 	),
	.sum 	(sum[7] )
	);

endmodule 

8bit的全加器


// -----------------------------------------------------------------------------
module full_add1 (
	input  		a 	,    	// data in a
	input  		b 	, 		// data in b
	input 		cin ,  		// carry in 
	output 		sum ,		// sum
	output 		cout 		// carry out
);

//signal 
wire 	s1 	;
wire 	m1 	;
wire 	m2 	;
wire 	m3 	;

and (m1,a,b 	),
	(m2,b,cin   ),
	(m3,a,cin 	);

xor (s1,a,b 	),
	(sum,s1,cin );

or (cout,m1,m2,m3);

endmodule 

总结:

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值