一、设计指标:● 设计一个16阶低通线性相位FIR 滤波器; ● 要求采样频率Fs 为80KHz ; ● 截止频率Fc 为10KHz ;● 采用函数窗法设计,且窗口类型为Kaiser ,Beta 为0.5; ● 输入序列位宽为10位的有符号数(最高位为符号位); ●输出序列位宽为10位的有符号数(最高位为符号位)。
二、线性相位fir 滤波器理论:有限长脉冲响应(FIR )滤波器的系统函数只有零点,除原点外,没有极点,因而FIR 滤波器总是稳定的。
如果他的单位脉冲响应是非因果的,总能够方便的通过适当的移位得到因果的单位脉冲响应,所以FIR 滤波器不存在稳定性和是否可实现的问题。
它的另一个突出的优点是在满足一定的对称条件时,可以实现严格的线性相位。
由于线性相位滤波器不会改变输入信号的形状,而只是在时域上使信号延时,因此线性相位特性在工程实际中具有非常重要的意义,如在数据通信、图像处理等应用领域,往往要求信号在传输和处理过程中不能有明显的相位失真,因而线性相位FIR 滤波器得到了广泛的应用。
长度为M 的因果有限冲激响应滤波器由传输函数H (z )描述:10()()M k k H z h k z --==∑ (1)它是次数为M-1的z -1的一个多项式。
在时域中,上述有限冲激响应滤波器的输入输出关系为:10()()()M k y n h k x n k -==-∑ (2)其中y (n )和x (n )分别是输出和输入序列。
有限冲激响应滤波器的一种直接型实现,可由式(2)生成,M=5的情况如图2-1(a )所示。
其转置,如图2-1(b )所示,是第二个直接型结构。
通常一个长度为M 的有限冲激响应滤波器由M 个系数描述,并且需要M 个乘法器和(M-1)个双输入加法器来实现。
南京理工大学EDA技术与应用课程实验报告- 1 - 共23页(a)(b)图2- 1 直接型有限冲激响应滤波器结构长度为M的线性相位有限冲激响应滤波器由对称的冲激响应h(n)=h(M-1-n)或反对称的冲激响应h(n)=-h(M-1-n)描述。
利用线性相位有限冲激响应滤波器的对称(或反对称)性质,可以将传输函数的直接型实现所需的乘法器总量减少一半。
例如,图2-2显示了一个具有对称冲击响应的、长度为7的有限冲激响应传输函数的实现。
图2- 2 线性相位有限冲激响应结构基于VHDL语言的线性相位FIR滤波器设计- 2 - 共23页三、设计思路:根据课程上老师所讲例题,首先使用matlab计算出符合设计要求的滤波器冲激响应系数。
后将整个电路规划为语言编辑和原理图编辑两个单元,其中语言编辑部分负责编辑整个滤波器电路中所需用的单元器件,包括寄存器、加法器、减法器以及乘法器几个单元器件;原理图编辑部分完成单元器件的电气连接工作。
整个电路的原理图设置方案如图3-1所示:图3- 1 滤波器整体设计思路南京理工大学EDA技术与应用课程实验报告- 3 - 共23页四、设计过程:(一)基于matlab工具的滤波器系数计算:在matlab命令编辑窗口输入Fdatool指令,敲击回车可以打开Filter Design & Analysis Tool窗口(如图4-1所示),在该工具的帮助下,我们可以完成f.i.r.滤波器系数的计算工作。
图4- 1 Filter Design & Analysis Tool窗口Fdatool界面总共分两大部分,一部分是design filter,在界面的下半部分,用来设置滤波器的设计参数,另一部分则是特性区,在界面的上半部分,用来显示滤波器的各种特性。
design filter部分主要分为:Response Type(响应类型)选项,包括Lowpass(低通)、Highpass(高通)、Bandpass(带通)、Bandstop(带阻)和特殊的滤波器。
根据本次作业要求,在该选项中选择Lowpass选项。
Design Method(设计方法)选项,包括IIR滤波器的Butterworth(巴特沃思)法、Chebyshev Type i(切比雪夫i型)法、Chebyshev Type ii(切比雪夫ii型)法、Elliptic(椭圆滤波器)法等和FIR滤波器的Equiripple法、Least-squares(最基于VHDL语言的线性相位FIR滤波器设计- 4 - 共23页小乘方)法、Window(窗函数)法等多种方法。
结合本次作业要求,选择FIR 滤波器的窗函数法进行设计。
选定窗函数法后,会在右侧出现Options区域,进行窗函数法相关参量的设置,根据作业要求选择Kaiser窗并设置Beta为:0.5。
Filter Order(滤波器阶数)选项,定义滤波器的阶数,包括Specify order(指定阶数)和Minimum order(最小阶数)。
在Specify order中填入所要设计的滤波器的阶数(n阶滤波器,specify order=n-1),如果选择Minimum order则matlab 根据所选择的滤波器类型自动使用最小阶数。
本次作业要求设计16阶滤波器,所以选定Specify order并填入15。
Frenquency Specifications选项,可以详细定义频带的各参数,包括采样频率Fs和频带的截止频率。
它的具体选项由Response Type选项和Design Metho选项决定。
我们要求的Lowpass(低通)滤波器只需要定义Fs、Fc。
采用窗函数设计滤波器时,由于过渡带是由窗函数的类型和阶数所决定的,所以只需要定义通带截止频率,而不必定义阻带参数。
Magnitude Specifications选项,可以定义幅值衰减的情况。
采用窗函数设计时,通带截止频率处的幅值衰减固定为6db,所以不必定义。
本次作业中的参数设定结果如图4-2所示。
图4- 2 滤波器参数设定结果参数设定完毕,单击工具窗口下方的Design Filter按钮,开始进行相关参数计算。
在计算结果中我们可以看到该滤波器的一些相关曲线,如幅频响应(如图4-3)、相频响应(如图4-4)、冲激响应(如图4-5)等以及具体的系数值(如图4-6)。
南京理工大学EDA技术与应用课程实验报告- 5 - 共23页图4- 3 幅频响应图4- 4 相频响应图4- 5 冲激响应基于VHDL语言的线性相位FIR滤波器设计- 6 - 共23页图4- 6 所设计滤波器冲激系数计算的结果可通过File下拉菜单中的Export命令取出,点击Export打开Export对话框(如图4-7),点击OK按钮可将滤波器系数数据存放到当前工作空间,并以Num命名。
图4- 7 冲激系数输出对话框保存并关闭滤波器设计分析工具回到matlab主窗口,在命令编辑区输入Num 可得到工具的计算结果(如图4-8)。
图4- 8 输出在matlab的冲激系数南京理工大学 EDA 技术与应用课程实验报告- 7 - 共23页对FIR 滤波器的系数进行调整,做整数化操作(如图4-9)。
可得到滤波器整数化的系数为[-31 -88 -106 -54 70 239 401 499 499 401 239 70 -54 -106 -88-31]图 4- 9 整数化后的冲激系数(二)单元器件的语言编辑:1、寄存器模块寄存器用于寄存一组二值代码,只要求它们具有置1、置0的功能即可。
在本设计中用D 触发器组成寄存器,实现寄存功能。
本设计中使用带异步复位rst 端的D 触发器,当rst=1时,输出信号q=0,当rst=0且上升沿脉冲到达时q=d 。
程序代码如下:--------------------------- LIBRARY ieee;USE ieee.std_logic_1164.all; --------------------------- ENTITY dff16 ISPORT (rst,clk: IN STD_LOGIC;d:IN STD_LOGIC_VECTOR (9 DOWNTO 0);q:OUT STD_LOGIC_VECTOR (9 DOWNTO 0)); END dff16;---------------------------ARCHITECTURE dff16 OF dff16 IS BEGINPROCESS (rst,clk) BEGINIF(rst='1')THEN q<=(OTHERS=>'0');ELSIF(clk'EVENT AND clk='1')THEN q<=d; END IF; END PROCESS; END dff16;---------------------------仿真结果如图4-10所示:图 4- 10 寄存器仿真结果基于VHDL语言的线性相位FIR滤波器设计8 共23页2、加法器模块实现两个有符号数的相加运算。
即将输入的两数,在时钟脉冲到来时相加运算,输出结果。
在本设计中共有8个两个10位有符号数相加产生一个11位有符号数的加法器、一个18位和19位有符号数相加产生20位有符号数的加法器、一个两个20位有符号数相加产生一个21位有符号数的加法器、一个两个19位有符号数相加产生一个20位有符号位数的加法器、一个20位和21位有符号数相加产生22位有符号数的加法器,以及一个20位和22位有符号数相加产生23位有符号数的加法器电路。
其中一个20位和22位有符号数相加产生23位有符号数的加法器电路为最后一级,所以在加法器电路中在引入低位舍去功能只保留最终10位输出,最终保留10位输出采用了直接取输出23位数的高十位的方法,因此在输出中近似等于除掉了2^13即8192以后的结果。
●10位有符号数相加产生一个11位有符号数的加法器设计:----------------------LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_arith.all;----------------------ENTITY sum101011 ISPORT(a,b: IN SIGNED(9 DOWNTO 0);clk: IN STD_LOGIC;s:OUT SIGNED(10 DOWNTO 0)); END SUM101011;---------------------- ARCHITECTURE sum101011 OF sum101011 IS BEGINPROCESS(clk)BEGINIF(clk'EVENT AND clk='1')THENs<=(a(9)&a)+(b(9)&b);END IF;END PROCESS;END sum101011;----------------------仿真结果如图4-11所示:图4- 11 两10位相加产生11位加法器仿真结果●18位和19位有符号数相加产生20位有符号数的加法器设计:---------------------- LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_arith.all;南京理工大学EDA技术与应用课程实验报告9 共23页----------------------ENTITY sum7023918 ISPORT(a: IN SIGNED(17 DOWNTO 0);b: IN SIGNED(18 DOWNTO 0);clk: IN STD_LOGIC;s:OUT SIGNED(19 DOWNTO 0));END sum7023918;----------------------ARCHITECTURE sum7023918 OF sum7023918 IS BEGINPROCESS(clk)BEGINIF(clk'EVENT AND clk='1')THENs<=(a(17)&a(17)&a)+(b(18)&b);END IF;END PROCESS;END sum7023918;----------------------仿真结果如图4-12所示:图4- 12 18位19位相加产生20位数仿真结果●两个20位有符号数相加产生一个21位有符号数的加法器设计:----------------------LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_arith.all;----------------------ENTITY sum40149919 ISPORT(a: IN SIGNED(19 DOWNTO 0);b: IN SIGNED(19 DOWNTO 0);clk: IN STD_LOGIC;s:OUT SIGNED(20 DOWNTO 0)); END sum40149919;---------------------- ARCHITECTURE sum40149919 OF sum40149919 ISBEGINPROCESS(clk)BEGINIF(clk'EVENT AND clk='1')THENs<=(a(19)&a)+(b(19)&b);END IF;END PROCESS;END sum40149919;----------------------仿真结果如图4-13所示:图4- 13 两20位相加产生21位数仿真结果●两个19位有符号数相加产生一个20位有符号位数的加法器设计:---------------------- LIBRARY ieee;USE ieee.std_logic_1164.all; USE ieee.std_logic_arith.all; ---------------------- ENTITY sum181819 IS基于VHDL语言的线性相位FIR滤波器设计10 共23页PORT(a: IN SIGNED(18 DOWNTO 0);b: IN SIGNED(18 DOWNTO 0);clk: IN STD_LOGIC;s:OUT SIGNED(19 DOWNTO 0)); END sum181819;----------------------ARCHITECTURE sum181819 OF sum181819 IS BEGINPROCESS(clk)BEGINIF(clk'EVENT AND clk='1')THENs<=(a(18)&a)+(b(18)&b);END IF;END PROCESS;END sum181819;----------------------仿真结果如图4-14所示:图4- 14 两19位相加产生20位数仿真结果●20位和21位有符号数相加产生22位有符号数的加法器:----------------------LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_arith.all;----------------------ENTITY sum192021 ISPORT(a: IN SIGNED(19 DOWNTO 0);b: IN SIGNED(20 DOWNTO 0);clk: IN STD_LOGIC;s:OUT SIGNED(21 DOWNTO 0)); END sum192021; ----------------------ARCHITECTURE sum192021 OF sum192021 IS BEGINPROCESS(clk)BEGINIF(clk'EVENT AND clk='1')THENs<=(a(19)&a(19)&a)+(b(20)&b);END IF;END PROCESS;END sum192021;----------------------仿真结果如图4-15所示:图4- 15 20位和21相加产生22位数仿真结果●20位和22位有符号数相加产生23位有符号数的加法器电路设计(最后一级带舍位):---------------------- LIBRARY ieee;USE ieee.std_logic_1164.all; USE ieee.std_logic_arith.all; ----------------------ENTITY sum192110 ISPORT(a: IN SIGNED(19 DOWNTO 0);b: IN SIGNED(21 DOWNTO 0);南京理工大学EDA技术与应用课程实验报告11 共23页clk: IN STD_LOGIC;s:OUT SIGNED(9 DOWNTO 0));END sum192110;----------------------ARCHITECTURE sum192110 OF sum192110 IS BEGINPROCESS(clk)V ARIABLE c:SIGNED(22 DOWNTO 0);BEGINIF(clk'EVENT AND clk='1')THENc:=(a(19)&a(19)&a(19)&a)+(b(21)&b);END IF;s<=c(22 DOWNTO 13);END PROCESS;END sum192110;----------------------仿真结果如图4-16所示:图4- 16 20位22位相加产生被截短的10位数仿真结果3、减法器模块:实现零值减去两个有符号数的减法运算。