本文使用进位选择的结构实现补码加法器,并且对比了使用内部逻辑实现和使用专用DSP单元实现时的性能差别。当然Xilinx FPGA中的DSP单元可以直接实现48位的运算,本文主要目的是验证进位选择结构加法器的实现和性能对比,这种结构可以运用到更大位宽的加法中。
在大位宽的加法运算中,将宽度大的数据截取为多段,然后分段计算是常常采用的做法。该方法可以提高每段加法的运行速度,但是高段加法需要在低段加法完成之后才能运行。进位选择加法器的结构如下图,主要策略是面积换速度。低段加法的进位不是0就是1,所以可以同时分别计算出进位为0和1时的高段加法的结果。最后根据低段加法的进位,选择不同的高段加法结果,然后再拼接到一起。
由于输入的运算数都是二进制补码,所以不需要额外的输入来区分加法和减法。但是在分段计算时需要注意以下方面。
1. 高段加法运算为有符号运算,低段加法需要当作无符号加法进行处理。因为二进制补码加法在计算时,除了符号位需要处理外,运算过程就是简单的逐位累加、进位。所以在分段相加时,最高段当作有符号运算处理,低段按照无符号加法处理。
2. 使用低段加法的进位位作为选择信号,将高段结果和低段结果拼接起来。为了提高速度,该拼接过程可以使用一级寄存器。
这种架构的加法运算的速度更快。一般情况下,由于FPGA内部的DSP使用大量的专用路径和资源,使用DSP实现加法运算的速度更快,占用布线资源更少。当然,位宽较小的加法运算更适合使用通用逻辑来实现。这没有一个明确的标准,通常我会把14bits以上的加法用DSP实现。
我使用3个加法单元实现了上述进位选择48bits二进制补码加法器,将工作时钟频率设置为400MHz,使用Xilinx的A7-2器件实现。使用OOC的方式进行布线,当使用通用逻辑实现时,其时序结果如下:最慢路径的建立时间裕量有0.315ns左右。
使用OOC的方式进行布线,当使用专用DSP实现时,其时序结果如下:最慢路径的建立时间裕量有1.049ns左右。
显然,使用DSP时工作速度更快,其时钟频率还有很大的提升空间。
接着对比以下资源消耗情况。当使用通用逻辑实现时,其资源消耗如下。
当使用DSP实现时,资源消耗如下。
可以看到,使用DSP时,除了多用了3个DSP单元外,Slice中LUT、Registers的使用量大幅降低,逻辑消耗的LUT大幅降低。所以,在设计中,将部分运算使用DSP实现,可以有效降低通用逻辑消耗,减小布线压力。
以下链接是我上传的两个工程的源码。
https://download.csdn.net/download/yinyeyy/12522365