FPGA课程设计报告基于FPGA的FIR滤波器的设计.docx
- 文档编号:8824983
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:22
- 大小:402.60KB
FPGA课程设计报告基于FPGA的FIR滤波器的设计.docx
《FPGA课程设计报告基于FPGA的FIR滤波器的设计.docx》由会员分享,可在线阅读,更多相关《FPGA课程设计报告基于FPGA的FIR滤波器的设计.docx(22页珍藏版)》请在冰豆网上搜索。
FPGA课程设计报告基于FPGA的FIR滤波器的设计
一设计目的2
二设计要求2
2.1、基本要求2
2.2、提髙部分3
三设计原理3
3.1、线性FIR滤波器原理3
3.2设计分析5
3.3实验结果分析验证提示6
3.4DDS原理简介6
四设计思路7
4.1基于matlab工具的滤波器系数计算8
五设计内容10
5.1、寄存器模块10
5.2加法器模块11
5.3减法器模块14
5.4乘法器模块16
六结果分析21
七参考文献23
八心得体会24
基于FPGA的FIR滤波器的设计
一设计目的
为了帮助学生深入理解和消化基本理论、进一步提高综合应用能力并且锻炼独立解决问题的能力,我们将《数字信号处理》、《集成电路原理与应用》和《FPGA系统设计与应用》儿门课程融合在一起开设的FPGA综合实验课程设计。
主要从以下两方面考虑:
1、设计内容突出FPGA及信号处理的理论和技术的综合应用。
如在数字滤波实验中,要求学生能够熟悉数字滤波器的基本原理,并能运用VHDL语言实现数字滤波。
并采用MATLAB软件实现的结果与运用VHDL实现的仿真结果进行,来验证其正确性。
最后通过实验装置进行硬件实现,并对结果进行综合分析。
2、如何将《数字信号处理》、《集成电路原理与应用》和《《FPGA系统设计与应用》三门课程有机的结合起来,设计一实际的系统。
山学生在所学知识的基础上,查阅相关资料,自主设计,通过实验装置进行实现,并对结果进行综合分析,寻找最佳设计方案。
希望学生通过完成一个利用FPGA实现信号处理相关的课题的理论设计、程序设计和实验调试任务,提高他们分析解决实际问题的能力。
本设计要求运用课程所学知识,进行算法实现、Matlab仿真,UHDL程序设计,FPGA开发平台上调试,加深对FPGA在信号处理知识领域的理解与运用,培养对FPGA系统的开发技能。
二设计要求
2.1、基本要求
利用所学知识,釆用VHDL语言完成FIR滤波器的设计仿真。
要求用VHDL编程设计底层文件,顶层文件可任意(可用原理图方式或文本方式);完成仿真文件(包括MATLAB和QUARTUSII两种仿
真)并对其结果比较。
具体设计指标如下:
(1)釆样频率y°KHz;
(2)截止频率Fc=WKHz;
(3)输入序列为10位(最高位为符号位);
(4)窗口类型为kaiser窗,"二0.5;
(5)滤波器长度为16;
(6)输出结果保留10位。
2.2、提高部分
根据所学知识,设计出一个具有频率控制功能DDS,要求输出频率分别为lOKHz和lOOKHz,将输出的两路数字信号进行叠加,并通过所设计的FIR滤波器进行滤波,将滤波输出的数字信号通过D/A转换电路输出波形,并用示波器观察输出波形,并完成测试结果分析。
结构框图如图1所示。
图1整体结构框图
三设计原理
3.1、线性FIR滤波器原理
FIR滤波器响应(简称FIR)系统的单位脉冲响应加料)为有限
长序列,系统函数H(z)在有限z平面上不存在极点,其运算结构中不存在反馈支路,即没有环路。
如果加“)的长度为N,则它的系统函数和差分方程一般具有如下形式:
N7
y(n)=为〃(加)x(n-加)
w?
-()
根据差分方程直接画出FIR滤波器的结构,称为直接型结构。
如图2所示:
垃1
閒)1
应)1
1ACA^-3)
rW-2)Th阳
r1r”響
图2FIR滤波器直接结构
FIR滤波器的特点:
单位脉冲响应序列为有限个;可快速实现;可得到线性相位;滤波器阶数较高。
对线性时不变系统保持线性相位的条件是:
单位脉冲响应为偶对称或奇对称。
即:
为设计线性滤波器,应保证h(n)为对称的。
072<0
h(n)=<
[±/i(/V-1-h)0 ①若N为偶数,其线性相位FIR滤波器的对称结构流图如图3: 图3若N为偶数线性相位FIR滤波器的对称结构流图 图中: “+1”对应偶对称情况,“-1"对应奇对称情况。 当n为奇数时,支路断开。 ②若N为奇数,其线性相位FIR滤波器的对称结构流图如图4: X«) 图4N为奇数线性相位FIR滤波器的对称结构流图 3.2设计分析 1.设计滤波器方案: 因为N二16为偶数,可以按照上面第一个原理图设计滤波器,如图5所示。 yM 图5 本设计取加町为偶对称的情况,则图中: 应取“+1”。 2.山上图可分析得到,要完成滤波器的设计,需要设计的底层文件包括延时单元、加法电路单元、乘以负一单元、乘法器单元及截取10位数单元。 由各单元VHDL编程后,生成相应的符号文件。 最后连接成顶层原理图。 3.3实验结果分析验证提示 1)利用QUARTUSII仿真设y(n)=x(w)*h(n), 取{x(n)}={30313434598-7897102-205412}进行仿真。 2)利用MATLAB仿真 求取y(n)=x(n)*h(n),y(n)/24,y(n)/214»然后,同以上仿真结果进行对比,说明滤波器设计的正确性。 3.4DDS原理简介 H前使用最广泛的一种DDS方式是利用高速存储器作查找表,然后通过高速DAC输出已经用数字形式存储的波形。 图6DDS系统的基本原理图 图6中虚方框部分是DDS的核心单元,它可以采用CPLD/FPGA来实现。 图中的相位累加器山N位全加器和N位累加寄存器级联而成,可对频率控制字的二进制码进行累加运算,是典型的反馈电路。 频率控制字M和相位控制字分别控制DDS输出正(余)弦波的频率和相位。 每来一个时钟脉冲,相位寄存器以步长M递增。 相位寄存器的输出与相位控制字相加,其结果作为正(余)弦查找表的地址。 正(余)弦查找表的数据存放在ROH中,内部存有一个周期的正弦波信号的数字幅度信息,每个查找表的地址对应于正弦波中0°〜360。 范围内的一个相位点。 查找表把输入的址信息映射成正(余)弦波的数字幅度信号,同时输出到数模转换器DAC的输入端,DAC输出的模拟信号经过低通滤波器(LPF),可得到一个频谱纯净的正(余)弦波。 DDS具体工作过程如下: 每来一个时钟脉冲elk,N位全加器将频率控制数据M与累加寄存器输出的累加相位数据N相加,把相加后的结果送至累加寄存器的输入端。 累加寄存器一方面将上一时钟周期作用后所产生的新的数据反馈到加法器的输入端,以使加法器在下一时钟的作用下继续与频率控制数据M相加: 另一方面将这个值作为取样地址值送入幅度/相位转换电路,此电路根据取样地址输出相应的波形数据。 最后经D./A转换器和低通滤波器将波形数据转换成所需要的模拟波形。 DDS输出信号的频率由下式决定: q=(2jW/2jV)Xclk(2“代表 取样点数,M为频率控制字、2"代表存储器中存储数据的多少,N代表累加器的位数,elk代表基准时钟频率)。 调节M可以改变取样的点数,从而改变频率。 假定基准时钟为70MHz,累加器为16位,则clk=70MHz,Y=216二65536(N=16),设M=12则X=212=4096,所以q二(4096/65536)X70二4.375MHz。 可见,通过设定相位累加器位数N、频率控制字M和基准时钟的值,就可以产生任一频率的输出。 DDS的频率分辨率定义为: q=clk/2tV由于基准时钟一般是固定的,因此相位累加器的位数就决定了频率的分辨率。 四设计思路 根据课程上老师所讲例题,首先使用matlab计算出符合设计 要求的滤波器冲激响应系数。 后将整个电路规划为语言编辑和原理图编辑两个单元,其中语言编辑部分负责编辑整个滤波器电路中所需用的单元器件,包括寄存器、加法器、减法器以及乘法器儿个单元器件;原理图编辑部分完成单元器件的电气连接工作。 整个电路的原理图设置方案如下图所示: 4.1基于matlab工具的滤波器系数计算: 在matlab命令编辑窗口输入Fdatool指令,敲击回车可以打 FilterDesign&AnalysisTool窗口(如图4-1所示),在该工具的帮助下,我们可以完成f.i.r.滤波器系数的讣算工作。 图4TF订terDesign&AnalysisTool窗口 Fdatool界面总共分两大部分,一部分是designfilter,在界面的下半部分,用来设置滤波器的设计参数,另一部分则是特性区,在界面的上半部分,用来显示滤波器的各种特性odesignfilter部分主要分为: ResponseType(响应类型)选项,包括Lowpass(低通)、Highpass(高通)、Bandpass(带通)、Bandstop(带阻)和特殊的滤波器。 根据本次作业要求,在该选项中选择Lowpass选项。 DesignMethod(设计方法)选项,包括IIR滤波器的Butterworth(巴特沃思)法、ChebyshevTypei(切比雪夫i型)法、ChebyshevTypeii(切比雪夫ii型)法、Elliptic(椭圆滤波器)法等和FIR滤波器的Equiripple法、Least-squares(最小乘方)法、Window(窗函数)法等多种方法。 结合本次作业要求,选择FIR滤波器的窗函数法进行设计。 选定窗函数法后,会在右侧出现Options区域,进行窗函数法相关参量的设置,根据作业要求选择Kaiser窗并设置Beta为: 0.5。 FilterOrder(滤波器阶数)选项,定义滤波器的阶数,包括Specifyorder(指定阶数)和Minimumorder(最小阶数)。 在Specifyorder中填入所要设讣的滤波器的阶数(n阶滤波器,specifyorder=nT),如果选择Minimumorder则matlab根据所选择的滤波器 类型自动使用最小阶数。 本次作业要求设计16阶滤波器,所以选定Specifyorder并填入15。 FrenquencySpec辻ications选项,可以详细定义频带的各参数,包括采样频率Fs和频带的截止频率。 它的具体选项山ResponseType选项和DesignMetho选项决定。 我们要求的Lowpass(低通)滤波器只需要定义Fs、Feo采用窗函数设计滤波器时,由于过渡带是山窗函数的类型和阶数所决定的,所以只需要定义通带截止频率,而不必定义阻带参数。 MagnitudeSpecifications选项,可以定义幅值衰减的情况。 采用窗函数设计时,通带截止频率处的幅值衰减固定为6db,所以不必定义。 本次作业中的参数设定结果如图4-2所示。 |OTP0W ▼ ,-FitCfOfCfcr. -OptiWg. —ScotePcssbo^ IKaserFvrctcrhsrtie: | 1^ 、恤I 082加Fta| Ready 图4-2滤波器参数设定结果 参数设定完毕,单击工具窗口下方的DesignFilter按钮,开始进行相关参数计算。 五设计内容 5.X寄存器模块 寄存器用于寄存一组二值代码,只要求它们具有置1、置0的功能即可。 在本设计中用D触发器组成寄存器,实现寄存功能。 本设计中使用带异步复位rst端的D触发器,当rst=l时,输出信号q二0,当rst=0且上升沿脉冲到达时q二d。 寄存器源程序如下: LIBRARYieee; USEieee.std_logic_1164.all; ENTITYdffl6IS PORT(rst,elk: INSTD_LOGIC; d: INSTD_LOGIC_VECTOR(9DOWNTO0); q: OUTSTD_LOGIC_VECTOR(9DOWNTO0)); ENDdffl6; ARCHITECTUREdffl6OFdffl6IS BEGIN PROCESS(rst,elk) BEGIN IF(rst二T')THEN q<=(OTHERS二〉'O'); ELSIF(elk'EVENTANDelk二'l')THEN Q<=d; ENDIF; ENDPROCESS; ENDdffl6; 5.2加法器模块 实现两个有符号数的相加运算。 即将输入的两数,在时钟脉冲到来时相加运算,输出结果。 在本设计中共有8个两个10位有符号数相加产生一个11位有符号数的加法器、一个18位和19位有符号数相加产生20位有符号数的加法器、一个两个20位有符号数相加产生一个21位有符号数的加法器、一个两个19位有符号数相加产生一个20位有符号位数的加法器、一个20位和21位有符号数相加产生22位有符号数的加法器,以及一个20位和22位有符号数相加产生23位有符号数的加法器电路。 其中一个20位和22位有符号数相加产生23位有符号数的加法器电路为最后一级,所以在加法器电路中在引入低位舍去功能只保留最终10位输出,最终保留10位输出采用了直接取输出23位数的高十位的方法,因此在输出中近似等于除掉了2J3即8192以后的结果。 10位有符号数相加产生一个11位有符号数的加法器设计源程序如下: LIBRARYieee; USEieee.std_logic_1164.dll; USEieee.std_logic_arith.all; ENTITYsumlOlOllIS PORT(a,b: INSIGNED(9DOWNTO0); elk: INSTD_LOGIC;s: OUTSIGNED(10DOWNTO0)); ENDSUM101011; LIBRARYieee; USEieee.std_logic_1164.all; USEieee.std_logic_arith.all; ENTITYsumlOlOllIS PORT(a,b: INSIGNED(9DOWNTO0); elk: INSTD_LOGIC; s: OUTSIGNED(10DOWNTO0)); ENDSUM101011; ARCHITECTUREsumlOlOllOFsumlOlOllIS BEGIN PROCESS(elk) BEGIN IF(clk'EVENTANDelk二'l')THEN s<=(a(9)&a)+(b(9)&b); ENDIF; ENDPROCESS; ENDsumlOlOll; 18位和19位有符号数相加产生20位有符号数的加法器设计源程 序如下: LIBRARYieee; USEieee.std_logic_1164.all; USEieee.std_logic_arith.all; ENTITYsum7023918IS PORT(a: INSIGNED(17DOWNTO0): b: INSIGNED(18DOWNTO0); elk: INSTD_LOGIC; s: OUTSIGNED(19DOWNTO0)); ENDsum7023918; ARCHITECTUREsum7023918OFsum7023918IS BEGIN PROCESS(elk) BEGIN IF(clk'EVENTANDelk二'l')THENs<=(a(17)&a(17)&a)+(b(18)&b); ENDIF; ENDPROCESS; ENDsum7023918; 两个20位有符号数相加产生一个21位有符号数的加法器设计源程序如下: LIBRARYieee; USEieee.std_logic_1164.all: USEieee.std_logic_arith.all; ENTITYsum40149919IS PORT(a: INSIGNED(19DOWNTO0); b: INSIGNED(19DOWNTO0); elk: INSTD_LOGIC;s: OUTSIGNED(20DOWNTO0)); ENDsum40149919; ARCHITECTUREsum40149919OFsum40149919IS BEGIN PROCESS(elk) BEGIN IF(clk'EVENTANDelk二'l')THEN s<=(a(19)&a)+(b(19)&b); ENDIF; ENDPROCESS; ENDsum-10149919; 两个19位有符号数相加产生一个20位有符号位数的加法器设计: LIBRARYieee; USEieee.std_logic_1164.al USEieee.std_logic_arith.all; ENTITYsuml81819IS PORT(a: INSIGNED(18DOWNTO0); b: INSIGNED(18DOWNTO0); elk: INSTD_LOGIC; s: OUTSIGNED(19DOWNTO0)); ENDsuml81819; ARCHITECTUREsuml81819OFsuml81819IS BEGIN PROCESS(elk) BEGIN IF(clk'EVENTANDelk二'l')THEN s<=(a(18)&a)+(b(18)&b); ENDIF; ENDPROCESS; ENDsuml81819; 20位和21位有符号数相加产生22位有符号数的加法器,20位和22位有符号数相加产生23位有符号数的加法器电路设计(最后一级带舍位)略。 5.3减法器模块 实现零值减去两个有符号数的减法运算。 即用零值减去输入的两数,在时钟脉冲到来时做减法运算,输出结果。 -31和-88的乘结果都只包含了乘系数31和88的数值,并没有将两个负号代入,所以两乘法器后面的加法器运算改为减法器模块,采用0-31*累加结果-88*累加结果的方法,实现(-31)*累加结果+ (-88)*累加结果的计算o-106和-54后面的加法器采用同样的方式处理。 -31和-88的减法器设计: LIBRARYieee; USEieee・std_logic_1164.all; USEieee・std_logic_arith・all; ENTITYsub318817is PORT(elk: inSTD_LOGIC; Dini: insigned(15downto0); Din2: insigned(17downto0); Dout: outsigned(18downto0)); ENDsub318817; ARCHITECTUREsub318817ofsub318817IS SIGNALsi: signed(17downto0): =(Dinl(15)&Dinl(15)&Dinl); SIGNALs2: signed(18downto0): 二(OTHERS二>'O'); BEGIN PR0CESS(Dinl,Din2,elk) BEGIN IFelk'eventandelk二T'THEN Dout<=s2-Din2-sl; ENDIF; ENDPROCESS; ENDsub318817; -106和-54的减法器的设计: LIBRARYieee; USEieee・std_logic_1164・all; USEieee・std_logic_arith.all; ENTITYsubl065417is PORT(elk: inSTD_LOGIC; Dini: insigned(17downto0); Din2: insigned(16downto0); Dout: outsigned(18downto0)); ENDsubl065417; ARCHITECTUREsubl065417ofsubl065417ISSIGNALsi: signed(17downto0): =(Din2(16)&Din2);SIGNALs2: signed(18downto0): 二(OTHERS二〉'O'); BEGIN PROCESS(Dini,Din2,elk) BEGIN IFelk'eventandelk二'1'THEN Dout<=s2-Dinl-sl; ENDIF; ENDPROCESS; ENDsubl065417; 5.4乘法器模块 从资源和速度考虑,常系数乘法运算可用移位相加来实现。 将常系数分解成儿个2的幕的和形式。 滤波器系数分别为-31、-88、-106、-54、70、239、401、499、499、401、239、70、-54、-106.-88、-31。 算法: 其中带负号数先乘去负号的整数部分,在后面的求和中做减法运算。 编码方式如下: 31被编码为2“5-2"0、88被编码为2"6+2"4+2"3、106被编码为2"6+2"5+2"3+2"1、54被编码为2"6-2"3-2"1、70被编码为2飞+2"2+2"1、239被编码为2"8-2"4-2"0、401被编码为2"9-2"7+2"4+2"0、499被编码为2"9-23-2"2-20。 实现输入带符号数据与固定数据两个二进制数的乘法运算。 当到达时钟上升沿时,将两数输入,运算并输出结果。 乘31电路设计: LIBRARYieee; USEieee.std_logic_1164.all;USEieee.std_logic_arith.all; ENTITYmult31IS PORT(elk: INSTD_LOGIC; Din: INSIGNED(10DOWNTO0); Dout: OUTSIGNED(15DOWNTO0));ENDmult31; ARCHITECTUREmult31OFmult31 BEGIN Al: PROCESS(Din,si,s2,s3) BEGIN si〈二Din&"00000"; s2〈二Din; IF(Din(10)二'O')THEN s3<=CO'&s1(14downto0))-(〃00000〃&s2(10DOWNTO0)); ELSE s3<=Cr&sl(14downto0))-(〃lllll〃&s2(10DOWNTO0)); ENDIF; ENDPROCESS: A2: PROCESS(elk,s3) BEGIN IFclkJEVENTANDclk^1’THEN Dout<=s3; ENDIF; ENDPROCESS; ENDmult31; 乘88电路设计: LIBRARY
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- FPGA 课程设计 报告 基于 FIR 滤波器 设计