前话
这个加法器写的是一波三折啊,昨天晚上花了两三个小时好不容易写完编译通过了,之后modelsim莫名其妙弹出一个对话框,我没看清就那么不小心一点,结果代码没了,惨痛啊。害的我今天早上又花了一上午的时间重写,结果又遇到了搞不清楚的编译问题。不过在重写的过程中,我还是发现昨天写的一些地方有问题,通过这次重写,我把verilog的语句并行理解的更加深刻了。下面总结一下原理和具体的实现。
原理
进位的传递
ci+1 = ai*bi+ai*ci+bi*ci
= ai*bi+(ai+bi)*ci
= gi+pi*ci
gi=ai*bi称为进位生成因子, 只要gi为1, 就有进位
pi=ai+bi称为进位传递因子, 只要pi为1, 就有把低位的进位向前传递
四位进位传递为例
c1 = g0+(p0*c0)
c2 = g1+(p1*g0)+(p1*p0*c0)
c3 = g2+(p2*g1)+(p2*p1*g0)+(p2*p1*p0*c0)
c4 = g3+(p3*g2)+(p3*p2*g1)+(p3*p2*p1*g0)+(p3*p2*p1*p0*c0)
只要低位有一个进位生成, 而且被传递, 则进位输出为1.
对于16位先行加法器,采用4个4位先行进位加法器组成,块内并行,由于高位的块需要用到低位块的进位,快间仍然并行计算进位。方法是产生每块的进位传递因子和进位产生因子。
块间进位传递因子: 每一位的传递因子都为1时才能传递