FPGA的低通数字滤波器实现.docx
- 文档编号:10084591
- 上传时间:2023-05-23
- 格式:DOCX
- 页数:24
- 大小:701.36KB
FPGA的低通数字滤波器实现.docx
《FPGA的低通数字滤波器实现.docx》由会员分享,可在线阅读,更多相关《FPGA的低通数字滤波器实现.docx(24页珍藏版)》请在冰点文库上搜索。
FPGA的低通数字滤波器实现
随着数字技术的发展,数字滤波器广泛应用于语音与图像处理、模式识别、雷达信号处理、频谱分析等领域,它有精度高、灵活性大等突出特点。
FIR数字滤波具有稳定性高,严格的线性相位,能用FFT算法实现等特点。
通过FPGA实现FIR数字滤波具有实时性高、处理速度快、精度高的特点。
这种新思路不同于传统的设计观念,必将在高速滤波器设计、高速FFT设计中得到广泛应用。
本文在设计中提出了一种采用现场可编程门阵列器件(FPGA)实现线性FIR数字滤波器,采用同一结构的FIR滤波器,并且通过调整参数实现不同频率段的滤波,利用分布式算法的并行处理的高效的特点,对于在FPGA中实现FIR滤波器的关键——乘加运算,给出将乘加转化为加法树结构实现乘法器,并利用多级流水线方式实现运算。
用VerilogHDL语言编写了程序,并用Matlab软件进行参数计算和仿真,再用ModelSim进行功能仿真,再用QuartusⅡ软件进行时序仿真。
仿真结束后下载到选定的FPGA上,实现FIR数字滤波器的功能。
实验结果可以看出,这种改进滤波器实现结构的算法,结果表明研制的滤波器性能稳定可靠,可以灵活的处理综合的面积和速度的约束关系,使最后设计达到最优。
由于采用FPGA,使得滤波器的结构实现简单,降低了对乘法存储容量的需求,并且不影响系统的速度,节约了硬件资源,加快了研制速度。
关键词:
FIR滤波器可编程门阵列器件加法树分布式流水线并行结构
一、概述部分
信号处理的内容含滤波、均衡、放大、噪声消除、信号产生、检测、运算和参量提取等许多方面。
FPGA器件作为ASIC的一个重要分支,是一种已经完成了全部工艺制造,可以直从市场购买的产品,用户只需对它编程就可以实现所需要的功能,并且在保持了传统ASIC低功耗、轻小型化、高可靠性等优点的同时,还具有较高的设计灵活性和适应性。
1.1、设计所要实现的功能:
设计一个15阶的线性相位FIR低通滤波器过程如下要求:
滤波器的设计指标
采样频率:
≥50MHz归一化截止频率:
0.4MHz
类型:
低通输入数据宽度:
4位
阶数:
15阶输出数据宽度:
11位
采用汉宁窗函数(Hanning)设计15阶线性相位FIR数字滤波器,并提取其特性参数。
1.2、设计所采用的基本思想:
目前FIR滤波器的实现方法有三种:
利用单片通用数字滤波器集成电路、DSP器件和可编程逻辑器件实现。
单片通用数字滤波器使用方便,但由于字长和阶数的规格较少,不能完全满足实际需要。
使用DSP器件实现虽然简单,但由于程序顺序执行,执行速度必然不快。
FPGA有着规整的内部逻辑块阵列和丰富的连线资源,特别适合细粒度和高并行度结构特点的数字信号处理任务,如FIR、FFT等。
在该FIR滤波器的设计中,根据FPGA的结构特点和资源,采用了如下的设计技巧:
(1)采用分布方式下的查找表和加法树的结构,简化了乘法器的设计;
(2)采用了流水线结构,减小了查找表ROM的规模;
(3)利用状态机实现输入、移位和输出功能,条理清楚地简化计算过程;
(4)滤波器的参数独立于滤波器的结构,方便实现不同类型的滤波器;
(5)采用了VerilogHDL语言作为设计输入的手段,增加了设计可移植性;
(6)采用参数化的结构,可以根据应用情况调整设计的规模。
二、FIR数字滤波器设计原理
2.1、滤波原理
滤波器,顾名思义,其作用是对输入信号起到滤波的作用。
对图所示的LSL系统其时域输入输出关系是
若x(n),y(n)的傅立叶变换存在,则输出输入的频域关系是
,
,如图所示,
那么由式,
将如图所示。
这样,x(n)通过系统h(n)的结果是使输出y(n)中不再含有
的频率成分,而使
的成分“不失真”的给以通过。
2.2、单位冲击响应h(n)的特点
FIR滤波器的单位冲击响应h(n)是有限长(0≤n≤N-1),其z变换为:
在有限Z平面有(N-1)个零点,而它的(N-1)个极点均位于原点Z=0处。
有限冲击响应(FIR)的优点:
(1)既具有严格的线性相位,又具有任意的幅度。
(2)FIR滤波器的单位抽样响应是有限长的,因而滤波器性能稳定。
(3)只要经过一定的延时,任何非因果有限长序列都能变成因果的有限长序列,因而能用因果系统来实现。
(4)FIR滤波器由于单位冲击响应是有限长的,因而可用快速傅里叶变换(FFT)算法来实现过滤信号,可大大提高运算效率。
2.3、设计基础:
由上面的分析可得,滤波器的设计归结为选择一组h(n),为了满足滤波器具有线性相位特性,h(n)在选择时必须注意保证其对称性和实值性。
线性相位的FIR滤波器共有4种:
(1)N为偶数,h(n)偶对称;
(2)N为偶数,h(n)奇对称;(3)N为奇数,h(n)偶对称;(4)N为奇数,h(n)奇对称,对称中心都为
。
利用系数h(n)的对称性节省的硬件资源及优化算法。
一般情况下,分析15阶FIR滤波器对15个数字通道(每通道8位)进行滤波,这样FIR的系数h(0)~h(14)是可以配置的,即可以作为RAM提前写到滤波器元件中。
如果是寄存器传输级设计,有三种设计方案:
方案1.例化15个FIR滤波器,即有15个图1所示的模块并联,即每个通道单独使用一个滤波器;
方案2.所有通道共享同一个例化FIR滤波器,但是这种方案需要的资源也较多;
方案3.共享FIR滤波器,同时共享乘器和加器;
从下表可以看出方案1实现起来较简单,没有控制器,但是需要的资源较多,需要例化9个滤波器;方案3实现的是串行流水线操作,实现资源共享,最节省资源,但是又是最复杂的一种实现方法,同时执行效率很低。
一般在FPGA的应用设计中要考虑的两个最重要的因素是系统的最高速率S和综合所需要的逻辑单元数L。
从而我们取指标
,可见对于同样要求的FIR滤波器计来说SLR大,则说明此FIR滤波器的设计效果好。
在设计的时灵活地设置模块数(即流水线的阶数),采用流水线的并行FIR滤波器的设计,尽量增大SLR值,从而在综合面积和速度上同时达到优化。
三、系统设计部分
3.1、整个设计的组织结构:
FPGA有着规整的内部逻辑阵列和丰富的连线资源,特别适合于数字信号处理任务,相对于串行运算为主导的通用DSP芯片来说,其并行性和可扩展性更好。
但长期以来,FPGA一直被用于系统逻辑或时序控制上,很少有信号处理方面的应用,其原因主要是因为在FPGA中缺乏实现乘法运算的有效结构。
现在这个问题得到了解决,使FPGA在数字信号处理方面有了长足的发展。
它们可以用较小的代价和与加法器级数无关的处理速度实现整数乘法运算,能比单纯地用查找表(DA)方法用更少的逻辑资源实现FIR滤波器。
随着FPCA集成规模的不断提高,许多复杂的数学运算已经可以用FPCA来实现,利用单片FPGA实现系统的设想即将变为现实际。
利用流水线技术将复杂的数字逻辑电路分级实现。
这样,使每一级的电路结构简化,从而减小输入到输出间的电路时延,在较小的时钟周期内就能够完成这一级的电路功能。
在下一个时钟周期到来的时候,将前一级的结果锁存为该级电路的输入,这样逐级锁存,由最后一级完成最终的结果输出。
流水线技术结构示意图见图:
在流水线技术中,由于算法分解后,数据逐级锁存,输出不是实时的,电路中有几级分步操作,输出相对于输入就会延迟相应的时钟周期。
另外在每一级都要用寄存器将上一级的结果寄存,所以当电路中位数增加。
这也是流水线技术为了得到较高的工作效率而增加额外的开销。
流水线设计的一个关键在于整个设计时序的合理安排,要求每个操作步骤的划分合理。
流水线处理方式之所以频率较高,是因为复制了处理模块,它是面积换取速度思想的又一种具体体现。
无论加法器、乘法器、还是整个FIR滤波器都可以利用流水线技术,加快运算速度。
3.2、各个子单元的设计思路:
3.2.1、分布式算法的运用
查找表可用所有输入变量的一同一位进行寻址。
分布式算法在完成乘加功能时是通过将各输入数据每一对应位产生的部分积预先进相加形成相应部分积,然后在对各部分积进行累加形成最终结果,而传统算法是等到所有乘积产生之后再进行相加来完成乘加运算的。
与传统算法相比,分布式算法可极大地减少硬件电路规模,很容易实现流水线处理,提高电路的执行速度。
如图为实现分布式算法的硬件结构:
3.2.2、乘法造作采用加法树实现
乘法造作采用加法树实现,八位输入、十六位输出,通过连续赋值语句构造门级基本框架,用always语句实现每位相乘后的移位相加,实现乘法的操作功能。
在这个模块里面,输出都有寄存器并且采用同一全局时钟,即流水线结构,大大增加了系统的吞吐量和数据处理速度。
通过模块调用,可将加法树运用到所需乘法的相关领域,能够降低开发周期。
它们可以用较小的代价和与加法器级数无关的处理速度实现整数乘法运算,能比单纯地用查找表(DA)方法用更少的逻辑资源实现FIR滤波器。
其用硬件实现电路如图所示:
3.2.3、采用状态机实现分布式算法的状态转移
设置三个状态s0、s1、s2。
状态s0完成数据的装入,数据寄存器需要成对出现,一个完成数据的延迟,另一个完成数据的移位,并将状态转移到s1;状态s1完成查找表功能、数据移位和分布式算法的乘累加运算,数据移位一个数据宽带后将状态转移到s2;状态s2完成数据的输出,并将状态转移到s0。
状态机的实现如图所示:
利用状态机可以条理清楚地简化计算过程,在算法实现时发挥着关键的作用。
3.2.4、采用查找表结构
查找表的实现方式如图右所示。
当实现固定系数的滤波器时,由于滤波器系数已经固定,因此,可以利用简化的乘法器(如查找表、逻辑树等),以减少设计所耗用的器件资源。
这时的乘法和加法就可以并行地采用查找表实现了,其结构示意。
查找表算法的主要特点,是巧妙地利用ROM查找表将固定系数的MAC运算转化为查表操作,其运算速度不随系数和输入数据位数的增加而降低,而且相对直接实现乘法器而言在硬件规模上得到了极大的改善。
3.3、各个子单元之间的接口关系:
3.3.1、数据的输入部分
为了避免由异步时钟域产生的错误,对于随机到达的数据,需要建立同步机制。
可采用使数据通过RAM或者FIFO的缓存再读取的方法。
数据的输入采用并行输入方式,通过移位寄存器实现移位,begin-end语句块实现滤波器的延时处理,8级缓存,减少不必要的冒险和竞争。
此外数据预处理部分也包含在着部分的描述中。
这部分的描述如下:
always@(posedgeclk)
begin
xfirst<=x;
xsecond<=xfirst;
xthird<=xsecond;
xfourth<=xthird;
xfifth<=xfourth;
xsixth<=xfifth;
xseventh<=xsixth;
xeighth<=xseventh;
end
3.3.2、系统的时序时钟
由于数据是逐字输入的,因此,前面的clk信号和数据输入的时钟信号之间必须符合是序关系,信号由clk信号延时得到,采用全局时钟网络。
这部分的描述如下:
initial
begin
clk=0;
forever#5clk=~clk;
end
3.3.3、乘法操作的函数调用
乘法操作采用加法树函数调用的方式实现,函数的调用是通过将函数作为表达式中的操作数来实现的。
在函数第一次调用时,返回二进制中一位的相乘,在函数第二次调用时,返回二进制中二位的相乘,最后用always语句使它们移位相加。
这部分的描述如下:
add_treer1(yfirst,xfirst,h1,clk),
r2(ysecond,xsecond,h2,clk),
r3(ythird,xthird,h3,clk),
r4(yfourth,xfourth,h4,clk),
r5(yfifth,xfifth,h5,clk),
r6(ysixth,xsixth,h6,clk),
r7(yseventh,xseventh,h7,clk),
r8(yeighth,xeighth,h8,clk);
3.3.4、流水线工作方式的接口关系
所谓流水线设计实际上是把规模较大、层次较多的组合逻辑电路分为几个级,在每级插入寄存器并暂存中间数据。
他能提高吞吐量,是以消耗较多的寄存器资源为代价的。
这部分的描述如下:
always@(posedgeclk)
begin
out1=yfirst+ysecond;
out2=ythird+yfourth;
out3=yfifth+ysixth;
out4=yseventh+yeighth;
out=out1+out2+out3+out4;
end
3.3.5测试码程序部分
`timescale10ns/1ns//definetime
moduletest;
output[10:
0]out;
input[3:
0]x;
inputclk;
reg[10:
0]out;
reg[8:
0]out1,out2,out3,out4;
parameter
always#5clk=~clk;//设置时钟
initial//initialprocess
begin
clk=1;
#5x={$random}%5;
#5x={$random}%5;;
#5x={$random}%5;;
#50$finish;
End
FIR1m(.out(out),.x(x),.clk(clk));
initial$monitor($time,,,"out=%bout1=%bout2=%bout3=%b",out,out1,out2,out3);
endmodule
3.4设计与其它设计的接口方式;
通过函数调用的方式,与其他设计进行连接,可以与其他设计连接。
例如把FIR1和FIR2运用到视频传输系统和音频系统中,实现信号的发送、传输和处理。
FIR1a(out,x,clk);FIR2b(out,x,clk);
接口可以通过运用wirer、reg定义引线类型,既可以作输入,又可以作输出,可以作为模块内部扩展功能。
reg[3:
0]xfirst,xsecond,xthird,xfourth,xfifth,xsixth,xseventh,xeighth;
wire[7:
0]yfirst,ysecond,ythird,yfourth,yfifth,ysixth,yseventh,yeighth;
reg[10:
0]out;
reg[8:
0]out1,out2,out3,out4;
4.1、片内各种资源的使用情况;
我们看一看Stratix芯片的内部结构,如下图:
Stratix主要包括add_tree,I/O块,RAM块和可编程连线(未表示出)。
在Stratix中,共使用了八个乘法器,七个加法器。
一个add_tree包括17个相加器和八个寄存器和相关逻辑。
片内硬件资源使用情况如下图所示:
4.2、关键节点、I/O引脚测试波形的描述:
系统pin如图所示:
可以用ModelSimSE6.0对各管脚的信号进行时序仿真,下图为加法树的仿真图,可以看出它实现的时一种乘法的功能。
4.3、仿真波形比较
FIR1时序仿真如下图:
在上图可以看出,当输入3时,每个时钟输出分别为010,016,024,02E,037;当输入e时,输出分别为04f,052,096。
实现滤波功能。
FIR2时序仿真如下图:
在上图可以看出,当输入3时,每个时钟输出分别为00c,010,016,024,02E;当输入e时,输出分别为03f,04f,052。
实现滤波功能。
4.4、RTL级电路描述;
上图分别为FIR1、和add_tree和FIR2的RTL级电路图。
借鉴计算机体系结构中的流水的思想,可以考虑数据一边输入一边送入相关的功能部件进行计算,主要是加法器和乘法器。
应该尽可能选择低位数的加法器和乘法器以减少设计成本。
五、结论
5.1、本文总结
本文首先给出了模拟和数字滤波器的技术指标和滤波器设计的基本原理,然后详细的论述了有限冲击响应(FIR)数字滤波器的设计原理和设计方法以及在设计过程中运用的思想和实现过程。
针对当前现场可编程门阵列器件(FPGA)在数字技术的发展和日益广泛的应用,为了提高有限冲击响应(FIR)数字滤波器的性价比,我们从其核心乘法器着手,从传统的以乘累加运算来实现乘法器,在根据FIR数字滤波器的线性相位特性,分布式算法原理以及查找表的构造方法,逐渐的引入一种基于流水线分布式算法的乘法器。
通过分析比较得出这种基于流水线分布式算法的乘法器在性能等方面都要优于传统的乘法器。
接着根据这种算法思想,我们设计了一个15阶的FIR滤波器;用VerilogHDL语言实现了上述思想,在QuartusⅡ上进行时序和功能仿真。
下图为所设计的滤波器在Matlab上的验证:
幅频特性曲线
相频特性曲线
冲击响应
从上述实现的结果来看,系统信号传递的最大延迟大约为40ns,完全满足整个系统对延迟的要求。
这种改进滤波器实现结构的算法可以灵活的处理综合的面积和速度的约束关系,使最后设计达到最优。
从上述设计和实现的过程来看,滤波器的结构和滤波器的滤波系数(决定了滤波器的类型)是分离的,因此可以很方便地实现不同类型的滤波器的设计移植,只需要将ROM中的初始化参数进行重新设置,也就是改变件中的数据,重新进行编译和布局布线,就可以得到不同类型的滤波器的实现。
此外,由于设计是采用VerilogHDL语言实现的,增加了设计的可移植性。
5.2、个人心得
时间如白驹过隙,转瞬即逝,在这段时间里,我付出了很多,同时也收获了很多。
我学会了,用VerilogHDL语言编写基本的设计程序和测试代码的编写,和QuartusⅡ如何安装,创建以及使用进行项目开发以及后期测试维护,时序图是如何画出来的,RTL级电路的实现等。
作为一个学电子的学生,一直觉得应该学会一个制作设计电路的软件,这也是选择这门课得初衷,只是学了这么久,掌握到的却只是很少的一部分,对软件体会的也不是很多,但学了一个学期,收获还是很多的。
学习软件是需要多练习和思考的,只有通过身体力行的实践才能真正懂得软件的作用,才能真正的达到学以致用的目的,所以以后还要经常练习。
这次课程设计对数字滤波器的设计,加强了我对FPGA这门课程的理解,对其应用有了一定的认识,提高了我们综合运用知识的能力,以及分析问题、解决问题的能力。
一方面,它加深与巩固了所学的数字滤波器各章节的理论,并将其综合运用,提高了我们综合运用知识的能力;另一方面,培养了我们对专业知识学习的趣。
虽然学习过程中出现很多问题,但都是有必要的,通过对他们的解决和处理,加深了我对整个软件的理解及电路的认识,很高兴学了这门课程。
六、参考文献
[1]夏宇闻.Verilog数字系统设计教程.北京航空航天大学出版社,2008
[2]程佩青.数字信号处理教程.北京:
清华大学出版社,2007
[3]郑学坚,周斌.微型计算机原理与应用.北京:
清华大学出版社,2002
[4]王诚,ALTER/FPGA_CPLD设计.西安:
人民邮电出版社,2009
七、附录
1、VerilogHDL程序代码如下:
(一)FIR1.V
moduleFIR1(out,x,clk);
output[10:
0]out;
input[3:
0]x;
inputclk;
reg[3:
0]xfirst,xsecond,xthird,xfourth,xfifth,xsixth,xseventh,xeighth;
wire[7:
0]yfirst,ysecond,ythird,yfourth,yfifth,ysixth,yseventh,yeighth;
reg[10:
0]out;
reg[8:
0]out1,out2,out3,out4;
//定义滤波器系数
parameter
h1=4'b0110,h2=4'b0010,
h3=4'b0011,h4=4'b0100,
h5=4'b0100,h6=4'b0011,
h7=4'b0010,h8=4'b0110;
always@(posedgeclk)
begin//该begin-end语句块实现滤波器的延时处理,8级缓存
xfirst<=x;
xsecond<=xfirst;
xthird<=xsecond;
xfourth<=xthird;
xfifth<=xfourth;
xsixth<=xfifth;
xseventh<=xsixth;
xeighth<=xseventh;
end
add_treer1(yfirst,xfirst,h1,clk),//乘法操作采用加法树实现
r2(ysecond,xsecond,h2,clk),
r3(ythird,xthird,h3,clk),
r4(yfourth,xfourth,h4,clk),
r5(yfifth,xfifth,h5,clk),
r6(ysixth,xsixth,h6,clk),
r7(yseventh,xseventh,h7,clk),
r8(yeighth,xeighth,h8,clk);
always@(posedgeclk)
begin
out1=yfirst+ysecond;
out2=ythird+yfourth;
out3=yfifth+ysixth;
out4=yseventh+yeighth;
out=out1+out2+out3+out4;
end
endmodule
(二)FIR2.V
moduleFIR2(out,x,clk);
output[10:
0]out;
input[3:
0]x;
inputclk;
reg[3:
0]xfirst,xsecond,xthird,xfourth,xfifth,xsixth,xseventh,xeighth;
reg[4:
0]s1,s2,s3,s4;
wire[8:
0]yfirst,ysecond,ythird,yfourth;
reg[10:
0]out;
reg[9:
0]out1,out2;
//定义滤波器系数
parameter
h1=4'b0110,h2=4'b0010,
h3=4'b0011,h4=4'b0100;
always@(posedgeclk)
begin//该begin-end语句块实现滤波器的延时处理,8级缓存
xfirst<=x;
xsecond<=xfirst;
xthird<=xsecond;
xfourth<=xthird;
xfifth<=xfourth;
xsixth<=xfifth;
xseventh<=xsixth;
xeighth<=xseventh;
end
always@(posedgeclk)
begin
s1=xfirst+xeighth;
s2=xsecond+xseventh;
s3=xthird+xsixth;
s4=xf
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- FPGA 数字滤波器 实现
![提示](https://static.bingdoc.com/images/bang_tan.gif)