基于FPGA的FIR数字滤波器设计_第1页
基于FPGA的FIR数字滤波器设计_第2页
基于FPGA的FIR数字滤波器设计_第3页
基于FPGA的FIR数字滤波器设计_第4页
基于FPGA的FIR数字滤波器设计_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

论文题目:基于FPGA的FIR数字滤波器设计内容提要本文首先介绍了FIR数字滤波器的研究背景与意义,分析了FIR数字滤波器的国内外研究现状。然后阐述了FIR数字滤波器的基本原理与FIR数字滤波器的线性相位结构及窗函数设计方法。在理解FIR数字滤波器的基本理论与基本结构的基础上,确定了使用分布式算法作为FIR数字滤波器的硬件实现方法。针对当滤波器阶数较高时,LUT规模过大的缺点,使用了分割查找表法来减小LUT的规模,还将FIR数字滤波器设计成线性相位的结构,使得LUT的电路规模进一步减小。最后利用MATLAB对滤波器系数与滤波器的性能参数图进行了提取,并利用VIVADO对FIR数字滤波器进行功能仿真,本文在硬件设计方面采用了自顶向下的模块化,层次化的设计思想,将FIR数字滤波器划分为多个子模块,并用硬件描述语言对各子模块进行设计,通过仿真调试使各个子模块功能完全正常,再将各模块进行级联仿真,使其功能正常,最终完成FIR数字滤波器的设计。指导教师评语同意其参加答辩,建议成绩评定为。指导教师:年

日答辩简要情况及评语根据答辩情况,答辩小组同意其成绩评定为。答辩小组组长:年

日答辩委员会意见经答辩委员会讨论,同意该毕业论文(设计)成绩评定为。答辩委员会主任:年

日目录TOC\o"1-3"\h\u29771摘要 基于FPGA的FIR数字滤波器设计摘要:本文设计了一个基于FPGA的16阶FIR低通数字滤波器。使用自顶向下的设计方法设计所需要的数字电路,先将FIR数字滤波器模块化,并分别实现模块功能,再将模块级联实现FIR数字滤波器所需要的乘法累加运算,完成卷积。硬件实现算法选用了分布式算法。本文使用了查找表法实现FIR数字滤波器所需要的乘法运算,同时使用分割查找表法降低查找表的硬件资源的消耗。关键词:FIR数字滤波器;FPGA;分布式算法。FPGABasedFIRDigitalFilterDesignAbstract:thispaperdesignsa16th-orderFIRlow-passdigitalfilterbasedonFPGA.usingthetop-downdesignmethodtodesigntherequireddigitalcircuit,theFIRdigitalfilterisfirstmodularized,andthemodulefunctionisrealizedseparately,andthenthemodulecascadestorealizethemultiplicationandaccumulationoperationrequiredFIRthedigitalfiltertocompletetheconvolution.DistributedalgorithmischosenasthehardwareimplementationalgorithmofFIRlowpassfilter.AfindtablemethodisusedtorealizethemultiplicationoperationoftheFIRdigitalfilter,andthesplitfindtablemethodisusedtoreducetheconsumptionofhardwareresources.Keywords:FIRdigitalfilter;FPGA;Distributedalgorithm.1绪论随着信息科技的不断发展,数字滤波器在现在的信息处理中越来越重要,数字滤波器的好坏对相关的信息处理领域影响很大,一个好的数字滤波器可以有效的对信息处理领域和工程技术领域的发展进行推动作用[1]。设计出一款好的数字滤波器具有很好的现实意义。1.1课题研究背景随着第五代移动通讯技术的出现,万物互联成为了未来发展的一个趋势,物于物之间的联系就离不开信号的处理。信号处理就是为了解决如何在各种噪声的干扰下提取需要的且有用的信号用于联系,而滤波器又是进行信号处理的主要工具。滤波器分为数字滤波器和模拟滤波器,数字滤波器相较于模拟滤波器具有可靠性强,容易大规模集成,灵活性好,精度高等特点[2]。数字滤波器在不断发展的过程中已经在很多场合逐步取代了模拟滤波器。FIR数字滤波器的实现方法分为软件实现和硬件实现[2]。其中软件实现实时性较差。硬件实现主要有专用集成电路器件(ApplicationSpecificIntegratedCircuit,ASIC)和数字信号器(DigitalSignalProcess,DSP),现场可编程门阵列(FieldProgrammableGateArray,FPGA)等。其中ASIC器件实时性好,可靠性高,但小批量生产成本较高。DSP器件开发周期很短,但其软硬件结合使得其滤波器速度不高,不适合对实时性要求高的系统。FPGA具有很好的实时性,可靠性,开发周期短,是小批量生产最好的选择。1.2国内外研究现状在国内外的研究中,以乘法器结构与分布式结构最为常见。乘法器结构主要有两种,一种是串行结构,另一种是并行结构。其中串行结构最为简单,资源消耗小,但处理速度慢,当对处理速度要求不高的时候,可以采用串行乘累加结果进行FIR数字滤波器的实现。并行乘法器结构相较于串行乘累加要复杂,资源消耗较大,处理速度较快。分布式算法是目前比较常用的FIR数字滤波器硬件实现方法。它与传统算法实现乘累加运算有所不同。分布式算法先完成输入数据每一位与滤波器系数相乘产生的结果预先相加进行相加形成部分积,然后对各个部分积累加形成最终结果,传统的乘累加是等所有乘积结果全部出来以后再进行累加运算[3]。DA算法就执行速度方面是优于传统算法的。DA算法可以并行实现,也可以串行实现。并行速度快,但资源消耗大,串行资源消耗小,但速度慢。具体选择可以在资源和处理速度之间做适当的折中处理。

2FIR数字滤波器基本原理及设计方法2.1FIR数字滤波器的数学理论基础FIR数字滤波器,即有限长脉冲响应滤波器,指的是单位脉冲冲激响应的长度是有限的滤波器,FIR数字滤波器的单位冲激响应h(n)是一个N点长的有限长序列,输出y(n)可以表示为输入序列x(n)与单位冲激响应h(n)的线性卷积[4]。FIR数字滤波器的常系数线性差分方程为 (1)FIR数字滤波器的系统函数可以表示为 (2)从式(2)中可以看出,数字滤波器将输入与之前的输出序列经过一定的运算变成了新的的输出序列,大多数普通的数字滤波器都是线性时不变滤波器,对于FIR系统,其系统仅有零点,(除Z=0的极点外),因此FIR系统的差分方程可以表示为[5]: (3)转移函数为: (4)由式(4)可知,FIR数字滤波器的输出仅与及时输入及过去的输入数据有关,它的单位冲激响应是因果。所以FIR数字滤波器是物理可实现的系统,FIR数字滤波器总是稳定的。FIR数字滤波器相比于IIR数字滤波器,它有很多独特的优越性。FIR数字滤波器在保证满足数字滤波器幅频响应的同时还可以获得严格的线性相位特性,这一特别想使得FIR数字滤波器得到了更方法的应用[6]。我们想要实现FIR数字滤波器其本质是实现传递函数H(z)。2.2线性相位型FIR数字滤波器FIR数字滤波器有一个非常大的优点就是可以设计成线性相位的滤波器。在许多应用领域如图像处理和通信中,往往会要求信号在传输的过程中不能出现明显的相位失真,FIR数字滤波器可以做到线性相位从而满足此要求[7]。FIR数字滤波器的单位冲激响应h(n)满足以下两个条件其中一个,即为线性相位滤波器[6]。 (5)即如果单位冲激响应h(n)是实数,且具有奇对称或偶对称,则FIR数字滤波器有严格的线性相位[8]。FIR数字滤波器的对称中心在处。当N为奇数时,其结构图如图1所示。当N为偶数时,其结构图如图2所示。线性相位结构与直接型结构相比少用了个乘法器,降低了硬件资源的消耗,而且结构也不复杂。图1N=7时线性相位FIR数字滤波器的结构图图2N=6时线性相位FIR数字滤波器的结构图2.3FIR数字滤波器的设计方法及算法本文采用的是窗函数法设计FIR数字滤波器,选用的窗函数为海明窗(HammingWindow)[10]。FIR数字滤波器的算法结构包括三种结构,串行结构速度消耗资源最小但速度慢,并行结构速度最快但消耗资源最大,分布式结构比串行结构速度快,消耗资源稍大一些,相比于并行结构消耗资源小,速度也略慢一些。本文采用的是分布式结构的硬件算法形式来实现FIR数字滤波器。2.3.1窗函数法窗函数法是一种设计FIR数字滤波器最常用的方法,也是最简单的方法[9]。用窗函数设计FIR数字滤波器的时候,基本思路是先要给出理想滤波器的频率响应,第二步设计一个FIR数字滤波器的频率响应去比较理想滤波器的频率响应。第三步再设计一个FIR数字滤波的单位冲激响应h(n)去逼近。任何数字滤波器的频率响应都是以w为周期的周期函数,它的傅里叶级数展开式为: (6)其中 (7)由于理想滤波器在物理上是不可实现的,其的单位频率响应序列是无限长的,也是非因果的。而实际设计的FIR数字滤波器,要求是有限长的,而且是因果的。实现FIR数字滤波器最简单的方法是直接截取,使得h(n)与之间的关系为 (8)但这种简单的截取是不能的到因果的h(n)的,但我们可以将直接截取的响应向右平移(N-1)/2的采样点,可以使截取的h(n)具有偶对称,还能实现因果系统。当N越大的时候,h(n)的逼近效果越好,但在硬件实现的时候消耗的资源也相应的越大,此时应该根据具体情况合理的选择N的大小,在精度和资源二者之间进行折中处理。窗函数的选择原则是具有较低的旁瓣幅度,尤其是第一旁瓣幅度;旁瓣幅度下降要陡峭,以便阻带衰减的很快;主瓣宽度要窄,以获得较陡的过渡带[10]。在实际的应用当中,以上三点往往不能同时满足,选择的形式往往是这三者的折中。已经得到认可并发表的窗函数很多,设计FIR滤波器常用的‘窗函数有:矩形(Rectangle)窗函数、三角窗(Barlett)函数、汉宁(Hanning)窗函数、海明(Hamming)窗函数、布莱克曼(Blackman)窗函数和凯塞(Kaiser)窗函数[11]。 常用的窗函数的具体性能如表1所示表1常用窗函数窗的类型最大旁瓣幅度(相对值)过度带带宽最大逼近误差20log10δ(dB)等效Kaiser窗β矩形-134π/N-210Bartlett-258π/N-251.33Hanning-318π/N-443.86Hamming-418π/N-534.86Blackman-5712π/N-747.042.3.2分布式算法(DA)FIR数字滤波器的本质就是计算乘累加结果。这恰好符合分布式算法的特点,这也使得分布式算法在FIR数字滤波器设计中应用的很广泛。分布式算法比传统算法硬件资源消耗低,并且可以流水线处理,提高电路的执行速度,这正是在FPGA设计中所追求的目标[12]。分布式算法的推导如下:设h(n)是已知的FIR数字滤波器系数,x(n)是输入数据的第n点,y(n)卷积输出: (9)X(i)是B位的无符号二进制数,可以表示为 (10)则 (11)将算式从新排列可得 (12)也可以写成 (13)有符号数的DA算法:用补码表示的有符号二进制,最高位是用来区分正负号的,所以要对无符号的分布式算法进行修正。输入X(i)是(B+1)位二进制补码,可表示为 (14)那么y(n)修正为 (15)2.3.2查找表LUT分布式算法可以用LUT计算部分积,将部分积存储在ROM中,通过地址码的输入,将需要的乘法结果进行输出。FIR数字滤波器是一个乘固定系数的乘法累加运算,我们可以预先将乘积的结果预先存储在查找表之中,这样通过地址码读取数据的方式来代替运算量很大的乘法运算,从而提高FIR数字滤波器的速度。以一个四位输入的乘法运算为例,乘法累加的运算式为式(16),LUT存储的值如表2所示,LUT表内的值即为输入的x(n)乘以固定系数h(n)的积。通过4位地址码读取数据实现乘法运算。 (16)表2LUT表输入信号x(n)输出y(n)LUT存储值000000001h(0)0010h(1)0011h(0)+h(1)0100h(2)0101h(0)+h(2)0110h(1)+h(2)0111h(0)+h(1)+h(2)1000h(3)1001h(0)+h(3)1010h(1)+h(3)1011h(0)+h(1)+h(3)1100h(2)+h(3)1101h(0)+h(2)+h(3)1110h(1)+h(2)+h(3)1111h(0)+h(1)+h(2)+h(3)根据可能的输入值和乘积结果做出的查找表,通过查找出相应的取值,实现乘法运算,这样可以很大程度上节省乘法器资源。由于LUT所占的硬件资源随着滤波器的阶数呈指数关系,所以当FIR滤波器的阶数非常高时,LUT查找表的规模将会十分庞大。这种情况会造成占用硬件资源太多[13]。本文采用了两种方法来减小LUT的规模。第一种为分割查找表法。由于LUT的规模随着FIR数字滤波器的阶数N呈指数增长关系(2N),因此如果当N较大的时候,只用一个LUT实现FIR数字滤波器所需要的硬件资源是非常大的,因此提出了分割查找表法,将原本的LUT分割成若干个小的LUT,再将小的LUT的结果求和就能得到所需要的LUT表的输出值。以一个NL阶的滤波器为例,其卷积长度为NL,乘积和表达式为: (17)可以将NL个系数c(n)分为L组,每组是一个N个系数的查找表,再将每组地址码读出的数据进行求和。这样查找表的规模就从2NL减小到了L*2N,这样可以极大的减小LUT的规模。分割查找表的乘积和表达式为: (18)第二种为线性相位结构具有系数对称性,因此可以将需要乘相同系数的采样值预先相加得到一个新的值来作为地址码进行数据的读取,这一LUT的规模可以降低到原来的二分之一[14]。3FIR数字滤波器的硬件实现本文设计了一个FIR低通滤波器,FIR数字滤波器的具体设计指标如表3所示。表3设计指标设计指标阶数16阶类型低通滤波器输入数据位宽8位输出数据位宽16位设计方法hamming窗采样频率fs5Mhz截止频率fc1.5Mhz3.1FIR数字滤波器的MATLAB设计本文使用FDATOOL对滤波器系数进行了提取,分析了本文所设计的FIR低通数字滤波器的幅频特性,相频特性,冲激响应等。其中本文设计的滤波器幅频特性如图3所示;相频特性如图4所示;冲激响应如图5所示;所提取的FIR低通数字滤波器的系数如表4所示。图3幅频特性图4相频特性图5冲激响应表4滤波器系数表原系数扩大2048倍系数(保留整数)16进制补码h(0)=h(15)0.0033842057645697006h(1)=h(14)-0.001806515918044-4ffdh(2)=h(13)-0.01083640081260122feah(3)=h(12)0.0226931567523614602eh(4)=h(11)0.01647331682055434021h(5)=h(10)0.097718941451917-200f38h(6)=h(9)0.05961895584566212207ah(7)=h(8)0.50819222299941710414143.2FIR数字滤波器的FPGA设计本文的FIR数字滤波器划分为了4个模块,分别为:输入模块,LUT模块,移位累加模块和锁存输出模块。3.2.1FIR数字滤波器的输入模块输入模块由16个寄存器,加法与地址码转化模块组成。其组成部分各自所需实现的功能介绍如下:移位寄存器:对输入的数据延迟输出,寄存器个数由滤波器阶数决定,本文FIR数字滤波器的阶数是16阶,所有需要16个移位寄存器,对输入的数据进行延时。加法器:由于FIR数字滤波器系数的对称性,x(i)与x(N-i)所乘系数一样,为了减少后续的LUT规模,先将输入的x(i)与x(N-i)相加,再由地址码进行转换,输入LUT读取数据,实现乘法运算[15]。地址码转化:此模块的功能是为了实现式(12)的计算对加法器输入的数据进行编码在输入LUT读取部分积。1.移位寄存器仿真分析移位寄存器的RTL视图如图6所示,其功能仿真图如图7所示。在第16个时钟上升沿时30ns处,第16个寄存器也有了输出,相较于第一个输出延迟了16个时钟上升沿。移位寄存器对输入的数据进行延时处理,从而实现数据流动,为后面的加法器提供输入,在每一次时钟信号来的时候,数据在移位寄存器中移位寄存。经验证,移位寄存器仿真结果正确,符合设计要求。图6移位寄存器的RTL视图图7移位寄存器的功能仿真图2.加法器仿真分析加法器的RTL视图如图8所示,其功能仿真如图9所示。在5ns时输入的加数分别为2和-127,输出和为-125,在10ns时输入的加数为8和-120,输出和为-112。加法器功能实现无误,且无溢出,符合设计要求。图8加法器的RTL视图图9加法器的功能仿真图地址码转化仿真分析地址码转化的RTL视图如图10所示,其功能仿真如图11所示。以21ns分析为例其功能是否正确,分析结果如表5所示。经分析地址码转化功能完全正确,实现了地址码的转化。表521ns时地址码转化输出验证表21ns应输出21ns实际输出y0=”00000001”y0=”00000001”y1=”00100010”y1=”00100010”y2=”10000100”y2=”10000100”y3=”00001100”y3=”00001100”y4=”00010000”y4=”00010000”y5=”01101000”y5=”01101000”y6=”01000000”y6=”01000000”y7=”10000000”y7=”10000000”y8=”00000100”y8=”00000100”图10地址码转化的RTL视图图11地址码转化的功能仿真图输入模块仿真结果分析输入模块的RTL视图如图12所示,其功能仿真如图13所示。输入数据经过移位寄存器进行延时,再进入加法器进预相加,最后到达地址码转化将相加后的数据进行转化输入到下一级。本次测试,输入xin一直为”00000001”经过寄存器,寄存器里面的值全部为”00000001”,加法器输出值位”00000010”经地址码译码可得y1为”11111111”即”ff”其余y均为”00000000”。输入模块功能仿真正确。图12输入模块的RTL视图图13输入模块的功能仿真图3.2.2FIR数字滤波器的LUT模块查找表输入位8位地址码,直接建立LUT的话,LUT规模很大,位28,为节省硬件资源,本设计使用了LUT分割技术,将8线LUT,分为两个4线的LUT,这样可以节省大量的硬件资源,加法器模块将高4位和低4位LUT输出值相加后得到8线LUT的输出值,本文采用的是并行LUT结构。LUT的RTL视图如图14所示,LUT的功能仿真图如图15所示。以5ns输入为例输入的x0-x7均为”00000100”输入结果应该为第四位输出“h(2)”加上高四位输出“0”再拓展一位所得“1fea”,再以9ns输入为例,输入的x0-x7均为”00010000”输入结果应该为第四位输出“0”加数高四位输出“h4”再拓展一位所得“0021”再拓展一位所得“1fea”。仿真结果输出无误。LUT输出为高四位输出加上低四位输出,输入输出关系可以对照表4。图14LUT模块RTL视图图15LUT模块的功能仿真图3.2.3FIR数字滤波器的移位相加模块本模块是为了实现式(12)中的加权相加运算。由于每个的权重均为2的N次方,所以乘以权重可以用移位来进行。移位相加模块的RTL视图如图16所示,其功能仿真图如图17所示。本次测试,输入的八个信号均为“0000000000001”对这个八个信号进行移位相加输出为“000000000000000111111111”结果正确。移位相加模块功能正确。图16移位相加模块RTL视图图17移位相加模块功能仿真图3.2.4FIR数字滤波器顶层仿真M1为输入单元,M2为查找表单元,M3为移位寄存器单元,M4为锁存器单元,FIR数字滤波器的RTL视图如图18所示,其功能仿真图如图19所示。在42ns时,输出结果为ff9f,根据之前的输入验证,该电路完成了卷积。图18FIR数字滤波器的RTL视图图19FIR数字滤波器的功能仿真图4总结本文首先介绍了FIR数字滤波器的研究背景与意义,分析了FIR数字滤波器的国内外研究现状。然后阐述了FIR数字滤波器的基本原理与FIR数字滤波器的线性相位结构及窗函数设计方法。在理解FIR数字滤波器的基本理论与基本结构的基础上,确定了使用分布式算法作为FIR数字滤波器的硬件实现方法。针对当滤波器阶数较高时,LUT规模过大的缺点,使用了分割查找表法来减小LUT的规模,还将FIR数字滤波器设计成线性相位的结构,使得LUT的电路规模进一步减小。最后利用MATLAB对滤波器系数与滤波器的性能参数图进行了提取,并利用VIVADO对FIR数字滤波器进行功能仿真。参考文献李书华.基于DA算法的FIR数字滤波器设计及其FPGA实现[D].湘潭大学,2009.田莎莎.FIR数字滤波器的FPGA最佳实现方法研究[D].中南民族大学,2009.高耀鸿.基于FPGA的FIR低通滤波器[D].湖南大学,2012.解亚南.基于FPGA的数字滤波器的设计研究[D].青岛大学,2016.刘朋全.基于FPGA的FIR数字滤波器的设计和实现[D].西北工业大学,2006何丽娜,叶听,汪伟.数字滤波器(FIR)设计算法研究[J].电声技术,2014,38(02):67-70.冷雪峰.基于FPGA/CPLD器件的FIR数字滤波器设计与仿真[D].燕山大学,2004.王学梅.基于FPGA的有限冲激响应数字滤波器的研究及实现[D].中南大学,2005夏瀑.基于分布式算法的FIR滤波器设计及FPGA实现[D].大连海事大学,2008丁倩.基于FPGA的可调参数FIR滤波系统[D].哈尔滨理工大学,2009.朱效效.基于优化DA算法的高阶滤波器的设计及其FPGA实现[D].安徽理工大学,2016.李建军.基于DA算法的高速FIR滤波器设计及其FPGA实现[D].中北大学,2018.万晨雨.基于LUT的高效能FIR数字滤波器设计与实现[D].电子科技大学,2019刘飞.FIR数字滤波器设计与应用[D].浙江工业大学,2019.王赟松.FIR数字滤波器设计[D].西安电子科技大学,2012.致谢本文的工作离不开老师和同学的大力支持,首先我要特别感谢我的指导老师汪洋副教授,感谢她在我的论文写作和修改过程中给予我的悉心指导和帮助。感谢我的室友,在写论文过程中给予我的鼓励与帮助,有他们一起,写论文的过程中不孤独,与他们一起共同进步。最后感谢我的家人,他们是照亮我前进道路上的明灯,也是我在黑夜里最温暖的避风港湾。他们给予了我极大的关系与支持,特别感谢我的姐姐,给予了我精神上和物质上的大力支持。附录:主要程序清单1.输入模块1.1移位寄存器libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;entityshift_regisport(xin:instd_logic_vector(7downto0);clk:instd_logic;a0,a1,a2,a3,a4,a5,a6,a7,aa7,aa6,aa5,aa4,aa3,aa2,aa1,aa0:bufferstd_logic_vector(7downto0));endshift_reg;architectureBehavioralofshift_regisbeginprocess(clk)beginaa0<=aa1;aa1<=aa2;aa2<=aa3;aa3<=aa4;aa4<=aa5;aa5<=aa6;aa6<=aa7;aa7<=a7;a7<=a6;a6<=a5;a5<=a4;a4<=a3;a3<=a2;a2<=a1;a1<=a0;a0<=xin;endprocess;endBehavioral;1.2预相加libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useieee.std_logic_signed.all;useieee.std_logic_arith.all;entityyujiafaisport(a0,a1,a2,a3,a4,a5,a6,a7:instd_logic_vector(7downto0);aa0,aa1,aa2,aa3,aa4,aa5,aa6,aa7:instd_logic_vector(7downto0);b0,b1,b2,b3,b4,b5,b6,b7:outstd_logic_vector(8downto0));endyujiafa;architectureBehavioralofyujiafaisbeginb0<=(a0(7)&a0)+(aa0(7)&aa0);b1<=(a1(7)&a1)+(aa1(7)&aa1);b2<=(a2(7)&a2)+(aa2(7)&aa2);b3<=(a3(7)&a3)+(aa3(7)&aa3);b4<=(a4(7)&a4)+(aa4(7)&aa4);b5<=(a5(7)&a5)+(aa5(7)&aa5);b6<=(a6(7)&a6)+(aa6(7)&aa6);b7<=(a7(7)&a7)+(aa7(7)&aa7);endBehavioral;1.3地址码libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useieee.std_logic_signed.all;useieee.std_logic_arith.all;entitydizhimaisport(b0,b1,b2,b3,b4,b5,b6,b7:instd_logic_vector(8downto0);y0,y1,y2,y3,y4,y5,y6,y7,y8:outstd_logic_vector(7downto0);clk:instd_logic);enddizhima;architectureBehavioralofdizhimaisbeginprocess(clk)beginy0<=b7(0)&b6(0)&b5(0)&b4(0)&b3(0)&b2(0)&b1(0)&b0(0);y1<=b7(1)&b6(1)&b5(1)&b4(1)&b3(1)&b2(1)&b1(1)&b0(1);y2<=b7(2)&b6(2)&b5(2)&b4(2)&b3(2)&b2(2)&b1(2)&b0(2);y3<=b7(3)&b6(3)&b5(3)&b4(3)&b3(3)&b2(3)&b1(3)&b0(3);y4<=b7(4)&b6(4)&b5(4)&b4(4)&b3(4)&b2(4)&b1(4)&b0(4);y5<=b7(5)&b6(5)&b5(5)&b4(5)&b3(5)&b2(5)&b1(5)&b0(5);y6<=b7(6)&b6(6)&b5(6)&b4(6)&b3(6)&b2(6)&b1(6)&b0(6);y7<=b7(7)&b6(7)&b5(7)&b4(7)&b3(7)&b2(7)&b1(7)&b0(7);y8<=b7(8)&b6(8)&b5(8)&b4(8)&b3(8)&b2(8)&b1(8)&b0(8);endprocess;endBehavioral;1.4输入模块顶层代码libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useieee.std_logic_arith.all;useieee.std_logic_signed.all;entityinput_moduleisport(xin:instd_logic_vector(7downto0);clk:instd_logic;y0,y1,y2,y3,y4,y5,y6,y7,y8:outstd_logic_vector(7downto0));endinput_module;architectureBehavioralofinput_moduleiscomponentshfit_regport(xin:instd_logic_vector(7downto0);clk:instd_logic;a0,a1,a2,a3,a4,a5,a6,a7:bufferstd_logic_vector(7downto0);aa7,aa6,aa5,aa4,aa3,aa2,aa1,aa0:bufferstd_logic_vector(7downto0));endcomponent;componentyujiafaport(a0,a1,a2,a3,a4,a5,a6,a7:instd_logic_vector(7downto0);aa0,aa1,aa2,aa3,aa4,aa5,aa6,aa7:instd_logic_vector(7downto0);b0,b1,b2,b3,b4,b5,b6,b7:outstd_logic_vector(8downto0));endcomponent;componentdizhimaport(b0,b1,b2,b3,b4,b5,b6,b7:instd_logic_vector(8downto0);y0,y1,y2,y3,y4,y5,y6,y7,y8:outstd_logic_vector(7downto0);clk:instd_logic);endcomponent;signalk0,k1,k2,k3,k4,k5,k6,k7,kk7,kk6,kk5,kk4,kk3,kk2,kk1,kk0:std_logic_vector(7downto0);signalc0,c1,c2,c3,c4,c5,c6,c7:std_logic_vector(8downto0);beginU1:shift_regportmap(xin=>xin,clk=>clk,a0=>k0,a1=>k1,a2=>k2,a3=>k3,a4=>k4,a5=>k5,a6=>k6,a7=>k7,aa7=>kk7,aa6=>kk6,aa5=>kk5,aa4=>kk4,aa3=>kk3,aa2=>kk2,aa1=>kk1,aa0=>kk0);U2:yujiafaportmap(a0=>k0,a1=>k1,a2=>k2,a3=>k3,a4=>k4,a5=>k5,a6=>k6,a7=>k7,aa7=>kk7,aa6=>kk6,aa5=>kk5,aa4=>kk4,aa3=>kk3,aa2=>kk2,aa1=>kk1,aa0=>kk0,b0=>c0,b1=>c1,b2=>c2,b3=>c3,b4=>c4,b5=>c5,b6=>c6,b7=>c7);U3:dizhimaportmap(b0=>c0,b1=>c1,b2=>c2,b3=>c3,b4=>c4,b5=>c5,b6=>c6,b7=>c7,clk=>clk,y0=>y0,y1=>y1,y2=>y2,y3=>y3,y4=>y4,y5=>y5,y6=>y6,y7=>y7,y8=>y8);endBehavioral;2.LUT模块2.1低四位LUTlibraryIEEE;useIEEE.STD_LOGIC_1164.ALL;libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;entityLUTisport(xin:instd_logic_vector(3downto0);clk:instd_logic;y:outstd_logic_vector(11downto0));endLUT;architectureBehavioralofLUTisbeginprocess(clk)begincasexiniswhen"0000"=>y<=x"000";when"0001"=>y<=x"006";when"0010"=>y<=x"ffd";when"0011"=>y<=x"003";when"0100"=>y<=x"fea";when"0101"=>y<=x"ff1";when"0110"=>y<=x"fe7";when"0111"=>y<=x"fed";when"1000"=>y<=x"02e";when"1001"=>y<=x"035";when"1010"=>y<=x"02a";when"1011"=>y<=x"031";when"1100"=>y<=x"018";when"1101"=>y<=x"01f";when"1110"=>y<=x"014";when"1111"=>y<=x"01b";whenothers=>y<=x"000";endcase;endprocess;endBehavioral;2.2高四位LUTlibraryIEEE;useIEEE.STD_LOGIC_1164.ALL;entityLUT2isport(xin:instd_logic_vector(3downto0);clk:instd_logic;y:outstd_logic_vector(11downto0));endLUT2;architectureBehavioralofLUT2isbeginprocess(clk)begincasexiniswhen"0000"=>y<=x"000";when"0001"=>y<=x"021";when"0010"=>y<=x"f38";when"0011"=>y<=x"f59";when"0100"=>y<=x"07a";when"0101"=>y<=x"09b";when"0110"=>y<=x"fb2";when"0111"=>y<=x"fb3";when"1000"=>y<=x"414";when"1001"=>y<=x"435";when"1010"=>y<=x"34c";when"1011"=>y<=x"36b";when"1100"=>y<=x"48e";when"1101"=>y<=x"4af";when"1110"=>y<=x"3c6";when"1111"=>y<=x"3e7";whenothers=>y<=x"000";endcase;endprocess;endBehavioral;2.3顶层LUTlibraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useieee.std_logic_arith.all;useieee.std_logic_signed.all;entityLUTmoduleisport(x0,x1,x2,x3,x4,x5,x6,x7,x8:instd_logic_vector(7downto0);clk:instd_logic;y0,y1,y2,y3,y4,y5,y6,y7,y8:outstd_logic_vector(12downto0));endLUTmodule;architectureBehavioralofLUTmoduleissignala0,a1,a2,a3,a4,a5,a6,a7,a8:std_logic_vector(11downto0);signalaa0,aa1,aa2,aa3,aa4,aa5,aa6,aa7,aa8:std_logic_vector(11downto0);signalx01,x11,x21,x31,x41,x51,x61,x71,x81:std_logic_vector(3downto0);signalx02,x12,x22,x32,x42,x52,x62,x72,x82:std_logic_vector(3downto0);componentLUTport(xin:instd_logic_vector(3downto0);clk:instd_logic;y:outstd_logic_vector(11downto0));endcomponent;componentLUT2port(xin:instd_logic_vector(3downto0);clk:instd_logic;y:outstd_logic_vector(11downto0));endcomponent;beginx01(3downto0)<=x0(3downto0);x02(3downto0)<=x0(7downto4);x11(3downto0)<=x1(3downto0);x12(3downto0)<=x1(7downto4);x21(3downto0)<=x2(3downto0);x22(3downto0)<=x2(7downto4);x31(3downto0)<=x3(3downto0);x32(3downto0)<=x3(7downto4);x41(3downto0)<=x4(3downto0);x42(3downto0)<=x4(7downto4);x51(3downto0)<=x5(3downto0);x52(3downto0)<=x5(7downto4);x61(3downto0)<=x6(3downto0);x62(3downto0)<=x6(7downto4);x71(3downto0)<=x7(3downto0);x72(3downto0)<=x7(7downto4);x81(3downto0)<=x8(3downto0);x82(3downto0)<=x8(7downto4);U1:LUTportmap(xin=>x01,y=>a0,clk=>clk);U2:LUT2portmap(xin=>x02,y=>aa0,clk=>clk);U3:LUTportmap(xin=>x11,y=>a1,clk=>clk);U4:LUT2portmap(xin=>x12,y=>aa1,clk=>clk);U5:LUTportmap(xin=>x21,y=>a2,clk=>clk);U6:LUT2portmap(xin=>x22,y=>aa2,clk=>clk);U7:LUTportmap(xin=>x31,y=>a3,clk=>clk);U8:LUT2portmap(xin=>x32,y=>aa3,clk=>clk);U9:LUTportmap(xin=>x41,y=>a4,clk=>clk);U10:LUT2portmap(xin=>x42,y=>aa4,clk=>clk);U11:LUTportmap(xin=>x51,y=>a5,clk=>clk);U12:LUT2portmap(xin=>x52,y=>aa5,clk=>clk);U13:LUTportmap(xin=>x61,y=>a6,clk=>clk);U14:LUT2portmap(xin=>x62,y=>aa6,clk=>clk);U15:LUTportmap(xin=>x71,y=>a7,clk=>clk);U16:LUT2portmap(xin=>x72,y=>aa7,clk=>clk);U17:LUTportmap(xin=>x81,y=>a8,clk=>clk);U18:LUT2portmap(xin=>x82,y=>aa8,clk=>clk);y0<=(a0(11)&a0)+(aa0(11)&aa0);y1<=(a1(11)&a1)+(aa1(11)&aa1);y2<=(a2(11)&a2)+(aa2(11)&aa2);y3<=(a3(11)&a3)+(aa3(11)&aa3);y4<=(a4(11)&a4)+(aa4(11)&aa4);y5<=(a5(11)&a5)+(aa5(11)&aa5);y6<=(a6(11)&a6)+(aa6(11)&aa6);y7<=(a7(11)&a7)+(aa7(11)&aa7);y8<=(a8(11)&a8)+(aa8(11)&aa8);endBehavioral;3.移位相加器libraryieee;useieee.std_logic_1164.all;useieee.std_logic_signed.all;useieee.std_logic_arith.all;entitycuishjialisport(m0,m1,m2,m3,m4,m5,m6,m7,m8:instd_logic_vector(12downto0);clk:instd_logic;y:outstd_logic_vector(23downto0));endcuishjial;architecturearcofcuishjialissignaln0,n1,n2,n3:std_logic_vector(14downto0);signalp0,p1:std_logic_vector(17downto0);signalq:std_logic_vector(22downto0);beginprocess(clk)beginn0<=(m2(12)&m2&'0')+(m1(12)&m1(12)&m1);n1<=(m4(12)&m4&'0')+(m3(12)&m3(12)&m3);n2<=(m6(12)&m6&'0')+(m5(12)&m5(12)&m5);n3<=(m8(12)&m8&'0')+(m7(12)&m7(12)&m7);p0<=(n1(14)&n

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论