1 引入
半加:不考虑来自低位的进位,将1位二进制数相加,称为半加
全加:将两个多位二进制数相加时,除了最低位以外,每一位都应考虑来自低位的进位,即:将两个对应的加数和来自低位的进位3个数相加,称为全加。
串行进位加法器:把n个全加器按低位的进位输出与高位的进位输入相连的方法连接起来,各位全加器的进位信号以串联形式逐位产生。
并行进位加法器:并行进位加法器的所有各位的进位都直接依赖最低位进位C-1,即所有各位的进位可以直接从C-1并行产生,故称为超前进位。
2 原理
2.1 简述
超前进位加法原理:
- 进位输入是由专门的“进位逻辑门”来提供
- 该门综合所有低位的加数、被加数及最低位进位输入
超前进位加法器使每位的进位直接由加数和被加数产生,而无需等待低位的进位信号。
2.2 详述
我们知道全加器的输出和进位信号可以用下面表示:
S
i
=
A
i
⊕
B
i
⊕
C
i
−
1
C
i
=
A
i
B
i
+
A
i
C
i
−
1
+
B
i
C
i
−
1
\begin{array}{l} S_{i}=A_{i} \oplus B_{i} \oplus C_{i-1} \\ C_{i}=A_{i} B_{i}+A_{i} C_{i-1}+B_{i} C_{i-1} \end{array}
Si=Ai⊕Bi⊕Ci−1Ci=AiBi+AiCi−1+BiCi−1
现在不妨定义两个中间变量:产生变量G_i和传输变量P_i:
G
i
=
A
i
B
i
P
i
=
A
i
+
B
i
\begin{array}{l} G_{i} = A_{i}B_{i} \\ P_{i} = A_{i} + B_{i} \end{array}
Gi=AiBiPi=Ai+Bi
进而定义一个中间变量K_i
K
i
=
G
i
‾
P
i
=
A
i
⊕
B
i
K_i = \overline{G_i} P_i = A_i \oplus B_i
Ki=GiPi=Ai⊕Bi
于是S_i和C_i可以用K_i、P_i、G_i表示为:
S
i
=
K
i
⊕
C
i
−
1
C
i
=
G
i
+
P
i
C
i
−
1
\begin{array}{l} S_{i}=K_{i} \oplus C_{i-1} \\ C_{i}=G_{i} + P_{i} C_{i-1} \end{array}
Si=Ki⊕Ci−1Ci=Gi+PiCi−1
于是进位信号C_i可以用下面表示:
‾ C 0 = G 0 + P 0 C − 1 C 1 = G 1 + P 1 C 0 = G 1 + P 1 G 0 + P 1 P 0 C − 1 C 2 = G 2 + P 2 C 1 = G 2 + P 2 G 1 + P 2 P 1 G 0 + P 2 P 1 P 0 C − 1 C 3 = G 3 + P 3 C 2 = 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 − 1 \overline{} \begin{array}{l} C_{0}=G_{0}+P_{0} C_{-1} \\ C_{1}=G_{1}+P_{1} C_{0}=G_{1}+P_{1} G_{0}+P_{1} P_{0} C_{-1} \\ C_{2}=G_{2}+P_{2} C_{1}=G_{2}+P_{2} G_{1}+P_{2} P_{1} G_{0}+P_{2} P_{1} P_{0} C_{-1} \\ C_{3}=G_{3}+P_{3} C_{2}=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_{-1} \end{array} C0=G0+P0C−1C1=G1+P1C0=G1+P1G0+P1P0C−1C2=G2+P2C1=G2+P2G1+P2P1G0+P2P1P0C−1C3=G3+P3C2=G3+P3G2+P3P2G1+P3P2P1G0+P3P2P1P0C−1
因为进位信号只与变量G_i、P_i和C_-1有关,而C-1是向最低位的进位信号,其值为0;
即:各位的进位信号都只与两个加数A和B有关,故它们是可以并行产生的。
关于带超前进位的四位全加器的原理基本就是这样。
3 Verilog HDL实现
module fulladd4(sum,c_out,a,b,c_in);
output [3:0] sum;
output c_out;
input [3:0] a,b;
input c_in;
wire p0,g0,p1,p2,p3,g1,g2,g3;
wire c4,c3,c2,c1;
//计算每一级的p
assign p0 = a[0]^b[0],
p1 = a[1]^b[1],
p2 = a[2]^b[2],
p3 = a[3]^b[3];
//计算每一级的g
assign g0 = a[0]&b[0],
g1 = a[1]&b[1],
g2 = a[2]&b[2],
g3 = a[3]&b[3];
//计算每一级的进位,在计算超前进位中c_in等于c_0
assign c1 = g0|(p0&c_in),
c2 = g1|(p1&g0)|(p1&p0&c_in),
c3 = g2|(p2&g1)|(p2&p1&g0)|(p2&p1&p0&c_in),
c3 = g3|(p3&g2)|(p3&p2&g1)|(p3&p2&p1&g0)|(p3&p2&p1&p0&c_in);
//计算加法的总和
assign sum[0] = p0^c_in,
sum[1] = p1^c1,
sum[2] = p2^c2,
sum[3] = p3^c3;
//进位输出赋值
assign c_out = c4;
endmodule