资源描述
资料内容仅供您学习参考,如有不当或者侵权,请联系改正或者删除。
本科毕业设计
基于VHDL的FIR滤波器设计
学院名称
工程学院
专业名称
电子信息工程
论文提交日期
5月 14 日
论文答辩日期
5月 19 日
摘 要
常见的实时数字信号处理的器件有可编程的数字信号处理(DSP)芯片(如AD系列、 TI系列)、 专用集成电路(ASIC)、 现场可编程门阵列(FPGA)等。
有限长冲击响应( FIR) 滤波器, 由于FIR系统只有零点、 系统稳定, 便于实现FFT( 快速傅里叶变换) 算法、 运算速度快、 线性相位的特性和设计更为灵活等突出优点而在工程实际中获得广泛应用, 属于数字信号处理的基本模块之一。本论文对基于FPGA的FIR数字滤波器实现进行了研究, 所做的主要工作如下:
1.介绍了FIR数字滤波器的基本理论和FPGA的基本概况, 以及FPGA设计流程、 设计指导原则和常见的设计指导思想与技巧。
2.以FIR数字滤波器的基本理论为依据, 使用分布式算法为滤波器的硬件实现算法, 并对其进行了详细的讨论。
3.设计出一个16阶低通线性相位FIR滤波器实例。设计使用VHDL语言经过Quartus II软件进行仿真。
关键词: FIR滤波器 FPGA Quartus II Matlab VHDL
The Design of FIR Filter base on VHDL
(College of Engineering, South China Agricultural University,Guangzhou 510642, China)
Abstract: Common real-time digital signal processing devices have programmable digital signal processing (DSP) chip (such as AD series, TI series), application-specific integrated circuit (ASIC), field programmable gates array (FPGA), etc.
Limited long shock response (FIR filter, because FIR system only zero, the system is stable, easy to realize FFT (fast Fourier transform) algorithm, quick speed, linear phase characteristic and design more flexible such prominent advantages and in engineering practice being widely applied digital signal processing, belong to one of the basic modules. This paper based on FPGA realizing the FIR digital filters is studied, the main work done as follows:
1. Introduced the basic theory of FIR digital filters with FPGA, and the basic situation of FPGA design process, the design guiding principle and common design guiding ideology and skill.
2. With the basic theory of FIR digital filters, by using distributed algorithm based on the hardware implementation algorithm for filter, and its are discussed in detail.
3. Design a 17 order low-pass linear phase FIR filter examples. Design uses VHDL language through simulation Quartus II software, and the simulation results and Matlab simulation results are compared and analyzed.
Key words: FIR filter FPGA Quartus II Distributed Arithmetic Matlab VHDL
目 录
1 前言 1
1.1 课题背景及意义 1
1.2 课题主要研究内容 2
1.3 FPGA介绍 2
1.4 工作平台介绍 3
1.4.1 MATLAB 3
1.4.2 Quartus II 3
2 FIR滤波器原理 4
2.1 FIR滤波器概念 4
2.2 FIR滤波器特点 4
2.3 FIR滤波器工作原理 4
3 方案分析及计算 6
3.1 FIR滤波器方案设计 6
3.1.1 分布式 7
3.1.2 直接型 7
3.2 FIR滤波器结构 7
3.3 基于Matlab的FIR滤波器系数计算 8
4 基于VHDL的FIR滤波器的设计及仿真实现 12
4.1 寄存器模块 12
4.2 加法器模块 13
4.3 减法器模块 15
4.4 乘法器模块 18
5 仿真 19
6 结论 20
参 考 文 献 22
附 录 23
附录A FIR原理图 23
附录B 代码 24
致 谢 31
本科生毕业设计成绩评定表
1 前言
1.1 课题背景及意义
数字滤波器一词出现在60年代中期。由于电子计算机技术和大规模集成电路的发展, 数字滤波器已可用计算机软件实现, 也可用大规模集成数字硬件实时实现。数字滤波器由数字乘法器、 加法器和延时单元组成的一种算法或装置。数字滤波器的功能是对输入离散信号的数字代码进行运算处理, 以达到改变信号频谱的目的。数字滤波器是一个离散系统, 该系统能对输入的离散信号进行处理, 从而获取所需的有用信息。
在数字信号处理中,FIR数字滤波器是最常见的单元之一。它用于将输入信号x[n]的频率特性进行特定的修改,转换成另外的输出序列y[n]。
与IIR滤波器相比较, 在设计和实现上FIR滤波器具有如下优越性:
1) 相位响应可为严格的线性, 因此它不存在延迟失真, 只有固定的时间延迟。
2) 、 由于不存在稳定性问题, 因此设计相对简单。
3) 、 只包含实数算法, 不涉及复数算法, 不需要递推运算。
另外, 也应看到, IIR滤波器虽然设计简单, 但主要是用于设计具有分段常数特性的滤波器, 如低通、 高通、 带通和带阻等, 往往脱离不了模拟滤波器的格局。而FIR滤波器则要灵活的多, 特别是她易于适应某些特殊应用, 如构成数字微分器或希尔伯特变换器等, 因而有更大的适应性和广阔的应用领域。
传统的FIR数字滤波器多采用诸如TMS320CXX系列的专用DSP芯片,根据输入采样的移位相乘累加编写软件,利用软硬件的相互结合完成滤波器的设计。但DSP芯片是基于哈佛体系结构的,它的顺序处理方式限制了数据的处理速度和吞吐量。
而FPGA有着规整的内部逻辑块整列和丰富的连线资源, 特别适合用于细粒度和高并行度结构的FIR滤波器的实现, 相对于串行运算主导的通用DSP芯片来说, 并行性和可扩展性都更好。由于在性能、 成本、 灵活性和功耗等方面的优势,基于FPGA的数字信号处理器已广泛应用于图像、 视频和无线通信领域。
采用分布式算法的FPGA 滤波器,其突出的优点是: 运算速度不再和滤波器的阶数正相关,而是与采样数据的宽度相关, 特别适合于高阶高速FIR滤波器的设计, 在提高系统运行速度和节省硬件资源方面具有很大的优势。而且, 经过改变阶数和查找表中的系数, 还能够将此设计灵活地运用于实现高通、 低通和带阻滤波器, 可移植性较好。因此, 这种方法在高速数字信号处理中将有很好的应用前景。
1.2 课题主要研究内容
本课题的经过对FIR滤波器的实现结构比较, 选取合适的FIR滤波器设计方案, 用MATLAB进行滤波器的系数计算并基于VHDL语言设计实现滤波器功能, 经过Quartus II对其仿真。
1.3 FPGA介绍
当前以硬件描述语言( Verilog 或 VHDL) 所完成的电路设计, 能够经过简单的综合与布局, 快速的烧录至FPGA上进行测试, 是现代IC设计验证的技术主流。这些可编辑元件能够被用来实现一些基本的逻辑门电路( 比如AND、 OR、 XOR、 NOT) 或者更复杂一些的组合功能比如解码器或数学方程式。在大多数的FPGA里面, 这些可编辑的元件里也包含记忆元件例如触发器( Flip-flop) 或者其它更加完整的记忆块。
系统设计师能够根据需要经过可编辑的连接把FPGA内部的逻辑块连接起来, 就仿佛一个电路试验板被放在了一个芯片里。一个出厂后的成品FPGA的逻辑块和连接能够按照设计者而改变, 因此FPGA能够完成所需要的逻辑功能。
FPGA一般来说比ASIC( 专用集成芯片) 的速度要慢, 无法完成复杂的设计, 而且消耗更多的电能。可是她们也有很多的优点比如能够快速成品, 能够被修改来改正程序中的错误和更便宜的造价。厂商也可能会提供便宜的可是编辑能力差的FPGA。因为这些芯片有比较差的可编辑能力, 因此这些设计的开发是在普通的FPGA上完成的, 然后将设计转移到一个类似于ASIC的芯片上。另外一种方法是用CPLD( 复杂可编程逻辑器件) 。
早在1980年代中期, FPGA已经在PLD设备中扎根。CPLD和FPGA包括了一些相对大数量的可编辑逻辑单元。CPLD逻辑门的密度在几千到几万个逻辑单元之间, 而FPGA一般是在几万到几百万。
CPLD和FPGA的主要区别是她们的系统结构。CPLD是一个有点限制性的结构。这个结构由一个或者多个可编辑的结果之和的逻辑组列和一些相对少量的锁定的寄存器。这样的结果是缺乏编辑灵活性, 可是却有能够预计的延迟时间和逻辑单元对连接单元高比率的优点。而FPGA却是有很多的连接单元, 这样虽然让它能够更加灵活的编辑, 可是结构却复杂的多。
CPLD和FPGA另外一个区别是大多数的FPGA含有高层次的内置模块( 比如加法器和乘法器) 和内置的记忆体。一个因此有关的重要区别是很多新的FPGA支持完全的或者部分的系统内重新配置。允许她们的设计随着系统升级或者动态重新配置而改变。一些FPGA能够让设备的一部分重新编辑而其它部分继续正常运行。
FPGA采用了逻辑单元阵列LCA( Logic Cell Array) 这样一个概念, 内部包括可配置逻辑模块CLB( Configurable Logic Block) 、 输出输入模块IOB( Input Output Block) 和内部连线( Interconnect) 三个部分。(吴继华, 王诚, ; 潘松, 黄继业, )
1.4 工作平台介绍
1.4.1 MATLAB
MATLAB是由美国mathworks公司发布的主要面对科学计算、 可视化以及交互式程序设计的高科技计算环境。它将数值分析、 矩阵计算、 科学数据可视化以及非线性动态系统的建模和仿真等诸多强大功能集成在一个易于使用的视窗环境中, 为科学研究、 工程设计以及必须进行有效数值计算的众多科学领域提供了一种全面的解决方案, 并在很大程度上摆脱了传统非交互式程序设计语言( 如C、 Fortran) 的编辑模式, 代表了当今国际科学计算软件的先进水平。
1.4.2 Quartus II
Quartus II 是Altera公司的综合性PLD开发软件, 支持原理图、 VHDL、 VerilogHDL以及AHDL( Altera Hardware Description Language) 等多种设计输入形式, 内嵌自有的综合器以及仿真器, 能够完成从设计输入到硬件配置的完整PLD设计流程。
Quartus II能够在XP、 Linux以及Unix上使用, 除了能够使用Tcl脚本完成设计流程外, 提供了完善的用户图形界面设计方式。具有运行速度快, 界面统一, 功能集中, 易学易用等特点。
Quartus II支持Altera的IP核, 包含了LPM/MegaFunction宏功能模块库, 使用户能够充分利用成熟的模块, 简化了设计的复杂性、 加快了设计速度。对第三方EDA工具的良好支持也使用户能够在设计流程的各个阶段使用熟悉的第三方EDA工具。
另外, Quartus II 经过和DSP Builder工具与Matlab/Simulink相结合, 能够方便地实现各种DSP应用系统; 支持Altera的片上可编程系统( SOPC) 开发, 集系统级设计、 嵌入式软件开发、 可编程逻辑设计于一体, 是一种综合性的开发平台。
Maxplus II 作为Altera的上一代PLD设计软件, 由于其出众的易用性而得到了广泛的应用。当前Altera已经停止了对Maxplus II 的更新支持, Quartus II 与之相比不但仅是支持器件类型的丰富和图形界面的改变。Altera在Quartus II 中包含了许多诸如SignalTap II、 Chip Editor和RTL Viewer的设计辅助工具, 集成了SOPC和HardCopy设计流程, 而且继承了Maxplus II 友好的图形界面及简便的使用方法。
Altera Quartus II 作为一种可编程逻辑的设计环境, 由于其强大的设计能力和直观易用的接口, 越来越受到数字系统设计者的欢迎。( 潘松, 黄继业, )
2 FIR滤波器原理
2.1 FIR滤波器概念
FIR(Finite Impulse Response)滤波器: 有限长单位冲激响应滤波器, 是数字信号处理系统中最基本的元件, 它能够在保证任意幅频特性的同时具有严格的线性相频特性, 同时其单位抽样响应是有限长的, 因而滤波器是稳定的系统。因此, FIR滤波器在通信、 图像处理、 模式识别等领域都有着广泛的应用。
2.2 FIR滤波器特点
有限冲激响应( FIR) 数字滤波器和无限冲激响应( IIR) 数字滤波器广泛应用于数字信号处理系统中。IIR数字滤波器方便简单, 但它相位的非线性, 要求采用全通网络进行相位校正, 且稳定性难以保障。FIR滤波器具有很好的线性相位特性, 使得它越来越受到广泛的重视。
有限冲击响应( FIR) 滤波器的特点:
(1)既具有严格的线性相位, 又具有任意的幅度;
(2)FIR滤波器的单位抽样响应是有限长的, 因而滤波器性能稳定;
(3)只要经过一定的延时, 任何非因果有限长序列都能变成因果的有限长序列, 因而能用因果系统来实现;
(4)FIR滤波器由于单位冲击响应是有限长的, 因而可用快速傅里叶变换(FFT)算法来实现过滤信号, 可大大提高运算效率。
(5)FIR也有利于对数字信号的处理, 便于编程, 用于计算的时延也小, 这对实时的信号处理很重要。
(6)FIR滤波器比较大的缺点就是阶次相对于IIR滤波器来说要大很多。
2.3 FIR滤波器工作原理
有限长脉冲响应( FIR) 滤波器的系统函数只有零点, 除原点外, 没有极点, 因而FIR滤波器总是稳定的。如果她的单位脉冲响应是非因果的, 总能够方便的经过适当的移位得到因果的单位脉冲响应, 因此FIR滤波器不存在稳定性和是否可实现的问题。它的另一个突出的优点是在满足一定的对称条件时, 能够实现严格的线性相位。由于线性相位滤波器不会改变输入信号的形状, 而只是在时域上使信号延时, 因此线性相位特性在工程实际中具有非常重要的意义, 如在数据通信、 图像处理等应用领域, 往往要求信号在传输和处理过程中不能有明显的相位失真, 因而线性相位FIR滤波器得到了广泛的应用。
长度为M的因果有限冲激响应滤波器由传输函数H( z) 描述:
( 1)
它是次数为M-1的z-1的一个多项式。在时域中上述有限冲激响应输入输出关系为:
( 2)
其中y( n) 和x( n) 分别是输出和输入序列。
有限冲激响应滤波器的一种直接型实现, 可由式( 2) 生成, M=5的情况如图1所示。其转置, 如图2所示, 是第二个直接型结构。一般一个长度为M的有限冲激响应滤波器由M个系数描述, 而且需要M个乘法器和(M-1)个双输入加法器来实现。
图1 直接型有限冲激响应滤波器结构
图2 图1结构转置后的直接型有限冲激响应滤波器结构
长度为M的线性相位有限冲激响应滤波器由对称的冲激响应h( n) =h( M-1-n) 或反对称的冲激响应h( n) =-h( M-1-n) 描述。利用线性相位有限冲激响应滤波器的对称( 或反对称) 性质, 能够将传输函数的直接型实现所需的乘法器总量减少一半。例如, 图3显示了一个具有对称冲击响应的、 长度为7的有限冲激响应传输函数的实现。
图3 线性相位有限冲激响应结构
3 方案分析及计算
3.1 FIR滤波器方案设计
随着数字技术日益广泛的应用, 以现场可编程门阵列( FPGA) 为代表的ASIC器件得到了迅速普及和发展, 器件集成度和速度都在高速增长。FPGA既具有门阵列的高逻辑密度和高可靠性, 又具有可编码逻辑器件的用户可编程特性, 能够减少系统设计和维护的风险, 降低产品成本, 缩短设计周期。
3.1.1 分布式
分布式算法是一种以实现乘加运算为目的的运算方法。它与传统算法实现乘加运算的不同在于执行部分积运算的先后顺序不同。简单地说, 分布式算法在完成乘加功能时是经过将各输入数据每一对应位产生的部分积预先进相加形成相应部分积, 然后在对各部门积进行累加形成最终结果, 而传统算法是等到所有乘积产生之后再进行相加来完成乘加运算的。与传统算法相比, 分布式算法可极大地减少硬件电路规模, 很容易实现流水线处理, 提高电路的执行速度。
3.1.2 直接型
有限冲激响应滤波器的一种直接型实现, 如图4所示。一般一个长度为M的有限冲激响应滤波器由M个系数描述, 而且需要M个乘法器和(M-1)个双输入加法器来实现。
图4
最后结合自己本身的情况和方案的设计难易程度综合考虑, 决定选择直接型结构完成本次的毕业设计。
3.2 FIR滤波器结构
FIR滤波器的结构主要是非递归结构, 没有输出到输入的反馈。而且FIR滤波器很容易获得严格的线性相位特性, 避免被处理信号产生相位失真。而线性相位体现在时域中仅仅是h(n)在时间上的延迟, 这个特点在图像信号处理、 数据传输等波形传递系统中是非常重要的。另外, 她不会发生阻塞现象, 能避免强信号淹没弱信号, 因此特别适合信号强弱相差悬殊的情况。
3.3 基于Matlab的FIR滤波器系数计算
在matlab命令编辑窗口输入Fdatool指令, 敲击回车能够打开Filter Design & Analysis Tool窗口( 如图5所示) , 在该工具的帮助下, 我们能够完成f.i.r.滤波器系数的计算工作。
图5 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( 最小乘方) 法、 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, 因此不必定义。本设计中的参数设定结果如图6所示。
图6 滤波器参数设定结果
参数设定完毕, 单击工具窗口下方的Design Filter按钮, 开始进行相关参数计算。在计算结果中我们能够看到该滤波器的一些相关曲线, 如幅频响应( 如图7) 、 相频响应( 如图8) 、 冲激响应( 如图9) 等以及具体的系数值( 如图11) 。
图7 幅频响应
图8 相频响应
图9 冲激响应
图10 所设计滤波器冲激系数
计算的结果可经过File下拉菜单中的Export命令取出, 点击Export打开Export对话框( 如图11) , 点击OK按钮可将滤波器系数数据存放到当前工作空间, 并以Num命名。
图11 冲激系数输出对话框
保存并关闭滤波器设计分析工具回到matlab主窗口, 在命令编辑区输入Num可得到工具的计算结果( 如图12) 。
图12 输出在matlab的冲激系数
对FIR滤波器的系数进行调整, 做整数化操作( 如图13) 。可得到滤波器整数化的系数为[-31 -88 -106 -54 70 239 401 499 499 401 239 70 -54 -106 -88 -31]
图13 整数化后的冲激系数
4 基于VHDL的FIR滤波器的设计及仿真实现
4.1 寄存器模块
寄存器用于寄存一组二值代码, 只要求它们具有置1、 置0的功能即可。在本设计中用D触发器组成寄存器, 实现寄存功能。本设计中使用带异步复位rst端的D触发器, 当rst=1时, 输出信号q=0, 当rst=0且上升沿脉冲到达时q=d。
程序如下:
LIBRARY ieee;
USE ieee.std_logic_1164.all;
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ARCHITECTURE dff16 OF dff16 IS
BEGIN
PROCESS (rst,clk)
BEGIN
IF(rst='1')THEN
q<=(OTHERS=>'0');
ELSIF(clk'EVENT AND clk='1')THEN
q<=d;
END IF;
END PROCESS;
END dff16;
仿真结果如图14所示:
图14 寄存器仿真结果
4.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 IS
PORT(a,b: IN SIGNED(9 DOWNTO 0);
clk: IN STD_LOGIC;
s:OUT SIGNED(10 DOWNTO 0));
END SUM101011;
ARCHITECTURE sum101011 OF sum101011 IS
BEGIN
PROCESS(clk)
BEGIN
IF(clk'EVENT AND clk='1')THEN
s<=(a(9)&a)+(b(9)&b);
END IF;
END PROCESS;
END sum101011;
仿真结果如图15所示:
图15 两10位相加产生11位加法器仿真结果
18位和19位有符号数相加产生20位有符号数的加法器设计:
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_arith.all;
ENTITY sum7023918 IS
PORT(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
BEGIN
PROCESS(clk)
BEGIN
IF(clk'EVENT AND clk='1')THEN
s<=(a(17)&a(17)&a)+(b(18)&b);
END IF;
END PROCESS;
END sum7023918;
仿真结果如图16所示:
图16 18位19位相加产生20位数仿真结果
4.3 减法器模块
实现零值减去两个有符号数的减法运算。即用零值减去输入的两数, 在时钟脉冲到来时做减法运算, 输出结果。
-31和-88的乘结果都只包含了乘系数31和88的数值, 并没有将两个负号代入, 因此两乘法器后面的加法器运算改为减法器模块, 采用0-31*累加结果-88*累加结果的方法, 实现( -31) *累加结果+( -88) *累加结果的计算。-106和-54后面的加法器采用同样的方式处理。
-31和-88的减法器设计:
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_arith.all;
ENTITY sub318817 is
PORT(clk : in STD_LOGIC;
Din1 :in signed (15 downto 0);
Din2 :in signed (17 downto 0);
Dout :out signed(18 downto 0));
END sub318817;
ARCHITECTURE sub318817 of sub318817 IS
SIGNAL s1: signed(17 downto 0):=(Din1(15)&Din1(15)&Din1);
SIGNAL s2: signed(18 downto 0):=(OTHERS=>'0');
BEGIN
PROCESS(Din1,Din2,clk)
BEGIN
IF clk'event and clk='1' THEN
Dout<=s2-Din2-s1;
END IF;
END PROCESS;
END sub318817;
仿真结果如图17所示:
图17 -31和-88减法器的仿真结果
-106和-54的减法器的设计:
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_arith.all;
ENTITY sub1065417 is
PORT(clk : in STD_LOGIC;
Din1 :in signed (17 downto 0);
Din2 :in signed (16 downto 0);
Dout :out signed(18 downto 0));
END sub1065417;
ARCHITECTURE sub1065417 of sub1065417 IS
SIGNAL s1: signed(17 downto 0):=(Din2(16)&Din2);
SIGNAL s2: signed(18 downto 0):=(OTHERS=>'0');
BEGIN
PROCESS(Din1,Din2,clk)
BEGIN
IF clk'event and clk='1' THEN
Dout<=s2-Din1-s1;
END IF;
END PROCESS;
END sub1065417;
仿真结果如图18所示:
图18 -106和-54减法器的仿真结果
4.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^6+2^2+2^1、 239被编码为2^8-2^4-2^0、 401被编码为2^9-2^7+2^4+2^0、 499被编码为2^9-2^3-2^2-2^0。
实现输入带符号数据与固定数据两个二进制数的乘法运算。当到达时钟上升沿时, 将两数输入, 运算并输出结果。
乘31电路设计:
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_arith.all;
ENTITY mult31 IS
PORT( clk : IN STD_LOGIC;
Din : IN SIGNED (10 DOWNTO 0);
Dout : OUT SIGNED (15 DOWNTO 0));
END mult31;
ARCHITECTURE mult31 OF mult31 IS
SIGNAL s1 : SIGNED (15 DOWNTO 0);
SIGNAL s2 : SIGNED (10 DOWNTO 0);
SIGNAL s3 : SIGNED (15 DOWNTO 0);
BEGIN
A1:PROCESS(Din,s1,s2,s3)
BEGIN
s1<=Din&"00000";
s2<=Din;
IF (Din(10)='0') THEN
s3<=('0'&s1(14 downto 0))-("00000"&s2(10 DOWNTO 0));
ELSE
s3<=('1'&s1(14 downto 0))-("11111"&s2(10 DOWNTO 0));
END IF;
END PROCESS;
A2: PROCESS(clk,s3)
BEGIN
IF clk'EVENT AND clk='1' THEN
Dout<=s3;
END IF;
END PROCESS;
END mult31;
仿真结果如图19所示:
图19 乘31仿真结果
5 仿真
仿真结果如图20所示:
我们任意设定输入信号为:
Din=[99, 0, 0, 0, 70, 0, 0, 0, 99, 0, 0, 0, 70, 0, 0, 0, 99, 0, 0, 0, 70, 0, 0, 0, 99, 0, 0, 0, 70, 0, 0, 0]
图20 滤波器仿真结果
6 结论
表1仿真结果验证
输出结果y[n]
理论值
仿真结果
MATLAB卷积值/512
经仿真器仿真
-2.3203
-3
-3.4805
-4
2.5137
2
5.6074
5
-4.1543
-5
-12.516
-13
4.4844
4
35.289
35
42.695
41
20.
展开阅读全文