3.3 累加运算
累加运算在信号处理中广泛应用,如直接数字频率合成技术中的相位累加器、FIR滤波器及雷达信号处理中的相参积累等,此外,在一些阵列信号处理中也会应用到,如自相关矩阵的估计。采用FPGA设计累加器时,可用硬件语言描述的方式实现,也可直接调用厂商提供的IP核,操作都非常简单。设计的关键环节是时序和位宽的控制。这将是本节阐述的重点。
3.3.1 累加原理
累加运算如式(3.7)所示。
它表示L个数相加。累加运算由累加器实现,其实质是完成一系列的加法运算,但是与简单的加法运算不同,它需要将前一次加法运算的结果反馈至输入端,作为新一次加法运算的加数。例如,在式(3.7)中,a1 与a2 相加的结果需要反馈回来与a3 相加。因此,累加器中具有反馈支路。此外,累加器最终输出的是累加结果,对于中间运算结果可不必输出。因此,累加器末端还需要一个捕获寄存器,捕获最终结果。累加器的工作原理是:每帧数据周期性地流动,新的数据不断进入累加器与反馈支路相加,实现累加,由捕获寄存器接收捕获信号,输出最终结果。
定义:构成一个累加结果的输入数据为一帧数据,一帧数据所包含的数据个数为帧长度。在式(3.7)中,a0,a1,…,aL-1为一帧数据,帧长度为L。由加法运算可知,两个数相加会引起比特增长。为保证累加结果正确,必须使中间运算结果有足够的位宽。假定输入数据位宽为B,那么最终结果的位宽应为
式中,ceil表示向上取整。这就要求将输入数据及中间运算结果进行符号位扩展,使位宽达到Ws。
3.3.2 顺序累加器
数据流按帧顺序进入累加器,即第1帧数据进入求和,然后第2帧数据进入求和,以此类推,这样的累加器称为顺序累加器。整个数据依时间顺序流动,帧与帧之间并没有间断。
假定有4帧数据,每帧长度均为4。第1帧数据为a1、a2、a3、a4,第2帧数据为b1、b2、b3、b4,第3帧数据为c1、c2、c3、c4,第4帧数据为d1、d2、d3、d4。这4帧数据的时间顺序如图3.17所示。现在要求对这4帧数据依次求和,最终输出 sa、sb、sc、sd,如式(3.9a)至式(3.9d)所示。
图3.17 4帧数据的时间顺序
根据累加器的工作原理可得到如图3.18所示的顺序累加器的硬件结构,包括加法器、流水寄存器和捕获寄存器。顾名思义,流水寄存器的目的是使数据流动起来,以提高系统处理速度。捕获寄存器用于捕获最终期望结果。
图3.18 顺序累加器的硬件结构
在图3.18中,数据由din端进入,最终结果由dout端输出。顺序累加器的时序图如图3.19所示。从图3.19中可以看出,bypass为直通信号,当其为高时,加法器输入端(din端)数据直接通过加法器而不执行任何操作到加法器输出端,表明新一帧数据开始;当其为低时,执行加法操作,将输入端数据与反馈端数据相加,以便对新一帧数据求和。节点P数据反馈至加法器输入端与din端数据相加求和,实现数据的累加,相应数据依次为a1、a1 +a2、a1 +a2 +a3、sa,中间结果未显示。capture作为捕获信号,当其为高时,捕获节点P的数据并将其输出,否则保持输出不变。加法器的位宽可由式(3.8)决定。
顺序累加器设计的关键是使数据流与各控制信号(bypass和capture)对应起来,实现正确累加。从图3.19可以看出,这并不难做到,bypass和capture两者周期一致且取决于数据帧长度。
图3.19 顺序累加器的时序图
3.3.3 滑动累加器
滑动累加器是指数据流按帧交错顺序进入,此时,在求每帧数据和时就要求对反馈支路数据进行滑动以实现正确累加。
假定有4帧数据,每帧长度均为4。第1 帧数据为a1、b1、c1、d1,第2 帧数据为a2、b2、c2、d2,第3帧数据为a3、b3、c3、d3,第4帧数据为a4、b4、c4、d4。这4帧数据的时间顺序仍如图3.17所示。显然,此时数据流的顺序是第1 帧的第1 个、第2 帧的第1 个、第3帧的第1 个、第4帧的第1 个,紧接着,第1 帧的第2 个、第2 帧的第2 个,以此类推。现在要求对这4 帧数据依次求和,最终输出 s1、s2、s3、s4,如式(3.10a)至式(3.10d)所示。
根据数据的时间关系,考虑到数据流的帧交错,为了保证同一帧的数据相加,就必须采取措施使“先头”数据潜伏一段时间,当同一帧的数据到达加法器输入端时,“先头”数据浮出执行加法操作。例如,把a1 视为“先头”数据,该数据直接通过加法器到其输出端,但不能立即反馈到加法器输入端,因为此时加法器输入端为a2 而非b1,所以必须对其潜伏;当加法器输入端为b1 时,a1 在加法器反馈端浮出实现与b1 的相加。这种潜伏可通过级联的寄存器实现,也可通过FIFO实现。
图3.20 滑动累加器的硬件结构
滑动累加器的硬件结构如图3.20所示,图中采用FIFO实现潜伏,FIFO深度为3(加法器输出已有一个时钟周期的寄存)。对于潜伏周期较长、速度要求较高的场合,采用FIFO更为合适;而对于潜伏周期较短、速度要求不高的场合,采用级联的寄存器较为合适或采用移位寄存器SRL。在图3.20中,ce为使能相加信号,当其为高时,允许加法器执行加法操作,否则将din端数据直接输出。capture为捕获信号,当其为高时,捕获节点P的数据并输出给dout,否则保持不变。
滑动累加器的时序图如图3.21所示。在图3.21中,s11 =a1 +b1、s21 =a2 +b2、s31 =a3 +b3、s41 =a4 +b4、s12 =a1 +b1 +c1、s22 =a2 +b2 +c2、s32 =a3 +b3 +c3、s42 =a4 +b4 +c4。
图3.21 滑动累加器的时序图
滑动累加器设计的关键是确定FIFO(或级联寄存器)的深度以保证正确的潜伏周期,而此深度与帧的个数有关。例如,此设计中共有4帧数据,故FIFO深度为4-1 =3,因为加法器输出已有一级寄存。使能相加信号ce和捕获信号capture可根据图3.21中时序设计。