网站导航网学 原创论文 原创专题 网站设计 最新系统 原创论文 论文降重 发表论文 论文发表 UI设计定制 论文答辩PPT格式排版 期刊发表 论文专题
返回网学首页
网学原创论文
最新论文 推荐专题 热门论文 论文专题
当前位置: 网学 > 交易代码 > 课程设计 > 正文

基于VHDL语言的FIR滤波器设计

论文降重修改服务、格式排版等 获取论文 论文降重及排版 论文发表 相关服务
基于VHDL语言的FIR滤波器设计
内 容 摘 要
 
当今电子技术的发展可谓是与时俱进,电子产品的更新换代更是日新月异。因而电子设计也由传统的手工设计过程向先进的自动化设计发展(即从CAD到EDA及ESDA: Electronic System Design Automation)。熟悉并掌握现代设计工具,就成为电子信息设计人员必备的技术。数字滤波作为数字信号处理技术的重要组成部分,广泛应用于诸如信号分离、恢复、整形等多种场合中,本文讨论的FIR滤波器因其具有严格的线性相位特性而得到广泛的应用。本设计用硬件语言VHDL来实现FIR数字滤波器功能。首先介绍VHDL语言的发展和由来、基本结构、规定、优点。接着简单介绍硬件语言的应用平台MAX+PLUSII软件,FIR滤波器的基本理论,然后通过软硬件结合的方法阐述了滤波器结构化的设计思想和大体的设计流程,最后进入本设计的核心设计部分,用VHDL语言设计FIR滤波器电路,着重对有限长单位冲激响应(FIR)滤波器设计过程进行了详尽的介绍。设计参数可调腇IR低通滤波器,以EP1K30QC208-2为核心,包括A/D转换电路,数码显示电路,以试验箱提供的模拟信号为输入进行了实际滤波效果的测试。实验系统的测试表明,与传统的数字滤波器相比较具有更好的实时性,准确性,灵活性和实用性。
关键词:VHDL,有限长单位冲激响应(FIR)数字滤波器,MAX+PLUSII软件
Abstract
 
Now, you can say that the electronic technology is developing with a very high speed. And the electronic products renewal speed it may be said changes with each new day, so electronic design has been changing from the traditional manual design to the advanced automated design (from CAD to EDA and ESDA: Electronic System Design Automation). Thus is familiar with and grasps these modern design tools, has become the electronic information to design a personnel necessary technology. The digital filters is an important part of digital signal processing and used widely in variety of application such as a signal separation, restoration or shaping. FIR filter discussed in this paper is widely used because of its strict phase distortion sharp cut-off characteristic. This design emphasis point is realizes the FIR digital filter function with hardware language VHDL. The article first introduced the VHDL language’s development and their origin, their basic structures, the stipulation and the merit .And then that simple was introduce hardware description language application platform MAX+PLUSII software and the basic theory of the FIR filter. Then the method which unifies through the software and hardware elaborated the filter structure design thought and the roughly design flow.  After carries on the simple explanation to the programmable logical component . Finally goes to the core design part, designing the FIR filter circuit with VHDL language. Introduce the process of FIR digital filter in details. Designed a FIR low pass filter that could adjust the parameters: the main IC is EP1K30QC208-2 ,including A/D convert circuit and digital display circuit. Chamber to the analog signal input to the filtering effect of the actual test. The experiment prove that this system is real-time, veracity, agile and practicability comparing with the traditional filter.175
 
基于VHDL语言的FIR滤波器设计
 
 Keyword: VHDL language;FIR (Finite Impulse Response) Digital Filter Design ;MAX+PLUSII software

目       录
前言... 1
1 硬件描述语言... 2
1.1 概述... 2
1.2 VHDL语言简介... 2
1.2.1 概述... 2
1.2.2 VHDL程序的基本结构... 3
1.2.3 VHDL的基本元素... 4
1.2.4 VHDL的基本语句... 5
2 MAX+PLUS II汇编环境... 5
2.1 MAX+PLUS II简介... 5
2.2  MAX+PLUS II的设计流程... 5
3 FIR数字滤波器的基本理论... 6
3.1 FIR数字滤波器的原理... 6
3.2 FIR数字滤波器的基本结构... 7
3.3 线性相位FIR系统的结构... 7
3.4 FIR滤波器的设计... 8
3.4.1 采用窗函数方法设计线性相位FIR滤波器的方法... 8
3.4.2 几种窗函数及窗函数选择原则... 9
3.4.3 等同波纹设计方法... 9
3.4.4 用MATLAB设计FIR滤波器... 10
3.5 FIR与IIR数字滤波器的比较... 10
4 FIR滤波器的设计... 10
4.1 FIR滤波器的模块划分... 11
4.1.1 方案确定... 11
4.1.2 FIR滤波器的模块划分... 12
4.2 FIR滤波器各模块功能的实现... 12
4.2.1 输入模块... 12
4.2.2 乘累加模块... 12
4.2.3 进制转换模块... 14
4.2.5 输出显示模块... 15
4.3 FIR滤波器的系统设计... 16
4.4 仿真结果分析... 16
4.5 实验结果分析... 17
4.6 FIR滤波器的阶数扩展... 19
结论... 21
致  谢... 22
参 考 文 献... 23
附录... 24

 
 
 
前言
几乎在所有的工程技术领域中都会涉及到信号的处理问题,其信号的表现形式有电、磁、机械、以及热、光、声等。信号处理的目的一般是对信号进行分析、变换、综合、估值与识别等。如何在较强的噪声背景下提取出真正的信号或信号的特征,并将其应用于工程实际是信号处理的首要任务。
数字滤波是提取有用信息非常重要、灵活的方法,是现代信号处理的重要内容。因而在数字通信、语音图像处理、谱分析、模式识别、自动控制等领域得到了广泛的应用。相对于模拟滤波器,数字滤波器没有漂移,能够处理低频信号,频率响应特性可做成非常接近于理想的特性,而且精度可以达到很高,容易集成等,这些优势决定了数字滤波器的应用将会越来越广泛。同时FPGA和CPLD的迅速发展也促进了数字滤波器的发展,并为数字滤波器的硬件实现提供了更多的选择。
相对于模拟滤波器,数字滤波器具有以下显著优点:
(1)精度高:模拟电路中元件精度很难达到 以上,而数字系统17位字长就可以达到 精度。因此在一些精度要求很高的滤波系统中,就必须采用数字滤波器来实现。
(2)灵活性大:数字滤波器的性能主要取决于乘法器的各系数,而这些系数是存放在系数存储器中的,只要改变存储器中存放的系数,就可以得到不同的系统,这些都比改变模拟滤波器系统的特性要容易和方便的多,因而具有很大的灵活性。
(3)可靠性高:因为数字系统只有两个电平信号:“1”和“0”,受噪声及环境条件的影响小,而模拟滤波器各个参数都有一定的温度系数,易受温度,振动,电磁感应等影响。并且数字滤波器多采用大规模集成电路,如用CPLD或FPGA来实现,也可以用专用的DSP处理器来实现,这些大规模集成电路的故障率远比众多分立元件构成的模拟系统的故障率低。
(4)易于大规模集成:因为数字部件具有高度的规范性,便于大规模集成大规模生产,且数字滤波电路主要工作在截止或饱和状态,对电路参数要求不严格,因此产品的成品率高,价格也日趋降低。相对于模拟滤波器,数字滤波器在体积,重量和性能方面的优势已越来越明显。比如在用一些用模拟网络做的低频滤波器中,网络的电感和电容的数值会大到惊人的程度,甚至不能很好的实现,这时候若采用数字滤波器则方便的多。
(5)并行处理:数字滤波器的另外一个最大的优点就是可以实现并行处理。
从数字滤波器的单位冲击响应来看,可分为两大类:有限冲击响应(FIR)数字滤波器和无限冲击响应(IIR)数字滤波器。IIR滤波器系统函数的极点可以位于单位圆内的任何地方,因此可以用较低的阶数或得较高的选择性,所用的存储单位少,经济而效率高,但是系统函数的极点也可能位于单位圆外,可能会引起系统的不稳定。同时IIR滤波器的相位是非线性的,且它的选择性越好,相位的非线性就越严重。相反FIR滤波器却可以得到严格的线性相位,然而由于FIR滤波器的系统函数的极点固定在原点,所以只能用较高的阶数来实现其高选择性,对于同样的滤波器设计指标,FIR滤波器所要求的阶数要比IIR高5至10倍,所以成本较高,信号延迟也比较大。但是如果要求相同的线性相位,则IIR滤波器就必须加全通网络进行相位校正,同样也要增加滤波器网络的节点和复杂性。FIR滤波器可以用非递归的方法实现,在有限精度下不会产生振荡,同时由于量化舍入以及系数的不确定性所引起的误差的影响要比IIR滤波器小的多,并且FIR滤波器可以采用FFT算法,运算速度块。但是不象IIR滤波器可以借助模拟滤波器的成果,FIR滤波器没有现成的计算公式,必须要用计算机辅助软件(如MATLAB)来计算。由此可知,FIR滤波器应用比较广,而IIR滤波器则用在相位要求不是很严格的场合。
滤波器从功能上分又可分为如下4类:
(1)低通滤波器(LPF);
(2)高通滤波器(HPF);
(3)带同滤波器(BPF);
(4)带阻滤波器(BSF)。
 
1 硬件描述语言
1.1 概述
随着EDA技术的发展,使用硬件语言设计PLD/FPGA成为一种趋势。目前最主要的硬件描述语言是VHDL和Verilog HDL。 VHDL发展的较早,语法严格,而Verilog HDL是在C语言的基础上发展起来的一种硬件描述语言,语法较自由。
1.2 VHDL语言简介
1.2.1 概述
VHDL(Very-High-Speed Integrated Circuit Hardware Description Language)是美国国防部为其超高速集成电路研究计划提出的硬件描述语言,作为各合同商之间提交复杂电路设计文档的一种标准方案.
作为EDA的重要组成部分,VHDL提供了借助计算机进行数字系统设计的一种很好的手段.VHDL设计硬件描述能力很强,可以用于从门级、电路级直至系统级的描述、仿真、综合和调试。利用VHDL丰富的仿真语句和库函数对大系统,在设计的早期可在远离门级的高层次上进行模拟,以利于设计者确定整个设计的结构和功能的可行性。VHDL强大的行为描述能力和程序结构,是其具有支持对大规模设计进行分解,以及对已有的设计进行再利用的功能。运用VHDL设计系统硬件具有相对独立性,设计时没有嵌入与工艺有关的信息,对硬件的描述与具体的工艺技术和硬件结构无关。当门级或门级以上的描述通过仿真检验以后,再用相应的工具将设计映射成不同的工艺,这使硬件实现的目标器件有很宽的选择范围,并且修改电路与修改工艺相互之间不会产生不良的影响。VHDL标准、规范,语法较为严格,采用VHDL的设计便于复用和交流,VHDL所具有的类属描述语句和子程序调用等功能,使设计者对完成的设计,不必改变源程序,只需改变类属参数或函数,就可改变设计的规模和结构。
1.2.2 VHDL程序的基本结构
完整的VHDL程序通常包括实体、结构体、配置、程序包和库五个部分。其基本结构如图1所示:若图片无法显示请联系QQ3710167
(1)库和程序包部分
    库用于存放编译过的VHDL设计单元(实体说明、结构体、配置说明、程序包说明和
程序包体等),这些设计单元可做其他VHDL描述的资源而被引用。
    用户编写设计单元时可访问多个库;也可将编写的设计单元加入库中,供别的设计单元访问。访问某个库,引用所需设计单元,可用LIBRARY语句把库打开,其格式为
LIBRARY 库名表;
    VHDL的库分为预定义库和资源库两种。预定义库对所有的设计单元都隐含地打开,不必用LIBRARY语句显式的打开。VHDL中有Std 和Work两个预定义库。这两个之外的库成为资源库,必须用LIBRARY语句显式地打开才能被引用。
    程序包用于存放已定义的常数、数据类型、元件说明、子程序等,以便被更多的设计实体访问和共享。程序包语句格式为
PACKAGE    程序包名  IS
说明部分
END      程序包名;
PACKAGE  BODY   程序包名    IS
说明部分
END     程序包名;
(2)实体部分
     实体说明是对设计模块的输入输出断口进行描述,它给出设计模块与外界的接口。格式为:
ENTITY     实体名     IS
PORT(
     端口信号名称1:输入/输出状态 数据类型;
     端口信号名称2:输入/输出状态 数据类型;
           ···
     端口信号名称N:输入/输出状态 数据类型
);
END 实体名;
(3)结构体  
     结构体用语描述设计实体的逻辑功能或内部电路结构,从而确定设计实体输出与输入之间的逻辑关系。结构体格式如下
ARCHITECTURE    结构体名  OF    实体名  IS
[说明语句]
BEGIN
[并行功能描述语句];
END    [结构体名];若图片无法显示请联系QQ3710167
对结构体的常用描述方式有行为描述,数据流描述和结构描述。
 

基于VHDL语言的FIR滤波器设计
图1-1   VHDL语言编程结构
    (4)配置若图片无法显示请联系QQ3710167
   配置语句用于指定与实体对应的结构体。语法形式为
CONFIGURATION  配置名 OF  实体名  IS
[ 说明语句];
END   配置名;
1.2.3 VHDL的基本元素
标识符——基本语法规则:以英文字母开头,其余可用数字,字母及下划线,字母不分大小写,不能以下划线结尾,不能连续出现两个两个以上下划线,避免使用保留字。
数据对象——VHDL的数据对象有SIGNAL,CONSTANT,VARIABLE和FILE四类。
SIGNAL是电子电路内部连接的抽象,在元件之间起互连作用。
CONSTANT的设置使设计实体中的常数更易阅读及修改。
VARIABLE用于对电路的高层次的算法描述中,对电路的行为功能进行建模。
FILE相当于文件指针,用于对文件的读写操作;在有关测试平台的使用时,可用文件来读激励输入和写数据输出。
数据类型——VHDL中基本数据类型分为逻辑信号,数值信号两类。逻辑信号又分为布尔代数,位及标准逻辑。数值信号分为整数和实数。
VHDL中进阶数据类型包括列举与数组数据类型两种。
VHDL表达式与运算符——VHDL运算符有算术运算符、关系运算符、逻辑运算符等等。
算术运算符:+、-、*、/、MOD、REM、SLL、SRL、SLA、SRA、ROL、ROR、**、ABS
关系运算符:=、/=、<、>、<=、>=
逻辑运算符:AND、OR、NOT、NAND、NOR、XOR、XNOR
其他运算符:+(正)、-(负)、&(并置)
1.2.4 VHDL的基本语句
VHDL的基本描述语句包括一系列并行语句和顺序语句。有的语句(如赋值语句、过程调用语句、断言语句等)既可作为并行语句又可作为顺序语句。对于顺序语句,程序执行时按语句顺序执行,而并行语句作为一个整体执行,程序执行时只执行被激活的语句。从分工上看,顺序语句主要用于实现模块的算法部分,并行语句则主要用于表示算法模块间的连接关系,可以直接构成结构体。
顺序语句——构成进程、过程和函数的基础。
主要有变量赋值语句,信号赋值语句,IF语句,CASE语句,LOOP语句,NEXT语句,EXIT语句,NULL语句,WAIT语句,RUTURN语句、ASSERT语句、REPORT语句和过程调用语句等。
并行语句——直接构成结构体,使结构体具有层次性,简单易读。
VHDL的并行语句主要有进程语句(PROCESS),块语句(BLOCK),生成语句(GENERATE),元件说明和元件例化语句(COMPONENT),信号赋值语句,并行断言语句和并行过程调用语句等。
 
2 MAX+PLUS II汇编环境
2.1 MAX+PLUS II简介
MAX+PLUS II是美国Altera公司设计的EDA工具。利用该工具所提供的编辑、仿真、综合、编译、芯片编程等功能,可以将设计好的电路图或硬件描述语言程序转换成基本的逻辑单元写入到可编程芯片中,作成ASIC芯片。
优点:界面开放,与结构无关,丰富的设计库,模块化工具,硬件描述语言。
功能:MAX+PLUS II的编译核心支持Altera公司的FLEX 10K、FLEX 8K、MAX9000、MAX7000、 Flashlogic、MAX5000、Classic系列可编程逻辑器件;
       MAX+PLUS II的设计输入、处理与校验功能一起提供了全集成化的一套可编程逻辑开发工具,可加快动态调试,缩短开发周期;
       MAX+PLUS II支持各种HDL设计输入,包括VHDL、VerilogHDL 、AHDL;MAX+PLUS II可与其他工业标准设计输入、综合与校验工具链接。与CAE工具接口符合EDIF200和209、参数化模块库(LPM)、VerilogHDL、VHDL及其他标准。
2.2  MAX+PLUS II的设计流程
使用MAX+PLUS II进行设计包括四个阶段:设计输入、设计处理、设计验证和器件编程。
设计输入:通过MAX+PLUS II图形编辑器,创建图形设计文件(.gdf);通过文本编辑器,使用AHDL语言,创建文本设计文件(.tdf);使用VHDL语言,创建文本设计文件(.vhd);使用VerilogHDL语言,创建文本设计文件(.v)。还可以通过MAX+PLUS II的波形编辑器,创建波形设计文件(.wdf)等。
设计处理:MAX+PLUS II在处理设计时,Compiler在设计文件中读取信息并产生编译文件和仿真文件,Timing Analyzer 可分析设计定时,Message Processor 可自动定位错误。Compiler的Logic Synthesize模块对设计方案进行逻辑综合并能看到真正的结果。Fitter(试配)模块应用试探法可把经过综合设计的设计最恰当的用一个或多个器件实现,生成报告文件(.rpf)。Complier中的Design Doctor 程序能检查每一个设计文件。Assemble(装配程序)模块为已编译的设计创建烧写文件(.pof)。
设计校验:设计校验包括设计仿真和定时分析两部分。作用是测试逻辑操作和设计的内部定时。
器件编程:MAX+PLUS II Programmer是使用Compiler生成的烧写文件对Altera器件进行编程的。它可以用来对器件编程、校验、检查是否空白以及进行功能测试。
 
3 FIR数字滤波器的基本理论
数字滤波器是完成信号滤波处理功能的,用有限精度算法实现的离散时间线性非时变系统,其输入的是一组数字量,其输出是经过变换的另一组数字量。数字滤波器具有稳定高、精度高、灵活性大等突出优点。随着数字技术的发展,用数字技术设计滤波器的功能越来越受到人们的注意和广泛的应用。
 3.1 FIR数字滤波器的原理
一个数字滤波器的的系统函数可以表示为:
 
若图片无法显示请联系QQ3710167
直接由H(Z)得出表示输入输出关系的常系数线性差分方程为
若图片无法显示请联系QQ3710167
可以看出,数字滤波器是把输入序列经过一定的运算变换成输出序列。大多数普通的数字滤波器是线性非时变的(linear time-invariant,LTI)滤波器。对因果的FIR系统,其系统函数仅有零点(除z=0的极点外),并且因为系数 全为零,所以上述的差分方程就可以简化为
若图片无法显示请联系QQ3710167
上式可以认为是x(n)与单位脉冲响应h(n)的直接卷积。
数字滤波器根据单位脉冲响应h(n)的时间特性可分为无限长单位脉冲响应(IIR,infinite impulse response)数字滤波器和有限长单位脉冲响应(FIR,finite impulse response)数字滤波器两种。从离散时间域来看,若系统的单位取样响应延伸到无穷之长,称之为IIR系统,若系统的单位取样响应是一个有限长序列,则称之为FIR系统。
FIR滤波器对于IIR滤波器有许多独特的优越性,在保证满足滤波器幅频响应要求的同时还可获得严格的线性相位特性,从而保持稳定。对非线性相位的FIR滤波器一般可以用IIR滤波器来代替。由于在数据通信、语音信号处理、图像处理以及自适应处理等领域往往要求信号在传输过程中不可能有明显的相位失真,而IIR存在频率色散的问题,所以FIR滤波器获得了更广泛的应用。
3.2 FIR数字滤波器的基本结构
FIR滤波器有直接型,级联型和频率抽样型三种基本结构,其中直接型是最常见的机构。由于本次设计是采用直接型数字滤波器结构,所以只对直接型结构做讨论。
若图片无法显示请联系QQ3710167
图3-1 直接型结构
这种结构也称为抽头延迟线结构,或称为横向滤波器结构。从上图可以看出,沿着这条链每一抽头的信号被适当的系数(脉冲响应)加权,然后将所得乘积相加就得到输出y(n)。
转置定理定义为,如果将网络中所有的支路方向倒转,并将输入x(n)和输出y(n)相互交换,则其系统函数H(Z)不变。将转置定理应用于上图,就可以得出FIR的转置直接型。
若图片无法显示请联系QQ3710167
图3-2 转置直接型结构
3.3 线性相位FIR系统的结构
在许多应用领域,例如通信和图像处理中,在一定的频率范围内维持相位的完整性是一个期望的系统属性。
可以证明,如果FIR滤波器的单位取样响应h(n)为实数,而且满足线性相位条件,则滤波器的单位取样响应h(n)满足以下两个条件之一:
偶对称   h(n)=h(N-1-n),
 

基于VHDL语言的FIR滤波器设计
奇对称   h(n)=-h(N-1-n),
其对称中心在 处。所谓线性相位特性是指滤波器对不同频率的正弦波所产生的相移和正弦波的频率成直线关系。
若图片无法显示请联系QQ3710167
图3-3 线性相位FIR滤波器结构
上图显示了线性相位FIR滤波器的结构。可以看出,线性相位FIR滤波器的固有对称属性可以降低所需要的乘法器的数量,它使得乘法器的数量降低了一半,而加法器的数量则保持不变。
3.4 FIR滤波器的设计
FIR滤波器设计方法以直接逼近所需离散时间系统的频率响应为基础。设计方法包括窗函数和最优化方法(等同波纹法)。其中窗函数设计方法是设计FIR数字滤波器最简单的方法,也是最常用的方法之一。
3.4.1 采用窗函数方法设计线性相位FIR滤波器的方法
任何数字滤波器的频率响应 都是w的周期函数,它的傅立叶展开式为:
若图片无法显示请联系QQ3710167    (a)
其中,
傅立叶系数h(n)实际上就是数字滤波器的冲激响应。获得有限冲激响应数字滤波器的一种可能方法就是把a式的无穷级数截取为有限级数来近似。
窗函数法用被称为窗函数的有限加权系列w(n)来修正a式的傅立叶级数,以求得要求的有限冲激响应序列 ,即有:若图片无法显示请联系QQ3710167
=h(n)w(n)
W(n)是有限长序列,当n>N-1及n<0时,w(n)=0。这里我们仅以冲激响应对称,即h(n)=h(N-1-n)(n=0,1,2,…N-1)时低通滤波器为例进行说明。低通滤波器的频率响应函数 如下图所示:
,            (b)
在 时为0,其中w为对抽样频率归一化的角频率,  为归一化截止角频率。利用反傅立叶变换公式求出于b式对应的冲激响应函数h(n)为:3.4.2 几种窗函数及窗函数选择原则
设计FIR滤波器常用的窗函数有:矩形窗函数、三角窗函数、汉宁窗函数、海明窗函数、布拉克曼窗函数和凯泽窗函数。具体指标如下表:





窗的类型

最大旁瓣幅度
(相对值)

过渡带宽度

最大逼近误差


等效凯泽窗β


矩形

-13

4π/N

-21

0


三角

-25

8π/N

-25

1.33


汉宁

-31

8π/N

-44

3.86


海明

-41

8π/N

-53

4.86


布拉克曼

-57

12π/N

-74

7.04
表3-1 窗函数指标
窗函数的选择原则是:
(1)       具有较低的旁瓣幅度,尤其是第一旁瓣幅度。
(2)       旁瓣幅度下降速度要块,以利增加阻带衰减。
(3)       主瓣的宽度要窄,以获得较陡的过渡带。
通常上述几点很难同时满足。当选用主瓣宽度较窄时,虽然得到较陡的过渡带,但通带和阻带的波动明显增加;当选用最小的旁瓣幅度时,虽然能得到匀滑的幅度响应和较小的阻带波动,但是过渡带加宽。因此,实际选用的窗函数往往是他们的折中。在保证主瓣宽度达到一定要求的情况下,适当牺牲主瓣宽度来换取旁瓣波动的减少。
3.4.3 等同波纹设计方法
窗函数存在着某些缺陷。首先,在设计中不能将边缘频率 和 精确的给定,这就是说,在设计完成之后,无论得倒任何值都必须接受。其次,不能够同时标定汶波因子 和 ,在窗函数法上只能设定 = 。最后,近似误差在频带区间上不是均匀分布的。在靠近频带边缘误差越大,远离频带边缘误差越小。
一种非常有效的解决这种问题的FIR滤波器就是等同波纹FIR滤波器。对于线性相位的FIR滤波器来说,有可能得到一组条件,对这组条件能够证明,在最大近似误差最小化的意义下,这个设计是最优的。具有这种性质的滤波器就称为等同波纹滤波器。因为近似误差在通带和阻带上都是均与分布的。
等同波纹法是采用Parks-McClellan迭代方法来实现的。与直接频率法相比,等同波纹设计方法的优点在于通频带和抑制带偏差可以分别指定,且实现相同指标的滤波器时所用的滤波器阶数较小。
3.4.4 用MATLAB设计FIR滤波器
在MTALAB的SIGNAL PROCESSING TOOLBOX中有一个专门的数字滤波器设计软件模块FDATool(Filter Design & Analysis Tool),其功能强大,可以设计多种滤波器,而且可以采用多种方法设计FIR滤波器,包括窗函数法和等同波纹法。它使用起来非常直观有效,在输入了设计要求和选择了设计方法后,计算出各阶系数,并以图形的直观方式显示出幅频、相频、冲激响应和零极点图。它还可以把各阶系数以二进制补码的形式导出到文本文件中去,方便了系数的转换。
3.5 FIR与IIR数字滤波器的比较
(1)在相同的技术指标下,IIR滤波器由于存在这输出对输入的反馈,所以可用比FIR滤波器较少的阶数来满足指标的要求,所用的存储单元少,运算次数少,较为经济。例如,用频率抽样法来设计阻带衰减为-20dB的FIR滤波器,其阶数要33阶才能达到,而用双线性变换法设计只需要4-5阶的切贝雪夫IIR滤波器即可达到指标要求,所以FIR滤波器的阶数要高5-10倍左右。
(2)FIR滤波器可得到严格的线性相位,而IIR滤波器做不到这一点,IIR滤波器的选择性越好,其相位的非线性越严重。因而,如果IIR滤波器要得到线性相位,又要满足幅度滤波的技术要求,必须加全通网络进行相位校正,这同样会大大增加滤波器的阶数。从这一点上看,FIR滤波器又优于IIR滤波器。
(3)FIR滤波器主要采用非递归结构,因而无论是从理论上还是从实际的有限精度的运算中它都是稳定的,有限精度运算的误差也比较小。IIR滤波器必须采用递归结构,极点必须在z平面单位圆内才能稳定,对于这种结构,运算中的四舍五入有时会引起寄生振荡。
(4)对于FIR滤波器,由于冲激响应是有限长的,因而可以用快速傅立叶变换算法,这样运算速度可以快得多。IIR滤波器则不能这样运算
(5)从设计上看,IIR滤波器可以利用模拟滤波器设计的现成的闭合公式、数据和表格,因而计算工作量较小,对计算工具要求不高。FIR滤波器则一般没有现成的设计公式,窗函数法只给出窗函数的计算公式,但计算通带、阻带衰减仍无显示表达式。一般FIR滤波器设计仅有计算机程序可资利用,因而要借助计算机。
(6)IIR滤波器主要是设计规格化的、频率特性分为分段常数的标准低通、高通、带通、带阻、全通滤波器。FIR滤波器则要灵活的多,例如频率抽样设计法,可适应各种幅度特性及相位特性的要求,因而FIR滤波器可设计出理想正交变换器、理想微分器、线性调频器等各种网络,适应性较广。而且,目前已有许多FIR滤波器的计算机程序可供给使用。
从以上比较可以看出,IIR滤波器与FIR滤波器各有特点,所以可以由实际应用时的要求,从多方面考虑来加以选择。
4 FIR滤波器的设计
数字滤波器无论是采用硬件实现还是软件实现的方案,首先应确定出数字滤波器的运算结构图。同一个系统函数或差分方程可以采用不同的结构来实现,而结构的不同又会影响系统的精度、稳定性、运算速度和运算单元的多少等许多重要的性能指标。本论文采用直接型结构设计了一个低通滤波器。由EDA试验箱提供的模拟信号做为输入信号,使用TLC5510芯片D/A转换为8位的数字信号,经过卷积运算后将输出的数据进行截取,取其高8位,输入到A/D转换芯片,由示波器观察滤波后的输出。此外为了直观的显示数字滤波的每一个输出数据,将卷积运算后的结果进行进制转换,且使用了一个锁存器对其结果进行锁存,然后在数码管上观察数字信号。
4.1 FIR滤波器的模块划分
4.1.1 方案确定
1.FIR滤波器的设计指标
采样频率:120KHZ
通带截止频率:5KHZ
阻带起始频率:25KHZ
类型:低通
输入数据宽度:8位
系数数据宽度:8位
阶数:8阶
2.参数提取
使用MATLAB软件Toolbox中的Filter Design,选择低通滤波器,Fs=120KHZ,Fpass=5KHZ,Fstop=25KHZ,阶数为8位,线性相位。设计出符合设计指标的线性相位8阶FIR数字低通滤波器的特征参数并转换为8位二进制补码如下:
h(0)=h(7)= 00000011;
h(1)=h(6)= 00011000;
h(2)=h(5)= 00101010;
h(3)=h(4)= 00111001;若图片无法显示请联系QQ3710167
设计的FIR低通滤波器的幅频和相频特性如图所示:
 

基于VHDL语言的FIR滤波器设计
图4-1 8阶FIR低通滤波器的幅频特性若图片无法显示请联系QQ3710167
图4-2 8阶FIR低通滤波器的相频特性
4.1.2 FIR滤波器的模块划分
FIR数字滤波器的数字硬件系统主要由输入模块、乘累加模块、进制转换模块、锁存模块和输出显示模块组成。
各模块执行的功能说明如下:
(1)输入模块:
输入模块的主要功能主要是完成对输入数据的处理,为后续电路做准备,主要由模拟信号源与A/D转换芯片TLC5510组成。
(2)乘累加模块:
乘累加模块的主要功能是实现数据的相乘和累加。
(3)进制转换模块
由于乘累加模块输出的数据为二进制的数据,为了方便在数码管上观察,此处将二进制数转化为二-十进制的BCD码。
(4)锁存模块:
 锁存模块主要功能是将转化为BCD码的输出结果锁存后输出。
 (5)输出显示模块:
 输出显示模块主要功能是将由锁存模块输出的数据在数码管上显示出来。
4.2 FIR滤波器各模块功能的实现
4.2.1 输入模块
 在输入模块中,主要由试验箱集成芯片ICL8038产生模拟信号,输入到TLC5510进行A/D转换,输出数据即为8位数字信号。采样频率选用120KHZ,,使用分频器实现,a为6MHZ的时钟信号,对其进行50分频,b,c为分频以后的输出时钟信号,模块框图如下:
若图片无法显示请联系QQ3710167
图4-3 分频器模块框图
 
4.2.2 乘累加模块
依据FIR滤波器的直接型结构,假定要求设计的FIR滤波器的阶数为8,即N=8。这时,滤波器的输出序列y(n)为:
y(1)=x(1)h(0)=0+0+0+0+0+0+0+x(1)h(0)
=0h(7)+0h(6)+0h(5)+0h(4)+0h(3)+0h(2)+0h(1)+x(1)h(0)
y(2)=x(1)h(1)+x(2)h(0)=0+0+0+0+0+0+x(1)h(1)+x(2)h(0)
   =0h(7)+0h(6)+0h(5)+0h(4)+0h(3)+0h(2)+x(1)h(1)+x(2)h(0)

    y(8)=x(1)h(7)+x(2)h(6)+x(3)h(5)+x(4)h(4)+x(5)h(3)+x(6)h(2)+x(7)h(1)+x(8)h(0)
可知,当n的值不同时(处于时钟的不同节拍),计算y(n)所需的乘法及加法的次数有所不同。为了实现程序在每次循环中(一个时钟周期内)以相同的运算形式,算出一个y(n)值,可把不同n值时输出的y(n)计算统一为下面的形式:
若图片无法显示请联系QQ3710167
其中,数组r(i)为一组中间变量,其变化规律是相当于每个n值。当 时,r(i)取值为0。当i由上可知,直接型FIR滤波器结构简单,整个乘累加模块的运算过程是乘法,加法,延时三种基本运算的组合。
大多数的 EDA 工具软件中都具备宏单元库,利用宏单元库提供的模块,可以大大提高基于 EDA 技术的电子设计的效率和可靠性。在用原理图描述的频率计的设计中,可从器件库中调用计数器、锁存器、译码器、门电路等器件,方便、快捷地完成电路的设计。这里运用 VHDL 进行此模块的设计,需要解决乘法和加法的运算问题。乘法和加法不是 VHDL 语言中所定义的标准运算,但通过引用 IEEE 标准程序包 std_logic_unsigned,仍可运用运算符“*”和“+”,实现乘法和加法运算,该程序包中含有为上述算术运算建模的部分。
为设计 FIR 滤波器,首先进行参数的设置,要求设计的 FIR 滤波器的阶数为 8,而其他参数在程序中应易于修改。假定设计的 FIR 滤波器为线性相位滤波器,其系数具有偶中心对称性,即 h(i)=h(N-1-i),抽头系数 h(n)的值以补码表示。为使设计适应不同的精度(输入、输出和抽头系数的字长),程序更具灵活性,在编写主程序(主设计实体)之前先定义一个供主程序调用的程序包(package);在程序包中预定义上述参数,某些数据类型以及各数据的字长。
在此模块中,xin[7..0]为输入数据,clk为时钟信号,outs[15..0]为输出结果。模块框图如下:
若图片无法显示请联系QQ3710167
图4-4 乘累加模块图
具体程序见附录。
4.2.3 进制转换模块
由于乘累加模块输出的outs[15..0]为16位的二进制数,为了方便在数码管上观察最终的结果输入,进制转换模块将16位的二进制码转换为二-十进制的BCD码。
实现这种转换传统的方法有:
    (1) 利用组合逻辑网络实现。其速度较快,但随着被转换的二进制码元位数的增加,将需要大量的硬件资源。
(2) 利用移位原理。这种方法速度适中,所需的硬件资源也适中。
(3) 利用计数器实现。这种方法所需的硬件相对较少,但速度慢。
本设计中由于二进制码元为16位,所以采用第一种方法,具体程序见附录,但是有局限性,当二进制码元位数较大时,将不适用,所以另外详细的介绍了用移位的方法实现二进制码到二-十进制BCD码的转换。
对于一个n位二进制码 ,其在十进制编码方式下的值为:
若图片无法显示请联系QQ3710167
把上式写成套乘的形式:

式中的每项乘2,相当于将寄存器中的二进制码左移一位。
设每一组数码(4位)左移1位前的状态为原状态 ,左移一位后的状态为次状态 。数码组左移一位相当于数码组的值被乘以2,所以有以下公式:其中 为串行输入的二进制码元。当原态 小于5时,能满足上式。当 时,左移一位,其次态将超过9,对于BCD码来说,这样的状态属于禁用状态。当 时,左移一位,则会向高一位的BCD码输入一个进位信号F。由于BCD码和二进制码权的不一致性,当发生进位时,虽然码元只是左移一位,但次态 将减少6.基于上述两种情况,在B/BCD转换时需要对结果加以校正。校正过程如下:
当 时,让 先加上3,然后再左移一位,次态 ,正好补偿由于进位减少的数值,并且向后一个变换单元送入一个进位信号F,此法称为“加3移位法”。
下表给出了一个8位二进制码11101011转换成8421BCD码的时序。当系统时钟开始时,二进制码开始左移,当第3个时钟脉冲作用后,BCD 码的最低位中的数值0111大于5 (二进制码送入时,高位在前,低位在后) , 故需要加3左移。我们用修正后的数据1010代替原来的大于5 的数据,参与下一个脉冲周期内的移位。在第5 、第6 、第7 脉冲周期中,在数据移位的同时,我们同样需要对数值大于5的BCD 码进行修正。最后,经过8个脉冲周期的移位,二进制码转换为8421BCD码的数码转换得以实现。
若图片无法显示请联系QQ3710167
表4-1 B/BCD的转换
4.2.4 锁存模块
锁存模块的主要功能是对输出结果进行锁存,这主要是为了方便在数码管上观察输出的结果,因为采样频率过快。将输出结果寄存,然后用一个较低的脉冲信号使结果在数码管上显示(本设计中采用了1HZ的脉冲信号)。
4.2.5 输出显示模块
经过进制转换以后,16位的二进制数换为10进制最多是5位数,所以选用了5个数码管来完成最后的显示功能。
 

基于VHDL语言的FIR滤波器设计
每个数码管内部主要由8个发光二极管组成,排成8字形,a-g为构成显示符号的7段码输入端,h为小数点输入端,送高电平对应段的发光二极管,从而显示符号。本设计最终输出的是5位的十进制数,用到了5个数码管,这就要求使用数码管位选。位选使用方法:在位选选中一个数码管情况下送出段码,在该数码管中显示段码字符,然后接着选中其他数码管,送其他字符。在送处的位选足够快的情况下,人眼就分辨不出是一位一位显示出来的,给人的感觉就是一起显示的。在设计中采用32768Hz的信号来产生位选数据。
4.3 FIR滤波器的系统设计
FIR滤波器原理图如下:

若图片无法显示请联系QQ3710167图4-5 8阶FIR低通滤波器顶层原理图
为便于理解整个设计,现将系统的运行过程说明如下:
首先是由芯片ICL8038产生模拟信号,由OUT接口接入A/D转换芯片TLC5510的IN接口,此部分由外接电路完成。采样频率由AD模块,即分频器提供,此分频器为50分频,输出的脉冲信号频率即采样频率,为120KHZ。DEL模块主要实现锁存的功能,由于要在数码管上观察最后的显示结果,所以将数据先锁存,然后用一个较低频率的脉冲,使数据以较低的速率传输,此处的脉冲选择1HZ。FIR模块则是将输入过来的数据与系数进行卷积运算。下一个模块ZHUAN就是将FIR模块输出的16位的二进制数进行进制的转换,转为二-十进制的BCD码,最后的XIAN模块就是将最终的结果在数码管上显示出来。
4.4 仿真结果分析
在系统仿真中,在MATLAB中设计一个幅度为1的20KHZ正弦波,使用120KHZ的采样器对其采样,得到的采样值取8个数据,分别是0,0.9511,0.5878,-0.5878,-0.9511,0,0.9511,0.5878。转换为8位二进制补码分别为:00000000,01111011,01001011,10110101,10000111,00000000,01111011,01001011。在MAXPLUSII中将其输入到乘累加模块的输入端,下面列出输出的系统仿真波形图:
若图片无法显示请联系QQ3710167


若图片无法显示请联系QQ3710167
图4-6 FIR滤波器的仿真输出
将图中得到的仿真输出结果转换成小数后与使用MATLAB计算得到的结果相比有一定的误差,误差主要是由系数量化而造成的量化误差。仿真图中的延时主要是由乘法器和加法器的延时所产生。
4.5 实验结果分析
为了验证FIR滤波器的实际滤波器效果,使用EDA实验箱所提供的A/D及D/A转换芯片,组成了一个测试系统。
由于D/A转换芯片的输入为8位二进制补码输入,而经过乘累加运算后输出数据为16位,因此作一截取模块,取其高8位送入D/A转换模块。此测试用的滤波器顶层原理图如下所示:
若图片无法显示请联系QQ3710167
图4-7 测试用FIR滤波器顶层原理图
测试系统如图4-8所示,本系统包括了3个部分:模拟信号输入部分、实验电路和示波器。实验电路主要包括一个A/D转换电路、FIR滤波器电路和D/A转换电路。
在测试中,输入的模拟信号先经过A/D转换电路,转换后的数字信号送入用FPGA实现的FIR滤波器电路进行滤波处理,滤波后的输出仍然是数字信号,因此再通过一个D/A转换电路将输出的数字信号转变为模拟信号,采用示波器来观测滤波前后的结果。
若图片无法显示请联系QQ3710167
图4-8 测试系统组成框图
 EDA实验箱提供3种模拟信号,分别是AJ4-方波,AJ5-正弦波和AJ6-三角波,而频率分为三个频率段,电容值越小输出频率段的频率越大。使用示波器测试3个频率段所对应的频率范围分别是:AJ1:50KHz~1KHz;AJ2:5KHz~0Hz;AJ3:1KHz~0Hz。将AJ4和AJ3短接,则输出模拟信号为频率在1KHz以内的方波,将其接入系统中,由示波器可观察,经过数字滤波后,输出依然为同频率的方波,在通带范围内的波形“无失真”的通过。再将AJ1短接,调节AJ0,使其频率尽量大,这时示波器显示检测到直流通过,由此可见,在阻带范围内的波已基本被滤除,实验与理论分析相一致。
示波器显示通带频率与阻带频率内波形分别如下:
若图片无法显示请联系QQ3710167
若图片无法显示请联系QQ3710167
图4-9 滤波器实际滤波效果
4.6 FIR滤波器的阶数扩展
本论文对不同阶数的FIR滤波器进行了比较,更加深刻的了解到在FIR滤波器中阶数对滤波效果的影响,32阶和64阶的FIR低通滤波器的幅频和相频特性如下图:

(a)
若图片无法显示请联系QQ3710167
(b)
图4-10 a 32阶FIR低通滤波器幅频特性 b 64阶FIR低通滤波器幅频特性
若图片无法显示请联系QQ3710167
(a)
若图片无法显示请联系QQ3710167
(b)
图4-11 a 32阶FIR低通滤波器相频特性 b 64阶FIR低通滤波器相频特性
    由图可见,FIR滤波器阶数越高,滤波效果越明显。在实际滤波器设计中,应当根据具体的滤波要求来选择合适的阶数。
 

基于VHDL语言的FIR滤波器设计
结论
在现代电子系统中,FIR数字滤波器以其良好的线性特性被广泛使用,属于信号处理的基本模块之一。本论文在设计中采用了层次化、模块化的设计思想,将整个设计划分为多个功能模块,利用VHDL语言和原理图输入两种设计技术进行了整个功能模块的设计,最后完成FIR数字滤波器的系统设计。对系数进行相应的改动,就可以分别实现低通、高通、带通、带阻等FIR滤波器,设计灵活性比较高。
由于采用系数量化等有限精度算法,最终结果将存在一定的误差,可以通过增加二进制的位数来改善,但是这样也会增加运算复杂度,对硬件的要求也相应提高,可以选择一个硬件与要求精度的最优点。
    设计数字系统,有多种方法,可以采用传统的数字系统设计方法,也可以采用使用硬件描述语言的数字系统设计方法。传统的设计方法不适合大规模系统的设计,所以采用硬件描述语言的设计方法。本论文设计的FIR低通滤波器采用了直接型结构,使用了乘法器和加法器,比较耗费硬件资源,且乘法器和加法器的延时比较大,可以采用分布式算法来实现,可以达到比较快的速度和占用较少的硬件资源,但是当滤波器阶数过大时,查找表的规模将很大,可以将大的查找表分化为2块小表及OBC(Offset Binary Coding)编码方式将查找表的规模减小。
致  谢
 
本毕业设计和毕业论文是在杨梅老师的精心指导下完成的。在此,谨对导师对我的培养和关怀致以衷心的感谢。由于初次接触本实验,有许多地方不了解,杨老师作为我毕业设计的指导老师,在精神上给予我支持和鼓励;在物质上给我创造了良好的学习环境和设备;在学习上给予我无微不至的关怀和帮助,不仅使我的专业知识和实验技能有了很大提高,而且老师严谨的治学态度,务实的工作作风,高度的责任心,也使我收益非浅。
在这里也衷心地感谢309实验室的沙老师和各位同学,在我的毕业设计中给予的指导和鼓励,使我圆满地完成了毕业设计。
参 考 文 献
 
 
1  陈云洽,保延翔.CPLD应用技术与数字系统设计.北京:电子工业出版社,2003年
2  李国丽,朱维勇,栾铭.EDA与数字系统设计.北京:机械工业出版社,2005年
3  任勇峰,庄新敏.VHDL与硬件实现速成.北京:国防工业出版社,2005年
4  Uwe Meyer-Baese 著,刘凌,胡永生译.数字信号处理的FPGA实现.北京:清华大学出版社,2003年
5  程佩青.数字信号处理教程.北京:清华大学出版社,2001年
6  卢毅,赖杰. VHDL与数字电路设计. 北京:科学出版社, 2001年
7  金西.VHDL与复杂数字系统设计.西安:西安电子科技大学出版社,2003年
8  林明权.VHDL数字控制系统设计范例.北京:电子工业出版设,2003年
9  李勇,徐震.MATLAB辅助现代工程数字信号处理.西安:西安电子科技大学出版社,2002年
10 王振红.VHDL数字电路设计与应用实践教程.北京:机械工业出版社,2003年
11 郭晓宇.基于FPGA实现FIR数字滤波器的研究.CNKI,2004年
12 王学梅.基于FPGA有限冲激响应数字滤波器的研究及实现.CNKI,2005年
13 金卫,陈长龄.基于FPGA的FIR及IIR数字滤波器的设计.CNKI,2004年
14 刘志新.用CPLD实现FIR数字滤波器.CNKI,2000年
 
 

基于VHDL语言的FIR滤波器设计
附录
分频器程序:
library ieee;
use ieee.std_logic_1164.all;
USE IEEE.STD_LOGIC_unSIGNED.ALL;
entity ad is
port(
a:in std_logic;
--c:out std_logic_vector(7 downto 0);
b:out std_logic;
c:out std_logic
);
end ad;
architecture ab of ad is
signal x:integer range 0 to 6;
signal mid:std_logic;
begin
process(a)
begin
if a'event and a='1' then
if x=2 then
x<=0;
mid<=not mid;
else
x<=x+1;
end if;
b<=mid;
c<=mid;
end if;
end process;
end ab;
 
乘累加模块程序:
library  ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
package pre is                
constant inb: positive:=8;        
constant hb: positive:=8;         
constant mres:positive:=inb+hb;
constant outb:positive:=mres+3;
constant h0:std_logic_vector:="00000011";
constant h1:std_logic_vector:="00011000";
constant h2:std_logic_vector:="00101010";
constant h3:std_logic_vector:="00111001";
constant h4:std_logic_vector:="00111001";
constant h5:std_logic_vector:="00101010";
constant h6:std_logic_vector:="00011000";
constant h7:std_logic_vector:="00000011";
type regs is array(1 to 7) of std_logic_vector(inb-1 downto 0);
end pre;
 
 
 
library  ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use work.pre.all;
 
entity fir is
port(xin:in std_logic_vector(inb-1 downto 0);
clk:in std_logic;
outs:out std_logic_vector(15 downto 0));
end  fir;
 
architecture rtl of fir is
signal ir:regs;               
signal m0,m1,m2,m3,m4,m5,m6,m7:std_logic_vector(15 downto 0);
signal a0,a1,a2,a3:std_logic_vector(15 downto 0);
signal b0,b1,b2:std_logic_vector(15 downto 0);
--signal c0,c1:std_logic_vector(15 downto 0);
begin
process(clk)              
begin
if clk'event and clk='1'then
m0<=xin*h0;
m1<=ir(1)*h1;
m2<=ir(2)*h2;
m3<=ir(3)*h3;
m4<=ir(4)*h4;
m5<=ir(5)*h5;
m6<=ir(6)*h6;
m7<=ir(7)*h7;
for i in 0 to 5 loop
ir(7-i)<=ir(6-i);
end loop;
ir(1)<=xin;
 
a0<=m0+m7;
a1<=m1+m6;
a2<=m2+m5;
a3<=m3+m4;
b0<=a0+a1;
b1<=a2+a3;
outs<=b0+b1;
end if;
end process;
end rtl;
进制转换模块程序:
library ieee;
use ieee.std_logic_1164.all;
USE IEEE.STD_LOGIC_unSIGNED.ALL;
 
 
entity zhuan is
port(
A: in std_logic_vector(14 downto 0);
y: out std_logic_vector(19 downto 0));
end zhuan;
 
architecture one of zhuan is
begin
process(a)
variable d: std_logic_vector(19 downto 0);
variable z: std_logic_vector(14 downto 0);
 
begin
z:=a;
if       z>=30000  then d(19 downto 16):="0011"; z:=z-30000;
   elsif z>=20000  then d(19 downto 16):="0010"; z:=z-20000;
   elsif z>=10000  then d(19 downto 16):="0001"; z:=z-10000;
   else                 d(19 downto 16):="0000";
end if;
 
if       z>=9000   then d(15 downto 12):="1001"; z:=z-9000;
   elsif z>=7000   then d(15 downto 12):="0111"; z:=z-7000;
   elsif z>=6000   then d(15 downto 12):="0110"; z:=z-6000;
   elsif z>=5000   then d(15 downto 12):="0101"; z:=z-5000;
   elsif z>=4000   then d(15 downto 12):="0100"; z:=z-4000;
   elsif z>=3000   then d(15 downto 12):="0011"; z:=z-3000;
   elsif z>=2000   then d(15 downto 12):="0010"; z:=z-2000;
   elsif z>=1000   then d(15 downto 12):="0001"; z:=z-1000;
   else                 d(15 downto 12):="0000";
end if;
 
if       z>=900   then d(11 downto 8):="1001"; z:=z-900;
   elsif z>=800   then d(11 downto 8):="1000"; z:=z-800;
   elsif z>=700   then d(11 downto 8):="0111"; z:=z-700;
   elsif z>=600   then d(11 downto 8):="0110"; z:=z-600;
   elsif z>=500   then d(11 downto 8):="0101"; z:=z-500;
   elsif z>=400   then d(11 downto 8):="0100"; z:=z-400;
   elsif z>=300   then d(11 downto 8):="0011"; z:=z-300;
   elsif z>=200   then d(11 downto 8):="0010"; z:=z-200;
      else                d(11 downto 8):="0000";
end if;
 
 
if       z>=90   then d(7 downto 4):="1001"; z:=z-90;
   elsif z>=80   then d(7 downto 4):="1000"; z:=z-80;
   elsif z>=70   then d(7 downto 4):="0111"; z:=z-70;
   elsif z>=60   then d(7 downto 4):="0110"; z:=z-60;
   elsif z>=50   then d(7 downto 4):="0101"; z:=z-50;
 
基于VHDL语言的FIR滤波器设计
 elsif z>=40   then d(7 downto 4):="0100"; z:=z-40;
   elsif z>=30   then d(7 downto 4):="0011"; z:=z-30;
   elsif z>=20   then d(7 downto 4):="0010"; z:=z-20;
   elsif z>=10   then d(7 downto 4):="0001"; z:=z-10;
   else               d(7 downto 4):="0000";
end if;
 
if       z>=9   then d(3 downto 0):="1001";
   elsif z>=8   then d(3 downto 0):="1000";
   elsif z>=7   then d(3 downto 0):="0111";
   elsif z>=6   then d(3 downto 0):="0110";
   elsif z>=5   then d(3 downto 0):="0101";
   elsif z>=4   then d(3 downto 0):="0100";
   elsif z>=3   then d(3 downto 0):="0011";
   elsif z>=2   then d(3 downto 0):="0010";
   elsif z>=1   then d(3 downto 0):="0001";
   else              d(3 downto 0):="0000";
end if;
y<=d;
end process;
end one;
 
显示模块程序:
library  ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity xian is
port(ain: in std_logic_vector(19 downto 0);
     clk3:in std_logic;
     chs:out std_logic_vector(2 downto 0);
     result:out std_logic_vector(7 downto 0)
);
end xian;
architecture aa of xian is
signal resultz,resulto,resultt,resulte,resultf,resultv: std_logic_vector(7 downto 0);
signal sel,seo,set,see,sef:std_logic_vector(3 downto 0);
signal ch:std_logic_vector(2 downto 0);
begin
sel<=ain(3 downto 0);
seo<=ain(7 downto 4);
set<=ain(11 downto 8);
see<=ain(15 downto 12);
sef<=ain(19 downto 16);
process(sel,seo,set,see,sef)
begin
if sel="0000" then resultz<="00111111";
elsif sel="0001" then resultz<="00000110";
elsif sel="0010" then resultz<="01011011";
elsif sel="0011" then resultz<="01001111";
elsif sel="0100" then resultz<="01100110";
elsif sel="0101" then resultz<="01101101";
elsif sel="0110" then resultz<="01111101";
elsif sel="0111" then resultz<="00000111";
elsif sel="1000" then resultz<="01111111";
elsif sel="1001" then resultz<="01101111";
else resultz<="00000000";
end if;
if seo="0000" then resulto<="00111111";
elsif seo="0001" then resulto<="00000110";
elsif seo="0010" then resulto<="01011011";
elsif seo="0011" then resulto<="01001111";
elsif seo="0100" then resulto<="01100110";
elsif seo="0101" then resulto<="01101101";
elsif seo="0110" then resulto<="01111101";
elsif seo="0111" then resulto<="00000111";
elsif seo="1000" then resulto<="01111111";
elsif seo="1001" then resulto<="01101111";
else resulto<="00000000";
end if;
if set="0000" then resultt<="00111111";
elsif set="0001" then resultt<="00000110";
elsif set="0010" then resultt<="01011011";
elsif set="0011" then resultt<="01001111";
elsif set="0100" then resultt<="01100110";
elsif set="0101" then resultt<="01101101";
elsif set="0110" then resultt<="01111101";
elsif set="0111" then resultt<="00000111";
elsif set="1000" then resultt<="01111111";
elsif set="1001" then resultt<="01101111";
else resultt<="00000000";
end if;
if see="0000" then resulte<="00111111";
elsif see="0001" then resulte<="00000110";
elsif see="0010" then resulte<="01011011";
elsif see="0011" then resulte<="01001111";
elsif see="0100" then resulte<="01100110";
elsif see="0101" then resulte<="01101101";
elsif see="0110" then resulte<="01111101";
elsif see="0111" then resulte<="00000111";
elsif see="1000" then resulte<="01111111";
elsif see="1001" then resulte<="01101111";
else resulte<="00000000";
end if;
if sef="0000" then resultf<="00111111";
elsif sef="0001" then resultf<="00000110";
elsif sef="0010" then resultf<="01011011";
elsif sef="0011" then resultf<="01001111";
elsif sef="0100" then resultf<="01100110";
elsif sef="0101" then resultf<="01101101";
elsif sef="0110" then resultf<="01111101";
elsif sef="0111" then resultf<="00000111";
elsif sef="1000" then resultf<="01111111";
elsif sef="1001" then resultf<="01101111";
else resultf<="00000000";
end if;
end process;
process(clk3)
begin
ch<=ch+1;
chs<=ch+1;
end if;
if ch<="000" then
result<=resultz;
elsif ch<="001" then
result<=resulto;
elsif ch<="010" then
result<=resultt;
elsif ch<="011" then
result<=resultf;
elsif ch<="101" then
result<="00000000";
 
elsif ch<="110" then
result<="00000000";
elsif ch<="111" then
result<="00000000";
end if;
end process;
 
end aa;
 
截取模块程序:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use IEEE.STD_LOGIC_ARITH.ALL;
entity jiequ is
  port(shuru:in std_logic_vector(15 downto 0);
       );
end jiequ;
architecture jie of jiequ is
begin
shuchu<=shuru(15 downto 8);    
end jie;
  • 下一篇资讯: 模拟乘法器振幅调制器
  • 设为首页 | 加入收藏 | 网学首页 | 原创论文 | 计算机原创
    版权所有 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2020 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号 常年法律顾问:王律师