`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;