`timescale 1ns/1ns

module lca_4(
	input		[3:0]       A_in  ,
	input	    [3:0]		B_in  ,
    input                   C_1   ,
 
 	output	 wire			CO    ,
	output   wire [3:0]	    S
);


   // 中间信号
    wire [3:0] G;  // Generate
    wire [3:0] P;  // Propagate
    wire [3:1] C;  // 中间进位(C1~C3)

    // G[i] = A[i] & B[i]
    and g0 (G[0], A_in[0], B_in[0]);
    and g1 (G[1], A_in[1], B_in[1]);
    and g2 (G[2], A_in[2], B_in[2]);
    and g3 (G[3], A_in[3], B_in[3]);

    // P[i] = A[i] ^ B[i]
    xor p0 (P[0], A_in[0], B_in[0]);
    xor p1 (P[1], A_in[1], B_in[1]);
    xor p2 (P[2], A_in[2], B_in[2]);
    xor p3 (P[3], A_in[3], B_in[3]);

    // Carry 计算
    // C[1] = G[0] + (P[0] & C_1)
    wire w10;
    and a10(w10, P[0], C_1);
    or  o10(C[1], G[0], w10);

    // C[2] = G[1] + P[1]·G[0] + P[1]·P[0]·C_1
    wire w20, w21, w22;
    and a20(w20, P[1], G[0]);
    and a21(w21, P[1], P[0], C_1);
    or  o20(C[2], G[1], w20, w21);

    // C[3] = G[2] + P[2]·G[1] + P[2]·P[1]·G[0] + P[2]·P[1]·P[0]·C_1
    wire w30, w31, w32;
    and a30(w30, P[2], G[1]);
    and a31(w31, P[2], P[1], G[0]);
    and a32(w32, P[2], P[1], P[0], C_1);
    or  o30(C[3], G[2], w30, w31, w32);

    // 最终 Cout = G[3] + P[3]·C[3]
    wire w40;
    and a40(w40, P[3], C[3]);
    or  o40(CO, G[3], w40);

    // 求和 S[i] = P[i] ^ C[i]
    xor s0(S[0], P[0], C_1);
    xor s1(S[1], P[1], C[1]);
    xor s2(S[2], P[2], C[2]);
    xor s3(S[3], P[3], C[3]); 

endmodule

首先我们要实现一个4位加法器, 功能是 A + B + C = 。。。 , 但是我们这里不能使用 + 运算符(这是行为级),而是要通过门级电路实现超前进位逻辑。

把设计过程分为几个step

计算generate 和 propagate

G[i] = A[i] & B[i] // 与门

P[i] = A ^ B // 异或门

用公式推导carry信号

C1 = G0 + P0*C0 ;

C2 = G1 + P1*G0 + P1*P0*C0;

C2 = G1 + P1*C1 = G1 + P1*( G0 + P0*C0) = G1 + P1* G0 + P1*P0*C0 ;

C3 = G2 + P2&G1 + P2&P1&..............

可以看到,每个carry都是前一位G/P的组合;

根据进位计算最终和;

S = P ^ C ; 注意第0位用C_1啊

因为SumI = P1 ^ C1 ;

输出最后的Cout

CO = G3 + P3C3;