新闻中心

EEPW首页 > EDA/PCB > 设计应用 > 基于FPGA的高效FIR滤波器设计与实现

基于FPGA的高效FIR滤波器设计与实现

作者: 时间:2011-03-24 来源:网络 收藏

  3 基于

  用设计滤波器的关键在于如何处理占用大量资源的乘法单元。分布式算法(DA) 的提出可将乘法运算转换为移位相加运算, 从而节约硬件资源。若令Hk为滤波器系数, xk (n) 为n时刻的采样输入, y (n) 为n时刻的系统响应, 那么, 式(1) 就可以等效于下式:



  把数据的源数据格式规定为2的补码形式,则有:



  式中, xkb (n) 为二进制数, 可取值为0或1;xk0 (n) 为符号位, 为1表示数据为负, 为0表示数据为正。因此, 将(4) 式代入(3) 式可得:



  式(5) 的形式被称为分布式算法。可以看出, 方括号内表示输入变量的一个数据位和所有滤波器抽头系数H0~HN的每一位进行“与” 运算并求和。而指数部分则说明了求和结果的位权,整数乘以2b就是左移b位, 对此可以通过硬件连线来实现, 而不占用逻辑资源。这样就可以通过建立查找表来实现方括号中的运算。查找表可用所有输入变量的同一位进行寻址, 这便是基于查找表的分布式算法(LUT-DA)。

  LUT-DA算法的查找表大小为B·2N bits, 其中B为输入数据的位宽, N为滤波器阶数。随着滤波器阶数的增加, 查找表大小是2的指数增长;当B为16, N为128时, 查找表的大小已经不可想象。故将查找表分割成多个子表, 可以有效解决这个问题, 这也衍生了比较有效的串行LUT-DA算法和并行LUT-DA算法, 但两者都有不足的地方。对于串行结构, 要完成一次输出, 需要大于B的多个时钟周期; 而对于并行结构, 虽然可以一个时钟周期完成一次输出, 但需要复制B个完全相同的LUT表, 而这会增加硬件资源的开销。

  为了兼顾速度和面积, 本文设计了一种基于DA算法原理的CSD-DA算法。首先, 将系数式(3) 中的固定系数Hk按2的幂展开后可得:



  然后交换移位和累加顺序, 则可得到下式:



  式中, Hkb是值为0或者1的权重系数; Sk为1表示Hk为正, 为-1则表示Hk为负; s′kb的值可取0、-1或者1。经过(4) 式的展开, 乘法运算将被全部转换为移位相加运算, 其中权重为0的部分可以剔除而不进行计算。为了更进一步减少Hkb阵列中的非零项, 可将Hk编码为CSD码, 即从二进制编码最低的有效位开始, 用10···01来取代所有大于或等于2的1序列, 1表示该位为-1。由于CSD表示其中任何相邻的两位中, 必包含一个0,故1的数量最多不会超过N/2。平均来说, CSD表示其中大约有1/3的位为非零值, 这比补码表示少大约1/3的非零位。假设h= (15) 10= (01111) 2,y=hx=x (23+22+21+20), 而如果将(15) 10编码为(10001) csd, 那么, Y=x· (24-20)。采用二进制编码方式, 将用到3个加法器, 而用CSD编码, 则只用了一个减法器, 可见, CSD编码可以从本质上减少硬件资源开销。经过CSD编码优化后, s′kb非零值的个数会远小于Hkb的非零值个数。

  对于线性相位系数对称的滤波器, 为了减少乘法单元, 可选择图3所示的结构。由于所有的乘法运算都可转化为大量的加法和减法运算, 故将导致关键路径过长, 系统运行速度较低。而加入流水线寄存器, 则可减少关键路径长度, 从而提高系统的最大工作频率。在b为定值时, s′kb的非零值个数存在不确定性, 故在进行流水线设计的时候, 可根据s′kb进行灵活的分割, 路径越长, 加入的流水线寄存器越多。为了防止中间结果的溢出, 寄存器的位宽要有冗余设计, 对于有符号的数, 其位宽取值为M+log2N-1, M为上级累加器位宽, N为滤波器阶数。流水线CSD-DA算法局部结构

图3 流水线CSD-DA算法局部结构

  从图3的流水优化CSD-DA算法结构可见, 所有乘法都会转换为移位加法, 移位运算可用硬件连线实现, 整个结构经过了合理的流水线分割。



关键词: FPGA FIR 滤波器设计

评论


相关推荐

技术专区

关闭