题解 | #超前进位加法器#

超前进位加法器

https://www.nowcoder.com/practice/c4c6afdab9ce45a3a2279a98391686ca

`timescale 1ns/1ns

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

//*************code***********//

	wire [3:0] G, P;
	wire G_blk, P_blk; // 块产生与块传播
	wire [4:0] C;

	assign C[0] = 1'b0;

	CLA_4 CLA(P, G, C[0], C[3:0], G_blk, P_blk);
	assign OUT[4] = G_blk | P_blk&C[0];

	genvar i;
	generate begin:BLK
		for(i=0; i<=3; i=i+1) Add1 ADDER(A[i], B[i], C[i], OUT[i], G[i], P[i]);
	end endgenerate

//*************code***********//
endmodule



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

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

	assign g = a&b;
	assign p = a|b;
	assign f = a^b^C_in;

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 = {
		//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,
		G[2] | P[2]&G[1] | P[2]&P[1]&G[0] | P[2]&P[1]&P[0]&C_in,
		G[1] | P[1]&G[0] | P[1]&P[0]&C_in,
		G[0] | C_in&P[0],
		C_in
	};

	assign Pm = P[3]&P[2]&P[1]&P[0];
	
	assign Gm = G[3] | P[3]&G[2] | P[3]&P[2]&G[1] | P[3]&P[2]&P[1]&G[0];
	
endmodule

全部评论

相关推荐

醉蟀:你不干有的是人干
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务