加法的本质是异或逻辑,即若有两个位相加,如果不考虑进位,只要将这两个位进行异或即可得到1加1等于0的效果。一些运算如二进制LDPC的编码和解码运算过程,使用的就是这种不带进位的异或方式。这种方式也被称为半加器,即加法只进行了一半,未考虑进位。
但是,实际的加法大多数是需要进位的。所以,在两个有一定位宽的数相加的过程中,总的原则是每一位各自相加,再加上来自低位的进位,即3个因素联合相加。这种加法器也被称为全加器。
在算法上,可以选择分步相加。先进行第0位的加法,算出第0位的结果和向第1位的进位,然后进行第1位的加法,将原本第1位的两个数与来自第0位的进位三者相加,得到第1位的结果以及向第2位的进位。以此类推,直到所有的位都被算出。
分步运算是需要等待的,算第 n 位时需要等待第 n -1位的进位结果。在数字RTL设计中,无论时序逻辑还是组合逻辑,都可以实现分步骤的运算。
使用时序逻辑进行分步骤运算的电路如图3-1所示。通过在步骤之间插入D触发器(也称为寄存器),可以达到以时钟为节拍,每一拍完成一个步骤的效果。其时序如图3-2所示。
图3-1 用时序逻辑进行分步骤运算的电路
图3-2 用时序逻辑进行分步骤运算的时序
使用组合逻辑进行分步骤运算,就是将图3-1中的寄存器去掉,其时序如图3-3所示。对比图3-2和图3-3可以发现,组合逻辑完成全部计算的速度快,在1个时钟周期之内3个步骤就全部完成了,而时序逻辑用了3个时钟周期。而且,组合逻辑还节省了3个寄存器。所以多数情况下,实现运算电路首先考虑使用组合逻辑的方式。只有当组合逻辑运算时间过长,无法在规定时刻得到结果时,才考虑改为时序逻辑。例如图3-3中第3步结果要推迟到采样沿之后才得到,是不允许的,此时需要在这3个步骤中插入寄存器。即便考虑插入寄存器,也不是像图3-1那样一次插入3个,而是先在合适的位置插入1个,如果这样运算能赶上时间要求,就不用再插。
图3-3 用组合逻辑进行分步骤运算的时序
加法器是电路设计中常用的模块,其结构相对简单,内部逻辑单元少、延迟低,因此,绝大多数加法器都是用组合逻辑实现的。本章以下所介绍的加法器,均使用组合逻辑。