题解 | #超前进位加法器#
超前进位加法器
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,F;
wire [4:1] C;
Add1 inst0(
.a (A[0]),
.b (B[0]),
.C_in (1'b0),
.f (F[0]),
.g (G[0]),
.p (P[0])
);
genvar i;
generate
for(i=1;i<4;i=i+1) begin:Add1_inst
Add1 inst(
.a (A[i]),
.b (B[i]),
.C_in (C[i]),
.f (F[i]),
.g (G[i]),
.p (P[i])
);
end
endgenerate
CLA_4 inst_cal(
.P (P),
.G (G),
.C_in (1'b0),
.Ci (C),
.Gm (),
.Pm ()
);
assign OUT = {C[4],F};
//*************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; //sum
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[0] & C_in);
assign Ci[3] = G[2] | P[2] & (G[1] | P[1] & (G[0] | P[0] & C_in));
assign Ci[4] = G[3] | P[3] & (G[2] | P[2] & (G[1] | P[1] & (G[0] | 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
