题解 | #串行进位加法器#

串行进位加法器

https://www.nowcoder.com/practice/83c5850805004b6d8c48742f582f304a

//	
//	串行进位加法器,4位 进位加法器
`timescale 1ns/1ns
module add_4(
   input         [3:0]  A   ,
   input         [3:0]  B   ,
   input                Ci  , 

   output	wire [3:0]  S   ,
   output   wire        Co   
);
/*
wire	[4:0]		cout;
assign	cout[0] = Ci;

genvar		i;
generate
	for(i = 0; i < 4; i = i+1)	begin: add_full_4
		add_full	u1_add_full(
		.A			(A[i]				),
		.B			(B[i]				),
		.Ci			(cout[i]			),
		.S			(S[i]				),
		.Co			(cout[i+1]			)
		);
end
endgenerate

assign	Co = cout[4];
*/

//	下面这种实现方法,也行。
wire	[3:0]	cout;
genvar		i;
generate
	for(i = 0; i < 4; i = i+1)		begin
	add_full	u1_add_full(
		.A			(A[i]								),
		.B			(B[i]								),
		.Ci			( i == 0 ? Ci : cout[i-1]			),
		.S			(S[i]								),
		.Co			(cout[i]							)
	);
	end
endgenerate
assign		Co = cout[3];


endmodule

//	全加器
module	add_full(
input			A,
input			B,
input			Ci,

output	wire	S,
output	wire	Co
);
//	第一个,半加
wire		Si;
wire		Coi;
//	第二个,半加
wire		Coo;

add_half	u1_add_half(
.A			(A		),
.B			(B		),
.S			(Si		),	//	Si = A ^ B;
.C			(Coi	)	//	Coi = A & B;
);

add_half	u2_add_half(
.A			(Si		),
.B			(Ci		),
.S			(S		),	//	S 	= A ^ B ^ Ci;
.C			(Coo	)	//	Coo = (A ^ B) & Ci;
);

//	进位
assign		Co = Coo | Coi;

endmodule


//	半加器
module	add_half(
input			A,
input			B,

output	wire	S,
output	wire	C
);

assign			S = A^B;
assign			C = A&B; 

endmodule


全部评论

相关推荐

03-25 19:00
东北大学 Java
程序员牛肉:太好了,是聊天记录。不得不信了。 当个乐子看就好,不要散播焦虑
点赞 评论 收藏
分享
佛系的本杰明反对画饼:个人看法,实习经历那段是败笔,可以删掉,它和你目标岗位没什么关系,没有用到什么专业技能,甚至会降低你项目经历内容的可信度。个人技能那里可以再多写一点,去boss直聘上看别人写的岗位要求,可以把你会的整合一下,比如熟悉常规的开关电源拓扑结构(BUCK、正激、反激、LLC等),熟悉常用的通信总线协议和通信接口,如UART,IIC,SPI等。简历首先是HR看的,HR大多不懂技术,会从简历里去找关键字,你没有那些关键字他可能就把你筛掉了,所以个人技能尽量针对着岗位描述写一下。还有电赛获佳绩,获奖了就写什么奖,没获奖就把获佳绩删了吧,要不会让人感觉夸大。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务