FIR滤波器

Vivado FIR滤波器设计与仿真(二)

在Vivado FIR滤波器设计与仿真(一)中产生了两路正弦信号,频率分别为4MHz和5MHz,今天要进行FIR滤波器设计,在进行滤波器设计之前,需要对滤波器的参数进行设置,需要借助MATLAB软件或者Filter Solutions软件,这次使用Filter Solutions来进行参数设定。

关于Filter Solutions软件的使用,这里有一篇博客比较详细的介绍了它的用法,可以作为参考:
Filter Solutions之滤波器设计

滤波器参数
产生的两路正弦信号分别为4MHz和5MHz,混频之后产生的信号频率为1MHz和9MHz,首先进行低通滤波设计,我们要把1MHz的信号滤除掉,Filter Solutions软件参数设置如图所示:

学会System Generator(17)——转置型FIR滤波器设计

本文是该系列的第17篇。上一篇介绍了使用低层次封装的block搭建直接型FIR滤波器结构的方法,对设计进行时序分析,并将设计流水线化来提高系统的工作频率。转置型FIR滤波器是一种由直接型FIR滤波器变换而来的结构,在几乎相同的结构下有着更好的性能,本文将对此做介绍。

转置型FIR滤波器
滤波器结构框图如下:

直接型FIR滤波器是对输入数据做寄存,这样当设计没有采用流水线时,最长的路径为输入到输出,有一个乘法器和多个加法器(见上篇);转置型FIR滤波器是对加法器的输出结果做寄存,这样相当于将原本最长的路径拆分为几段,缩短了延迟,大大提升了系统工作频率。

需要注意的是,虽然看起来直接型FIR和转置型FIR的结构完全相同,只是延迟器的位置不同。但转置型FIR滤波器是对乘加运算之后的值(位宽有扩展)做寄存,消耗的资源实际上更多,在系数越多的情况下越明显。

System Generator设计

作者:圆宵  FPGA那点事儿

在这个系列的前4篇文章“HighLevel Synthesis(HLS) 从一个最简单的fir滤波器开始1-4”中,我们从一个最简单的FIR滤波器,一步步优化,得到了一个资源和Latency都比较理想的HLS综合结果。我们先回顾下:

我们做过的优化主要有:
在头文件定义中,把数据和系数的精度都改成了整形,用18bit来表示;
在fir.c的for loop里面,修改代码结构,只显性的出现一处乘法描述;
把fir.c中的shift_reg,在HLS中约束只用reg来实现

作者:圆宵  FPGA那点事儿

在这个系列的前3篇文章“HighLevel Synthesis(HLS) 从一个最简单的fir滤波器开始1-3”中,我们从一个最简单的FIR滤波器,一步步优化,得到了一个比较理想的HLS综合结果,资源消耗很少。我们先回顾下:

我们做过的优化主要有:
在头文件定义中,把数据和系数的精度都改成了整形,用18bit来表示;
在fir.c的for loop里面,修改代码结构,只显性的出现一处乘法描述;
通过这2处改进,我们成功把DSP48E的消耗数量,从最开始的8个,降低到了1个。最新的资源消耗如下:

作者:圆宵  FPGA那点事儿

在上一章“High LevelSynthesis(HLS) 从一个最简单的fir滤波器开始2”中,我们通过修改c的头文件里面的类型精度定义,把DSP48E的消耗数量从8个压缩到了2个:

但这个结果仍然不是最优的结果。理论上如果采用串行的结构,乘加运算可以复用,虽然latency会变长,但是一个fir滤波器最少只需要1个乘法器即可实现。但是我们之前的c代码,HLS确采用的2个乘法运算单元,这是为什么呢?

我们还是先看下原先的代码结构,简单起见,只放相关的片段:

作者:圆宵  FPGA那点事儿

在这个系列的上一篇文章“HighLevel Synthesis(HLS) 从一个最简单的fir滤波器开始1”中,我们从一个最简单的FIR滤波器,介绍了HLS是如何把C映射成RTL代码的一些基本细节:
1、c函数的参数,会映射成RTL代码的输入或者输出;
2、HLS会自动在RTL代码接口上加入clk和rst信号;除此之外,还可以选择性加入其它一些系统控制信号;
3、c函数里面的变量,一般会映射成寄存器;数组可能会映射成RAM
4、c里面的加减乘运算,也会映射成RTL里面的加减乘运算;一般乘法运算用FPGA里的DSP Block来实现
5、c里面的循环,if else等控制,也会映射成RTL里面的状态机或者if else控制逻辑。

作者:圆宵 FPGA那点事儿

众所周知,HLS是Xilinx于几年前推出的一个高级综合工具,可以直接把C/C++代码,转换成可综合的verilog/VHDL代码。听起来很高级,是不是?。但看新鲜的人多,愿意吃螃蟹的人却很少。这里面有很多因素在,比如担心HLS的效率,对C/C++不熟悉(或者说对verilog/vhdl更熟悉),项目时间太紧……,等等原因。但不管怎样,高层次综是未来硬件系统设计的的一个趋势方向。如果作为工程师的我们,还不赶快转变思维跟上这一变革,那很快就out啦 ~\(≧▽≦)/~。

接下来的这个系列里面,就让我们一点一点的解开HLS的面纱。为了循序渐进的展开,作为一个引子,让我们先从最简单的FIR滤波器例子开始。

FIR滤波器是很常见的一种数字信号处理电路。我们看看用c代码如何描述一个FIR滤波器:

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

教程——基于HLS实现FIR滤波器

1.FIR滤波器简介
FIR(Finite Impulse Response)滤波器:有限长单位冲激响应滤波器,又称为非递归型滤波器,是数字信号处理系统中最基本的元件,它可以在保证任意幅频特性的同时具有严格的线性相频特性,同时其单位抽样响应是有限长的,因而滤波器是稳定的系统。因此,FIR滤波器在通信、图像处理、模式识别等领域都有着广泛的应用。

在进入FIR滤波器前,首先要将信号通过A/D器件进行模数转换,把模拟信号转化为数字信号;滤波器输出的数据是一串序列。FPGA有着规整的内部逻辑阵列和丰富的连线资源,特别适合于数字信号处理任务,相对于串行运算为主导的通用DSP芯片来说,其并行性和可扩展性更好,利用FPGA乘累加的快速算法,可以设计出高速的FIR数字滤波器。本章借助Xilinx HLS工具,实现了一个硬件FIR滤波器。

2.基于HLS的FIR滤波器实现流程
1)打开vivado HLS 2014.4,点击“Create New Project”图标,如下图所示:

作者:Steve Leibson, 赛灵思战略营销与业务规划总监

1400多人阅读了上个月的博文“JESD204B ADC interface magically commutates Gsamples/sec into a polyphase channelizer”,这篇博文描述了拥有JESD204B接口的ADC怎样切换或抽样千兆样点/每秒的数据流,变成多个低速流,为的是用多相信道器并行处理。如果你懂得最后一句话,你会很高兴可以学到现在在赛灵思System Generator的最新发布中有一个可配置的超级采样FIR滤波器,可以在最近的Vivado 2014.3 release中找到。

原文链接:

同步内容