课程设计报告基于FPGA的FIR滤波器设计.docx
《课程设计报告基于FPGA的FIR滤波器设计.docx》由会员分享,可在线阅读,更多相关《课程设计报告基于FPGA的FIR滤波器设计.docx(38页珍藏版)》请在冰豆网上搜索。
课程设计报告基于FPGA的FIR滤波器设计
1概述
为了帮助学生深入理解和消化基本理论、进一步提高综合应用能力并且锻炼独立解决问题的能力,电子系统设计方向老师将《数字信号处理》、《集成电路原理与应用》和《FPGA系统设计与应用》几门课程融合在一起开设的FPGA综合实验课程设计。
主要从以下两方面考虑:
一:
设计内容突出FPGA及信号处理的理论和技术的综合应用。
如在数字滤波实验中,要求学生能够熟悉数字滤波器的基本原理,并能运用VHDL语言实现数字滤波。
并采用MATLAB软件实现的结果与运用VHDL实现的仿真结果进行,来验证其正确性。
最后通过实验装置进行硬件实现,并对结果进行综合分析。
二:
如何将《数字信号处理》、《集成电路原理与应用》和《《FPGA系统设计与应用》三门课程有机的结合起来,设计一实际的系统。
由学生在所学知识的基础上,查阅相关资料,自主设计,通过实验装置进行实现,并对结果进行综合分析,寻找最佳设计方案。
学生通过完成一个利用FPGA实现信号处理相关的课题的理论设计、程序设计和实验调试任务,可以提高分析解决实际问题的能力。
本设计要求运用课程所学知识,进行算法实现、Matlab仿真,VHDL程序设计,FPGA开发平台上调试,加深对FPGA在信号处理知识领域的理解与运用,培养对FPGA系统的开发技能。
2课程设计要求及注意事项
1.设计过程以小组为单位,各组设一个组长,负责组织和协调本小组的讨论、任务分工等;
2.设计过程必须在本组内独立完成,不得跨组参考或抄袭,避免方案出现雷同;
3.设计书一律采用A5纸打印,用统一封面装订;
4.课程设计原则上在3周内做完;
5.最后一周周五进行优秀设计方案评选,在各组推选代表进行方案介绍的基础上,推选出2-3个优秀设计方案。
6.学有余力的学生在完成必做设计内容的基础上,可对内容进一步展开设计,以提高综合应用能力,锻炼独立解决问题的能力。
3课程设计内容
3.1课程设计题目及要求
3.1.1设计题目
基于FPGA的FIR滤波器设计
3.1.2设计要求
利用所学知识,采用MATLAB和FPGA相结合完成FIR滤波器的设计仿真。
采用直接法或分布式算法实现FIR数字低通滤波器的设计。
比较两种算法的优缺点,选择其中一种算法,得出用它来实现FIR滤波器的硬件结构,对其实现方式进行研究,分别采用合适的方法进行仿真,并用Matlab对实现的结果进行比较。
3.1.3设计指标
1)类型:
FIR低通;
2)系统采样频率:
;
3)截止频率
;
4)输入序列位宽为8位的有符号数(最高位为符号位);
5)输出结果保留8位(最高位为符号位);
6)窗口类型为kaiser窗,
=0.5;
7)滤波器长度为N=16。
3.2课程设计内容
3.2.1数字滤波器简介
滤波器是用来进行频率选择或频率分辨操作的线性时不变系统的通称。
数字滤波器通常都是应用于修正或改变时域或频域中信号的属性。
最为普通的数字滤波器就是线性时间不变量(1ineartime—invariant,LTI)滤波器。
一个简单的数字滤波系统如图3-1所示,图中,x(t)为模拟信号,经过A/D转换器后变为一个有着先后顺序的数字序列x(n)。
然后x(n)通过数字滤波系统H(z),即得到数字滤波器的输出y(n)。
H(z)为该数字滤波系统的单位脉冲响应h(n)的Z变换,即:
(3-1)
若h(n)为无限长序列,则得到的数字滤波器为IIR数字滤波器,又称递归滤波器;反之,若h(n)为有限长序列,则得到的数字滤波器为FIR滤波器,也称非递归滤波器。
一个线形时不变因果滤波器可表示为:
(3-2)
其中N为h(n)的长度,即滤波器的长度。
滤波器的阶数为N-1。
图3-1数字滤波系统
3.2.2FIR滤波器的基本结构
FIR滤波器的单位抽样响应为有限长度,一般采用非递归形式实现。
通常的FIR数字滤波器有横截性和级联型两种。
FIR滤波器实现的基本结构有:
(1)FIR滤波器的横截型结构
表示系统输入输出关系的差分方程可写作:
(3-3)
直接由差分方程得出的实现结构如图3-2所示:
图3-2横截型(直接型﹑卷积型)
若h(n)呈现对称特性,即此FIR滤波器具有线性相位,则可以简化加横截型结构,下面分情况讨论:
图3-3N为奇数时线性相位FIR滤波器实现结构
图3-4N为偶数时线性相位FIR滤波器实现结构
(2)FIR滤波器的级联型结构
将H(z)分解成实系数二阶因子的乘积形式:
(3-4)
这时FIR滤波器可用二阶节的级联结构来实现,每个二阶节用横截型结构实现。
如图所示:
图3-5FIR滤波器的级联结构
这种结构的每一节控制一对零点,因而在需要控制传输零点时可以采用这种结构。
3.2.3数字滤波器的设计原理
数字滤波器根据其冲激响应函数的时域特性,可分为两种,即无限长冲激响应(IIR)滤波器和有限长冲激响应(FIR)滤波器。
IIR滤波器的特征是,具有无限持续时间冲激响应。
这种滤波器一般需要用递归模型来实现,因而有时也称之为递归滤波器。
FIR滤波器的冲激响应只能延续一定时间,在工程实际中可以采用递归的方式实现,也可以采用非递归的方式实现。
数字滤波器的设计方法有多种,如双线性变换法、窗函数设计法、插值逼近法和Chebyshev逼近法等等。
随着MATLAB软件尤其是MATLAB的信号处理工作箱的不断完善,不仅数字滤波器的计算机辅助设计有了可能,而且还可以使设计达到最优化。
3.2.4滤波器的性能指标
我们在进行滤波器设计时,需要确定其性能指标。
一般来说,滤波器的性能要求往往以频率响应的幅度特性的允许误差来表征。
以低通滤波器特性为例,频率响应有通带、过渡带及阻带三个范围。
在通带内:
在阻带中:
图3-6低通滤波器频率响应幅度特性的容限图
其中
为通带截止频率,
为阻带截止频率,
为通带误差,
为阻带误差。
与模拟滤波器类似,数字滤波器按频率特性划分为低通、高通、带通、带阻、全通等类型,由于数字滤波器的频率响应是周期性的,周期为2π。
各种理想数字滤波器的幅度频率响应如图3-7所示:
图3-7各种理想数字滤波器的幅度频率响应
3.2.5FIR数字滤波器的设计方法
IIR滤波器的优点是可利用模拟滤波器设计的结果,缺点是相位是非线性的,若需要线性相位,则要用全通网络进行校正。
FIR滤波器的优点是可方便地实现线性相位。
FIR滤波器单位冲激响应h(n)的特点:
其单位冲激响应h(n)是有限长(
),系统函数为:
(3-5)
在有限Z平面有(N-1)个零点,而它的(N-1)个极点均位于原点z=0处。
FIR滤波器线性相位的特点:
如果FIR滤波器的单位抽样响应h(n)为实数,而且满足以下任一条件:
偶对称h(n)=h(N-1-n)
奇对称h(n)=-h(N-1-n)
其对称中心在n=(N-1)/2处,则滤波器具有准确的线性相位。
本次设计采用窗函数设计法:
一般是先给定所要求的理想滤波器频率响应
,由
导出
,我们知道理想滤波器的冲击响应
是无限长的非因果序列,而我们要设计的
是有限长的FIR滤波器,所以要用有限长序列
来逼近无限长序列
,设:
(3-6)
常用的方法是用有限长度的窗函数
来截取
即:
(3-7)
这里窗函数就是矩形序列
加窗以后对理想低通滤波器的频率响应将产生什么样的影响呢?
根据在时域是相乘关系,在频域则是卷积关系:
(3-8)
其中,
为矩形窗谱,
是FIR滤波器频率响应.
4基于FPGA的FIR滤波器设计
4.1基于Matlab的FIR数字低通滤波器抽头系数的提取
4.1.1滤波器的具体设计方法
启动Matlab设计软件后,依次打开start→Toolboxes→FilterDesign→FilterDesign&AnalysisTool(FDATOOL)就可以看到如图4-1的FDATOOL界面。
选择所需要的参数指标,就会生成FIR低通数字滤波器的特性曲线以及重要的幅度相位波形图,如图4-2、图4-3、图4-4所示,验证了其技术指标。
图4-1FDATool界面
图4-2幅度特性曲线
图4-3相位特性曲线
图4-4冲激响应曲线
4.1.2参数提取与量化
利用Matlab软件的FDATOOL图形用户界面工具,输入设计指标后便会自动生成所设计的FIR低通数字滤波器的系数即抽头数,一般线性相位的FIR低通数字滤波器的单位冲激响应都为实数,满足奇或偶对称的条件。
计算的结果可通过File下的菜单中的Export命令取出,点击Export打开对话框,点击OK可将滤波器系数数据存放到当前工作空间,并且以Num命名。
保存并关闭当前窗口回到工作空间,在命令区输入Num回车,即可查看Num的值。
根据设计所求出的16阶FIR低通数字滤波器的系数是实数,而在FPGA硬件仿真中要求输入的数据为整数,因此在这里,要对系数做归一化处理,即将h(n)扩大
倍,再分别进行四舍五入处理。
如表4-1所示:
表4-1FIR低通数字滤波器系数
序数序列
FIR滤波器的系数h(n)
取整后系数h(n)*2^8
序数序列
h(0)
-0.0404
-10
h(15)
h
(1)
-0.0383
-10
h(14)
h
(2)
-0.0175
-4
h(13)
h(3)
0.0217
6
h(12)
h(4)
0.0736
19
h(11)
h(5)
0.1286
33
h(10)
h(6)
0.1736
44
h(9)
h(7)
0.1993
51
h(8)
4.2FIR滤波器的FPGA实现
4.2.1FIR数字滤波器的实现方法
可以两种方法:
1.直接型结构设计2.分布式算法设计
1.线性相位FIR滤波器的一般设计方法
根据线性相位的偶数N的FIR滤波器的系统直接结构可知,在FIR滤波器中的整个运算过程是、加法、乘法、减法和延时4种基本运算的组合。
例如长度N=16的线性相位FIR滤波器的原理图设计如图4-5所示。
图4-515阶线性相位FIR滤波器的原理图设计
2.采用分布式算法设计FIR滤波器
1)分布式算法基础
分布式算法(DistributedArithmetic,DA)是一项重要的FPGA技术,广泛地应用于计算乘积和:
(4-1)
这种算法可用于滤波器、卷积、相关、DFT等凡是有乘累加运算的地方。
一个线性时不变网络的输出可用式(4-1)表示。
假设
为常量,
为变量。
对于有符号DA系统,
可表示为:
(4-2)
将式(4-2)代入式(4-1),得
(4-3)
其中x(n)为(B+1)位,
称为位乘积,其中b=0,…,B+1。
函数
的实现方法是利用一个LUT实现映射,预先设定程序的LUT接收一个N位的输入向量
,输出为
,各个映射
都由相应的二次幂加权累加,最后得到一次滤波的结果。
具体到本次设计,系统函数如下:
(4-5)
设
则
由上分析可知,分布式算法是将乘法运算转换成基于查找表结构的移位相加算法,从而实现多个乘法运算操作。
在被乘数位数较少的情况下,相比直接的乘法器结构,这种算法有明显的速度和算法优势。
这种算法尤其是在乘法器资源很少的FPGA器件中有很大的应用前景。
2)并行的分布式算法
分布式算法有串行实现方式和并行实现方式。
并行方式的算法结构如图3-10所示。
图中ROM的输出和求和结果的输出都加上了虚线框,这些虚线框为流水线寄存器。
上下级流水线寄存器之间的数字电路按照时钟频率工作而不用考虑它们本身的延迟,这使得整个系统的工作频率增加,从而加快了运算速度。
但是这种并行结构增加了额外的LUT、寄存器和加法器。
当输入数据位宽较少时,比如4到8位,这种实现方式会有令人满意的结果。
图4-6并行DA结构
4.2.2模块划分
本设计采用并行分布式算法的实现方案。
图4-7并行分布式算法实现框图
如图所示,各个模块的实现步骤如下:
(1)输入数据预处理模块
该模块用于将A/D转换器输出的8位有符号数据转换成二进制补码形式,并进行锁存。
由于在计算机中采用的数据形式是二进制补码,为了仿真方便,在仿真时可以去掉这个模块。
(2)并行延时模块
输入数据输送到并行延时模块,在每个时钟周期,把一组数据顺序时延,每经过15个时钟周期,就会有一个数据移出并行延时模块。
这些并行时延模块是有15组D触发器串联而成,并且共用一个时钟。
(3)预相加模块
由于线性相位FIR滤波器的系数具有对称性,因此可以通过将对称的x(n)进行相加,这样可以节省(N-1)/2个乘法器,从而降低了硬件的规模。
(4)查找表模块
该模块用于对位乘积的寻址。
一个8位的地址,可以产生
个数据。
为了节约FPGA资源,可以采用LUT分割技术,将一个8位地址的LUT分割成两个4位地址的LUT。
这样可以节省224个数据空间。
因此,采用LUT分割技术,可以节省大量硬件资源,避免了大容量ROM的使用。
根据分布式算法,查找表存储的是滤波器系数的各种组合相加的结果,由于滤波器系数通常为浮点数,我们需要将其化为定点整数。
(5)加法器模块
该模块用于将高4位LUT选中的数据和低4位LUT选中的数据进行相加,然后送入移位累加器模块。
为了保证结果正确性,在相加前,需要对相加的两个有符号数进行符号位扩展。
(6)移位累加器模块
各个位产生的位乘积在这个模块中乘以各自的权重,也即左移相应的位数,然后相加得到最终结果。
(7)输出处理模块
由于移位累加器输出的是24位二进制数,为了得到16位字长的数据,需要对输出数据进行截去低8位,同时进行锁存输出。
如果有必要,还需将输出的二进制补码转换为二进制原码。
4.2.3FIR滤波器各模块的实现
(1)数据预处理
--输入信号转换进程,对输入的二进制原码转换为二进制补码输出
--预处理
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitysigned_bumais
port(X_in:
instd_logic_vector(7downto0);---输入
clk:
instd_logic;
buma:
outstd_logic_vector(7downto0)--补码输出
);
endsigned_buma;
architecturearcofsigned_bumais
signaltemp:
std_logic_vector(7downto0);--中间信号
signalb:
std_logic;--中间信号
begin
b<=X_in(7);
process(clk)
begin
ifclk'eventandclk='1'then
ifb='1'then
temp<=(X_in(7)&(notX_in(6))&(notX_in(5))&(notX_in(4))&
(notX_in(3))&(notX_in
(2))&(notX_in
(1))&(notX_in(0)))+'1';
else
temp<=X_in;
endif;
endif;
endprocess;
buma<=temp;
endarc;
时序仿真波形如图4-8所示:
图4-8补码转换波形图
Clk为输入时钟,X_in为输入的原码的有符号表示,buma为输出补码的有符号数表示,由波形可以看出,负数的补码为符号位不变,其他位按位取反后加1,正数的补码即为原码。
(2)输入模块
输入模块由移位寄存器和加法器与地址码形成模块组成。
移位寄存器模块实现对并行输入信号的延迟输出,其寄存器的个数由FIR滤波器的阶数决定。
加法与地址码形成模块首先实现B(i)=X(i)+X(N-i)的运算,即考虑了滤波器系数的对称性,把与相同两个滤波系数相乘的两个采样值预先相加,以减少硬件规模。
移位寄存器模块的VHDL代码如下所示:
--并行延时,相当于15个D触发器串联
libraryieee;
useieee.std_logic_1164.all;
entitydelayis
port
(X_in:
instd_logic_vector(7downto0);--滤波器输入
clk:
instd_logic;--输入时钟
x0,x1,x2,x3,x4,x5,x6,x7:
bufferstd_logic_vector(7downto0);--寄存器
x8,x9,x10,x11,x12,x13,x14,x15:
bufferstd_logic_vector(7downto0));
enddelay;
architectureoneofdelayis
begin
process(clk)
begin
ifclk'eventandclk='1'then
x15<=x14;
x14<=x13;
x13<=x12;
x12<=x11;
x11<=x10;
x10<=x9;
x9<=x8;
x8<=x7;
x7<=x6;
x6<=x5;
x5<=x4;
x4<=x3;
x3<=x2;
x2<=x1;
x1<=x0;
x0<=X_in;
endif;
endprocess;
endone;
时序仿真波形如图4-9所示:
图4-9移位寄存器仿真图
由图4-9可以看出每来一个脉冲,输入信号就会向后延时一次。
加法与地址码形成模块具体程序如下:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_signed.all;
useieee.std_logic_arith.all;
--输入预相加和地址码产生
entityAddressis
port(x0,x1,x2,x3,x4,x5,x6,x7:
instd_logic_vector(7downto0);--输入寄存器
x8,x9,x10,x11,x12,x13,x14,x15:
instd_logic_vector(7downto0);--输入寄存器
clk:
instd_logic;--输入时钟
add0,add1,add2,add3,add4,add5,add6,add7,add8:
outstd_logic_vector(7downto0));--地址输出
endAddress;
architecturearcofAddressis
signala0,a1,a2,a3,a4,a5,a6,a7:
std_logic_vector(8downto0);
begin
a0<=(x0(7)&x0)+(x15(7)&x15);--系数相同的两两相加求和
a1<=(x1(7)&x1)+(x14(7)&x14);
a2<=(x2(7)&x2)+(x13(7)&x13);
a3<=(x3(7)&x3)+(x12(7)&x12);
a4<=(x4(7)&x4)+(x11(7)&x11);
a5<=(x5(7)&x5)+(x10(7)&x10);
a6<=(x6(7)&x6)+(x9(7)&x9);
a7<=(x7(7)&x7)+(x8(7)&x8);
process(clk,a0,a1,a2,a3,a4,a5,a6,a7)
begin
--下面产生的8位位矢量将作为LUT的地址
ifclk'eventandclk='1'thenadd0<=a7(0)&a6(0)&a5(0)&a4(0)&a3(0)&a2(0)&a1(0)&a0(0);--最低位
add1<=a7
(1)&a6
(1)&a5
(1)&a4
(1)&a3
(1)&a2
(1)&a1
(1)&a0
(1);
add2<=a7
(2)&a6
(2)&a5
(2)&a4
(2)&a3
(2)&a2
(2)&a1
(2)&a0
(2);
add3<=a7(3)&a6(3)&a5(3)&a4(3)&a3(3)&a2(3)&a1(3)&a0(3);
add4<=a7(4)&a6(4)&a5(4)&a4(4)&a3(4)&a2(4)&a1(4)&a0(4);
add5<=a7(5)&a6(5)&a5(5)&a4(5)&a3(5)&a2(5)&a1(5)&a0(5);
add6<=a7(6)&a6(6)&a5(6)&a4(6)&a3(6)&a2(6)&a1(6)&a0(6);
add7<=a7(7)&a6(7)&a5(7)&a4(7)&a3(7)&a2(7)&a1(7)&a0(7);
add8<=a7(8)&a6(8)&a5(8)&a4(8)&a3(8)&a2(8)&a1(8)&a0(8);--最高位
endif;
endprocess;
endarc;
时序仿真波形如图4-10所示:
图4-10加法与地址码形成模块波形仿真图
由波形图可以看出,x0+x15的结果组成了add0—add8最低位,x7+x8的结果组成了add0—add8最高位,其他相加结果依次组成add0—add8相应位。
add0—add8即为查找表的九个八位地址。
(3)查找表模块
输入模块形成9组8位地址码,如果直接建立LUT,则LUT的规模较大,为
个字,为了节约FPGA资源并且简化表格深度,本文使用了8位地址线LUT分割技术,分成2个4位地址线的LUT。
加法模块实现高4位LUT与低4位LUT输出值相加后得出8位地址码的输出值。
低四位和高四位LUT如表4-2、表4-3所示:
表4-2低四位LUT地址及对应值
低四位
函数值
十进制
二进制补码
相反数
二进制补码
0000
0
0
000000000
0
000000000
0001
h(0)
-10
111110110
10
000001010
0010
h
(1)
-10
111110110
10
000001010
0011
h(0)+h
(1)
-20
111101100
20
000010100
0100
h
(2)
-4
111111100
4
000000100
0101
h(0)+h
(2)
-14
111110010
14
000001110
0110
h
(1)+h
(2)
-14
111110010
14
000001110
0111
h(0)+h
(1)+h
(2)
-24
111101000
24
000011000
1000
h(3)
6
000000110
-6
111111010
1001
h(3