微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于VerilogHDL的FIR数字滤波器设计与仿真

基于VerilogHDL的FIR数字滤波器设计与仿真

时间:01-06 来源:互联网 点击:

引言

数字滤波器是语音与图像处理、模式识别、雷达信号处理、频谱分析等应用中的一种基本的处理部件, 它能满足波器对幅度和相位特性的严格要求, 避免模拟滤波器所无法克服的电压漂移、温度漂移和噪声等问题。有限冲激响应(FIR)滤波器能在设计任意幅频特性的同时保证严格的线性相位特性。

1 FIR 数字滤波器

FIR 滤波器用当前和过去输入样值的加权和来形成它的输出, 如下所示的前馈差分方程所描述的。

FIR 滤波器又称为移动均值滤波器, 因为任何时间点的输出均依赖于包含有最新的M个输入样值的一个窗。由于它的响应只依赖于有限个输入, FIR 滤波器对一个离散事件冲激有一个有限长非零响应, 即一个M阶FIR 滤波器对一个冲激的响应

在M个时钟周期之后为零。

FIR滤波器可用图1 所示的z 域块图来描述。

其中每个标有z- 1 的方框都代表了有一个时钟周期延时的寄存器单元。这个图中标出了数据通道和必须由滤波器完成的操作。滤波器的每一级都保存了一个已延时的输入样值, 各级的输入连接和输出连接被称为抽头, 并且系数集合{hk}称为滤波器的抽头系数。一个M阶的滤波器有M+1 个抽头。通过移位寄存器用每个时钟边沿n( 时间下标) 处的数据流采样值乘以抽头, 并且求和得到输出yFIR[n]。滤波器的加法和乘法必须足够快, 在下一个时钟来到之前形成y[n]。并且在每一级中都必须测量它们的大小以适应他们数据通道的宽度。在要求精度的实际应用中, Lattice 结构可以减少有限字长的影响, 但增加了计算成本。一般的目标是尽可能快地滤波, 以达到高采样率。通过组合逻辑的最长信号通路包括M级加法和一级乘法运算。FIR 结构指定机器的每一个算术单元有限字长, 并且管理运算过程中数据流。

2 FIR 数字滤波器设计的实现

目前FIR 滤波器的实现方法有三种: 利用单片通用数字滤波器集成电路、DSP 器件和可编程逻辑器件实现。单片通用数字滤波器使用方便, 但由于字长和阶数的规格较少, 不能完全满足实际需要。使用DSP 器件实现虽然简单, 但由于程序顺序执行, 执行速度必然不快。FPGA/CPLD 有着规整的内部逻辑阵列和丰富的连线资源, 特别适合于数字信号处理任务, 相对于串行运算为主导的通用DSP 芯片来说, 其并行性和可扩展性更好。但长期以来, FPGA/CPLD 一直被用于系统逻辑或时序控制上, 很少有信号处理方面的应用, 其原因主要是因为在FPGA/CPLD 中缺乏实现乘法运算的有效结构。

现在的FPGA 产品已经能够完全胜任这种任务了。其中Altera公司的Stratix 系列产品采用1.5V 内核, 0.13um 全铜工艺制造, 它除了具有以前Altera FPGA 芯片的所有特性外, 还有如下特点: 芯片内有三种RAM 块, 即512bit 容量的小RAM(M512) 、4KB 容量的标准RAM(M4K) 、512KB 的大容量RAM(MegaRAM) 。内嵌硬件乘法器和乘加结构的DSP 块, 适于实现高速信号处理; 采用全新的布线结构, 分为三种长度的行列布线, 在保证延时可预测的同时增加布线的灵活性; 增加片内终端匹配电阻, 提高信号完整性, 简化PCB 布线; 同时具有时钟管理和锁相环能力。

FIR 滤波器的Verilog HDL 设计实例

1、设计意图

本例主要是在Stratix 器件内实现基本有限脉冲响应滤波器。

FIR 的基本结构包括一系列的乘法和加法。FIR 的运算可用式( 1) 的方程描述, 现重写如下:

x(n)表示输入样本序列, h(n)代表滤波器的系数, L 是抽头的数量。

一个L=8 的FIR 设计如图2, 利用了输入的8 个样本。因此称之为8 抽头滤波器。该结构是有一个移位寄存器, 乘法器和加法器组成的, 可实现L=8 阶的FIR。其数据通道必须足够宽, 以适应乘法器和加法器的输出。这些采样值被编码为有限

字长的形式, 然后通过M个寄存器并行移动。可见用一个MAC级连链就可以构成这种机器。每个寄存器提供一个单位样本内延迟。这些延迟输入与各自的系数相乘, 然后叠加得到输出。图2 所示为基于MAC 的8 阶FIR 数字滤波器结构。

在该设计中有八个抽头, 各抽头有18 位输入和滤波器系数。由于一个DSP 块可以支持4 个18 位输入的分支, 所以设计需要2 个DSP 块。输入数据串行加载到DSP 块中, DSP 内部的移入/移出寄存器链用于产生延迟。滤波器系数从TriMatrix(tm)的ROM存储器中加载。

2、Verilog HDL 代码编写风格

HDL 代码编写应该具有很好的易读性和可重用性, 而自顶向下的分割方法可以帮助我们达到最佳的结果。HDL 代码在达到功能的情况下要尽可能的简洁, 尽量避免使用带有特殊库单元的实例, 因为这样会使得整个进程变得不可靠。在本设计中, 我们将设计划分成一个顶级文件和三个次

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top