基于FPGA的FIR滤波器的设计与仿真

更新时间:2023-10-30 11:01:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

郑州轻工业学院

电子技术课程设计

题 目 基于FPGA的FIR滤波

器 的 程 序 设 计

学生姓名 李 振 伟 专业班级 电子信息工程10-01 学 号 541001030118 院 (系) 电气信息工程学院 指导教师 耿鑫 完成时间 2013年06月22日

郑州轻工业学院 课 程 设 计 任 务 书

题目 基于FPGA的FIR滤波器的程序设计

专业、班级 电子信息工程10-01学号541001030118姓名 李 振 伟 主要内容、基本要求、主要参考资料等:

主要内容:

要求学生使用硬件描述语言(Verilog 或者 VHDL)设计基于FPGA的FIR滤波器的源程序。FIR滤波器的阶数为8;FIR滤波器的类型为低通,截止频率可以自行设计;FIR滤波器的系数可借助Matlab FDA tool 给出。

基本要求:

1、学会quartusII的使用,掌握FPGA 的程序设计方法。 2、学会 MATLAB 的使用,掌握Matlab FDA tool的使用。 3、掌握硬件描述语言语法。

4、程序设计完成后要求在quartusII中实现功能仿真。 主要参考资料:

1、周润景.基于QuartusⅡ的FPGA/CPLD数字系统设计实例[M].电子工业出版社.2007,8

2、褚振勇. FPGA设计及应用(第三版)[M].西安电子科技大学出版社.2012,4 3、陈怀琛.MATLAB及在电子信息课程中的应用[M].北京:电子工业出版社.2008,1

完 成 期 限: 2013.6.21—2013.6.25 指导教师签名: 课程负责人签名:

2013年 6月 18日

基于FPGA的FIR滤波器的程序设计

中 文 摘 要

线性相位是FIR数字滤波器设计中的一个重要条件。线性相位FIR滤波器的设计方法主要包括时窗函数法、频率采样法、等波纹最佳逼近法。本文基于MATLAB软件,分别用这三种方法设计FIR低通滤波器,并进行比较分析。为了验证FIR滤波器的性能,本文使用MATLAB自带的FDATool工具设计等波纹法15阶低通滤波器,在Simulink里进行仿真,最后得到预期的结果。设计好15阶FIR低通滤波器的系数后,本文就FIR低通滤波器的FPGA实现进行了研究。EDA技术的发展和大规模可编程逻辑器件的应用,使得数字信号处理借助于FPGA实现变为可能。为了实现这一目标,本文讨论了FPGA器件的结构、特点和分布式算法实现FIR滤波器的可行性,然后给出了基于并行分布式算法的FIR滤波器的VHDL描述,最后借助于EDA软件QUARTUSII进行了综合和仿真,并取得了成功。

关键词:分布式算法 FIR数字滤波器 线性相位 DSP Builder

I

目 录

中文摘要……………………………………………………………….I 目 录 ................................................. 1 1 绪 论 ................................................ 2

1.1 课题的目的和意义 .................................. 2 1.2 FPGA技术的发展及应用 ............................. 3 2 FPGA软件设计工具Quartus II ............................ 4 3 FIR数字滤波器设计...................................... 5

3.1 FIR数字滤波器 ..................................... 5

3.1.1 数字滤波器简介 ............................................ 5 3.1.2 FIR数字滤波器............................................. 6 3.1.3 FIR数字滤波器的结构....................................... 8

四、设计方案 ............................................ 10 五、设计内容及结果分析 .................................. 11

5.1基于matlab的FIR滤波器系数计算 ................... 11 5.2 单元器件的编辑及仿真 ............................ 15

5.2.1、寄存器模块 .............................................. 15 5.2.2、加法器模块 .............................................. 16 5.2.3、减法器模块: ............................................ 21 5.2.4、乘法器模块: ............................................ 22

5.3 顶层原理图的编辑及仿真 .......................... 30 六、心得体会 ........................................... 335 参 考 文 献 ............................................ 336 附 录 ............................................... 337

1

1 绪 论

1.1 课题的目的和意义

在当今的生活中,身边的工程技术领域越来越受到关注。其中的通信领域所涉及到的各种信号更是重中之重。如何在较强的背景的噪声下和干扰的信号下有效提炼出真正的有用信号并将其真正运用到实际的工程中,这正是信号处理要解决的问题。上世纪60年代,数字信号处理在理论层上发展迅猛。其体系和框架逐渐成熟,如今,数字信号处理已经成为一门完整的学科。其涉及到许多学科而又广泛应用于许多领域,20世纪60年代以来,随着计算机和信息技术的飞速发展,数字信号处理技术应运而生并得到迅速的发展。数字信号处理是一种通过使用数学技巧执行转换或提取信息,来处理现实信号的方法,这些信号由数字序列表示。

而数字滤波器在这门学科中占有很重要的地位。数字滤波器是一个离散时间系统(按预定的算法,将输入离散时间信号要求的输出离散时间信号的转换为所特定功能装置)。应用数字滤波器处理模拟信号时,首先须对输入模拟信号进行限带、抽样和模数转换。数字滤波器输入信号的抽样率应大于被处理信号带宽的两倍,其频率响应具有以抽样频率为间隔的周期重复特性,且以折叠频率即1/2抽样频率点呈镜像对称。为得到模拟信号,数字滤波器处理的输出数字信号须经数模转换、平滑。数字滤波器具有高精度、高可靠性、可程控改变特性或复用、便于集成等优点。数字滤波器在语言信号处理、图像信号处理、医学生物信号处理以及其他应用领域都得到了广泛应用。它涉及到的领域很广,如通信系统,系统控制,生物医学工程,机械振动,遥感遥测,地质勘探,故障检测,电力系统,航空航天,自动化仪器等。

数字滤波器的好坏对相关的众多工程技术领域影响很大,一个好的数字滤波器会有效的推动众多的工程技术领域改造和学科发展。所以对数字滤波器的工作

2

原理,硬件结构和实现方法进行研究具有一定的意义。

FPGA(Field-Programmable Gate Array),即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。

FPGA采用了逻辑单元阵列LCA(Logic Cell Array)这样一个概念,内部包括可配置逻辑模块CLB(Configurable Logic Block)、输出输入模块IOB(Input Output Block)和内部连线(Interconnect)三个部分。 现场可编程门阵列(FPGA)是可编程器件。与传统逻辑电路和门阵列(如PAL,GAL及CPLD器件)相比,FPGA具有不同的结构,FPGA利用小型查找表(16×1RAM)来实现组合逻辑,每个查找表连接到一个D触发器的输入端,触发器再来驱动其他逻辑电路或驱动I/O,由此构成了即可实现组合逻辑功能又可实现时序逻辑功能的基本逻辑单元模块,这些模块间利用金属连线互相连接或连接到I/O模块。FPGA的逻辑是通过向内部静态存储单元加载编程数据来实现的,存储在存储器单元中的值决定了逻辑单元的逻辑功能以及各模块之间或模块与I/O间的联接方式,并最终决定了FPGA所能实现的功能, FPGA允许无限次的编程.

1.2 FPGA技术的发展及应用

FPGA正处于高速发展时期,新型芯片的规模越大,成本也越来越低,低端的FPGA已逐步取代了传统的数字元件,高端的FPGA将会成为今后竞争的主流。

自1985年问世以来,FPGA从集成电路与系统家族一个不起眼的小角色逐渐成为电子设计领域的重要器件。它极大地提高了设计灵活性并缩短了产品上市时间,在通信、工业控制、航空领域中广泛应用。

FPGA行业集中度很高,几家美国公司掌握着行业的“制空权”。特别是在航空航天及军工等特殊领域,美国等少数国家对先进的技术保持封锁。因此,发展国内FPGA产业不是要不要的问题,而是怎么发展的问题。国内IC企业介入FPGA的时间并不长,多数公司还处于学习阶段。

Altera公司和Xilinx公司为代表的FPGA厂商,除了在FPGA产品线上不断

3

推陈出新之外,也在不懈地提高开发软件的设计能力,他们的软件产品在很多方面一点也不逊色于专业的EDA厂商,所以从这个角度来说,FPGA厂商也是EDA公司。这里的代表性产品就是Altera公司的Quartus II开发软件和Xilinx公司的ISE开发软件。

Altera的FPGA开发工具已经经历了四代。从最初的基于DOS的A+Plus,发展到Max+Plus,1991年推出基于Windows的开发工具Max+Plus II。Max+Plus II在FPGA设计工具里是一个划时代的产品,它提供了一种与结构无关的图形化设计环境,功能强大,使用方便。设计者无须精通器件内部的复杂结构,而只需要使用自己熟悉的设计输入工具(如原理图或者HDL语言)把自己的设计输入到计算机中,Max+Plus II就会自动把这些设计转换成最终结构所需的格式,用户只要把最后生成的配置数据通过下载电缆下载到芯片中,即完成了所有的工作。

Quartus II是Altera公司在2001年推出的第四代开发工具,是一个集成化的多平台设计环境,能够直接满足特定设计需要,在FPGA和CPLD设计各个阶段都提供了工具支持,并为可编程片上系统(SOPC)提供全面的设计环境,是一个系统级的高效的EDA设计工具。而且,随着器件结构和性能的不断提高,器件集成度的不断扩大,Altera始终能够同步推出与之相适应的开发工具,满足了设计者的要求,近年来一直保持着一年一个新版本的更新进度。

2 FPGA软件设计工具Quartus II

Altera公司和Xilinx公司为代表的FPGA厂商,除了在FPGA产品线上不断推陈出新之外,也在不懈地提高开发软件的设计能力,他们的软件产品在很多方面一点都不逊色于专业的EDA厂商,所以从这个角度来说,FPGA厂商也是EDA公司。这里的代表性产品就是Altera公司的Quartus II开发软件和Xilinx公司的ISE开发软件。

Altera的FPGA开发工具已经经历了四代。从最初的基于DOS的A+Plus,发展到Max+Plus,1991年推出基于Windows的开发工具Max+Plus II。Max+Plus II在FPGA设计工具里是一个划时代的产品,它提供了一种和结构无关的图形化的设计环境,功能强大,使用方便。设计者无需精通器件内部的复杂结构,而只

4

需要使用自己熟悉的设计输入工具(如原理图或者HDL语言)把自己的设计输入到计算机中,Max+Plus II就会自动把这些设计转换成最终结构所需的格式,用户只要把最后生成的配置数据通过下载电缆下载到芯片中,即完成了所有的工作。

Quartus II是Altera公司在2001年推出的第四代开发工具,是一个集成化的多平台设计环境,能够直接满足特定的设计需要,在FPGA和CPLD设计各个阶段都提供了工具支持,并为可编程片上系统(SOPC)提供全面的设计环境,是一个系统级的高效的EDA设计工具。而且,随着器件结构和性能的不断提高,器件集成度的不断扩大,Altera始终能够同步推出与之相适应的开发工具,满足了设计者的要求,近年来一直保持这一年一个新版本的更新进度。

Altera公司的Quartus II软件是一种集编辑,编译,综合,布局布线,仿真与器件编程于一体的集成设计环境。Quartus II软件支持基于VHDL与Verilog HDL等硬件描述语言的设计和基于图形的设计,内部嵌有VHDL和Verilong HDL的逻辑综合器,也支持利用第三方的综合工具进行逻辑综合。进行设计仿真时,既可以利用Quartus II软件自己的仿真工具,也可以利用如ModelSim等第三方仿真工具。Quartus II软件除了进行基于FPGA的一般的数字系统开发外。还可以与MATLAB和DSP Builder结合,进行基于FPGA的DSP系统开发;使用内嵌的SOPC Builder设计工具,配合Nios II IDE集成开发环境,进行基于Nios II软核处理器的嵌入式系统开发。

Quartus II软件的设计流程遵循典型的FPGA设计流程,包括设计输入,综合,布局布线,时序分析,仿真验证,编程配置等设计步骤,以及与布局布线有关的功耗分析,调试,工程更改管理,与时序分析和仿真验证有关的时序逼近。

3 FIR数字滤波器设计

3.1 FIR数字滤波器

数字滤波器在数字信号处理中属于预处理的部分,因而起着基础性的作用,数字滤波器包括IIR和FIR数字滤波器。数字滤波器具有精度高、稳定性好、灵活性强、不要求阻抗匹配,易于修改等特点。下面将首先介绍一下数字滤波器,

5

然后重点讨论FIR数字滤波器的设计原理和结构。

3.1.1 数字滤波器简介

一个简单的数字滤波系统如图1-1所示。图中,x(t)为模拟信号,经过A/D转换器后变为一个有着先后顺序的数字序列x(n)。然后x(n)通过数字滤波系统H(z),即得到数字滤波器的输出y(n)。H(z)为该数字滤波系统的单位脉冲响应h(n)的Z变换,即:

H(z)?n????h(n)z??n (2-1)

若h(n)为无限长序列,则得到的数字滤波器为IIR数字滤波器,又称递归滤波器;反之,若h(n)为有限长序列,则得到的数字滤波器为FIR滤波器,也称非递归滤波器。一个线形时不变因果滤波器可表示为:

H(z)??h(n)z?n (2-2)

n?0N?1其中N为h(n)的长度,即滤波器的长度。滤波器的阶数为N-1。

y(n)H(z)x(t)A/Dx(n)

图2-1 数字滤波系统

IIR滤波器主要是基于对模拟滤波器如巴特沃斯滤波器、椭圆滤波器等的幅

频响应进行逼近,而其相频响应是非线性的。与IIR滤波器不同,FIR滤波器可以把相位特性设计成线性。这使得FIR数字滤波器在信号无失真传输、数据通信、图像传输与处理、语音信号处理等有线性相位要求的领域应用广泛。FIR滤波器的优点是软硬件实现结构简单,不用考虑系统的稳定性问题;缺点是实现较高性能的频率响应需要较高的滤波器阶数。

3.1.2 FIR数字滤波器

由于线性相位FIR滤波器的广泛应用,本文将首先讨论一下如何实现线性相位FIR滤波器。由式(2-2)将z?ejw代入,得到:

6

H(e)??h(n)e?jwn (2-3)

jwn?0N?1H(ejw)为复数,因此可以表示成如下形式:

jwj?(w)H(e)?H(w)e

(2-4)

式中,H(w)为实函数,称为幅度特性函数,?(w)为相位特性函数。

当?(w)满足:

?(w)??0?w? (2-5)

?0为初始相位,?为常数。该滤波器具有广义的线性相位,将(2-5)式变换为:

?(w)w??0w?? (2-6)

由(2-6)式可知,

?(w)不为常量。这样,当不同频率的信号通过该滤波器时,w便会产生相位的失真。不过通常?0较小,位失真可忽略不计。

在(2-5)式中,当?0?0时,

?0相比?来说小得多,由?0引起的相w?(w)w???为常量,这时滤波器有严格的线性

相位,即对于不同频率的信号,通过该滤波器都有恒定的延迟,而不产生相位的失真。

将式(2-3),(2-4),(2-5)联立,可得

?h(n)cos(nw)?H(w)cos(?0?w?) (2-7a)

n?0N?1?h(n)sin(nw)??H(w)sin(?n?0N?10?w?) (2-7b)

将(1-7a)式除以(2-7b)式,消去H(w) ,得到:

?h(n)sin(?0?(n??)w)=0 (2-8)

n?0N?17

当?0?0时,式(2-8)变为:

?h(n)sin((n??)w)=0 (2-9)

n?0N?1观察可知,若h(n)sin((n??)w)关于求和区间中心(N?1)/2奇对称,则(2-9)式成立。由于sin((n??)w)关于n??奇对称,令h(n)关于(N?1)/2偶对称,

??(N?1)/2,则满足h(n)sin((n??)w)关于求和区间中心(N?1)/2奇对称的要求,即(2-9)式成立。

当?0???/2时,式(2-8)变为:

?h(n)cos((n??)w)?0 (2-10)

n?0N?1若h(n)关于n?(N?1)/2奇对称,cos((n??)w)关于n?(N?1)/2??偶对称,则(2-10)式成立。

基于h(n)的对称不同和长度N的奇偶区别,线性相位FIR数字滤波器的幅度频率特性有所不同,因而所实现的滤波器的功能有所不同,具体如表1-1所示。第三列为能够实现的滤波器的性能。

表2-1 四种类型的线性相位滤波器

I型 N为奇数 低通、带通、高通、带阻 低通、带通 h(n)?h(N?1?n) II型 III型 IV型 N为偶数 N为奇数 N为偶数 h(n)??h(N?1?n) 带通 带通、高通 3.1.3 FIR数字滤波器的结构

根据FIR数字滤波器实现算法的不同,可以把FIR滤波器的结构划分为直接型、级联型、频率采样型和快速卷积型四种基本形式。本文主要讨论前两种结构。

A. 直接型结构

8

由式子(1-2)可直接画出FIR数字滤波器的直接型结构,如图1-2所示。对于直接型结构来说,一个长度为N的FIR滤波器,每产生一个输出数据,要经过N次乘法,N-1次加法。对于使用FPGA开发FIR数字滤波器,这样的结果显然不令人满意。

x(n)z?1z?1z?1h(N-2)h(N-1)y(n)h(0)h(1)h(2)

图2-2 直接型结构

于是本文做了一下改进,这种改进是基于线性相位的FIR数字滤波器的。以严格线性相位,N为偶数的FIR滤波器为例,如图1-3所示。

x(n)z?1z?1z?1z?1z?1h(0)h(1)z?1h(2)z?1h(N/2)z?1y(n)

图2-3 直接型的改进

由于h(n)关于n?(N?1)/2对称,我们可以将经过延时环节的位置关于

(N?1)/2对称的数据预先相加,然后可以再乘以相应的滤波器系数进行累加

得到最终的输出结果。这样,每产生一个输出,经过N/2次乘法,N?1次加法,比原来减少N/2次乘法。 B. 级联型结构

对式子(1-2)进行因式分解,并将零点共轭的因式放在一起,这样产生了若干个一阶子式和二阶子式,将一阶子式看作二阶子式的一个特例,则系统函数H(z)可以表示为:

9

H(z)?h(0)?(1?a11z?1?a12z?2)

l?1L(1-11)

FIR数字滤波器的级联型结构如图1-4所示。

x(n)h(0)z?1z?1z?1y(n)?11?21?12z?1z?1?L1z?1?22

?L2图2-4 级联型结构

从图中可以看出,级联型结构每产生一个输出,需要N?1次乘法,N?1次加法。级联型的最大特点是可以分别独立调整每个子系统的零点之值,当需要精确控制滤波器的零点位置时,往往采用这种结构。

四、设计方案

图4-1若N为偶数线性相位FIR滤波器的对称结构流图

本设计取h(n)为偶对称的情况,则图中:应取“ +1 ”。由上图可分析得到,要完成滤波器的设计,需要设计的底层文件包括延时单元、加法电路单元、乘以负一单元、乘法器单元及截取10位数单元。由各单元VHDL编程后,生成相应的符号文件。最后连接成顶层原理图。整个电路的原理图设置方案如图4-2所示:

10

Din[9..0]-1-1-1-1-1-1-1-1zzzzzzzz+-1+-1+-1+-1+-1+-1+-1+zzzzzzzx-x+x-x+x+x+x+xDout[9..0] 图4- 2 滤波器整体设计方案原理图

五、设计内容及结果分析

首先使用matlab计算出符合设计要求的滤波器冲激响应系数。后将整个电路规划为语言编辑和原理图编辑两个单元,其中语言编辑部分负责编辑整个滤波器电路中所需用的单元器件,包括寄存器、加法器、减法器以及乘法器几个单元器件;最后将所有的器件连接成顶层原理图。在进行编译及仿真。

5.1基于matlab的FIR滤波器系数计算

在matlab命令编辑窗口输入Fdatool指令,再点回车即可打开Filter Design & Analysis Tool窗口,在该工具的帮助下,我们就可以完成f.i.r.滤波器系数的计算。Fdatool界面总共分两大部分,一部分是design filter,在界面的下半部分,用来设置滤波器的设计参数,另一部分则是特性区,在界面的上半部分,用来显示滤波器的各种特性。design filter部分主要分为:

Response Type(响应类型)选项,包括Lowpass(低通)、Highpass(高通)、Bandpass(带通)、Bandstop(带阻)和特殊的滤波器。根据本次作业要求,在

11

该选项中选择Lowpass选项。

Design Method(设计方法)选项,包括IIR滤波器的Butterworth(巴特沃思)法、Chebyshev Type i(切比雪夫i型)法、 Chebyshev Type ii(切比雪夫ii型) 法、Elliptic(椭圆滤波器)法等和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=80 KHz、Fc=10 KHz。

本次课设中的参数全部设定后的结果如图5-1所示。

图5-1 参数全部设定后图

12

参数设定完毕,单击工具窗口下方的Design Filter按钮,就开始进行相关参数计算。在计算结果中可以看到该滤波器的一些相关曲线,如幅频响应(如图5-2)、相频响应(如图5-3)、冲激响应(如图5-4)等。图形如下:

13

图5-2 幅频响应曲线

图5-3 相频响应曲线

图5-4 冲激响应

计算的结果可通过File下拉菜单中的Export命令取出,点击Export打开Export对话框(如图5-5),点击Export按钮可将滤波器系数数据存放到当前工作空间,并以Num命名。

图5-5 冲激系数输出对话框

保存并关闭滤波器设计分析工具回到matlab主窗口,在命令编辑区输入Num可得到工具的计算结果(如图5-6)。

图 5-6 输出在matlab的冲激系数

对FIR滤波器的系数进行调整,做整数化操作。可得到滤波器整数化的系数为[-31 -88 -106 -54 70 239 401 499 499 401 239 70 -54 -106 -88 -31],如图 5-7所示:

14

图5-7 整数化后的冲激系数

5.2 单元器件的编辑及仿真

5.2.1、寄存器模块

在本次课设中延迟单元可用寄存器来替代,寄存器用于寄存一组二值代码,只要求它们具有置1、置0的功能即可。在本设计中使用带异步复位rst端的D触发器,当rst=1时,输出信号q=0,当rst=0且上升沿脉冲到达时q=d,即延迟了一个在周期。

其程序代码如下:

LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY jicunqi IS

PORT (rst,clk: IN STD_LOGIC; d:IN STD_LOGIC_VECTOR (9 DOWNTO 0);

q:OUT STD_LOGIC_VECTOR (9 DOWNTO 0)); END jicunqi;

ARCHITECTURE dff16 OF jicunqi 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;

程序编译后就可进行仿真,仿真结果如图5-8所示:

图5-8 寄存器模块仿真结果

15

由上图可知,与预期相符,即设计正确,再将其生成为一个元件以便后来调用,其生成图如图5-9 所示。

图 5-9 寄存器元件图

5.2.2、加法器模块

即实现两个有符号数的相加运算。即将输入的两数,在时钟脉冲到来时相加运算,输出结果。在本设计中共有8个:

两个10位有符号数相加产生一个11位有符号数的加法器、一个18位和19位有符号数相加产生20位有符号数的加法器、一个两个20位有符号数相加产生一个21位有符号数的加法器、一个两个19位有符号数相加产生一个20位有符号位数的加法器、一个20位和21位有符号数相加产生22位有符号数的加法器,以及一个20位和22位有符号数相加产生23位有符号数的加法器电路。具体如下:

⑴ 两个10位有符号数相加产生一个11位有符号数的加法器设计: 由分析可写出如下程序:

LIBRARY ieee;

USE ieee.std_logic_1164.all; USE ieee.std_logic_arith.all; ENTITY add101011 IS

PORT(a,b: IN SIGNED(9 DOWNTO 0); clk: IN STD_LOGIC;

s:OUT SIGNED(10 DOWNTO 0)); END add101011;

ARCHITECTURE sum101011 OF add101011 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;

程序编译后就可进行仿真,仿真结果如图5-10所示:

16

图5-10 两个10位有符号数相加结果波形图

由上图可知,与预期相符,即设计正确,再将其生成为一个元件以便后来调用,其生成图如图5-11所示

图5-11 两个10位有符号数相加元件图

⑵ 18位和19位有符号数相加产生20位有符号数的加法器设计: 由分析可写出如下程序:

LIBRARY ieee;

USE ieee.std_logic_1164.all; USE ieee.std_logic_arith.all; ENTITY add181920 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 add181920;

ARCHITECTURE sum7023918 OF

add181920 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;

程序编译后就可进行仿真,仿真结果如图5-12所示:

图5-12 18位和19位有符号数相加结果波形图

由上图可知,与预期相符,即设计正确,再将其生成为一个元件以便后来调用,其生成图如图5-13 所示

图5-13 18位和19位有符号数相加元件图

17

⑶ 两个20位有符号数相加产生一个21位有符号数的加法器设计:

由分析可写出如下程序:

LIBRARY ieee;

USE ieee.std_logic_1164.all; USE ieee.std_logic_arith.all; ENTITY add202021 IS

PORT(a: IN SIGNED(19 DOWNTO 0); b: IN SIGNED(19 DOWNTO 0); clk: IN STD_LOGIC;

s:OUT SIGNED(20 DOWNTO 0)); END add202021;

ARCHITECTURE sum40149919 OF

add202021 IS BEGIN

PROCESS(clk) BEGIN

IF(clk'EVENT AND clk='1')THEN s<=(a(19)&a)+(b(19)&b); END IF; END PROCESS; END sum40149919;

程序编译后就可进行仿真,仿真结果如图5-14所示:

图 5-14 两个20位有符号数相加结果波形图

由上图可知,与预期相符,即设计正确,再将其生成为一个元件以便后来调用,其生成图如图5-15所示

图 5-15 两个20位有符号数相加元件图

⑷ 两个19位有符号数相加产生一个20位有符号位数的加法器设计: 由分析可写出如下程序:

LIBRARY ieee;

USE ieee.std_logic_1164.all; USE ieee.std_logic_arith.all; ENTITY add191920 IS

PORT(a: IN SIGNED(18 DOWNTO 0); b: IN SIGNED(18 DOWNTO 0); clk: IN STD_LOGIC;

s:OUT SIGNED(19 DOWNTO 0)); END add191920; 18

ARCHITECTURE sum181819 OF add191920 IS BEGIN

PROCESS(clk) BEGIN

IF(clk'EVENT AND clk='1')THEN s<=(a(18)&a)+(b(18)&b); END IF; END PROCESS;

END sum181819;

程序编译后就可进行仿真,仿真结果如图5-16所示:

图 5-16 两个19位有符号数相加结果波形图

由上图可知,与预期相符,即设计正确,再将其生成为一个元件以便后来调用,其生成图如图5-17所示

图 5-17 两个19位有符号数相加元件图

⑸ 20位和21位有符号数相加产生22位有符号数的加法器:

由分析可写出如下程序:

LIBRARY ieee;

USE ieee.std_logic_1164.all; USE ieee.std_logic_arith.all; ENTITY add202122 IS

PORT(a: IN SIGNED(19 DOWNTO 0); b: IN SIGNED(20 DOWNTO 0); clk: IN STD_LOGIC;

s:OUT SIGNED(21 DOWNTO 0)); END add202122;

ARCHITECTURE sum192021 OF add202122

IS BEGIN

PROCESS(clk) BEGIN

IF(clk'EVENT AND clk='1')THEN s<=(a(19)&a(19)&a)+(b(20)&b); END IF; END PROCESS; END sum192021;

程序编译后就可进行仿真,仿真结果如图5-18所示:

图 5-18 20位和21位有符号数相加结果波形图

19

由上图可知,与预期相符,即设计正确,再将其生成为一个元件以便后来调用,其生成图如图5-19 所示

图5-19 20位和21位有符号数相加元件图

⑹ 20位和22位有符号数相加产生23位有符号数的加法器电路设计(最后一级带舍位):

在此加法器电路中在引入低位舍去功能只保留最终10位输出,最终保留10位输出采用了直接取输出23位数的高十位的方法,因此在输出中近似等于除掉了2^13即8192以后的结果。为了比较,特又引出了一个23位全输出引脚(quan)。其程序如下:

LIBRARY ieee;

USE ieee.std_logic_1164.all; USE ieee.std_logic_arith.all; ENTITY add202223 IS

PORT(a: IN SIGNED(19 DOWNTO 0); b: IN SIGNED(21 DOWNTO 0); quan: OUT SIGNED(22 DOWNTO 0);

clk: IN STD_LOGIC;

s:OUT SIGNED(9 DOWNTO 0)); END add202223;

ARCHITECTURE sum192110 OF add202223

IS BEGIN

PROCESS(clk)

VARIABLE c:SIGNED(22 DOWNTO 0); BEGIN

IF(clk'EVENT AND clk='1')THEN c:=(a(19)&a(19)&a(19)&a)+(b(21)&b); END IF;

s<=c(22 DOWNTO 13); quan<= c; END PROCESS; END sum192110;

程序编译后就可进行仿真,仿真结果如图5-20所示

图 5-20 20位和22位有符号数相加 结果波形图

由上图可知,与预期相符,即设计正确,再将其生成为一个元件以便后来调用,其生成图如图5-21所示;

20

图 5-21 20位和22位有符号数相加元件图

5.2.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 jian3188 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 jian3188;

ARCHITECTURE sub318817 of jian3188 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;

程序编译后就可进行仿真,仿真结果如图5-22所示:

图5-22 31和-88的减法器结果仿真图

由上图可知,与预期相符,即设计正确,再将其生成为一个元件以便后来调用,其生成图如图5-23 所示;

21

图5-23 -31和-88的减法器元件图

⑵-106和-54的减法器的设计:

由分析可写出如下程序:

LIBRARY ieee;

USE ieee.std_logic_1164.all; USE ieee.std_logic_arith.all; ENTITY jian10654 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 jian10654;

ARCHITECTURE sub1065417 of jian10654 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;

程序编译后就可进行仿真,仿真结果如图5-24 所示:

图 5-24 -106和-54的减法器结果仿真图

由上图可知,与预期相符,即设计正确,再将其生成为一个元件以便后来调用,其生成图如图5-25 所示;

图 5-25 -106和-54的减法器元件图

5.2.4、乘法器模块:

实现输入带符号数据与固定数据两个二进制数的乘法运算。当到达时钟上升沿时,将两数输入,运算并输出结果。

从资源和速度方面考虑,常系数乘法运算可用移位相加来实现。将常系数分

22

解成几个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 mul31 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&\

s2<=Din;

IF (Din(10)='0') THEN s3<=('0'&s1(14 0))-(\

ELSE s3<=('1'&s1(14 0))-(\

END IF; END PROCESS; A2: PROCESS(clk,s3) BEGIN

IF clk'EVENT AND clk='1' THEN Dout<=s3; END IF; END PROCESS; END mul31;

downto downto

程序编译后就可进行仿真,仿真结果如图5-26 所示:

图 5-26 乘31电路结果仿真图

由上图可知,与预期相符,即设计正确,再将其生成为一个元件以便后来调用,其生成图如图5-27所示;

23

图5-27 乘31电路元件图

⑵乘88电路设计:

由分析可写出如下程序:

LIBRARY ieee;

USE ieee.std_logic_1164.all; USE ieee.std_logic_arith.all; ENTITY mult88 IS

PORT( clk : IN STD_LOGIC;

Din : IN SIGNED (10 DOWNTO 0); Dout : OUT SIGNED (17 DOWNTO 0)); END mult88;

ARCHITECTURE mult88 OF mult88 IS SIGNAL s1 : SIGNED (16 DOWNTO 0); SIGNAL s2 : SIGNED (14 DOWNTO 0); SIGNAL s3 : SIGNED (13 DOWNTO 0); SIGNAL s4 : SIGNED (17 DOWNTO 0); BEGIN

A1:PROCESS(Din,s1,s2,s3) BEGIN

s1<=Din&\

s2<=Din&\ s3<=Din&\ IF (Din(10)='0') THEN

s4<=('0'&s1(16 downto 0))+(\DOWNTO 0))+(\ ELSE

s4<=('1'&s1(16 downto 0))+(\DOWNTO 0))+(\ END IF; END PROCESS; A2: PROCESS(clk,s4) BEGIN

IF clk'EVENT AND clk='1' THEN Dout<=s4; END IF; END PROCESS; END mult88;

程序编译后就可进行仿真,仿真结果如图5-28所示:

图 5-28 乘88电路结果仿真图

由上图可知,与预期相符,即设计正确,再将其生成为一个元件以便后来调用,其生成图如图5-29所示;

24

图 5-29 乘88电路元件图

⑶乘106电路设计: 由分析可写出如下程序:

LIBRARY ieee;

USE ieee.std_logic_1164.all; USE ieee.std_logic_arith.all; ENTITY mult106 IS

PORT( clk : IN STD_LOGIC;

Din : IN SIGNED (10 DOWNTO 0); Dout : OUT SIGNED (17 DOWNTO 0)); END mult106;

ARCHITECTURE mult106 OF mult106 IS SIGNAL s1 : SIGNED (16 DOWNTO 0); SIGNAL s2 : SIGNED (15 DOWNTO 0); SIGNAL s3 : SIGNED (13 DOWNTO 0); SIGNAL s4 : SIGNED (11 DOWNTO 0); SIGNAL s5 : SIGNED (17 DOWNTO 0); BEGIN

A1:PROCESS(Din,s1,s2,s3,s4) BEGIN

s1<=Din&\ s2<=Din&\

s3<=Din&\ s4<=Din&'0';

IF (Din(10)='0') THEN

s5<=('0'&s1(16 downto 0))+(\DOWNTO ELSE

s5<=('1'&s1(16 downto 0))+(\DOWNTO

0))+(\

DOWNTO

0))+(\ END IF; END PROCESS; A2: PROCESS(clk,s5) BEGIN

IF clk'EVENT AND clk='1' THEN Dout<=s5; END IF; END PROCESS; END mult106;

0))+(\

DOWNTO

0))+(\

程序编译后就可进行仿真,仿真结果如图5-30所示:

图 5-30 乘106电路结果仿真图

由上图可知,与预期相符,即设计正确,再将其生成为一个元件以便后来调用,其生成图如图5-31所示;

25

图 5-31 乘106电路元件图

⑷ 乘54电路设计: 由分析可写出如下程序:

LIBRARY ieee;

USE ieee.std_logic_1164.all; USE ieee.std_logic_arith.all; ENTITY mult54 IS

PORT( clk : IN STD_LOGIC;

Din : IN SIGNED (10 DOWNTO 0); Dout : OUT SIGNED (16 DOWNTO 0)); END mult54;

ARCHITECTURE mult54 OF mult54 IS SIGNAL s1 : SIGNED (16 DOWNTO 0); SIGNAL s2 : SIGNED (13 DOWNTO 0); SIGNAL s3 : SIGNED (11 DOWNTO 0); SIGNAL s4 : SIGNED (16 DOWNTO 0); BEGIN

A1:PROCESS(Din,s1,s2,s3) BEGIN

s1<=Din&\

s2<=Din&\ s3<=Din&'0';

IF (Din(10)='0') THEN

s4<=('0'&s1(15 downto 0))-(\DOWNTO 0))-(\ ELSE

s4<=('1'&s1(15 downto 0))-(\DOWNTO 0))-(\ END IF; END PROCESS; A2: PROCESS(clk,s4) BEGIN

IF clk'EVENT AND clk='1' THEN Dout<=s4; END IF; END PROCESS; END mult54;

程序编译后就可进行仿真,仿真结果如图5-32所示:

图 5-32 乘54电路结果仿真图

由上图可知,与预期相符,即设计正确,再将其生成为一个元件以便后来调用,其生成图如图5-33所示;

26

图 5-33 乘54电路元件图

⑸ 乘70电路设计:

由分析可写出如下程序:

LIBRARY ieee;

USE ieee.std_logic_1164.all; USE ieee.std_logic_arith.all; ENTITY mult70 IS

PORT( clk : IN STD_LOGIC;

Din : IN SIGNED (10 DOWNTO 0); Dout : OUT SIGNED (17 DOWNTO 0)); END mult70;

ARCHITECTURE mult70 OF mult70 IS SIGNAL s1 : SIGNED (16 DOWNTO 0); SIGNAL s2 : SIGNED (12 DOWNTO 0); SIGNAL s3 : SIGNED (11 DOWNTO 0); SIGNAL s4 : SIGNED (17 DOWNTO 0); BEGIN

A1:PROCESS(Din,s1,s2,s3) BEGIN

s1<=Din&\

s2<=Din&\ s3<=Din&'0';

IF (Din(10)='0') THEN

s4<=('0'&s1(16 downto 0))+(\DOWNTO 0))+(\ ELSE

s4<=('1'&s1(16 downto 0))+(\DOWNTO 0))+(\ END IF; END PROCESS; A2: PROCESS(clk,s4) BEGIN

IF clk'EVENT AND clk='1' THEN Dout<=s4; END IF; END PROCESS; END mult70;

程序编译后就可进行仿真,仿真结果如图5-34所示:

图5-34 乘70电路结果仿真图

由上图可知,与预期相符,即设计正确,再将其生成为一个元件以便后来调用,其生成图如图5-35所示;

图5-35 乘70电路元件图

27

⑹ 乘239电路设计: 由分析可写出如下程序:

LIBRARY ieee;

USE ieee.std_logic_1164.all; USE ieee.std_logic_arith.all; ENTITY mult239 IS

PORT( clk : IN STD_LOGIC;

Din : IN SIGNED (10 DOWNTO 0); Dout : OUT SIGNED (18 DOWNTO 0)); END mult239;

ARCHITECTURE mult239 OF mult239 IS SIGNAL s1 : SIGNED (18 DOWNTO 0); SIGNAL s2 : SIGNED (14 DOWNTO 0); SIGNAL s3 : SIGNED (10 DOWNTO 0); SIGNAL s4 : SIGNED (18 DOWNTO 0); BEGIN

A1:PROCESS(Din,s1,s2,s3) BEGIN

s1<=Din&\

s2<=Din&\ s3<=Din;

IF (Din(10)='0') THEN

s4<=('0'&s1(17 downto 0))-(\DOWNTO 0))-(\ ELSE

s4<=('1'&s1(17 downto 0))-(\DOWNTO 0))-(\ END IF; END PROCESS; A2: PROCESS(clk,s4) BEGIN

IF clk'EVENT AND clk='1' THEN Dout<=s4; END IF; END PROCESS; END mult239;

程序编译后就可进行仿真,仿真结果如图5-36所示:

图 5-36 乘239电路结果仿真图

由上图可知,与预期相符,即设计正确,再将其生成为一个元件以便后来调用,其生成图如图5-37所示;

图5-37 乘239电路元件图

⑺乘401电路设计: 由分析可写出如下程序:

LIBRARY ieee;

USE ieee.std_logic_1164.all; 28

USE ieee.std_logic_arith.all; ENTITY mult401 IS

PORT( clk : IN STD_LOGIC;

Din : IN SIGNED (10 DOWNTO 0); Dout : OUT SIGNED (19 DOWNTO 0)); END mult401;

ARCHITECTURE mult401 OF mult401 IS SIGNAL s1 : SIGNED (19 DOWNTO 0); SIGNAL s2 : SIGNED (17 DOWNTO 0); SIGNAL s3 : SIGNED (14 DOWNTO 0); SIGNAL s4 : SIGNED (10 DOWNTO 0); SIGNAL s5 : SIGNED (19 DOWNTO 0); BEGIN

A1:PROCESS(Din,s1,s2,s3,s4) BEGIN

s1<=Din&\ s2<=Din&\ s3<=Din&\ s4<=Din;

IF (Din(10)='0') THEN

s5<=('0'&s1(18 downto 0))-(\DOWNTO 0))+(\0))+(\ ELSE

s5<=('1'&s1(18 downto 0))-(\DOWNTO 0))+(\0))+(\ END IF; END PROCESS; A2: PROCESS(clk,s5) BEGIN

IF clk'EVENT AND clk='1' THEN Dout<=s5; END IF; END PROCESS; END mult401;

程序编译后就可进行仿真,仿真结果如图5-38所示:

图 5-38 乘401电路结果仿真图

由上图可知,与预期相符,即设计正确,再将其生成为一个元件以便后来调用,其生成图如图5-39所示;

图5-39 乘401电路元件图

⑻ 乘499电路设计: 由分析可写出如下程序:

LIBRARY ieee;

USE ieee.std_logic_1164.all; USE ieee.std_logic_arith.all; ENTITY mult499 IS

PORT( clk : IN STD_LOGIC;

Din : IN SIGNED (10 DOWNTO 0); Dout : OUT SIGNED (19 DOWNTO 0)); 29

END mult499;

ARCHITECTURE mult499 OF mult499 IS SIGNAL s1 : SIGNED (19 DOWNTO 0); SIGNAL s2 : SIGNED (13 DOWNTO 0); SIGNAL s3 : SIGNED (12 DOWNTO 0); SIGNAL s4 : SIGNED (10 DOWNTO 0); SIGNAL s5 : SIGNED (19 DOWNTO 0);

BEGIN

A1:PROCESS(Din,s1,s2,s3,s4) BEGIN

s1<=Din&\ s2<=Din&\ s3<=Din&\ s4<=Din;

IF (Din(10)='0') THEN

s5<=('0'&s1(18 downto 0))-(\DOWNTO 0))-(\0))-(\ ELSE

s5<=('1'&s1(18 downto 0))-(\DOWNTO 0))-(\0))-(\ END IF; END PROCESS; A2: PROCESS(clk,s5) BEGIN

IF clk'EVENT AND clk='1' THEN Dout<=s5; END IF; END PROCESS; END mult499;

程序编译后就可进行仿真,仿真结果如图5-40所示:

图5-40 乘499电路结果仿真图

由上图可知,与预期相符,即设计正确,再将其生成为一个元件以便后来调用,其生成图如图5-41所示;

图5-41 乘499电路元件图

5.3 顶层原理图的编辑及仿真

单元器件的编辑好后,将元器件按设计思路中的图3-1连接搭建成整体的滤波器电路。其中clk和rst信号采用了总线名称的连接方式。 其总电路原理图编辑结果如图5-42所示:

30

图5-42 总原理图电路

将原理图编辑好后,进行编译仿真,设y(n)?x(n)*h(n),

取{x(n)}?{ 303 134 345 98 -78 97 102 -205 412}进行仿真,结果如图5-43所示:

32

图 5-43 总图仿真结果

利用matlab的conv函数可以验证FIR滤波器卷积的结果,其结果如图5-44所示;

33

本文来源:https://www.bwwdw.com/article/k6j2.html

Top