《基于FPGA的数字信号处理》(第2版)试读章节——基于多片双端口RAM的半并行FIR滤波器

在某些场合,系统的采样率较高或者滤波器阶数较高,在这种情况下,采用分布式逻辑资源的移位寄存器实现数据缓冲并不是最好的方法。此时,考虑采用Block RAM 模拟抽头延时链的行为实现数据缓冲则是十分可取的。为便于说明,本节以8 抽头FIR滤波器为例。

根据半并行滤波器设计思想,将 8 个系数分为两组,h(0) h(3) 为一组,h(4) ~ h(7) 为一组,通过分时复用两个乘法器实现滤波运算。输入数据采样率与系统时钟频率之间依然满足式(4.30)所示的关系式。由N=8,M=2 可知。数据流的关系类似于图 4.35 所示,只是此时为8 抽头。采用两个双端口RAM(Simple Dual Port RAM)实现数据缓冲,两个 RAM均配置为先读后写模式,每个RAM 的深度为N /M  4,其结构如图 4.41 所示。后级RAM 的输入是前级RAM 的输出,即两个RAM 级联。通过加法树求得部分和(图中的虚线框在M  2时将为加法树),最终将部分和累加获得滤波运算结果。图中数据输入端为din,waddr1 和waddr2 分别为两个RAM 的写地址,we1 和we2 分别为两个RAM 的写使能,raddr1 和raddr2 分别为两个RAM 的读地址,coeaddr 为两个系数ROM 的读地址。图中2D 表示两个寄存器级联。

图4.41 基于两个单端口RAM 的8 抽头半并行FIR 滤波器硬件结构

图4.41 基于两个单端口RAM 的8 抽头半并行FIR 滤波器硬件结构

与图4.41 相匹配的时序如图4.42 所示。控制逻辑是此设计中的关键之一,依然要求尽量使控制信号之间有相关性以实现电路的自我纠错能力。图中,读系数地址coeaddr 单独产生,是一个模值为4 的计数器。通过对其译码产生第一个RAM 的写使能信号we1。对we1计数产生第一个RAM 的写地址waddr1,而每次滤波运算读的首地址与当前的写地址一致,如图中箭头所指。这样由写地址可产生读首地址,进而产生读地址raddr1。we2 和waddr2可分别由we1 和waddr1 做一定延时产生。从而,实现了控制信号之间的逻辑紧凑。需要注意的是只有当输入数据在第一个RAM 中的生命周期结束才可写入第二个RAM,如图中的x(0) ,只有在计算 y(3)之后才被写入第二个 RAM。同时,对比 data1 和 data2虚线框内的数据,也就不难理解图4.41 中乘法器的输出需要两级寄存。

对图4.41 所示结构进行一定的改进即可由加法树改为加法链实现中间乘积结果的相加,改进思路与图4.39 类似,此处不再赘述。

图4.42 基于两个单端口RAM 的8 抽头半并行FIR 滤波器时序图

图4.42 基于两个单端口RAM 的8 抽头半并行FIR 滤波器时序图

结论:
(1)此结构中输入数据采样率与系统时钟频率之间的关系由式(4.30)决定;
(2)每个单端口RAM的深度为N /M ;
(3)ce 信号决定了一次滤波运算所需时钟周期;
(4)滤波器系数分M段存储在M个ROM中,每个ROM深度为N /M 。

《基于FPGA的数字信号处理》(第2版)本书围绕Xilinx新一代28nm工艺芯片7系列FPGA,结合Xilinx新一代开发工具Vivado以及针对算法开发的Vivado HLS和System Generator,讲解了数字信号处理中的经典算法在FPGA上的实现方法。第2版保持了第1版的主题――如何将理论算法转化为工程实现,新增了算法的Matlab代码描述;增加了部分算法的System Generator模型。 讲解了FPGA实现时的一些细节问题如复位、跨时钟域设计等。
本书购买地址:
京东: http://item.jd.com/11727638.html
当当: http://product.dangdang.com/23733281.html
亚马逊: http://www.amazon.cn/
互动出版网: http://product.china-pub.com/4715650