Verilog超前进位加法器

Verilog超前进位加法器,verilog,Verilog,我刚刚了解了CLA加法器,对求和有点困惑。我看到p有两个版本,p=a或b和p=a或b 如果我模拟此代码,它将给出正确的结果: module CLA_4bit( output [3:0] S, output Cout, input [3:0] A,B, input Cin ); wire [3:0] G,P,C; assign G = A & B; assign P = A ^ B; assign C[0] = Cin; assign C[1] = G[

我刚刚了解了CLA加法器,对求和有点困惑。我看到p有两个版本,p=a或b和p=a或b

如果我模拟此代码,它将给出正确的结果:

module CLA_4bit(
    output [3:0] S,
    output Cout,
    input [3:0] A,B,
    input Cin
);

wire [3:0] G,P,C;

assign G = A & B;
assign P = A ^ B;
assign C[0] = Cin;
assign C[1] = G[0] | (P[0] & C[0]);
assign C[2] = G[1] | (P[1] & G[0]) | (P[1] & P[0] & C[0]);
assign C[3] = G[2] | (P[2] & G[1]) | (P[2] & P[1] & G[0]) | (P[2] & P[1] & P[0] & C[0]);
assign Cout = 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[0]);
assign S = P ^ C;

endmodule

但是,如果我将
p=A^B
更改为
p=A | B
,它将给出一个不正确的总和。需要对代码进行哪些更改才能使其与
P=A | B
一起工作?

计算

S
P^C
)的公式适用于使用
XOR
运算计算的
P
。您可能知道,
异或
操作之间的真值表的唯一区别是当两个位都是
1
时。这就是为什么如果使用
操作,
s
的公式应该略有不同的原因:

S = (P & (~G)) ^ C