摘 要

本文讨论的FIR滤波器因其具有严格的线性相位特性而得到广泛的应用。在工程实践中,往往要求信号处理具有实时性和灵活性,本论文研究FIR的FPGA解决方案正体现了电子系统的微型化和单片化。

本论文主要讨论了以下的问题:

首先,以FIR滤波器的基本理论为依据,研究适应工程实际的数字滤波器的设计方法,确定了直接型网络结构、窗函数设计法的设计方案;

然后,讨论了FPGA的原理与结构特点,总结FPGA的设计流程与设计原则,并用Verilog HDL语言根据设计方案编写出FIR滤波器程序;

接着,采用Q值量化的方法解决了如何将FIR滤波器的系数,由带符号十进制浮点数转化成定点二进制补码的问题;

最后,重点研究了在FPGA设计FIR滤波器时,如何使用MATLAB来加强FIR滤波器的设计,以及用MATLAB中的simulink对FIR滤波器设计进行算法上的仿真,还研究了FPGA设计中另外一个重要方法:QuartusII和MATLAB联合仿真,同时介绍了用MATLAB对仿真结果进行验证的方法。

关键词:FIR滤波器,FPGA,MATLAB,QuartusII,联合仿真

ABSTRACT

FIR filter discussed in this paper is widely used because of its strict phase distortion and sharp cut-off characteristic. In the engineering practice, there is often a request for the real-time and flexible signal processing, the present paper studied FIR the FPGA solution regular script present electron system microminiaturization and monolithic.

Below this article mainly discusses the question:

Firstly, take the FIR filter elementary theory as the basis, the research adaption project actual numeral filter design method, has determined the direct network architecture, the window function design method design proposal;

Then, discussed the FPGA principle and the unique feature, summarizes the FPGA design flow and the principle of design, and language compiles the FIR filter procedure with Verilog HDL according to the design proposal;

After that, how used the Q value quantification the method to solve the FIR filter coefficient, transformed the fixed point two's complement by the belt mark decimal base floating number the question;

Finally, has studied with emphasis designs the FIR filter when FPGA, how uses MATLAB to strengthen the FIR filter the design, as well as carries on in the algorithm with MATLAB simulink to the FIR filter design the simulation, but also has studied in the FPGA design another important method: QuartusII and the MATLAB union simulation, simultaneously introduced carries on the confirmation with MATLAB to the simulation result the method.

KEY WORDS: FIR filter, FPGA, MATLAB, QuartusII, Union simulation

第1章  引 言

1.1  本课题的研究意义

许多工程技术领域都涉及到信号,这些信号包括电的、磁的、机械的、热的、声的、光的及生物体的等等。如何在较强的背景噪声和干扰信号下提取出真正的信号并将其用于实际工程,这正是信号处理要研究解决的问题。

滤波器在信号处理中占有很重要的地位,它涉及的领域很广,如通信系统、系统控制、生物医学工程、机械振动、遥感遥测、地质勘探、航空航天、电力系统、故障检测、自动化仪器等。数字滤波器的好坏对相关的众多工程技术领域影响很大,一个好的滤波器会有效的推动众多工程技术领域的技术改造和学科发展。所以对滤波器的工作原理、硬件结构和实现方法进行研究具有一定的意义。

模拟滤波器的理论和方法是较早研究的一类信号处理的理论和方法,这种处理方法是以各种分立元件,如电阻、电容、电感为基础的,简单的阻容器和电抗型滤波器如图1-1所示:

图1-1 简单的阻容器和电抗型滤波器

数字滤波器是一种基本的处理部件,它能满足滤波器对幅度和相位特性的严格要求,避免模拟滤波器所无法克服的电压漂移、温度漂移和噪声等问题。有限冲激响应(FIR)滤波器能在设计任意幅频特性的同时,保证严格的线性相位特性。同时由于其实现结构主要是非递归的, 因此FIR 滤波器可以稳定工作。

它与模拟滤波器相比具有以下优点:

(1)无需电子分立器件:电阻、电感、电容;

(2)性能体积比好;

(3)可靠性好;

(4)通用性好;

(5)易实现;

(6)微处理器可同时实现多种多处滤波。其速度高、体积小、成本低,功能强大。

1.2  国内外的研究现状

关于数字滤波器实现方法的研究,大体可以分为软件实现和硬件实现方法两种。

1、在通用微型计算机上用软件实现

软件可以是自己编写的,也可以使用现成的软件包,这种方法的缺点是速度太慢,不能用于实时系统,只能用于教学和算法的仿真研究。比如近年来迅速发展的MATLAB,就几乎可以实现所有数字滤波器的仿真。而且在MATLAB下的部分仿真程序还可以通过转化为C语言,再通过DSP的C编译器直接在DSP硬件上运行。这对非实时系统或准实时系统来说是很有吸引力的。

硬件实现即是设计专门的数字滤波硬件,目前主要采用的方法有以下几种:

2、DSP器件来实现

DSP处理器配有专门适用于数字信号处理的指令系统,具备独特的循环寻址,倒序寻址能力。这些特点非常适合数字信号处理中的滤波器设计的实现。DSP芯片的这些特点使得对不允许延迟的实时应用领域,如蜂窝电话、计算机硬盘驱动器等非常理想。其唯一缺点是程序顺序执行, 尽管DSP器件性能不断提高, 但在某些实时性要求极高的场合中受到限制。

3、专用DSP芯片来实现

适用于过程固定而又追求高速的信号处理任务,其体积小、保密性好,具有极高的性能。但这种芯片将相应的信号处理算法在芯片内部用硬件实现,无须进行编程,由于字长和阶数的规格较少, 不易完全满足实际需要,虽可采用多片扩展来满足, 但会增加体积和功耗, 因而在实际中受到一定限制,灵活性差,而且开发工具很不完善。

4、用单片机来实现。

单片机不断发展,如Inte196000的运算速度就非常可观,而且单片机的接口性能比较良好,容易实现人机接口。但是由于单片机采用的是冯诺依曼总线结构,系统比较复杂,实现乘法运算速度较慢,而在数字滤波器中却要涉及大量的乘加运算,因此这种方法在运算量大的实时信号滤波处理当中很难有所作为,可用于一些不太复杂的数字信号处理,如数字控制等。

5、可编程逻辑器件实现

FPGA有着规整的内部逻辑阵列和丰富的连线资源,特别适合于数字信号处理任务,相对于串行运算为主导的通用DSP芯片来说,其并行性和可扩展性更好。 但长期以来FPGA一直被用于系统逻辑和时序控制上,很少有信号处理方面的应用,其原因主要是因为在FPGA中缺乏实现乘法运算的有效结构。现在这个问题得到了解决使FPGA在数字信号处理方面有了长足的发展。由于FPGA/CPLD本身具有并行处理的特点,现在使用此方式也越来越多。

1.3  本论文的研究目的和主要内容

本论文以基于FPGA的FIR数字滤波器的实现为研究内容,对FIR数字滤波器的实现进行了研究。通过讨论与比较多种FIR滤波器的设计方法之后,最后采用窗函数设计方法来设计直接型结构的FIR滤波器。在设计了滤波器程序后,论文着重的研究了MATLAB、QuartusII等EDA软件在设计FPGA时,在功能与方法上的互补。给出了用MATLAB进行滤波器设计,及结合EDA软件进行联合仿真的简便方法。

本论文分为六部分:

第1章主要介绍背景、选题以及文章的概要;

第2章介绍了数字滤波器的分类与FIR滤波器的原理,对直接型的FIR滤波器进行了详细的说明,并介绍了用窗函数法实现 FIR 滤波器的方法;

第3章对FPGA进行了概述,介绍了FPGA的结构,并对FPGA的设计流程与设计原则进行了详细的说明,最后介绍了MATLAB与QuartusII两款EDA工具;

第4章进行具体的设计论述,首先介绍如何用MATLAB设计求出满足指标的滤波器系数,并讨论了用Q值量化将系数由带符号十进制浮点数转化成定点二进制补码的方法,然后给出了用Verilog HDL语言编写的部分程序代码。

第5章介绍了运用MATLAB与QuartusII对所设计的滤波器进行联合仿真的方法,并对仿真的结果进行了分析验证。

第6 章主要是对本次设计进行总结,并分析了本次设计的不足以及需要改进的地方。

第2章  FIR数字滤波器原理及技术

2.1  数字滤波器概述

所谓数字滤波器,是指输入、输出均为数字信号,通过一定运算关系改变输入信号所含频率成分的相对比例或者滤除某些频率成分的器件。因此,数字滤波的概念和模拟滤波相同,只是信号的形式和实现滤波方法不同。如果要处理的是模拟信号,可通过ADC和DAC,在信号形式上进行匹配转换,同样可以使用数字滤波器对模拟信号进行滤波。

信号中一般都包含噪声或者说其中有很多能量在感兴趣的最高频率之外,因此我们要用滤波电路将感兴趣的带宽之外的信号和噪声移去。数字滤波器是数字信号处理中使用最广泛的一种线性系统环节,图2-1给出了一个具有模拟输入信号和输出信号的实时数字滤波器的简化框图。这个模拟信号被周期地抽样,且转化成一系列数字x(n)(n = 0,1,......)。数字滤波器依据滤波器的计算算法,执行滤波运算、把输入系列x(n)映射到输出系列y(n)。DAC把数字滤波后的输出转化成模拟值,这些模拟值接着被模拟滤波器平滑,并且消去不需要的高频分量。

图2-1 数字处理系统

2.2  数字滤波器的分类

对于一般的数字滤波器,按照单位冲激响应可分为无限冲激响应IIR 系统和有限冲激响应FIR系统。

在IIR系统中,用有理分式表示的系统函数来逼近所需要的频率响应,即其单位冲激响应h(n)是无限长的;而在FIR系统中,则用一个有理多项式表示的系统函数去逼近所需要的频率响应,即其单位冲激响应h(n)在有限个n值处不为零。

IIR滤波器由于借用了模拟滤波器的结果,有大量的图表可查,可以方便、简单、有效地完成设计,效果很好,但是其相位特性不好控制,必须用全通网络进行复杂的相位较正,才能实现线性相位特性的要求。

FIR滤波器则可在幅度特性随意设计的同时,保证精确、严格的线性相位特性。这在要求相位线性信道的现代电子系统,如图像处理、数据传输等波形传递系统中,是具有很大吸引力的。而且,其单位冲激响应是有限长的,不存在不稳定的因素,并且可用因果系统来实现。

本次设计主要研究的就是FIR滤波器的设计。

2.3  FIR滤波器的基本理论

FIR滤波器的系统函数为:

(2-1)

直接由H(z)得出表示输入输出关系的常系数线性差分方程为:

(2-2)

可以看出,数字滤波器是把输入序列经过一定的运算(如式2-2所示)变换成输出序列。大多数普通的数字滤波器是线性非时变的LTI滤波器。对于因果的FIR系统,其系统函数仅有零点(除z=0的极点外),并且因为系数a*全为零,所以(2-2 )式的差分方程就简化为

(2-3)

式(2-3)可以认为是x(n)与单位脉冲响应h(n)的直接卷积。

2.4  FIR数字滤波器的基本结构

FIR滤波器有直接型、级联型和频率抽样型三种基本结构,其中直接型是最常见的结构。

图2-2 直接型结构

这种结构也称为抽头延迟线结构,或称横向滤波器结构。从图2-2可以看出,沿着这条链每一抽头的信号被适当的系数(脉冲响应)加权,然后将所得乘积相加就得到输出y(n)。这种结构具有一般性。

转置定理定义,如果将网络中所有的支路方向倒转,并将输入x(n)和输出y(n)相互交换,则其系统函数H(z)不变。将转置定理应用于图2-2,就可以得出FIR的转置直接型结构如图2-3。

图2-3 转置直接型结构

线性相位FIR系统的结构:

在许多应用领域,例如通信和图像处理中,在一定的频率范围内维持相位的完整性是一个期望的系统属性。

可以证明,如果FIR滤波器的单位取样响应h(n)为实数,而且满足线性相位条件,则滤波器的单位取样响应h(n)满足以下两个条件之一:

偶对称      h(n)=h(N-1-n)

奇对称      h(n)=-h(N-1-n)

其对称中心在n=N-1/2处。所谓线性相位特性是指滤波器对不同频率的正弦波所产生的相移和正弦波的频率成直线关系。

图2-4 线性相位结构

图2-4显示了线性相位FIR滤波器的结构。可以看出,线性相位FIR滤波器的固有对称属性可以降低所需要的乘法器的数量,它使得乘法器的数量降低了一半,而加法器的数量则保持不变。

本次设计采用直接型FIR滤波器结构。

2.5  FIR滤波器的设计指标

数字滤波器的特性经常在频域定义,对于选择性的滤波器,如低通滤波器和带通滤波器,性能规范经常以容差图的形式出现。我们如要设计一个因果可实现的滤波器,要考虑到复杂性与成本问题,因此实用中通带和阻带中都允许一定的误差容限,即通带不一定时完全水平的,阻带不一定都绝对衰减到零。此外,按照要求,在通带和阻带之间还应设置一定宽度的过渡带。

图2-5 低通滤波器技术指标

由图2-5可知,滤波器的基本技术指标包括6个参数:通带截止频率,阻带截止频率,滤波器阶数N,3dB截止频率,通带容限和阻带容限。通带频率范围为,在通带中要求,阻带频率范围,在阻带中要求,从到称为过渡带,一般是单调下降的。

但通带内和阻带内允许的衰减一般用dB数表示,通带内允许的最大衰减用表示,阻带内允许的最小衰减用表示,如将归一化为1,和分别定义为:

(2-4)

(2-5)

当幅度下降到时,,此时=3dB,称为3dB截止频率。 、和统称为边界频率。这些指标在滤波器的设计中是很重要的。

2.6  窗函数法设计 FIR 滤波器

设计FIR数字滤波器常用的方法主要有窗函数法、频率取样法、等纹波逼近法等。其中,窗函数法是一种基本的设计方法,其设计方法较为成熟,本设计即采用窗函数法。下面先简要介绍其设计思想。

任何数字滤波器的频率响应都是的周期函数,它的傅立叶级数展开式为:

(2-6)

其中                                            (2-7)

傅立叶系数实际上就是数字滤波器的冲击响应,由于可能是无限长序列且为非因果响应,是物理不可实现的。为此要寻找一个因果的,在相应的误差准则下最近逼近。窗函数法设计的初衷是使设计的滤波器频率特性在频域均方误差最小意义下进行逼近,即

(2-8)

窗函数法就是用被称为窗函数的有限加权序列来修正式(2-6),则所需表示为:

(2-9)

是有限长序列,当及时,这里我们仅以冲激响应对称即时低通滤波器为例进行说明。低通滤波器的频率响应函数如下式所示:

(2-10)

在时为0,其中为对抽样频率归一化的角频率,为归一化截止角频率。利用反傅立叶变换公式求出式(2-9)对应的冲激响应为:

(2-11)

所以加窗函数后,对滤波器的理想特性的影响有以下几点:

1、在截止频率的间断点变成连续的曲线,使出现了一个过渡带,宽度等于窗函数的主瓣的宽度。由此可见,如果窗函数的主瓣越宽,过渡带就越宽。

2、由于窗函数旁瓣的影响,使得滤波器的幅度频率特性出现了波动,波动的幅度取决于旁瓣的相对幅度。旁瓣范围的面积越大,通带波动和阻带的波动就越大,换句话说,阻带的衰减减小,而波动的多少,取决于旁瓣的大小。

3、增加窗函数的长度,只能减小窗函数的幅度频率特性的主瓣宽度,而不能减小主瓣和旁瓣的相对值,改值取决于窗函数的形状。

为了满足工程上的需要,可以通过改变窗函数的形状来改善滤波器的幅度频率特性,而窗函数的选择原则是:

1、具有较低的旁瓣幅度,尤其是第一旁瓣的幅度。

2、旁瓣的幅度下降的速度要快,以利于增加阻带的衰减。

3、主瓣的宽度要窄,这样可以得到比较窄的过渡带。

通常上述的几个原则难以同时满足。当选用主瓣宽度较窄时,虽然能够得到比较陡峭的幅度频率响应,但是通带和阻带的波动明显增加;当选用比较小的旁瓣幅度时,虽然能够得到比较平坦和匀滑的幅度频率响应,但是过渡带将加宽。因此,实际中选用的窗函数往往是它们的折衷。在保证主瓣宽度达到一定要求的条件下,适当地牺牲主瓣的宽度来换取旁瓣的波动减小。

工程中比较常用的窗函数有:矩形窗函数、三角形(Bartlett)窗函数、汉宁(Hanning)窗函数、哈明(Hamming)窗函数、布莱克曼(Blackman)窗函数和凯塞(Kaiser)窗函数。这几种窗函数的基本参数比较见表2-1所示。

表2-1 几种窗函数的基本参数比较

窗函数

旁瓣峰值幅度/dB

过渡带宽

阻带最小衰减/dB

矩形窗

-13

4

-21

三角形窗

-25

8

-25

汉宁窗

-31

8

-44

哈明窗

-41

8

-53

布莱克曼窗

-57

12

-74

凯塞窗

-57

10

-80

凯塞窗是一种适应能力比较强的窗函数,在本文的设计中将使用到凯塞窗。

其窗函数的形式可以表示为:

(2-12)

式中                                         (2-13)

是零阶第一类正凯塞-贝塞尔函数,可用下面级数计算:

(2-14)

一般取15~25项,便可以满足精度要求。参数可以控制窗的形状。一般加大,主瓣加宽,旁瓣幅度减小,典型数据为4〈〈9。当=5.44时,窗函数接近哈明窗。当=7.865时,窗函数接近布莱克曼窗。凯塞窗的幅度函数为:

(2-15)

这种窗函数在不同值的性能归纳在表2-2中:

表2-2 凯塞窗参数对滤波器的性能影响

 

过渡带宽

通带波纹/dB

阻带最小衰减/dB

2.120

3.00

0.27

-30

4.538

5.86

0.0274

-50

7.865

10.0

0.000 868

-80

10.056

10.8

0.000 087

-100

第3章  FPGA设计方法与设计流程

3.1  FPGA概述

随着微电子技术的发展,设计与制造集成电路的任务已不完全由半导体厂商来独立承担。系统设计师们更愿意自己设计专用集成电路(ASIC)芯片,而且希望ASIC的设计周期尽可能短,最好是在实验室里就能设计出合适的ASIC芯片,并且立即投入实际应用之中,因而出现了现场可编程逻辑器件FPLD,其中应用最广泛的当属现场可编程门阵列FPGA和复杂可编程逻辑器件CPLD。

FPGA/CPLD, DSP和CPU被称为未来数字电路系统的3块基石,也是目前硬件设计研究的热点。与传统电路设计方法相比,FPGA具有功能强大、开发过程投资少、周期短、可反复编程修改、保密性能好、开发工具智能化等特点,特别是随着电子工艺的不断改进,低成本FPGA器件推陈出新。另一方面集成电路技术仍然按照摩尔定律飞速发展,最新的工艺水平也由90纳米有条不紊地发展到了65纳米,但是一般的ASIC的流片生产的增长速度更是惊人。而且现代市场商机瞬息万变、稍纵即逝,商家希望设计的产品在最短的时间里投入市场中,ASIC开发周期显得比较长。这一切促使FPGA成为当今硬件设计的首选方式之一。

FPGA的基本特点主要有:

1、采用FPGA设计ASIC电路,用户不需要经过流片生产,就能得到可用的芯片。

2、FPGA可做其它全定制或半定制ASIC电路的中试样片。

3、FPGA内部有丰富的组合逻辑、触发器和I/O引脚。

4、FPGA是ASIC电路中设计周期最短、开发费用最低、风险最小的器件之一。

5、FPGA采用高速CHMOS工艺,功耗低,可以与CMOS, TTL电平兼容。

3.2  FPGA的基本结构

现场可编程门阵列(FPGA)器件是Xilinx公司1985年首家推出的,它是一种新型的高密度PLD。 FPGA内部由许多独立的可编程逻辑模块(CLB)组成,逻辑块之间可以灵活地相互连接。FPGA的结构一般分为三部分:可编程逻辑块、可编程I/O模块和可编程内部连线。结构示意图3-1如下:

图3-1 FPGA结构图

1、CLB模块

CLB是FPGA的主要组成部分,是实现逻辑功能的基本单元,CLB主要是由逻辑函数发生器、触发器、数据选择器等电路组成。CLB的功能很强,不仅能够实现逻辑函数,还可以配置成RAM等复杂的形式,配置数据存放在片内的SRAM或熔丝图上,基于SRAM的FPGA器件工作前需要从芯片外部加载配置数据。配置数据可以存储在片外的EPROM或计算机上,设计人员可以控制加载过程,在现场修改器件的逻辑功能,即现场可编程。

2、I/O模块IOB

IOB提供了器件引脚和内部逻辑阵列之间的连接,通常排列在芯片的四周。主要是由触发器、输入缓冲器、输出触发器和输出缓冲器组成,每个IOB控制一个引脚,可被配置为输入、输出或双向I/O功能。

3、可编程互连资源IR

可编程互连资源包括各种长度的金属连线线段和一些可编程开关,它们将各个CLB之间和CLB与IOB之间互相连接起来,构成各种复杂功能的系统。

FPGA的发展非常迅速,形成了各种不同的结构。按逻辑功能块的大小分类,FPGA可分为细粒度FPGA和粗粒度FPGA。细粒度FPGA的逻辑功能块较小,资源可以充分利用,但连线和开关多,速度慢:粗粒度FPGA的逻辑功能块规模大,功能强,但资源不能充分利用。从逻辑功能块的结构上分类,可分为查表结构、多路开关结构和多级与非门结构。根据FPGA内部连线的结构不同,可分为分段互连型FPGA和连续互连型FPGA两类。分段互连型FPGA中具有各种不同长度的金属线,各金属线段之间通过开关矩阵或反熔丝编程连接,走线灵活方便,但是无法预测走线延时;连续互连型FPGA是利用相同长度的金属线,连接与距离远近无关,布线延时是固定的和可预测的。

3.3  FPGA设计流程

FPGA设计大都采用至上而下的设计方法,即从系统整体要求出发,自上而下地逐步将设计内容细化,最后完成系统硬件的整体设计。

图3-2 基于EDA软件的FPGA设计流程图

整个设计流程如下所示,包括设计准备、设计输入、功能仿真、时序仿真、布局布线、综合、综合后仿真、编程下载等。图3-2是基于EDA软件的FPGA设计流程图,对于目前流行的EDA工具软件,图3-2的设计流程具有一般性。

以下分别介绍开发设计中各流程的主要功能及其常用的 EDA 软件。

1、设计准备

在系统设计之前,首先要进行方案论证、系统设计和器件选择等准备工作。根据任务要求,如系统的功能和复杂度,对工作速度和器件本身的资源、成本及连线的可布性进行权衡,选择合适的设计方案和合适的器件类型。

2、设计输入

常用的输入方式有三种:原理图输入方式、硬件描述语言输入方式、波形输入方式。

①原理图输入方式

原理图输入方式是最直接的设计描述方式,要设计什么,就从软件系统提供的元件库中调出来,画出原理图,这样比较符合人们的习惯。这种方式需要设计人员具有丰富的电路知识以及对FPGA的结构比较了解。其主要优点是容易实现仿真,便于信号的观察和电路的调整;缺点是效率低,特别是产品有所改动,需要选用另外一种器件时,就需要重新输入原理图,而硬件描述语言则不存在这个问题。

②硬件描述语言输入方式

硬件描述语言HDL的发展至今已有20多年的历史,并成功地应用于设计的各个阶段:建模、仿真、验证和综合等。到20世纪80年代,己出现了上百种硬件描述语言,对设计自动化曾起到了极大的促进和推动作用。但是,这些语言一般各自面向特定的设计领域和层次,而且众多的语言使用户无所适从。因此,急需一种面向设计的多领域、多层次并得到普遍认同的标准硬件描述语言。20世纪80年代后期,VHDL和Verilog HDL语言适应了这种趋势的要求,先后成为IEEE标准。关于这两种语言在下面将进行详细讨论。

③波形输入方式

波形输入方式主要用来建立和编辑波形设计文件,以及输入仿真向量和功能测试向量。波形设计输入适合用于时序逻辑和有重复性的逻辑函数。系统软件可以根据用户定义的输入/输出波形自动生成逻辑关系。

3、功能仿真

功能仿真也叫前仿真。用户所设计的电路必须在编译之前进行逻辑功能验证,此时的仿真没有延时信息,对于初步的功能检测非常方便。仿真前要先利用波形编辑器和硬件描述语言等建立波形文件和测试向量,仿真结果会生成报告文件和输出波形信号,从中便可以观察到各个接点的信号变化。如果发现错误,则返回设计输入中修改逻辑设计。

4、设计处理

设计处理是FPGA设计中的核心环节。在设计处理过程中,编译软件将对设计输入文件进行逻辑化简、综合优化和适配,最后产生编程用的编程文件。

5、语法检查和设计规则检查

设计输入完成后,首先要进行语法检查,如原理图中有无漏连信号线,信号有无双重来源,文本输入文件中关键字有无输错等各种语法错误,并及时列出错误信息报告供设计人员修改,然后进行设计规则检查,检查总的设计有无超出器件资源或规定的限制,并将编译报告列出,指明违反规则情况以供设计人员纠正。

6、逻辑优化和综合

化简所有的逻辑方程或用户自建的宏,使设计所占用的资源最少。综合的目的是将许多模块化设计文件合并为一个网表文件,并使层次设计平面化。

7、适配和分割

确立优化以后的逻辑能否与器件中的宏单元和I/O单元适配,然后将设计分割为多个便于识别的逻辑小块形式映射到器件相应的宏单元中。如果整个设计较大,不能装入一个器件时,可以将整个设计划分(分割)成多块,并装入同一系列的多片器件中去。分割可全自动、部分或全部用户控制,目的是使器件数目最少,器件之间通信的引脚数目最少。

8、布局和布线

布局和布线工作是在上面的设计工作完成后由软件自动完成的,它以最优的方式对逻辑元件布局,并准确地实现元件间的互连。布线以后软件自动生成报告,提供有关设计中各部分资源的使用情况等信息。

9、时序仿真

时序仿真又称后仿真或延时仿真。由于不同器件的内部延时不一样,不同的布局布线方案也给延时造成不同的影响,因此在设计处理以后,对系统的各模块进行时序仿真,分析其时序关系,估计设计的性能,以及检查和消除竞争冒险等是非常必要的。实际上这也是与实际器件工作情况基本相同的仿真。

10、器件编程测试

时序仿真完成后,软件就可以产生供器件编程使用的数据文件。对于FPGA来说,就是产生位数据流文件(Bitstream Generation ),然后将编程数据写到对应的具体可编程器件中去。

器件在编程完毕后,可以用编译时产生的文件对器件进行校验、加密等工作,对于支持JTEG技术具有边界扫描测试BST ( Bandary-Scan Testing)能力和在线编程能力的器件来说,测试起来就更加方便。

3.4  VHDL与Verilog HDL

硬件描述语言(HDL)是一种用文本形式来描述和设计电路的语言。经过长时间的发展,HDL语言发展为VHDL与Verilog HDL两种语言。

VHDL(Very High Speed Integration Circuit HDL)超高速集成电路硬件描述语言是1985年在美国国防部的支持下推出的一种标准化程度较高的语言,VHDL语言是一种全方位的语言,包括从系统到电路的所有设计层次,支持自上而下和基于库的设计方法,而且还支持同步电路、异步电路、FPGA以及其它随机电路的设计。其范围之广是其它HDL语言所不能比拟的。VHDL语言具有多层次描述系统硬件功能的能力,可以从系统级的数学模型直到门级电路。另外高层次的行为描述可以与低层次的RTL描述和结构描述混合使用。VHDL语言能进行系统级的硬件描述,这是其最突出的一个优点。

在用VHDL语言设计系统硬件时,没有嵌入与工艺有关的信息,可以使设计人员在系统设计、逻辑验证阶段便确立方案的可行性;VHDL语言的公开可利用性,便于实现大规模系统的设计;具有很强的逻辑描述和仿真功能,而且输入效率高,在不同的设计输入库之间的转换非常方便,且不用对低层电路的结构非常熟悉。

Verilog HDL语言是1983年由GDA公司的Phil Moorby首创的,至今已有20多年的应用历史,因而拥有广泛的用户群体,其设计资源也比VHDL丰富。Verilog HDL语言是在C语言的基础上发展而来的。从语法结构上看,Verilog HDL语言和C语言有许多相之处,继承和借鉴了C语言的很多语法结构。由于这种语言具有简洁、高效、易用、功能强等特点,因此逐渐为众多设计者接受和喜爱。

Verilog HDL既能进行面向综合的电路设计,又可用于电路的模拟仿真。支持在多个层次上对所设计的系统加以描述,从开关级、门级、寄存器传输级到行为级等。拥有灵活多样的电路描述风格,可进行行为描述,也可进行结构描述或数据流描述,同时支持混合建模,在一个设计中各个模块可以在不同的设计层次上建模和描述。Verilog HDL语言易学易用,可以使设计者更快更好地掌握并用于电路设计。Verilog HDL语言功能强,可满足各个层次设计人员的需要。正是以上优点,使得它广泛流行。在ASIC设计领域,Verilog HDL语言一直就是事实上的标准。

本次设计将采用Verilog HDL语言来进行描述。

3.5  FPGA设计原则

FPGA设计的一个重要指导原则:面积和速度的平衡与互换,这个原则在后边的滤波器设计中有大量的验证体现。

这里“面积”指一个设计消耗FPGA/CPLD的逻辑资源的数量,对于FPGA可以用所消耗的触发器(FF)和查找表(LUT)来衡量,更一般的衡量方式可以用设计所占用的等价逻辑门数来衡量。“速度”指设计在芯片上稳定运行所能够达到的最高频率,这个频率由设计的时序状况决定,和设计满足的时钟周期,PADto PAD Time, Clock Setup Time, Clock Hold Time, Clock-to-Output Delay等众多时序特征量密切相关。面积(area)和速度(speed)这两个指标贯穿着FPGA设计的始终,是设计质量评价的终极标准。关于面积和速度的两个最基本的概念:面积与速度的平衡和面积与速度的互换,本文做如下探讨。

面积和速度是一对对立统一的矛盾体。要求一个设计同时具备设计面积最小,运行频率最高是不现实的。更科学的设计目标应该是在满足设计时序要求(包含对设计频率的要求)的前提下,占用最小的芯片面积。或者在所规定的面积下,使设计的时序余量更大,频率跑得更高。这两种目标充分体现了面积和速度的平衡的思想。关于面积和速度的要求,不应该简单的理解为工程师水平的提高和设计完美性的追求,而应该认识到它们是和产品的质量和成本直接相关的。如果设计的时序余量比较大,跑的频率比较高,意味着设计的健壮性更强,整个系统的质量更有保证;另一方面,设计所消耗的面积更小,则意味着在单位芯片上实现的功能模块更多,需要的芯片数量更少,整个系统的成本也随之大幅度削减。作为矛盾的两个组成部分,面积和速度的地位是不一样的。相比之下,满足时序、工作频率的要求更重要一些,当两者冲突时,采用速度优先的准则。

面积和速度的互换是FPGA设计的一个重要思想。从理论上讲,一个设计如果时序余量较大,所能跑的频率远远高于设计要求,那么就能通过功能模块复用减少整个设计消耗的芯片面积,这就是用速度的优势换面积的节约;反之,如果一个设计的时序要求很高,普通方法达不到设计频率,那么一般可以通过将数据流串并转换,并行复制多个操作模块,对整个设计采取“串并转换”的思想进行运作,在芯片输出模块再在对数据进行“并串转换”,是从宏观上看整个芯片满足了处理速度的要求,这相当于用面积复制换速度提高。

举一个例子。假设数字信号处理系统输入数据流的速率是350Mb/s,而在FPGA上设计的数据处理模块的处理速度最大为150Mb/s,由于处理模块的数据吞吐量满足不了要求,看起来直接在FPGA上实现是不可能的。这种情况下,就应该利用“面积换速度”的思想,至少复制成3个处理模块,首先将输入数据进行串并转换,然后利用这三个模块并行处理分配的数据,然后将处理结果“并串变换”,就完成数据速率的要求。我们在整个处理模块的两端看,数据速率是350Mb/s,而在FPGA的内部看,每个子模块处理的数据速率是150Mb/s,其实整个数据的吞吐量的保障是依赖于3个子模块并行处理完成的,也就是说利用了占用更多的芯片面积,实现了高速处理,通过“面积的复制换取处理速度的提高”的思想实现了设计。

3.6  EDA开发工具介绍

下面对本设计将要用到的两款EDA开发工具进行介绍:

Matlab ---- Matlab是当今国际上科学界(尤其是自动控制领域)最具影响力、也是最有活力的软件。它起源于矩阵运算,并已经发展成一种高度集成的计算机语言。它提供了强大的科学运算、灵活的程序设计流程、高质量的图形可视化与界面设计、便捷的与其他程序和语言接口的功能。Matlab 语言在各国高校与研究单位起着重大的作用。Matlab 语言中提供了数字信号处理工具箱,使数字信号处理较以前更简洁方便且效果更好。在 Matlab 中提供了一些滤波器的函数,使 FIR 滤波器的运算更加方便和快速。

Quartus II---- Quartus II是Altera公司的第四代可编程逻辑器件集成开发环境,提供从设计输入到器件编程的全部功能,支持百万门级的设计,适合大规模FPGA的开发。Quartus II可以产生并识别EDIF网表文件、VHDL网表文件和Verilog HDL网表文件,为其他EDA工具提供了方便的接口,可以在Quartus II集成环境中自动运行其他EDA工具。使用Quartus II可完成从设计输入、综合适配、仿真到编程下载整个的设计过程。它实现了FPGA业界的编译增强特性,使设计人员在综合和适配时,将设计分成物理和逻辑两部分来处理。此特性支持基于模块的设计,设计人员保持专用模块性能不变,而只对其他模块进行优化。设计人员针对专用设计部分采用物理综合等高级优化技术,而不改动其他模块,能够显著提高时序逼近效果。

第4章  FIR滤波器的实现

4.1  设计方案确定

数字滤波器无论是采用硬件实现还是软件实现的方案,首先应确定出数字滤波器的设计指标。设计指标的不同,将会直接影响到最终设计的滤波器的幅频响应、相频响应等各项性能结果。根据前几章的介绍,本次设计将用凯塞尔窗函数设计一个直接型结构的FIR滤波器,并用Verilog HDL语言编写程序。

FIR滤波器的设计指标:

滤波器类型:低通滤波器,通带频率:0到3.4KHz,采样频率:8KHz,截止频率:3.5KHz,阶数:16阶,输入数据宽度:8位,输出数据宽度:8位。

4.2  使用Matlab来设计 FIR 滤波器

在Matlab的SIGNAL PROCESSING TOOLBOX中有一个专门的数字滤波器设计软件模块FDA (Filter Design & Analysis Tool),其功能强大,可以采用多种方法设计各种类型的FIR滤波器,包括窗函数法和等同纹波法,低通、带通等滤波器。运用它可以极大的简化我们的设计过程。图4-1与图4-2就是根据FIR滤波器的设计指标与设计方法,用FDATool设计的FIR滤波器的幅频响应与相频响应。

图4-1   FIR滤波器幅频响应

图4-2   FIR滤波器相频响应

在输入设计要求,选择设计方法后,FDAtool会以图形方式直观的显示出幅频、相频、冲击响应和零极点图等设计结果,这让我们能够方便及时的对结果进行分析。从图4-1、图4-2可以看出,所设计FIR滤波器在3.4KHz处衰减了大约10dB,而相频则保持了FIR滤波器的特点,呈线性。表明滤波器的设计满足要求。

同时,FDAtool还计算出了滤波器各阶系数,而抽头系数是我们设计FIR滤波器时需要的重要数据。滤波器系数得到后,由于系数是带符号的十进制浮点数,不能在FPGA中使用,因此要考虑对其进行量化。

4.3  系数的量化

所谓量化,就是将连续信号的脉冲抽样幅度值用一个最为接近的、而且是数字信号所规定的数字值来近似。下载到 FPGA 的程序是按照 FIR 滤波器的差分方程式编写的。通过差分方程不难分析出运算的关键是二进制的乘累加。由于通过Matlab计算出的抽头系数h(n)的值是一组带有符号的浮点数,而FPGA器件只进行定点值的计算,所以不仅要进行浮点数到定点数的转换,还要对负数进行处理。

本文采用Q值量化法对浮点数进行转换。

浮点数与定点数的转换关系可表示为:浮点数(x)转换为定点数(y):y=(int)x* 2Q次方-1;定点数(y)转换为浮点数(x):x=(float)y*2-Q。例如,浮点数x=0.5,设定Q=10,则定点数y=0.5*1023=511.5=512,式中1023表示2的10次方再减1,那么相应的定点数整数为512,转化为10位二进制补码就是1000000000。正数的二进制补码就是其本身,负数的二进制补码要取反再加1。反之,一个用Q=10表示的定点数 512,其浮点数为512/1023=0.5。其他的依此类推。根据上面的FIR设计指标,分析得到本次量化的Q值Q=8。量化后的系数用二进制的补码表示,为了兼顾精度和所占用的资源,本文的系数用8位二进制来表示,最高位为符号位。

我通过设计Matlab程序来实现对滤波器16阶抽头系数的8位量化处理,以下就是Matlab程序代码:

若unnamed中存放的是代表16阶抽头系数的带符号浮点数;

x=127*unnamed;   //通过对小数点后的数字四舍五入的方法,将浮点数转换

y=round(x);       // 为整数

z=y<0;           //把系数中的负数选择出来

c=z.*y;            //

d=c+256;          //先把负数变为正数

e=dec2bin(d);      //再转换为二进制

z=y>0;           //把系数中的正数选择出来

c=z.*y;           //

f=dec2bin(c);     //直接转换成二进制

e中的是由负浮点数转化的二进制补码,f中的是由正浮点数转化的二进制数。

根据上面的程序将FDAtool求出的滤波器系数进行量化,得到的结果见表4-1:

表4-1 滤波器系数量化后的结果

脉冲响应

数值

16进制补码

脉冲响应

数值

16进制补码

h(0)

0.0156

02

h(8)

0.1250

10

h(1)

-0.0391

FB

h(9)

-0.1094

F2

h(2)

0.0547

07

h(10)

0.0938

0C

h(3)

-0.0781

F6

h(11)

-0.0781

F6

h(4)

0.0938

0C

h(12)

0.0547

07

h(5)

-0.1094

F2

h(13)

-0.0391

FB

h(6)

0.1250

10

h(14)

0.0156

02

h(7)

0.8750

70

h(15)

0

00

在进行量化时也不能忘记分析量化所带来的误差。

量化误差是指实际模拟值同用来表示模拟值的数字之间的差别。当实际模拟值落入两个量化层次之间时,便会产生量化误差。量化过程实际是一个近似的过程,所以量化误差有时又被称为量化噪声,所以采用正确的量化方式所造成的误差可在接收范围内。

通过在Matlab的FDATool中来分析量化误差,生成量化后的FIR滤波器的幅频和相频的特性曲线,由于篇幅有限在这里没有给出。观察量化后的FIR滤波器的幅频和相频的特性曲线,量化所带来的误差在要求的范围之内,量化前和量化后滤波器的响应差别很小。所以基于上述量化方法的滤波器设计是可行的。

在得到了经过量化的滤波器系数后,就可以进行滤波器的程序设计了。

4.4  FIR滤波器部分原程序

原程序用Verilog HDL语言编写,根据FIR滤波器直接型结构,也就是乘累加和的结构,并根据本次设计所要求的设计指标以及之前量化所得到的滤波器系数,直接设计。下面是原程序的各个部分:

(1)数据各端口定义部分:

clk是时钟脉冲输入端;clk_enable是使能端,用来控制数据输入;reset是复位端;filter_in是信号输入端;filter_out是滤波后的数据输出端。

module filter (clk, clk_enable, reset, filter_in, filter_out );

input   clk;

input   clk_enable;

input   reset;

input   signed [7:0] filter_in;

output  signed [7:0] filter_out;

(2)抽头系数进程部分:

根据前面的量化方法,将用MATLAB量化后的16个8位二进制的滤波器系数输入到程序中,并定义为常量。

parameter signed [7:0] coeff1 = 8'b00000000;

parameter signed [7:0] coeff2 = 8'b00000010;

parameter signed [7:0] coeff3 = 8'b11111011;

parameter signed [7:0] coeff4 = 8'b00000111;

∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙

∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙

(3)寄存器定义进程部分:

此部分定义了程序中将要用到的延迟存储器、输出寄存器及多个累加和寄存器。

reg  signed [7:0] delay_pipeline [0:16] ;

wire signed [23:0] product16;

wire signed [23:0] product15;

wire signed [23:0] product14;

wire signed [23:0] product13;

wire signed [23:0] product12;

∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙

∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙

(4)复位与数据输入进程部分:

此部分采用行为描述方式,每当时钟上升沿到来时,即进入该进程,若此时复位端reset为高电平,则延迟寄存器都被置为0; 若此时复位端reset为低电平,同时控制使能端clk_enable若为高电平,则数据输入延迟寄存器,并通过延迟寄存器实现延迟。

always @( posedge clk or posedge reset)

begin: Delay_Pipeline_process

if (reset == 1'b1) begin

delay_pipeline[0] <= 0;

delay_pipeline[1] <= 0;

delay_pipeline[2] <= 0;

delay_pipeline[3] <= 0;

∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙

∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙

end

else begin

if (clk_enable == 1'b1) begin

delay_pipeline[0] <= filter_in;

delay_pipeline[1] <= delay_pipeline[0];

delay_pipeline[2] <= delay_pipeline[1];

∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙

∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙

∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙

end

end

end

(5)乘法部分

该部分实现的是乘法的作用。采用数据流描述方式,接收来自延迟器寄存的输入信号,将其与代表抽头系数的常量相乘,然后把结果送入加法寄存器中。

assign product16 = delay_pipeline[15] * coeff16;

assign product15 = delay_pipeline[14] * coeff15;

assign product14 = delay_pipeline[13] * coeff14;

∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙

∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙

∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙

(6)加法部分

该部分把16阶抽头系数与延迟寄存器的相乘的结果进行累加,并把累加后的数据传给输出寄存器。此部分也采用数据流描述方式。到该部分为止,整个程序已经通过乘累加器,实现了对输入信号进行滤波。

assign add_cast = $signed({{16{product2[23]}}, product2});

assign add_cast_1 = $signed({{16{product3[23]}}, product3});

assign add_temp = add_cast + add_cast_1;

assign sum1 = add_temp[39:0];

∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙

∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙

∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙

(7)输出部分

每当时钟上升沿或复位端reset上升沿到来时,进入该进程,若同时复位端reset为高电平,则滤波器被复位,输出寄存器就被置为0,那么输出也为0;若使能端clk_enable为高电平,则将实现滤波后的数据传给输出寄存器,那么输出就为对输入信号滤波后的数据。

always @ (posedge clk or posedge reset)

begin: Output_Register_process

if (reset == 1'b1) begin

output_register <= 0;

end

else begin

if (clk_enable == 1'b1) begin

output_register <= output_typeconvert;

end

end

end

assign filter_out = output_register;

endmodule

4.5  对程序进行编译、综合

有了设计代码,接下来就要对设计的代码进行编译、综合。通过编译、综合能够发现代码中的错误、不足,再经过不断的改进和补充后就可以进行功能仿真和时序仿真了。当然,通过功能仿真、时序仿真后,发现问题或不足,也可以回来修改代码,再综合、仿真,在设计中,这样的过程会反复好多次。

在这里,我使用QuartusII软件来对上述代码进行编译、综合,一方面可以发现其中的错误,另一方面,通过QuartusII软件的RTL View功能可以很清晰地看出设计的层次结构。对上节程序进行编译、综合后的系统层次化结构体如图4-3:

图4-3   综合后的RTL级视图

图4-3是根据原程序的逻辑描述生成的RTL(寄存器传输级)方式的电路原理图,可用于定性检查原设计的正确性,仔细核对此电路可以发现与设计程序的功能描述是否吻合。此外,QuartusII还可得到原程序综合后的门级电路原理图,限于篇幅在此没有给出。

编译、综合后,同时生成了FIR滤波器的报告文件:

图4-4  程序编译综合后的报告

编译报告描述了设计时选用的芯片型号,编译器版本,设计占用的芯片逻辑单元数量、管脚数量、存储器数量等信息。根据图4-4的结果可以看出,采用直接型结构设计阶数较低的FIR滤波器时,占用逻辑资源的数量少,运行的速度较快,内存的占有也较优。可以判定,本设计在“面积”方面达到了设计目的。在下面的时序仿真中,还将讨论此设计在速度上是否满足要求。

在编译、综合后,用QuartusII还可生成FIR滤波器系统模块。

图4-5 生成的FIR滤波器系统模块

从图4-5中可以看出,虽然前面所述的FIR 滤波器看似复杂,最后运行的模块其实很小。从中可以看出,使用 FPGA 设计FIR 滤波器,可使滤波器的规模很小,封装的很好,只留下几个简单的接口,使用者很容易了解和使用。

第5章  FIR滤波器的仿真测试与验证

根据设计要求,求出FIR滤波器抽头系数,编写Verilog HDL程序并成功完成了对程序的编译综合。以上这也只完成了FIR滤波器设计的一部分,而另外一部分,也是至关重要的部分是对所设计系统的仿真与验证。本章是这次设计的核心部分。

如前所述,仿真可分为功能仿真和时序仿真。同时,用MATLAB软件还可以在进行FPGA设计之前从算法级来验证设计系统。换句话说,就是在编写程序之前,以MATLAB求出的抽头系数为核心构建滤波器系统,对其进行仿真,这样可以验证所求的系数能否满足要求以及系统在理论上的可行性。本章将对这三种仿真详细说明。

5.1  使用Matlab进行理论上的算法仿真

对设计系统进行算法仿真,就要用到Matlab中的系统仿真工具Simulink。Simulink可以使我们快速而方便地实现仿真目的,而且仿真结果准确直观。Simulink仿真的内容非常广泛。Simulink把Matlab的许多功能都设计成一个个直观的功能模块,把需要的功能模块用连线连起来就可以实现仿真功能了。我们可以根据自己的需要设计我们自己的功能模块,也可以用采用Simulink的功能模块函数库提供的各种功能模块;另外我们还可以把一个具有许多复杂功能的模块群作为一个功能模块来使用。Simulink的另一个优点是在原来的Matlab的基础上不增加任何新的函数,使用的语法也都是原来的语法,这增加了其界面的友好性。

Simulink的使用流程一般是先根据我们将要仿真的功能从功能模块函数库选定功能模块(或者直接设计自己的功能模块),然后设置功能模块的参数,接着根据仿真中数据处理的顺序用连线把功能模块连接起来,最后保存文件就可以仿真了。

用Simulink搭建的本次设计的仿真模型如图5-1所示。

图5-1 算法仿真模型

在本次设计中,设计要求通频带为0到3.4KHz。为了验证系统的正确性,我设定了一个400Hz的正弦信号和一个3.6KHz的正弦信号叠加在一起的混合信号,作为滤波器的输入。同时,将设计得到的滤波器分子、分母系数填充到数字滤波器模块中,作为所设计的FIR滤波器。将示波器模块连接滤波器的输出,用来观察仿真结果。

运行已经构建好的上边的仿真模型,便得到如图5-2的结果。

图5-2-1 400Hz与3.6KHz叠加信号波形         图5-2-2 对叠加信号采样后的波形

图5-2-3 叠加信号通过FIR滤波器后输出的波形       图5-2-4 原400Hz信号波形

图5-2-1为混合输入信号的波形,可以看出由于有了噪声信号的干扰,400Hz正弦有用信号已经无法辨认。图5-2-2为对这个混合信号进行采样保持后的信号波形,通过比较发现采样结果基本上保持了原混合信号的波形形状。图5-2-3为输入型号通过滤波器后的输出信号波形,由图很5-2-3容易看出3.6KHz噪声被滤波器彻底滤掉,而同时,400Hz正弦信号则全部通过了滤波器。由此可以得出结论,我们所设计的滤波器在理论上是完全可行的。

同时,由于FPGA处理的是数字信号,应在输入信号后加上A/D转换,对输入进行信号采样。这里用MATLAB来完成A/D转换的功能,我们可以由仿真模型得到混合输入信号的采样数据,以作为功能仿真与时序仿真的输入数据。采样的21个数据为:0、0.6180、-0.0000、1.6180、-0.0000、2.0000、0.0000、1.6180、0.0000、0.6180、0.0000、-0.6180、0.0000、-1.6180、-0.0000、-2.0000、-0.0000、-1.6180、0.0000、-0.6180、-0.0000

对采样数据同样要进行量化,量化的方法与之前滤波器系数量化方法相同,在这里就不再累述了。经过量化的数据为:0、00100111、0、01100111、0、01111111、0、01100111、0、00100111、0、11011001、0、10011001、0、10000001、0、10011001、0、11011001、0、00100111、0、01100111、0、01111111、0、01100111、0、00100111、0、11011001、0、10011001、0、10000001、0、10011001、0、11011001

5.2  QuartusII与 MATLAB联合仿真

在用算法仿真证明了系统在理论上完全可行之后,我们还要对实际设计的滤波器,进行全面充分的功能仿真和时序仿真,以验证实际设计的正确性。下面就将介绍运用QuartusII与MATLAB进行联合仿真的方法。

5.2. 1  用MATLAB生成QuartusII输入文件

当输入信号的形式比较简单,利用QuartusII软件的波形编辑器就可以完成,输出信号是输入信号经过滤波器后的信号。因其输入和输出都是以波形的形式给出的,虽然看起来如同逻辑分析仪的输出形式,比较直观,但是难以对随机信号进行输入;随机信号的输出也难以分析。

对于比较复杂的设计应用,比如设计输入信号要求是模拟现实信号环境的噪声加信号,或是多个信号的叠加等复杂情况,输出信号也是含有噪声的信号。要产生这样的仿真输入信号或对复杂的仿真输出信号做进一步的分析,例如观察其频谱变化规律等操作,利用现有的FPGA设计仿真软件就不够了,必须利用更强大的或专业的数值分析软件例如MATLAB软件,来辅助仿真。这样就能大大加强QuartusII软件的仿真功能,提高设计效率。

在MATLAB中生成QuartusII软件仿真所需的输入文件*.vec。下面就是本次设计的MATLAB程序。

START 0 ;               //确定仿真开始时间,单位为ns

STOP 72700 ;            //确定仿真结束时间

radix binary;             //确定输入数据的格式为二进制

INTERVAL 100 ;         //确定clk间隔,为100ns

INPUTS clk ;            //确定输入为clk

Pattern                  //输入数据取值

0 1;                     //

radix binary;              //确定输入数据的格式为二进制

INTERVAL 200 ;         //输入数据x间隔,为200ns

inputs filter_in[7:0];       //确定输入为x[7..0]

pattern                  //输入数据取值

0

00100111

//经过MATLAB采样量化后的21个输入信号数据就放在这里//

0

11011001;

outputs filter_out[7:0];       //确定输出为y[8..0]

radix binary;

有了用MATLAB生成的仿真输入文件,下面就可以开始仿真了。

5.2.2  QuartusII功能仿真与时序仿真

通过QuartusII软件中的RTL View功能虽然能够看出程序的层次结构,但是,并不能验证程序能否实现相应的功能:对信号进行滤波。这就需要通过在ModelSim软件或QuartusII软件中仿真来验证。QuartusII软件中的功能仿真必须在软件中设置,每一次程序的改动,哪怕是在程序中添加了一个空格,QuartusII软件都要重新进行编译、综合、布局布线、仿真,因此仿真的速度较慢。

在对设计的代码进行功能仿真时,必须给设计文件加一个合适的仿真测试向量,可以用文本编辑器像编辑一般的Verilog HDL程序一样编写仿真测试向量文件(testbench),在编写testbench时可以采用许多行级的描述来加快程序的设计,也可以采用先在QuartusII软件中编写波形文件,再将波形文件转变成testbench的方法,还可以用MATLAB来生成。本次设计采用最后一种方法。

把前边MATLAB生成的*.vec文件作为仿真的输入文件,就得到如图5-3的结果。

图5-3  FIR滤波器功能仿真结果

功能仿真只能验证设计代码是否达到了预期的功能,并不能验证代码的时序逻辑是否满足了要求,一般功能仿真用于大的项目的前期可行性验证,对于一般设计系统比较简单,甚至可以不做功能仿真,直接进行时序仿真。

时序仿真是加入了器件延迟信息、布局布线之后的仿真,可以在QuartusII软件中利用.vec文件或.wav文件进行时序仿真,也可以将设计的延迟信息导入到其它一些EDA软件中进行时序仿真,仿真中所采用的testbench文件不变。

时序仿真的输入文件仍然是MATLAB生成的*.vec文件,图5-4就是仿真结果。

图5-4  FIR滤波器时序仿真结果

比较功能仿真与时序仿真的结果,可以发现功能仿真只完成了对系统功能的验证,并且仿真速度很快。而时序仿真的输出则出现了延迟,这是由于信号在FPGA器件内部通过连线和逻辑单元时,有一定的延时,延时的大小与连线的长短和逻辑单元的数目有关。时序仿真的输出还带有明显的毛刺,这是因为电路中多路信号发生变化时,在信号变化的瞬间,受电路延时的影响,组合逻辑的输出并不是同时变化,而是有先后顺序,因此往往会出现一些不正确的尖峰信号,即毛刺。

不过从这样的仿真波形图中,很难看出结果正确与否。因此,下面将采用把波形输入文件中的数据导入MATLAB中的方法,用MATLAB验证仿真结果。

5.2.3  用MATLAB验证QuartusII仿真输出的结果

将时序仿真结束后生成的波形文件另存为*.tbl格式文件,以便将仿真结果导入MATLAB中观察频谱进行验证。本次实验仿真得到的部分*tbl文件如下所示:

UNIT ns;

RADIX HEX;       //其格式与*.vec文件类似,不同的是输出信号的数据是在

PATTERN         //“=”号之后。时间标尺是以ns表示的,输出数据的值则是

0.0> 0 00 = 00      //以十六进制表示的。信号的排列顺序与*.vwf波形文件中

100.0> 1 00 = 00    //的顺序是一致的。

…………………….

1964.225> 1 00 = 08     //“=”号后的就是仿真的结果。

1965.889> 1 00 = 09

1966.142> 1 00 = A0   //以下四行,由于是在同一ns内产生的数据,因此可以

1966.281> 1 00 = A9   //判断,这些都是由仿真波形中的毛刺产生的。

1966.283> 1 00 = FF

1966.488> 1 00 = FF

……………………..

以数据文件输入的方式将此*.tbl文件中的QuartusII仿真输出信号的数值导入MATLAB中,并进行频谱分析。注意谱分析时对毛刺产生的数据要忽略不计,这样才能得到正确的频谱图,如图5-6 。

图5-5 信号通过滤波器前的频谱

图5-6 信号通过滤波器后的频谱

将其与滤波前的采样数据频谱图5-5比较可以发现,滤波器很好的完成了从0到3.4kHz的低通滤波功能。3.6KHz噪声被滤波器完全滤掉,而同时,400Hz正弦信号则全部通过了滤波器。通过频谱分析我们清楚的看到了滤波后的信号变化情况,给了我们更直观的印象,而这正是单独使用QuatusII仿真所达不到的。

至此,我们已经完成了全部的滤波器设计,不论是理论算法上的,还是功能时序上的仿真,本次设计的滤波器都达到了设计要求。

第6章  结束语

6.1  总结

在当今的电子电路的设计中,占用相对少的资源和在此相对少的资源上具有最快运行速度是设计的方向。在不同的设计中,为达到某种设计的目的,适当的牺牲一方面的优势也是可以接受的。

随着科技的日新月异,基于FPGA来设计电子电路已成为一种趋势。这是由于FPGA器件集成度高、体积小,使用它可以大大缩短开发的周期,减少资金的投入,将原来的电路板级产品升级为芯片级产品。

在本设计的过程中,通过对各种结构的FIR滤波器的分析,了解到直接型结构在设计FIR滤波器时较为简便;并对各种窗函数方法设计FIR滤波器进行了对比,通过对比发现,凯塞窗在阻带最小衰减上比其他窗函数有明显的优势。决定采用凯塞窗来设计直接型结构的FIR滤波器。经过后面的仿真得出采用这种方式的FIR 滤波器是能够较好的满足设计要求的。

该设计是使用Verilog HDL语言进行设计的,可以利用 QuartusII进行综合,在设计过程中运用了多个基于FPGA的EDA开发工具来辅助设计以及仿真。论文也探讨了如何在FPGA中使用浮点数的方法,并从不同的方面深入研究了MATLAB软件在设计FPGA时的作用。

6.2  问题与展望

在本设计的过程中,虽然其在实际的测试仿真中达到了较好的效果,但是通过对数字处理技术的研究、FIR数字滤波器传统算法的改良和模块化设计等几个方面的深入学习和研究,我认识到在本论文工作中还有许多需要改进的地方和可以优化的地方,改进方法如下:

1、在选取FIR数字滤波器网络结构时,可以选取线性相位结构来代替直接型网络结构。虽然直接型便于程序设计,但是采用线性相位结构可以使运算速度提高一倍,效率大大增加。

2、由时序仿真结果可以发现输出有毛刺,而毛刺会影响到逻辑电路的稳定性,时钟端口、清零和置位端口对毛刺信号十分敏感,因此在设计电路时应避免毛刺的产生,但是由于时间和对程序语言的理解所限,在本次设计中没有对毛刺进行处理。随着以后对编程语言的进一步学习,可以采用添加寄存器的方式来消除毛刺。

3、由时序仿真结果可以看出输出与输入的时延不是很大,能够满足要求。但是在设计更高阶的滤波器时,这种时延将不能再被忽视。本次设计的Verilog HDL程序还可以进一步的简化,在以后的研究中,可以学习更加实用的基于查找表的分布式算法,以提高效率。

致 谢

本论文是在张会生教授的悉心指导完成的。从选题开始,直至今天完成论文的撰写,张老师在学习上给予了我无私的帮助。老师渊博的专业知识和严谨的治学态度,深深的影响着我,在本课题完成之际,谨向我的老师致以最衷心的感谢和最崇高的敬意!

在论文的研究过程中,还得到了吴萌学姐的热情指导,她对我在论文编写与学习上的严格要求和帮助,使我受益非浅,在此表示衷心的感谢!

同时,感谢我的家人对我学业的支持,他们给予我全力的支持和无限的关怀,并对所有关心、支持和帮助我的老师、亲人和朋友们表示深深的谢意!

最后,衷心感谢各位评审老师!感谢您们在百忙之中参与我的论文评阅工作,谢谢!

参考文献

[1] 王金明编著. 数字系统设计与Verilog HDL(第2版) .北京:电子工业出版社,2005.9

[2] 褚振勇,翁木云编著. FPGA设计及应用. 西安:西安电子科技大学出版社,2002.7

[3] 余成波,杨如民,周登义编著. 数字信号处理及Matlab实现. 北京:清华大学出版社,2005

[4] (美)贝斯著,刘凌,胡永生译. 数字信号处理的FPGA实现. 北京:清华大学出版社,2003.1

[6] 王旭东,潘广桢编著. Matlab及其在FPGA中的应用.北京:国防工业出版社,2006

[7] 徐志军,徐光辉编著. CPLD/FPGA的开发与应用. 北京:电子工业出版社,2002

[8] (美)奥本海姆等编著,刘树堂,黄建国译.离散时间信号处理. 西安交通大学出版社,2001.9

[9] 丁玉美,高西全编著.数字信号处理(第二版). 西安:西安电子科技大学出版社,2005.8

[10] 韩利竹, 王华编著.MATLAB 电子仿真与应用.北京:国防工业出版社,2001

[11] 施阳, 李俊编著.MATLAB语言工具箱.西安:西北工业大学出版社,1999

[12] 汤磊编著.一种 FIR 滤波器的 FPGA 实现.电气电子教学学报,2001

[13] 陈桂明,张月照编著.应用MATLAB语言处理数字信号与数字图像.北京:科学出版社,2000

[14] 陈亚勇编著.MATLAB 信号处理详解.北京:人民邮电出版社,2001

[15] 陈永春.MATLAB /Simulink模型到代码实现.北京:清华大学出版社,2002

[16] Peled, B. Liu, "A New Hardware Realization of Digital Filters", IEEE Trans. on  ASSP, Vol22, December 1974, pp456-462

[17] Jer Valls, Marcos M. Peiro, Trini Sansaloni, Eduardo Boemo, "A Study About FPGA-Based Digital Filters", IEEE SIPS, pp191-201,October 1998

毕业设计小结

经过辛苦努力,本次毕业设计终于告一段落。本文设计的FIR滤波器的各项性能指标基本达到了设计之处的要求。

通过这次毕业设计,使我加深了对FIR滤波器的基本理论与FIR滤波器结构的理解,明白了窗函数设计FIR滤波器的方法,学会了用Q值量化法将FIR滤波器的系数,由带符号十进制浮点数转化成定点二进制补码的方法。更为重要的是,通过本次毕业设计,懂得了MATLAB软件在滤波器设计不同阶段所起的作用,学会了它的各种使用方法,以及如何用它与其他的EDA软件进行相互配合,共同设计仿真的方法。

面对此次毕业设计过程中所存在的问题,在接下来的学习当中,我要进一步的深化对Verilog HDL语言的理解和掌握,并进一步积累FPGA设计经验,以提高自己的FPGA设计水平和EDA应用技巧。

转载论文关于fir滤波器的fpga实现的更多相关文章

  1. FIR滤波器的FPGA实现方法

    FIR滤波器的FPGA实现方法 2011-02-21 23:34:15   来源:互联网    非常重要的基本单元.近年来,由于FPGA具有高速度.高集成度和高可靠性的特点而得到快速发展.随着现代数字 ...

  2. FIR滤波器(1)- 基础知识

    FIR滤波器广泛应用于数字信号处理中,主要功能就是将不感兴趣的信号滤除,留下有用信号.FIR滤波器是全零点结构,系统永远稳定:并且具有线性相位的特征,在有效频率范围内所有信号相位上不失真.在无线通信收 ...

  3. FIR滤波器和IIR滤波器的区别

    数字滤波器广泛应用于硬件电路设计,在离散系统中尤为常见,一般可以分为FIR滤波器和IIR滤波器,那么他们有什么区别和联系呢. FIR滤波器 定义: FIR滤波器是有限长单位冲激响应滤波器,又称为非递归 ...

  4. FIR滤波器相关解释

    LTI(Linear Time-Invariant) 线性时不变: 线性时不变系统是根据系统输入和输出是否具有线性关系来定义的.满足叠加原理的系统具有线性特性.线性满足y=kx函数. 根据系统的输入和 ...

  5. FIR滤波器与IIR滤波器

    FIR(Finite Impulse Response)滤波器 有限长单位冲激响应滤波器,又称为非递归型滤波器 特点: FIR滤波器的最主要的特点是没有反馈回路,稳定性强,故不存在不稳定的问题: FI ...

  6. FIR滤波器工作原理(算法)以及verilog算法实现(包含与IIR的一些对比)

    滤波器在2017年IC前端的笔试中,出现频率十分的高.不论今后是否会涉及,还是要记住一些会比较好.接下来就将从这四个方面来讲解,FIR数字滤波器的工作原理(算法)与verilog实现. ·什么是FIR ...

  7. IIR滤波器和FIR滤波器的区别与联系zz

      -------------------------------------------------------------------------------------------------- ...

  8. 数字信号处理实验(六)——FIR滤波器的设计

    一.四种线性相位FIR滤波器的振幅响应 1.自编函数 [Hr,w,a,L]=-n) [Hr,w,a,L]=-n) [Hr,w,a,L]=-n) [Hr,w,a,L]=-n) 2.一个demo clea ...

  9. FIR滤波器设计

    FIR滤波器的优越性: 相位对应为严格的线性,不存在延迟失真,仅仅有固定的时间延迟: 因为不存在稳定性问题,设计相对简单: 仅仅包括实数算法,不涉及复数算法,不须要递推运算,长度为M,阶数为M-1,计 ...

随机推荐

  1. 20145201《Java程序设计》第1次实验报告

    实验内容 一.命令行下java程序开发 1.建立Code目录,输入mkdir 20145201命令建立实验目录,并使用dir命令查看目录建立情况. 运行结果如图 2.进入实验目录,输入mkdir ex ...

  2. 实验四Android开发

    实验四Java Android简易开发 实验准备 Android Studio 的下载: Android Studio 安装教程 在安装过程中的问题: 在下载了官网上的说明包含sdk的安装包之后找不到 ...

  3. [国家集训队2011]happiness

    Description 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一对好朋友 ...

  4. tyvj 1062 合并傻子 区间dp,典型模型石子归并

    P1062 合并傻子 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 从前有一堆傻子,钟某人要合并他们~但是,合并傻子是要掉RP的...... 描述 在一个园 ...

  5. Dynamo概述

    Dynamo 是Amazon提供的一款高可用的分布式Key-Value存储系统,其满足可伸缩性.可用性.可靠性. CAP原理满足:通过一致性哈希满足P,用复制满足A,用对象版本与向量时钟满足C.用牺牲 ...

  6. MVVM3

    MVVM设计模式 2010-09-19 23:59:18|  分类: MVVM |  标签:mvvm  silverlight4  mvc  mvp  command  |举报|字号 订阅     一 ...

  7. python fire库的使用

    一. 介绍 fire是python中用于生成命令行界面(Command Line Interfaces, CLIs)的工具,不需要做任何额外的工作,只需要从主模块中调用fire.Fire(),它会自动 ...

  8. Windows Server 2016 桌面环境的自动配置脚本(2017-10-24更新)

    github:https://github.com/m2nlight/WindowsServerToWindowsDesktop 下载:https://github.com/m2nlight/Wind ...

  9. Sunday算法--C#版

    public static int Sunday(string text, string pattern) { int i, j, m, k; i = j = 0; int tl, pl; int p ...

  10. discuz! 设置私密论坛版块的方法

    Discuz!的强大功能不用细说, 话说对于有一部分需要设置具有一定访问权限的用户才能浏览的版块内容的话. 可能很多朋友不太清楚, 为了解决这个问题, 第一步以管理员的身份登陆, 然后 论坛-> ...