资源描述
安徽大学
本科毕业论文(设计、创作)
题 目: 用VHDL设计FIR低通数字滤波器
学生姓名: 学号:
院(系): 电子信息工程学院 专业: 电子信息工程
入学时间: 二〇〇九 年 九 月
导师姓名: 职称/学位:
导师所在单位: 安徽大学电子信息工程学院
完成时间: 二〇一三 年 六 月
31
用VHDL设计FIR低通数字滤波器
摘 要
数字滤波器在语音与图像处理﹑生物医学信号处理﹑通信以及电力系统中有着广泛的应用,它在过滤噪声、提高信噪比等方面有着重要的意义。本文首先分析了几种主要的FIR滤波器的实现方案,经过比较,最终采用了利用单位冲激响应的对称特性的方案。然后根据FIR低通数字滤波器的原理与滤波特性,利用MATLAB中的FDATOOL工具设计了一定性能的FIR低通滤波器,获取滤波器的相应系数并且将其进行量化。最后在MAX+PLUSⅡ环境下运用VHDL语言和原理图混合输入方式实现了18阶FIR低通数字滤波器,利用MAX+PLUSⅡ的仿真器对设计进行仿真得到相应的滤波仿真结果,并与MATLAB计算出来的理论值进行比较。此外,还对理论值与实际值的误差进行了分析。
关键词:FIR数字滤波器;MATLAB;VHDL语言;MAX+PLUSⅡ
Design FIR Low-pass Digital Filter Using VHDL
Abstract
Digital filter has been widely used in speech and image processing, biomedical signal processing, communications and power system, which has important significance in filtering noise and improving the signal-noise. At first, this paper analyzes several main scheme of the realization of FIR filter, after comparing, finally adopts the scheme of using the symmetrical characteristic of the unit impulse response. and then, based on the principle of FIR low pass digital filter and filter characteristics, use FDATOOL of MATLAB tools to design certain properties of the FIR low pass filter, get corresponding filter coefficients and quantify it. At last, I use VHDL language and schematic hybrid approach to achieve the 18-order FIR low-pass digital filter in the environment of MAX + PLUS Ⅱ, and make use of MAX + PLUS Ⅱ simulators to simulate the design to get the corresponding filter simulation results which are used to compare with the MATLAB calculated theoretical value. Furthermore, the error between the theoretical value and the actual value are analyzed.
Keywords: FIR digital filter;MATLAB;VHDL language;MAX+PLUS Ⅱ
目 录
1 引言 1
1.1 论文背景介绍 1
1.2 论文的主要研究内容 1
1.3 工作平台介绍 2
1.3.1 MATLAB介绍 2
1.3.2 MAX+PLUSⅡ 2
2 FIR滤波器 2
2.1 FIR滤波器的基本概念 2
2.2 FIR滤波器的特点 2
2.3 FIR滤波器的结构与原理 3
3 方案分析与设计 5
3.1 FIR滤波器的设计方案 5
3.2 FIR滤波器指标设计 7
3.2.1 基于MATLAB的滤波器参数设置 7
4 用VHDL设计FIR低通数字滤波器 9
4.1 寄存器 10
4.2 加法器模块 12
4.3 乘法器模块 13
4.4 减法器模块 14
4.5 截取模块 15
5 FIR滤波器仿真 16
6 结论 17
主要参考文献 19
附录A 20
附录B 21
致谢 31
1 引言
1.1 论文背景介绍
数字滤波器是数字信号处理系统中一种基本的处理部件,滤波是指依据噪声与有用信号频谱特性的不同,提取有用的信号,滤除不需要的信号,达到改变输入信号中所含频率分量的相对比例的目的。数字滤波器是一个离散的系统,该系统应用的对象是离散信号。若用数字滤波器处理模拟信号,则需要对输入的模拟信号进行限带、抽样、量化和编码等一系列操作。当离散信号通过特定的数字滤波器时,滤波器可以提取信号所含有的有用信息,这就是数字滤波器的功能。从结构上看,数字滤波器可由数字乘法器、加法器和延时单元组成。
数字滤波器可以从两个方面来划分,按频率响应特性来分,可分为低通、高通、带通、带阻滤波器;按单位脉冲响应长度来分,可分为有限长单位脉冲响应(FIR)滤波器和无限长单位脉冲响应(IIR)滤波器[1]。
FIR滤波器与IIR滤波器各有特点,在选择时可以从实际应用时的要求出发,从多方面考虑加以选择[2]。在用FIR滤波器设计和实现某些特定的应用时,会比IIR滤波器更有优势,例如用频率抽样设计法设计理想正交变换器、线性调频器等网络,会很灵活。
在大多数数字信号处理的场合,数字滤波器被要求具有能对输入的信号实时处理并能进行复杂的运算等功能,这些需求越来越普遍,也成为某些数字滤波器的性能指标。在速度方面,FPGA表现出了特有的优势。FPGA拥有丰富的连线资源和规范完整的内部逻辑块整列,非常适合用于高并行度结构和细粒度的FIR滤波器的实现,相对于串行运算的通用DSP芯片来说,可扩展性与并行性都更好[3]。在效率、性价比、功能和使用灵活性方面有优势的FPGA数字信号处理器,正在通信﹑电力系统﹑图像处理等领域发挥着巨大的作用。
运用分布式算法实现的FPGA滤波器具有运算速度与采样数据的宽度成正比的突出优点,适合设计高速高阶的FIR滤波器,在节省硬件资源和提高系统运行速度方面有相当大的优势。另外,可移植性较好,在设计不同参数的滤波器时,只需改变查找表的内容就可以满足具体的实际需要[4]。因此,这种方法在高速数字信号处理中将有很广的应用领域。
1.2 论文的主要研究内容
本文讨论FIR滤波器的多种实现方案并对其进行比较。选择利用具有严格线性FIR滤波器的单位冲激响应的对称特性的方案,用MATLAB中的FDATOOL工具设计一定性能的FIR低通数字滤波器,获取滤波器的单位脉冲响应序列,并进行量化。使用VHDL语言设计滤波器的基本结构,例如:延时单元、加法器、乘法器、减法器等;在顶层模块中采用原理图输入方式实现各元件的互连。用MAX+PLUSⅡ对本设计进行编译仿真,并与MATLAB计算出来的理论值进行对比分析。
1.3 工作平台介绍
1.3.1 MATLAB介绍
MATLAB(Matrix Laboratory的缩写)是美国MathWorks公司推出的面向科学计算、可视化以及交互式程序设计的商业数学软件。如今,MATLAB的功能不仅是解决矩阵与数值计算,它将数值分析、矩阵计算、科学数据可视化、以及非线性动态系统的建模和仿真等诸多强大功能集成在一个易于使用的视窗环境中,为科学研究、工程设计以及必须进行有效数值计算的众多科学领域提供一个全面的解决方案,并在很大程度上摆脱了传统非交互式程序设计语言(如C、Fortran)的编辑模式,代表了当今国际科学计算软件的先进水平[5]。由于功能非常强大,很多著作在进行理论验证或说明一些现象时都使用MATLAB作为辅助工具。在高校的推广和应用下,MATLAB已成为很多大学课程,如信号与系统、数字信号处理等的基本教学工具。
1.3.2 MAX+PLUSⅡ
MAX+PLUSⅡ是Altera公司上一代的PLD开发软件,提供FPGA/CPLD开发集成环境。MAX+PLUSⅡ界面友好,使用方便,被称为业界最易学易用的EDA软件。MAX+PLUSⅡ支持VHDL、原理图和Verilog语言文本文件,以及波形和EDIF等文件作为设计输入,并支持这些文件的混合设计,提供的设计环境与结构无关,使设计者能方便快速地进行设计输入、迅速处理和器件的编程。MAX+PLUSⅡ还拥有门级仿真器,可以进行功能和时序仿真,并产生精确的仿真结果。在适配之后,MAX+PLUSⅡ生成供时序仿真用的VHDL、EDIF和Verilog 3种不同格式的网表文件[1]。
MAX+PLUSⅡ具有以下特点:
(1)开放的界面,与结构无关;
(2)完全集成化,丰富的设计库;
(3)设计环境可用户化;
(4)支持各种硬件描述语言(HDL)输入;
(5)具有OpenCore(开放核)特征;
2 FIR滤波器
2.1 FIR滤波器的基本概念
FIR滤波器是数字信号处理系统中最基本的元器件,主要用来实现信号的预处理、带选、防混叠、抽选/插补、滤波和视频卷积等功能,它可以做成具有严格的线性相位的同时也具有任意的幅频特性。此外,FIR滤波器能用快速傅里叶算法(FFT)来处理信号从而提高运算效率并且滤波器是稳定的,这些特点与其单位抽样响应是有限长的有关。因此,FIR滤波器在通信、模式识别、图像处理等领域有着非常广泛的应用[6]。
2.2 FIR滤波器的特点
FIR数字滤波器可以是稳定的并且可具有良好的线性相位,这些优点是它能广泛应用于数字信号处理领域的关键。
有限冲激响应(FIR)滤波器的特点[2]:
(1)FIR滤波器的单位抽样响应是有限长的,因而滤波器性能稳定;
(2)既可以具有严格的线性相位,又可以具有任意的幅度;
(3)能用因果系统来实现,这是因为任何非因果有限长序列经过一定的延时,都能变成因果有限长序列;
(4)FIR有利于对数字信号的处理,方便编程,计算速度快,便于信号的实时处理;
(5)FIR滤波器比较大的缺点就是要取得良好的衰减特性,H(Z)的阶次比IIR滤波器要高;
(6)IIR滤波器的各种变换方法不适合FIR滤波器的设计,这是其系统函数决定的。
2.3 FIR滤波器的结构与原理
FIR数字滤波器是一个线性时不变系统(LTI),其单位冲激响应的z变换为
(1)
式(1)系统差分方程为
(2)
由式(2)可知n时刻滤波器的输出值只决定于n时刻滤波器的输入值以及过去N-1个输入值,画出其网络结构,如图1所示,这种结构称为直接型。
对于图1所示的直接型结构,可以知道N+1个系数才能描述N阶FIR滤波器,N阶FIR滤波器得用N+1个乘法器和N个两输入加法器来实现。
图1:直接型结构
如果FIR滤波器的单位冲激响应h(n)满足式(3)所示的对称条件:
,n=0,1,…,M (3)
则该因果系统具有严格的线性相位。利用此对称性制作n阶FIR滤波器可减少一半的乘法器:当n为偶数时,需要n/2个乘法器;当n为奇数时,则需要(n+1)/2个乘法器。在实际的电路中要尽可能的减少乘法器的使用,这是因为电路的制作成本与乘法器的数目成正相关,电路的运行速度与乘法器的数目成负相关。
当M为偶数时,式(2)可化为
(4)
把式(3)带入式(4)得到
(5)
对应的偶数型网络结构如图2所示:
图2:偶数型结构
同理,当M为奇数时,式(2)可化为
(6)
对应的奇数型网络结构如图3所示:
图3:奇数型结构
3 方案分析与设计
3.1 FIR滤波器的设计方案
FIR滤波器的设计方案相当多,一般情况下每个方案都有侧重的地方和适用的范围,设计时会考虑速度、资源、结构、稳定性等问题,有时会做出折中的选择。下面介绍几种方案并分析比较。
方案一:
此方案是引用图1所示的直接型结构,它没有经过任何化简,采用并行运算的方式进行。该方案速度快,通用性强,适合参数可变的FIR滤波器[1];但是要实现高阶滤波器则会占用大量的资源,对于资源紧缺的FPGA来说,不实际。
方案二:
本方案利用了具有严格线性FIR滤波器的单位冲激响应的对称特性,采用图2和图3的结构,这样就可以减少一半的乘法运算,节省资源。其运算采用并行方式,不过所选的结构要由滤波器阶数的奇偶性来确定,可见此结构非常适合参数固定的FIR滤波器。
方案三:
若要用FPGA实现参数可变的FIR滤波器,则其网络结构必须是通用型的。方案三的网络结构仍采用直接型,只是在进行乘法运算时,用串行乘法代替并行乘法,拿更多的运行时间来换取少占资源。
串行乘法器模块图如图4所示,图中的A﹑B是两个N位的乘数。串行乘法器的工作原理是:首先将输入数据B通过并串转换器使并行数据转换成串行数据,从数学的角度来看即将其写成几个2的幂的和的形式;接着A和转换后的数据B进入乘法器,运算结果通过加法器;最后将加法器的输出进行循环移位累加,N次移位相加后输出结果。
图4:串行乘法器
方案四:
本方案使用乘法表来实现乘法运算,用查表的方式来得到两输入数的乘积结果,即把两乘数作为ROM的地址,对应的单元数据就是乘积。此方法精度高,速度快,结构简单,适合参数固定,数据位数少的滤波器,如果数据位数多则就不合适[1]。
方案四的结构图如图5所示:
图5:采用乘法表的滤波器结构
方案五:
本方案综合了方案三﹑方案四,有了较好的改进,基本原理如下:
假设滤波器是N阶的M位,则系统的差分方程为
(7)
可表示为
(8)
由式(7)可以得到该方案的结构,如图6所示,其中的用串行时序来实现,用移位寄存器来实现,用N个1×W乘法器来实现, 用加法树来实现。
此外,要实现用方案五制作的FIR滤波器的滤波功能,除了需要上述的串行时序、移位寄存器、N个1×W乘法器、加法树外,还需要设计一个总控制单元用于协调各部件按照设定的时序运行,完成FIR滤波操作。
图6:方案五结构图
以上讨论了五种制作FIR滤波器的方法,各有优缺点,结合自己本身的情况和方案的设计难易程度综合考虑,决定选择方案二的结构来完成本次的毕业论文。
3.2 FIR滤波器指标设计
本文设计的FIR低通数字滤波器的设计指标为:
(1)滤波器阶数为18阶;
(2)采用Kaiser窗函数设计,Beta为0.5;
(3)采样频率Fs为48KHZ,截止频率Fc为10KHZ;
(4)输入序列位宽为8位的有符号数;
(5)输出序列的位宽为8位的有符号数。
3.2.1 基于MATLAB的滤波器参数设置
在MATLAB的命令编辑窗口中输入Fdatool指令,回车后即可打开Filter Design & Analysis Tool窗口,如图7所示,利用此工具,可以快速的完成FIR滤波器系数的计算工作。
由图7可知Fdatool界面可分为两大部分,在界面的上半部分是特性区,用来显示滤波器的各种特性;界面的下半部分则是滤波器设计区,用来设置滤波器的参数。
图7:Filter Design & Analysis Tool窗口
按照设计指标的参数要求,输入相应的参数,设置好的参数如图8所示:
图8:滤波器参数设置
单击工具窗口下方的Design Filter按钮,开始进行相关参数计算。此时,可以看到该滤波器的一些相关曲线,如图9幅频响应、图10相频响应、图11冲激响应。
图9:幅频响应
图10:相频响应
图11:冲激响应
运算的结果通过File下拉菜单中的Export命令取出,并将滤波器的系数存放到当前工作空间,并且以Num命名。保存并关闭滤波器设计分析工具回到MATLAB主窗口,在命令编辑区输入Num可得到工具的计算结果[7]。对FIR滤波器的系数进行调整,做整数化操作后得到滤波器的系数如图12所示。
图12:整数化后的冲激系数
4 用VHDL设计FIR低通数字滤波器
FIR低通数字滤波器可分为以下五种模块:寄存器﹑加法器﹑乘法器﹑减法器﹑截取模块,完成所需的相关模块后在顶层文件中进行连接,综合,以实现低通滤波功能。
本文的FIR低通滤波器的原理图如图13所示。图中的寄存器模块有两个不同的功能,乘法器级之后的只起到信号延时的作用,目的是为了整体仿真时内部信号在时序上的一致性。
图13:FIR低通滤波器的原理图
4.1 寄存器
寄存器用来寄存一组二值代码,对其触发器只要求具有置0﹑置1的功能即可。本文用D触发器组成两种不同的寄存器,实现寄存功能。
(1)具有异步复位功能,当rst=1时,输出信号Dout=0;当rst=0且clk上升沿脉冲到达时Dout=Din;如图14所示。
图14:第一种寄存器
程序如下所示:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
ENTITY reg8 IS
PORT(rst:IN STD_LOGIC;
clk:IN STD_LOGIC;
Din:IN SIGNED(7 DOWNTO 0);
Dout:OUT SIGNED(7 DOWNTO 0));
END reg8;
ARCHITECTURE rt OF reg8 IS
BEGIN
PROCESS(clk,rst)
BEGIN
IF (rst='1' )THEN
Dout<=(OTHERS=>'0');
ELSIF(clk'EVENT AND clk='1') THEN
Dout<=Din;
END IF;
END PROCESS;
END rt;
仿真结果如图15所示:
图15:寄存器仿真结果
(2)不具有异步复位功能,仅起到数据暂存作用,在电路中的作用是使得电路中的信号在时序上保持一致。如图16所示,程序与第一种类似。
图16:第二种寄存器
4.2 加法器模块
加法器用来完成两个有符号数的相加运算。在时钟信号上升沿到达时,对输入的两有符号数进行相加运算后输出结果。加法器有并行进位和串行进位两种组成方式:串行进位加法器运算速度慢,资源占用少,而并行加法器刚好相反。
本文所用的加法器都采用并行进位方式,共有以下几种加法器:两个8位有符号数相加产生9位有符号数的加法器、11位和13位有符号数相加产生14位有符号数的加法器、两个13位有符号数相加产生14位有符号数的加法器、12位和14位有符号数相加产生15位有符号数的加法器、11位和15位有符号数相加产生16位有符号数的加法器、15位和16位有符号数相加产生17位有符号数的加法器、14位和16位有符号数相加产生17位有符号数的加法器、14位和17位有符号数相加产生18位有符号数的加法器。
仅以15位有符号数加16位有符号数生成17位有符号数的加法器为例,其模块框图如图17所示。
图17:加法器结构图
程序:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
ENTITY add151617 IS
PORT(clk:IN STD_LOGIC;
Din1:IN SIGNED(14 DOWNTO 0);
Din2:IN SIGNED(15 DOWNTO 0);
Dout:OUT SIGNED(16 DOWNTO 0));
END add151617;
ARCHITECTURE rt OF add151617 IS
BEGIN
PROCESS(clk)
BEGIN
IF(clk'EVENT AND clk='1') THEN
Dout<=(Din1(14)&Din1(14)&Din1)+(Din2(15)&Din2);
END IF;
END PROCESS;
END rt;
仿真结果如图18所示:
图18:加法器仿真结果
4.3 乘法器模块
本文设计的乘法器具有对输入数据进行固定的放大作用,即乘法器的系数是固定的。乘法器在时钟信号上升沿到达时,完成输入的有符号数与滤波器系数这两个数的乘法运算,之后输出结果。
考虑速度和资源,确定系数的乘法运算可以用移位相加来实现,即将系数分解成几个2的幂的和形式[8]。本文设计的FIR低通数字滤波器系数分别为-9、-4、10、11、-7、-23、-4、50、99、99、50、-4、-23、-7、11、10、-4、-9。由于采用了偶数型的对称结构,滤波器的系数只需要使用一半,即乘法器数目减半。在编写程序时,所有的系数都先当成正值,在后面的求和运算时改为减法运算即可。
以乘99乘法器为例,其模块框图如图19所示。
图19:乘99乘法器结构图
乘99乘法器程序:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
ENTITY mult99 IS
PORT(clk:IN STD_LOGIC;
Din:IN SIGNED(8 DOWNTO 0);
Dout:OUT SIGNED(15 DOWNTO 0));
END mult99;
ARCHITECTURE rt OF mult99 IS
SIGNAL s1:SIGNED(14 DOWNTO 0);
SIGNAL s2:SIGNED(13 DOWNTO 0);
SIGNAL s3:SIGNED(9 DOWNTO 0);
SIGNAL s4:SIGNED(15 DOWNTO 0);
BEGIN
A1:PROCESS(Din)
BEGIN
s1<=Din&"000000";s2<=Din&"00000";s3<=Din&'0';
IF(Din(8)='0') THEN
s4<=('0'&s1)+("00"&s2)+("00000"&s3)+("0000000"&Din);
ELSE
s4<=('1'&s1)+("11"&s2)+("11111"&s3)+("1111111"&Din);
END IF;
END PROCESS;
A2:PROCESS(clk,s4)
BEGIN
IF(clk'event and clk='1') THEN
Dout<=s4;
END IF;
END PROCESS;
END rt;
仿真结果如图20所示:
图20:乘99乘法器仿真结果
4.4 减法器模块
减法器的原理与加法器类似,区别仅在于输出结果为两数的差值。当时钟信号上升沿到来时,实现两个有符号数的相减操作,并输出结果。本文采用18位有符号数减去17位有符号数生成18位有符号数的减法器,其结构框图与加法器差别不大。
程序:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
ENTITY sub181718 IS
PORT(clk:IN STD_LOGIC;
Din1:IN SIGNED(17 DOWNTO 0);
Din2:IN SIGNED(16 DOWNTO 0);
Dout:OUT SIGNED(17 DOWNTO 0));
END sub181718;
ARCHITECTURE rt OF sub181718 IS
BEGIN
PROCESS(clk)
BEGIN
IF(clk'EVENT AND clk='1') THEN
Dout<=Din1-(Din2(16)&Din2);
END IF;
END PROCESS;
END rt;
仿真结果如下图21所示:
图21:减法器仿真结果
4.5 截取模块
减法器的下一级是电路的最后一级,减法器的输出为18位有符号数,按照设计要求输出为8位数据,所以截取模块将减法器输出的18位数据低位舍去直接输出高8位,因此截取后的输出近似等于除掉了2^8即256后的结果。模块结构图如图22所示:
图22:截取模块结构图
程序:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
ENTITY cut188 IS
PORT(clk:IN STD_LOGIC;
Din:IN SIGNED(17 DOWNTO 0);
Dout:OUT SIGNED(7 DOWNTO 0));
END cut188;
ARCHITECTURE rt OF cut188 IS
BEGIN
PROCESS(clk)
BEGIN
IF(clk'EVENT AND clk='1') THEN
Dout<=Din(17 downto 10);
END IF;
END PROCESS;
END rt;
仿真结果如图23所示:
图23:截取模块仿真结果
5 FIR滤波器仿真
MAX+PLUSⅡ仿真器的Grid size项(此项用来设置时钟脉冲的周期)设置为50ns,End time(结束时间)设置为5.0us。任意设定输入的信号为:
Din=[98,0,0,0,76,0,0,0,98,0,0,0,76,0,0,0,98,0,0,0,76,0,0,0,98,0,0,0,76,0,0,0, 98,0,0,0,76,0,0,0,98,0,0,0,76,0,0,0,98,0 ]。
得到的仿真结果如图24所示:
图24:18阶FIR滤波器滤波结果
6 结论
用MATLAB计算FIR低通滤波器的输出结果,运算公式为yn=conv(xn,hn),与仿真器得到的结果如下表1所示:
表1:仿真结果验证
输出结果y[n]
理论值
仿真结果
MATLAB卷积值/256
经仿真器仿真
-0.8613
255
-0.3828
255
0.9570
0
1.0527
1
-1.3379
254
-2.4980
253
0.3594
0
5.6016
5
8.0938
8
7.3848
7
5.4453
5
4.3809
4
3.8086
3
4.1797
4
5.1230
5
6.2617
6
y[0]
6.0039
6
Y[1]
6.0039
6
y[2]
6.2617
6
y[3]
5.1230
5
y[4]
3.5117
3
y[5]
3.5117
3
y[6]
5.1230
5
y[7]
6.2617
6
y[8]
6.0039
6
y[9]
6.0039
6
y[10]
6.2617
6
y[11]
5.1230
5
y[12]
3.5117
3
y[13]
3.5117
3
y[14]
5.1230
5
y[15]
6.2617
6
y[16]
6.0039
6
y[17]
6.0039
6
MAX+PLUSⅡ的仿真器支持四种类型的数:二进制、四进制、八进制、十六进制[9]。当进行减法运算时,如果被减数小于减数则被减数会向高位借位,使输出结果为正。在此情况下,如果仿真器结果显示255,实际的数为-1、254则为-2、253实际为-3。对于仿真器输出的是正数还是负数,要通过上级减法器的两个输入信号的仿真波形图来判断。修正表1中的数据后,用MATLAB制作18阶FIR滤波器理论值与仿真值对比图如图25所示,其中虚线为理论值,实线为仿真值。
图25:18阶FIR滤波器理论值与仿真值对比图
由表1可以看出,仿真结果与MATLAB计算出来的输出信号理论值基本吻合,且波形基本没有毛刺,达到设计要求。此外,从图25中也可以证明这点。图25理论值与仿真值所表现出来的误差,可以从三个方面进行理解:首先,用MATLAB获取滤波器系数时进行了取整运算,舍去了小数位,产生误差;其次,在本设计顶层电路的最后一级使用了截取模块,采用直接截取数据高8位的方式,这样不可避免的带来了误差;最后,VHDL仿真器进行时序仿真时会存在延时问题从而影响输出结果,对于这方面的影响,可增加时钟周期的宽度来减小。
主要参考文献:
[1]潘松,王国栋.VHDL实用教程[M]. 成都:电子科技大学出版社,2007.
[2]程佩青.数字信号处理教程[M]. 北京:清华大学出版社,2008.
[3]张秀娟.基于DA算法的FIR数字滤波器的FPGA设计[J]. 计算机与数学工程,2010(6):165.
[4]薛严冰,韩雪,邵远.基于分布式算法的FIR数字滤波器的FPGA实现[J]. 大连交通大学学报2009,8:84-87.
[5]周品.MATLAB神经网络设计与应用[M]. 北京:清华大学出版社,2013.
[6]刘欲晓,方强.EDA技术与VHDL电路开发应用实践[M]. 北京:电子工业出版社,2009.
[7]岑光.基于FPGA的FIR数字滤波器研究与设计[D]. 西安:西安电子科技大学生物医学工程系,2011.
[8]王丹琦,赵惠昌.一种基于MATLAB及FPGA的FIR低通数字滤波器的设计与实现[J]. 电子设计工程,2010,7:131-134.
[9]Volnei A.Pedroni.VHDL数字电路设计教程[M]. 北京:电子工业出版社,2013.
附录A
FIR低通数字滤波器的原理图
附录B
乘法器与加法器程序
乘4乘法器程序:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
ENTITY mult4 IS
PORT(clk:IN STD_LOGIC;
Din:IN SIGNED(8 DOWNTO 0);
Dout:OUT SIGNED(10 DOWNTO 0));
END mult4;
ARCHITECTURE rt OF mult4 IS
SIGNAL s1:SIGNED(10 DOWNTO 0);
BEGIN
A1:PROCESS(Din)
BEGIN
s1<=Din&"00";
END PROCESS;
A2:PROCESS(clk,s1)
BEGIN
IF(clk'event and clk='1') THEN
Dout<=s1;
END IF;
END PROCESS;
END rt;
乘7乘法器程序:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
ENTITY mult7 IS
PORT(clk:IN STD_LOGIC;
Din:IN SIGNED(8 DOWNTO 0);
Dout:OUT SIGNED(11 DOWNTO 0));
END mult7;
ARCHITECTURE rt OF mult7 IS
SIGNAL s1:SIGNED(10 DOWNTO 0);
SIGNAL s2:SIGNED(9 DOWNTO 0);
SIGNAL s3:SIGNED(11 DOWNTO 0);
BEGIN
A1:PROCESS(Din)
BEGIN
s1<=Din&"00";s2<=Din&'0';
IF(Din(8)='0') THEN
s3<=('0'&s1)+("00"&s2)+("000"&Din);
ELSE
s3<=('1'&s1)+("11"&s2)+("111"&Din);
END IF;
END PROCESS;
A2:PROCESS(clk,s3)
BEGIN
IF(clk'event and clk='1') THEN
Dout<=s3;
END IF;
END PROCESS;
END rt;
乘9乘法器程序:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
ENTITY mult9 IS
PORT(clk:IN STD_LOGIC;
Din:IN SIGNED(8 DOWNTO 0);
Dout:OUT SIGNED(12 DOWNTO 0));
END mult9;
ARCHITECTURE rt OF mult9 IS
SIGNAL s1:SIGNED(11 DOWNTO 0);
SIGNAL s2:SIGNED(12 DOWNTO 0);
BEGIN
A1:PROCESS(Din)
BEGIN
s1<=Din&"000";
IF(Din(8)='0') THEN
s2<=('0'&s1)+("0000"&Din);
ELSE
s2<=('1'&s1)
展开阅读全文