带超前进位的四位全加器

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=AiBiCi1Ci=AiBi+AiCi1+BiCi1
现在不妨定义两个中间变量:产生变量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=AiBi

于是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=KiCi1Ci=Gi+PiCi1

于是进位信号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+P0C1C1=G1+P1C0=G1+P1G0+P1P0C1C2=G2+P2C1=G2+P2G1+P2P1G0+P2P1P0C1C3=G3+P3C2=G3+P3G2+P3P2G1+P3P2P1G0+P3P2P1P0C1

因为进位信号只与变量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
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值