`timescale 1ns/1ns

module huawei8//四位超前进位加法器
(
	input wire [3:0]A,
	input wire [3:0]B,
	output wire [4:0]OUT
);

wire [3:0] P,G,F;
wire [4:1] Ci   ; 


//*************code***********//
CLA_4 CLA_4(
		.P(P),
		.G(G),
		.C_in(1'b0),
		.Ci(Ci),
		.Gm(),
		.Pm()
	);
Add1 Add_1_INST1
(
		 .a   (A[0])  ,
		 .b    (B[0]) ,
		 .C_in (1'b0) ,
		 .f   (F[0]) ,
		 .g   (G[0]) , 
		 .p   (P[0])
);	

Add1 Add_1_INST2
(
		 .a   (A[1])  ,
		 .b    (B[1]) ,
		 .C_in (Ci[1]) ,
		 .f   (F[1]) ,
		 .g   (G[1]) , 
		 .p   (P[1])
);	
Add1 Add_1_INST3
(
		 .a   (A[2])  ,
		 .b    (B[2]) ,
		 .C_in (Ci[2]) ,
		 .f   (F[2]) ,
		 .g   (G[2]) , 
		 .p   (P[2])
);	
Add1 Add_1_INST4
(
		 .a   (A[3])  ,
		 .b    (B[3]) ,
		 .C_in (Ci[3]) ,
		 .f   (F[3]) ,
		 .g   (G[3]) , 
		 .p   (P[3])
);	

assign OUT = {Ci[4],F} ;
//*************code***********//
endmodule



//////////////下面是两个子模块////////

module Add1
(
		input a,
		input b,
		input C_in,
		output f,
		output g, 
		output p
		);

assign f = a ^ b ^ C_in ;
assign g = a & b        ; //进位生成函数
assign p = a | b        ; //进位传送函数

endmodule




module CLA_4(
		input [3:0]P,
		input [3:0]G,
		input C_in,
		output [4:1]Ci,
		output Gm,
		output Pm
	);


assign	Ci[1] = G[0] | P[0] & C_in ;
assign  Ci[2] = G[1] | P[1] & G[0] | P[1] & P[0] & C_in ;
assign  Ci[3] = G[2] | P[2] & G[1] | P[2] & P[1] & G[0] | P[2]& P[1] & P[0] & C_in ;
assign  Ci[4] = G[3] | P[3] & G[2] | P[3] & P[2] & G[1]| P[3] & P[2] & P[1] & G[0] | P[3]& P[2]& P[1] & P[0] & C_in ;
endmodule

原来的串行进位加法器需要每一位计算以后,进位端输出端CO 连接到下一位的进位输入端CI来进行计算。

这样做的话一个运算需要经过4个一位全加器的延迟时间。

而超前进位加法器与串行进位加法器的不同之处在于,超前进位加法器的进位是事先通过逻辑电路就可以的出每一位全加器的进位输入CI。

全加器的逻辑表达式为:

S = A ^ B ^ CI ;

CO = AB + (A+B)CI

令G=AB 作为进位生成函数G ,P=A+B 作为进位传送函数P 那么CO可以改写为:

CO = G +P CI ;

那么对于每一位的进位可以展开为:

其中C0 为第0位的进位

那么展开以后发现 每一位的进位端都可以由进位生成函数G以及进位传送函数P表示,代表可以事先通过逻辑表达式就可以表示出进位,而不需要经过全加器的计算。

所以结构如下:

通过CAL_4模块 事先处理 所有进位端。