首页 > 编程知识 正文

并行进位加法器原理,进位保留加法器原理

时间:2023-05-05 09:57:29 阅读:120633 作者:4914

数电书上说道超前进位加法器,没有仔细讲。上网搜了这篇资料,摘抄下来

串行进位加法器需要逐级进位,进位延迟大。 进位先行加法器(也称为进位先行加法器)可以有效地减少进位延迟。

设二进制加法器的第I位输入为Xi、Yi,输出为Si,进位输入为Ci,进位输出为Ci 1

Si=XiYiCi

ci1=XiyiXiciyici=Xiyi(Xiyi ) ci

假设Gi=XiYi,Pi=Xi Yi

Ci 1=Gi PiCi

在Xi和Yi都为1的情况下,Gi=1,产生进位Ci 1=1

如果Xi和Yi之一为1,则传递Pi=1,进位Ci 1=Ci

因此,Gi定义为进位发生信号,Pi定义为进位传递信号。 Gi优先顺序高于Pi,即,在Gi=1时(当然此时也有Pi=1),无条件地发生进位,无论Ci是多少

Gi=0且Pi=1时,进位输出为Ci,与Ci以前的逻辑有关。

以下,导出4位进位前加法器。 设4位进位和被加数为a和b,进位输入为Cin,进位输出为Cout,对第I位进位产生Pi=Ai Bi,进位传递Pi=Ai Bi,I=0,1,2,3

因此,该各级的进位输出、递归展开Ci如下。

C0=Cin

C1=G0 P0C0

C2=G1P1C1=G1P1() G0P0C0)=G1P1G0P1P0C0

C3=g2p2c2=g2p 2g1P2P 1g0P2P1P0 P2P1p0c 0

C4=g3p3c3=g3p 3g2p3p 2g1P3 P2P 1g0p1g0p1p0p3p 2p2p0P2P1p1p0c 0

出局=C4

由此可知,各级进位相互独立发生,仅与输入数据和Cin有关,各级之间的进位级联被去除,因此进位引起的延迟变小。

每个等式对应于只有三级延迟的电路,第一级延迟对应于进位生成信号和进位传递信号,而后两级延迟对应于上乘积之和。 这可以在集成了Synplify的RTL电路中看到。

另外,可以从真值表中简单地求出第I个和。

si=Xiyici=(Xiyi )(Xi Yi )ci=gipici

根据上式可以设计超前进位加法器。 根据《数字系统设计与Verilog HDL》的方法,在Verilog中创建了4位超前进位加法器。 代码如下。

1moduleadd_ahead(a、b、sum、cin、cout 2); 3 input [3:0] a,b; 4输入CIN; 5 output [3:0] sum; 6输出计数; 7 wire c1、c2、c3; //各级进位输出8 wire [3:0] g,p; 9第9 10 //位的本位值和进位输出11 assign g[0]=a[0] b[0]; 12 assign p[0]=a[0]| b[0]; 13 assign sum[0]=g[0]^p[0]^cin; 14assignC1=g[0]|(p[0]CIN ); 15第15 16 //位的本位值和进位输出17 assign g[1]=a[1] b[1]; 18 assign p[1]=a[1]| b[1]; 19 assign sum[1]=g[1]^p[1]^c1; 20assignC2=g[1]|(p[1]C1 ); 21第21 22 //位的本位值和进位输出23 assign g[2]=a[2] b[2]; 24 assign p[2]=a[2]| b[2]; 25 assign sum[2]=g[2]^p[2]^c2; 26assignC3=G[2]|(P[2]C2 ); 27 28 //位(最高位)的本位值和进位输出29assigng(3)=a(3)=a(3); 30 assign p[3]=a[3]| b[3]; 31 assign sum[3]=g[3]^p[3]^c3; 32 assign cout=g[3]|(p[3]c3; 33 34 endmodule代码在实现c2、c3、cout时还在使用前一级的进位。 我开始觉得合并器会自动展开,但通过Synplify合并,我发现各位的进位仍然与高位的进位输出有关。 因此,用上面展开的公式实现上面计算出的c2、c3、cout的代码,如下所示。

1 assign C2=g [1]|p [1] g [0]|[ p [1] p [0] CIN ]; 2 assign C3=g [2]|p [2] g [1]|[ p [2] p [1] g [0]|[ p [2] p [1] p [0] CIN ]; 3 assign cout=g [3]|p [3] g [2]|p [3] p [2] g [1]|p [2] p [1] g [0]|| p [3] p synplify合并后

修正后的程度用Modelsim模拟的结果正确。

其实比较好理解,就是如果按照正常的加法进行进位,如果使用逻辑电路,那么第一次的进位会加到第二次的进位上,第二次的进位会加到第三次上,这样实际上第一次的进位会一直传递到最后一次的进位上,这样必然会导致较大的延迟,delay。而如果采用时序电路的话,那么就会需要几次进位,就延迟几个周期之后才能输出数据,这样的latency较大。

采用了超前进位的方法就把刚才的情况避免了,因为超前进位归纳了进位的特点,每一次的进位都和之前的进位无关,只和之前的p和g的结果有关,而这些p和g的结果是可以通过一个时钟周期就计算出来的,即1)一个时钟周期内,计算出所有的p,g 2)第二个时钟周期内,计算出所有的c 3)第三个时钟周期,计算出所有的s。并且如果对很长的数进行加法,可以拆成小的位数进行相加。即64bit的加法操作可以拆成32bit的加法操作。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。