FIR数字滤波器的FPGA实现(二)-串行FIR滤波器设计(2)
(二)FIR数字滤波器的FPGA实现-串行FIR滤波器设计
文章目录
对于FIR滤波器主要涉及到滤波器的设计和滤波器的实现,设计和实现的区别如下图所示:
实现是 forward problem,设计是 inverse problem
What are inverse problems?
本文主要涉及到FIR滤波器的实现,在实现的过程中,h[k]都是已知的,而h[k]的求解一般是设计的过程。具体内容包括,FIR滤波器的基本原理,串行FIR滤波器设计(此设计为滤波器实现的“设计”和FIR滤波器的设计不同,自行理会),并行FIR滤波器设计,串并FIR滤波器设计,分布式FIR滤波器设计,快速卷积型 FIR 滤波器、多通道 FIR 滤波器、多频响 FIR 滤波器。对于快速卷积型 FIR 滤波器、多通道 FIR 滤波器、多频响 FIR 滤波器会简单介绍,其中串行、并行、串并、分布式FIR滤波器设计会给出相应源码和仿真模型,如果条件允许会抽出一个源码在FPGA上运行,并进行实验分析。
0 串行FIR滤波器基本原理
1 基于移位寄存器的串行 FIR 滤波器
1.1 基本理论
1.2 设计实现
2 基于双端口 RAM 的串行 FIR 滤波器
基于双端口 RAM (此时 RAM 配置为 Simple Dual Port RAM) 的串行 FIR 滤波器其设计思想是输入数据周期性的动态流动是以读/写地址的改变而实现的。这里的周期性是指输入数据的动态管理方式即读/写地址的变化是周期性的,从而导致了输入数据的流动是周期性的。结合图 2.2 进一步分析,将输入数据;x(0)写入 RAM 的 0 号地址, 在其整个生命周期内都将位于 0 号地址,直至 x(4)写入。x(l)写入 RAM 的 1 号地址,在其整个生命周期内都将位于 1 号地址, 直至 x(5)写入。 其他数据依此类推。 通过读地址使数据依期望顺序进入数据窗。
基于双端口 RAM 的串行 FIR 滤波器硬件结构如图 4.15 所示。 整个系统由控制模块、 双端口 RAM 系数 ROM 和乘加器构成。控制模块产生双端口 RAM 所需的写地址 waddr 写使能 wen 读地址 raddrdata 以及系数 ROM 的读地址信号 raddrcoe。双端口 RAM 的读/写时钟一致,写入数据速率即输入数据采样率通过写使能控制,它与系统时钟频率之间依然满足式 (2.11) 所示的关系式。滤波运算最终结果 firout 由末级捕获寄存器输出。
图 4.15 所示各信号之间的时序关系如图 4.16 所示。此处以 4 抽头 FIR 滤波器为例。以读系数地址 raddrcoe 为基础, 通过译码产生写使能信号 wen。 对 wen 计数产生写地址信号 waddr。可以发现每次滤波运算读地址以递减方式计数, 且读的首地址 ( 图中曲线箭头所指) 即为当前写地址, 从而使读写地址具有很强的相关性, 实现电路的自我纠错。 这是 FPGA 设计中的一个重要思想。 设计时, 加法器的位宽仍按照式 (2.12) 处理, 此处不再赘述。
图 4.15 所示结构中,用于输入数据缓存的 RAM 深度、存储滤波器系数的 RAM 深度均与滤波器长度一致。由于 Xilinx 7 系列 FPGA 中,每个 Block RAM 的大小为 18Kb,可配置为 1K x 18、2K x 9 或者512 X 36 ( 深度 X 宽度)。这意味着这两个 RAM 都有一些存储空间被浪费。能否将这两个 RAM 合并形成 RAM+ROM 的结构呢?就单个 Block RAM 大小而言, 无论是深度还是宽度都可以同时满足通常情况下的输入数据和滤波器系数存储的需求。因此, 把输入数据和滤波器系数存储在一个 Block RAM 中是可行的。 此时, 只需把一个Block RAM 分为两个存储空间: 上半存储空间用于数据缓存, 下半存储空间用于滤波器系数存储。 这两个存储空间的深度均为 V, 宽度为输入数据位宽和滤波器系数位宽两者中的较大者。 初始化时, 上半存储空间初始化值为 0, 下半存储空间初始化值为滤波器系数。 系统运行时, 上半存储空间可进行读写操作, 且为先写后读模式; 下半存储空间只能进行读操作, 类似于 ROM, 其硬件结构如图 4.17 所示, 相应的时序如图 4.18 所示, 这里仍以 4 抽头FIR 滤波器为例。
采用 SysGen 设计时, 控制模式的实现方式如 SysGen 模型 4- 1 所示。 这里假定滤波器长度为 92, 因此存储系数的地址范围为 92〜 183。
结论:
- (1) 采用双端口 RAM 设计时, 双端口 RAM 的深度与滤波器抽头数一致;
- (2) 输入数据采样率与系统时钟频率满足式 (4.21 ) 所示关系式。
3 系数对称的串行 FIR 滤波器的设计
对于线性相位 FIR 滤波器, 可利用其系数的对称性构造高效的串行结构。 为方便起见 , 不失一般性 , 此处以8抽头FIR滤波器为例, 假定其系数为偶对称, 则由式(4.15)可知
这样, 完成一次滤波运算由原来的 8 次乘法运算变为 4 次, 加法运算次数保持不变, 但首先要进行预加处理。
从数据窗的角度来看, 此时进入窗内的数据应为两行, 如图 4.19 所示。 显然, 这两行数据是并行的, 同时进入窗内。 于是, 这等效于将 8 抽头变为 4 抽头处理, 将采样率提高了1 倍。
根据以上分析, 对于 N 抽头( 这里假定 N 为偶数) 系数对称的 FIR 滤波器, 其采样率fs 与系统时钟频率fclk 之间的关系为
针对系数的对称性, 设计的关键就是如何构造图 4.19 所示的数据流, 使得相应的输入数据并行输出, 且第一行数据正向输出, 第二行数据反向输出。 进一步的分析如图 4.20 所示。 图中显示了计算x(7)、 x(8)和x(9)时所需要的输入数据, 同时假定 x(0)〜 x(7)依次存储在 0〜7 号地址空间。 不难看出, 每次滤波运算总有一个数据被替换掉。 例如, 计算x(8)时, x(8)替换掉 x(0) 从地址的角度看, 计算y(7)时从 0 号地址读出 x(0) 并将 x(8)写入 0号地址。 同样地, 计算y(8)时从 1 号地址读出x(l)并将 x(9)写入 1 号地址。
上述操作可利用双端口 RAM 完成。 两个端口 A、B 共享存储空间但却有独立的读写地址和输出端口。 其中, A 端口可读可写, 且工作在先读后写的模式, 即对同一个地址进行读写时, 读出该地址上的原有数据并将新数据写入该地址。 B 端口只读, 且反向读出数据。 相应的硬件结构如图 4.21 所示。 整个系统由控制模块、 双端口 RAM、系数 ROM 和乘加器构成。 控制模块是设计的关键。
图 4.21 所示结构关键点是如何设计地址发生器, 该地址发生器要产生正向地址 addra,反向地址 addrb 写使能信号wen 和读系数地址 addrcoe 并尽量使它们相关起来。 以 8 抽头为例, 它们之间的时序关系如图 4.22 所示。 这里假定 x(0)〜 x(7)按顺序存储在 RAM 的0〜7 号地址。 从图中可知, addra 递增计数, 通过wen的选择巧妙地将读写地址融为一体。addrb 递减计数, 且当前滤波运算的写地址是下一次滤波运算 addrb 的首地址, 如图中曲线箭头所指。 此外, 也可看出每次滤波运算 addra 和 addrb 首地址之间的关系即 addra 首地址减 1 与 addrb 的首地址相等, 如图中虚线箭头所指。 利用这一点使写地址、 正向读地址以及反向读地址相关起来。
根据图 4.22 所示时序, 可设计出相应的电路如 SysGen 模型 4-2 所示。 由于 SysGen 提供的计数器模块在 Counter type 为 Count limited 的模式下不提供预加载端 (load ) 故 addra和 addrb 对应的计数器采用加法器+数据选择器的结构, 如图中虚线框所示。
在 Virtex-6 和 7 系 列 FPGA 中的 DSP48E1 具有了预加器, 从而使得预加运算可在DSP48E1 内部完成, 节省了外部逻辑资源, 而且使得系统可以高速运行。 在 7 系列中实现系数对称的串行 FIR 滤波器可采用如图 4.23 所示的硬件结构。
结论:
- (1) 存储输入数据的双端口 RAM 其深度与滤波器抽头数一致;
- (2) 存储系数的 ROM 其深度为滤波器抽头数的一半;
- (3) 输入数据采样率与系统时钟频率满足式 (4.28) 所示关系式。
4 两种串行结构的 FIR 滤波器性能比较
基于移位寄存器和双端口 RAM 的串行 FIR 滤波器都是使用了一个乘加器, 根据式 (4.2 ) 卷积运算所要求的数据流顺序完成输入数据与滤波器系数的相乘以及乘积结果的累加本质上是一致的, 都要求输入数据采样率与系统时钟频率满足式 (4.2.1) 所示的关系, 当系数对称时则满足式 (4.28 ) 所示的关系。 不同之处体现在抽头延时线的实现方式, 前者采用移位寄存器实现数据的动态流动, 后者则是通过 RAM 来实现的。
从资源角度看, 两者都需要运算单元和存储单元。 运算单元完成乘累加运算。 在不同的器件中可以采用不同的方式实现。 例如, 在 Xilinx Virtex-4 中可用 DSP48, 在 Virtex-5 中可用 DSP48E, Virtex-6 和 7 系 列 FPGA 中可用 DSP48E1 , 三者均可利用其动态配置的特性独立并行完成乘法运算与累加运算, 而功能的切换只需要一个简单的控制信号。 存储单元有两个功能: 缓存输入数据和存储滤波器系数。 如果采用移位寄存器对输入数据进行缓存, 则其消耗的是 LUT,如果采用双端口 RAM,那么可通过分布式 RAM 或 Block RAM 实现。 滤波器系数的存储要考虑滤波器的阶数。 如果阶数较高, 那么采用 Block RAM 为宜。
从速度角度看, 两者的处理速度都受限于式 (4.21 ) 或式 (4.28 ) 所示的关系式, 更直接地讲, 取决于输入数据采样率和滤波器的阶数, 同时还和器件有关。 显然, 串行结构适用于采样率较低、 滤波器阶数适中或者采样率极低、 滤波器阶数很高的场合。
综上所述, 串行结构占用了极少的资源(只用了一个乘加器), 这是它的优势, 而其处理速度不会太高, 这是它的不足。 它正是“ 以速度换资源” 即牺牲速度节省资源, 在某些场合灵活使用会体现其应有的价值