//	
//	串行进位加法器,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