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

超前进位加法器

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

题解思路

1、确定题目要求

一级加法器进位信号如下

这里‘+’ ‘·’符号不是‘加’和‘乘’,是‘或’和 ‘与’


4级可以表示为如下,这里P和G是传播信号和生成信号:


因此,应该得到两个子模块:一位运算和四位逻辑


在下面模块中 f为输出的Ci+1  g为输入Gi  P为Pi  C_in为Ci

//一位加法器

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


//4位CLA部件

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;


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

assign Pm=P[3]&P[2]&P[1]&P[0];

endmodule


第一步是CLA_4通过输入的数值,一次性算出四个加法器的进位。第二步,由于已经确定了每位的进位数值,ADD1分别例化四次,对四位同时进行加法。


2、写出v代码


module huawei8//四位超前进位加法器

(

       input wire [3:0]A,

       input wire [3:0]B,

       output wire [4:0]OUT

);

       wire [3:0] G;

       wire [3:0] P;

       wire [3:0] F;

       wire [4:1] C;

 Add1 u1

 (    .a(A[0]),

       .b(B[0]),

       .C_in(1'b0),

       .f(F[0]),

       .g(G[0]),

       .p(P[0])

 );

  Add1 u2

 (    .a(A[1]),

       .b(B[1]),

       .C_in(C[1]),

       .f(F[1]),

       .g(G[1]),

       .p(P[1])

 );

   Add1 u3

 (    .a(A[2]),

       .b(B[2]),

       .C_in(C[2]),

       .f(F[2]),

       .g(G[2]),

       .p(P[2])

 );

   Add1 u4

 (    .a(A[3]),

       .b(B[3]),

       .C_in(C[3]),

       .f(F[3]),

       .g(G[3]),

       .p(P[3])

 );

 CLA_4 uut

 (

       .P(P),

       .G(G),

       .C_in(1'b0),

       .Ci(C),

       .Gm(),

       .Pm()

 );

  assign OUT={C[4],F};

 endmodule


仿真结果如下:


`timescale 1ns/1ns



module huawei8//四位超前进位加法器
(
	input wire [3:0]A,
	input wire [3:0]B,
	output wire [4:0]OUT
);
	wire [3:0] G;
	wire [3:0] P;
	wire [3:0] F;
	wire [4:1] C;
 Add1 u1
 (	.a(A[0]),
	.b(B[0]),
	.C_in(1'b0),
	.f(F[0]),
	.g(G[0]),
	.p(P[0])
 );
  Add1 u2
 (	.a(A[1]),
	.b(B[1]),
	.C_in(C[1]),
	.f(F[1]),
	.g(G[1]),
	.p(P[1])
 );
   Add1 u3
 (	.a(A[2]),
	.b(B[2]),
	.C_in(C[2]),
	.f(F[2]),
	.g(G[2]),
	.p(P[2])
 );
   Add1 u4
 (	.a(A[3]),
	.b(B[3]),
	.C_in(C[3]),
	.f(F[3]),
	.g(G[3]),
	.p(P[3])
 );
 CLA_4 uut
 (
	.P(P),
	.G(G),
	.C_in(1'b0),
	.Ci(C),
	.Gm(),
	.Pm()
 );
  assign OUT={C[4],F};
 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

//4位CLA部件
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;

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












如果关于此次题单有问题或者反馈意见,欢迎加入牛客用户反馈群沟通~

全部评论
这里f指第i位输出,不是进位输出。
6 回复 分享
发布于 2022-11-24 17:19 湖北
这个Pm,Gm在子模块中是什么
2 回复 分享
发布于 2022-08-24 11:51 黑龙江
P不应该是异或的结果吗?1bit二进制相加,1+1=0,应该是异或吧
点赞 回复 分享
发布于 2025-10-27 12:59 广东

相关推荐

想run的马里奥在学...:这个学历帮你扫平百分之80的障碍,投就完了,这会找不到就等3月暑期一样能找到
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
01-07 00:20
点赞 评论 收藏
分享
评论
8
2
分享

创作者周榜

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