《FPGA数字信号处理设计流程》课件第6章_第1页
《FPGA数字信号处理设计流程》课件第6章_第2页
《FPGA数字信号处理设计流程》课件第6章_第3页
《FPGA数字信号处理设计流程》课件第6章_第4页
《FPGA数字信号处理设计流程》课件第6章_第5页
已阅读5页,还剩108页未读 继续免费阅读

下载本文档

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

文档简介

第6章应用实例6.1数字振荡器6.2有限脉冲响应(FIR)滤波器6.3CORDIC算法的原理与运用6.4时延数字正切锁相环6.5本章小结

6.1数 字 振 荡 器

6.1.1用IIR滤波器实现振荡器

我们可以使用IIR滤波器生成正弦波,例如如图6.1.1所示二阶IIR滤波器。图6.1.1用IIR滤波器实现振荡器结构图滤波器的输出为:(6.1.1)分别对等式两边进行Z变换,可以写成:(6.1.2)传递函数可以写成:(6.1.3)(6.1.4)给定b是一个实数,于是p1和p2和可以写成下列极数形式:(6.1.5)考虑到公式(6.1.3)的分子为1,分母为二阶多项式,且最终要输出正弦波,因此要求两个极点位于S坐标的单位圆上,同时用频率来表示极点数值可得如下等式:(6.1.6)(6.1.7)

1.用8位的IIR滤波器实现正弦振荡器

打开实例“sine_wave_iir_8bit.mdl”,位于“C:\SG\example\Oscillators\”路径下,在本实例中,实现一个IIR滤波器,工作在采样频率fs = 100MHz上,并假定图6.1.1中的b=1.75,其数据位宽为8位,如图6.1.2所示。图6.1.2用8位的IIR滤波器实现正弦振荡器结构图于是系统的传递函数为:图6.1.3Z域分析图假定模型sine_wave_iir_8bit.mdl中的所有模块和仿真结果都是理想的,那么输出的应是8.04MHz的正弦波,对模型sine_wave_iir_8bit.mdl进行仿真后可以得到如图6.1.4所示的仿真结果。图6.1.48位的IIR滤波器实现正弦振荡器的仿真结果在使用FPGA进行设计开发时除了考虑设计的性能,还需要考虑硬件资源的使用情况。好的设计能使用极少的资源获得很高的性能,但当模块功能比较复杂时,性能和资源是难以兼顾的,通常在满足设计要求的基础上要求尽量减少硬件资源的使用。同样的模块设计要求,使用不同的硬件资源就有不同的实现方式、不同的性能和不同的资源使用量,遇到这类情况就需要根据整个系统的情况,决定使用何种实现方式。以此IIR滤波器为例,其中包含有两个乘法单元,可以使用FPGA上的嵌入式硬件乘法器实现或用片上的基本逻辑单元来构成。需要注意的是,在本书使用的Spartan-3EFPGA上一共只有20个18×18位的嵌入式硬件乘法器,是相对比较稀缺的资源,本例中仅用到8位位宽,又没有充分发挥嵌入式硬件乘法器的全部性能,如果使用片上的逻辑单元来实现乘法器又需要使用较多的资源,且性能没有使用嵌入式硬件乘法器好,此时就需要从系统设计的角度考虑选择哪种实现方式。表6.1.1和表6.1.2为实现IIR滤波器时使用嵌入式硬件乘法器和不使用嵌入式硬件乘法器两种情况下的硬件资源使用量。表中没有给出CLB的使用量,CLB相对而言还是比较大的逻辑单元,并不能很好地反映资源的使用情况。对比表6.1.1和表6.1.2中的数据不难发现:

使用片上Slices等逻辑单元实现乘法器需要占用较多的资源。

模块的逻辑功能主要由LUTs来实现。

乘法计算比加法计算要复杂很多,因而实现乘法器需要使用更多的资源。

时延环节由触发器来实现。

使用片上嵌入式硬件乘法器实现乘法器能获得较高的处理速度。

2.用12位的IIR滤波器实现正弦振荡器

打开实例“sine_wave_iir_12bit.mdl”(位于“C:\SG\example\Oscillators\”路径下),在本实例中,实现一个采样频率fs = 100MHz的IIR滤波器,并假定图6.1.1中的b=1.75,其数据位宽为12位,如图6.1.5所示。图6.1.512位的IIR滤波器实现正弦振荡器结构图对此模型可以采用前面对8位的IIR滤波器类似的分析方式,并进行仿真,得到如图6.1.6所示的Simulink中的仿真结果。图6.1.612位的IIR滤波器实现正弦振荡器的仿真结果图6.1.6为生成正弦波经快速傅立叶变换后得到的信号频谱图。本模型是一个12位的IIR滤波器,相对于前面8位的IIR滤波器,其在数值的量化过程中的误差要小,因而在仿真结果中可以很明显地看到信号纯度更高,谐波较少,具有更高的性能。

同样将SystemGenerator导出的工程文件在ISE中完成布局布线后得到如表6.1.3和表6.1.4所示的结果。

对比表6.1.3和表6.1.4中的数据不难发现:

加法器所需资源关于数据位呈宽线性增长,涨幅较小。

如果不使用硬件乘法器,乘法器所需资源关于数据位宽呈指数级增长,涨幅较大。

数据吞吐量影响处理速度,且需要更多的硬件资源。6.1.2用查表法实现数控振荡器

数控振荡器通常用查找表来实现,定步长的不断读取正弦查找表中的数值来生成正弦波,当读到表单末尾时再从头开始,从而产生一个周期信号,如图6.1.7所示。图6.1.7用查表法实现数控振荡器结构图图中输入的频率控制信号为一常值,则输出的正弦波频率不变,当频率控制信号变化时输出的正弦波的频率也随之改变。给到正弦查找表的地址为三角波信号,由一个累加器生成,累加器包括一个寄存器和一个加法器,并将计算结果的小数部分丢弃,保留整数部分作为地址。累加器的输入即为频率控制信号,此频率控制信号又可理解为单步步长或相位移。假定作为地址的整数部分有n位,正弦查找表的深度为N,要求2n=N,即当输入的频率控制量为1时将正弦查找表中的所有数据逐个全部输出。并假定此振荡器工作在频率为fclk的时钟上,输入频率控制量为δ,则其输出正弦波的频率为:

1.用查找表实现数控振荡器

打开实例“nco.mdl”(位于“C:\SG\example\Oscillators\”路径下),在本实例中,用查找表实现数控振荡器,系统的时钟频率为50MHz,地址位宽为6,输入频率控制量为1.28,于是其输出频率为:Hz=1MHz图6.1.8设定Convert模块参数用ROM模块作为正弦查找表,其深度(Depth)要与地址位宽一致,如图6.1.9所示。图6.1.9设定ROM模块参数Basic栏参数由图可知,正弦的幅值为0.5,于是定义正弦查找表的输出为带6位小数位且位宽为6的带符号数,如图6.1.10所示。图6.1.10设定Rom模块OutputType栏参数图6.1.11用查找表实现数控振荡器Simulink仿真结构图图6.1.12用查找表实现数控振荡器的仿真结果图6.1.13用查找表实现数控振荡器的频谱图

2.直接数字综合器

在SystemGenerator的XILINXBlockset库中的DSP子库中提供有直接数字综合器(DirectDigitalSynthesizer,DDS)模块,也可用来生成正弦波,其原理与6.2.1节中用查找表实现数控振荡器的原理相同,但在资源使用量和性能方面进行了优化,结构图如图6.1.14所示。图6.1.14直接数字综合器Simulink仿真结构图图6.1.15直接数字综合器仿真结果表6.1.7和表6.1.8为正弦查找表在FPGA硬件实现时分别使用BlockRAM及Distributedmemory时的硬件资源使用情况。

图6.1.13与图6.1.15所示的仿真结果几乎是完全一致的,亦即两者生成的正弦波几乎完全一致。对比表6.1.5~6.1.8四个表中的数据不难发现,无论是由BlockRAM还是由Distributedmemory实现的,DDS模块的使用使得设计性能有了极大提高,并减少了硬件逻辑资源的使用量。使用DDS模块本质上是调用了可配置的DDSIP核,正如第5章中阐述的,调用相关功能的IP核可快速获得现有IP核的功能,对具有一定规格的类似功能模块不需要重复开发,IP核已针对特定结构进行了优化;但IP核并不是总能满足设计要求,需要熟悉IP核的参数和信号,以达到设计要求。 6.2有限脉冲响应(FIR)滤波器

在介绍这一部分实验之前,首先要引入图论的一些相关知识,这是分析这部分实验的基础,有助于理解时延分析。对于一个FPGA设计而言,其运行速度是由整个设计中的最大逻辑延时决定的,假如将设计分割为两个模块,如图6.2.1所示。图6.2.1设计模块分割图6.2.1中,虚线所示即为通过两个模块的最长路径,它决定了整个设计的运行速度。为了保持系统的平衡,在流入割集的分支上加一个延时单元,流出割集的分支上加一个超前单元,如图6.2.2所示。图6.2.2设计割集于是得到如图6.2.3所示结果。

从图6.2.3可以看出,系统的处理速度已经不再是由通过两个模块的最长路径决定的,而是由两个模块分别的最长路径中的最大值来决定的,换句话说,可以将两个模块看成是两个相对独立的系统,这两个系统都有各自的最大逻辑延时,其中的较大者决定当前系统的最大运行速度。图6.2.3中虚线所示分别为两个模块的最长路径,模块二的最长路径即为整个设计的最大逻辑延时,比原有系统小很多。由此可以看出,通过这种方法可以将设计的运行速度提高。

本节将主要介绍关于FIR滤波器的多种不同实施方案,为了能够清楚地说明这些,我们仅仅以简单的4抽头(4tap)的FIR滤波器为例进行实验,如图6.2.4所示。图6.2.3割集后的等价设计图6.2.4标准FIR滤波器结构图6.2.1标准FIR滤波器

打开C:\SG\example\FIR\FIR1\fir1.mdl。

这是一个标准的4抽头的FIR滤波器,其结构可以用图6.2.4表示。

在此结构中,我们使用了三个时延模块,四个乘法器和三个加法器。对此FIR滤波器进行MATLAB仿真,并在ISE中综合,其资源使用情况及运行速度如表6.2.1所示。6.2.2标准FIR滤波器的改进结构

打开C:\SG\example\FIR\FIR2\fir2.mdl。

这是一个根据原有标准FIR滤波器改进后的结构,它是利用图论的相关知识,将标准4抽头的FIR进行如下切割,在每个切割点处,增加一个延时,可得到如图6.2.5所示结构。图6.2.5改进的标准FIR滤波器结构图

对比上面的FIR标准结构,改进结构在切割点处共增加了6个延时,在设计中,延时是通过触发器来实现的。在MATLAB中仿真,指定乘法器为8比特的乘法器,因此通过三个乘法器的数据位宽均为8。两个位宽为8的二进制数据相加后,需要至少9比特的延时模块,同理,两个9比特二进制数据相加,需要至少10比特的延时模块。因此设计中较标准FIR模型增加了33个触发器。由于SystemGenerator在设计过程中的优化作用,FIR的改进形式共需要30个触发器。在处理速度上,改进的FIR滤波器比标准形式提高了很多,由原来的最小周期12.950ns降低到了7.609ns。这是由于,标准4抽头的FIR滤波器结构中的最长路径为一个乘法器和三个加法器,如图6.2.4中虚线所示。但是在切割后的结构中,我们发现,最长路径降到了一个乘法器和一个加法器,如图6.2.5中虚线所示,比原有标准FIR的最长路径短很多,这使得处理速度有了很大的提高。6.2.3转置4抽头FIR滤波器

打开C:\SG\example\FIR\fir_transpose\fir_transpose.mdl。

这是一个转置的4抽头FIR滤波器,其结构如图6.2.6所示。图6.2.6转置FIR滤波器结构图线性信号流图理论中有许多预算处理方法,可在保持输入和输出之间的传输关系不变的情况下,将信号流图变换成不同的形式。转置FIR就是利用流图转置的方法导出的一种转置滤波器的结构,如图6.2.6所示,对此结构的FIR滤波器进行MATLAB仿真,并在ISE中综合,其资源使用情况及运行速度如表6.2.3所示。

对比标准型FIR,转置FIR滤波器虽然在延时单元的使用数量上没有变,仍然是3个,但是触发器的使用数目却由原来的6个增加为24个。这是因为在转置FIR滤波器中,由于在经过延时模块之前,先通过了乘法器,在Simulink中仿真,指定乘法器为8比特的乘法器,因此通过三个乘法器的数据位宽均为8比特,所需三个延时模块的最大位宽分别为8、9、10,经过SystemGenerator优化后的触发器总个数为24个。

在处理速度上面,两种FIR滤波器虽然只是结构上面有所不同,但运行速度却相差很多。分析标准FIR的结构,从x(k)到y(k)的最远路径是一个乘法器和三个加法器,而在转置FIR中,从x(k)到y(k)的最远路径只需经过一个乘法器和一个加法器,如图6.2.6中虚线所示,运行速度得到了大大提高。6.2.4转置4抽头的FIR滤波器的变换结构

打开C:\SG\example\FIR\fir_transpose2\fir_transpose2.mdl。

这是一个改进的转置FIR滤波器,其结构如图6.2.7所示。

此结构为4抽头的转置FIR滤波器的改进结构,即按照图6.2.7所示将其切割,并在每一支路加上一个延时,这样,此结构比4抽头的转置FIR滤波器多4个时延单元,对此结构进行Simulink仿真,并用ISE综合,得到如表6.2.4所示结果。图6.2.7改进的转置FIR滤波器结构图

对比转置4抽头的FIR滤波器,转置4抽头的FIR滤波器的变换结构在其基础上增加了四个延时单元。采用同样的方法进行分析,通过乘法器的数据位宽为8比特,则由乘法器直接进入的四个延时单元的触发器的个数均为8个,另外三个延时单元的触发器个数分别为触发器的个数,即分别为8、9、10,因此总个数从原有的24个增加到52个。

在处理速度上面,转置4抽头的FIR滤波器的变换结构比转置4抽头的FIR滤波器有了很大的提高。分析两种结构的最长路径即可发现,在转置FIR中,最长路径是一个乘法器和一个加法器,但是转置FIR的变换结构中,最长路径仅为一个乘法器,如图6.2.7所示,在处理速度上有了很大的提高。6.2.5使用SystemGenerator现有乘加FIR模块

打开C:\SG\example\FIR\fir_MAC\fir_mac.mdl。

此设计为利用SystemGenerator中现有的乘加FIR模块(n-tapMACFIRfilter模块)搭建而成。其结构如图6.2.8所示。图6.2.8n-tapMACFIRfilter模块仿真结构图图6.2.9n-tapMACFIRfilter模块内部结构图在n-tapMACFIRfilter模块的结构中,CoefficientROM模块定义了4抽头的抽头系数。此结构不同于上述几种结构之处在于,其通过Counter模块的计数控制来实现串行处理,由于该结构为4抽头的滤波器,完成一次滤波运算需要4个时钟周期,因此在输出端口前使用了一个4拍的下采样模块,保证输出为有效数据。结构中的MACEngine为n-tapMACFIRfilter模块的乘加环节,其内部结构如图6.2.10所示。图6.2.10MACEngine模块内部结构图由图6.2.10可以看出,n-tapMACFIRfilter模块采用的是串行处理方式,仅用一个嵌入式乘法器即实现了4抽头的FIR滤波器,节省了大量资源。

由于该设计中所使用的n-tapMACFIRfilter模块是经过优化且具有一定通用性的模块,通过表6.2.5可以发现,该设计的触发器使用量为65,多用于构成流水线结构,其运行速度得到了极大的提高,最大频率提高到了206.441MHz。 6.3CORDIC算法的原理与运用

6.3.1CORDIC算法介绍

CORDIC算法是一种计算旋转坐标的方法。如图6.3.1所示,设起点坐标为(,),终点坐标为(,)。

由三角函数知识,得到旋转后的新坐标(见图6.3.2)为:(6.3.1)图6.3.1CORDIC旋转坐标示意图图6.3.2旋转坐标中后模的变化示意图将cosθ去掉后相当于把旋转后矢量的模减小了,为了保证最终结果的正确,一般在结果后面将乘上一个系数K。如果把θ约束成tanθ =2-i(i=0,1,2,L),则正切项的乘法就演变成简单的二进制的移位运算,每旋转一次,i加1,由于在-π/2~π/2内,无论θ正负,cosθ始终是正值,因而可以将公式(6.3.1)改写为下式:(6.3.2)所以>

事实上也就是说,假设我们从X轴开始旋转,通过一系列逐次减小的角度旋转后,只要迭代的次数足够多,就可以实现-π/2~π/2内任意角度的旋转,并且通过加法和移位运算得到目标的横坐标和纵坐标。每次旋转后得到的实际矢量和目标矢量之间的误差角度(目标角度减去实际角度)如下式:(6.3.3)其中,Z0为目标矢量角度,若Zi>0,则=+1;若<0,则= -1。实际迭代后累计角度为:(6.3.4)其中,a0=0。例如,要实现68°的矢量旋转,我们可以列出第i次迭代对应的旋转角度、旋转方向、迭代后的实际角度和误差角度如表6.3.1所示。

一旦Zi

(°)迭代的次数确定了,Ki也就确定了,Ki的乘积可以在实现时不做处理,而是被当作整个系统处理增益的一部分,实际的增益值取决于迭代次数n。当n趋于无穷大时,的极限值约为1.647。在实现CORDIC算法时,由于当作系统的处理增益不做处理,因此只需要移位、相加运算就可完成矢量旋转,很适合在FPGA中实现。(6.3.5)

1.搭建CORDIC模块的系统

搭建CORDIC模块时,请参看上节中的CORDIC算法介绍。迭代次数越多计算越精确,但同时消耗资源会增加而且系统速度也会受到影响。所以需要根据具体设计的要求来选择迭代的次数,一般来说,迭代次数不高于数据的位宽。打开C:\SG\exercise\CORDIC\CORDIC_deff_6.mdl,如图6.3.3所示。图6.3.3CORDIC参考系统从图6.3.3可以看到,该系统主要分四个大的模块:数据输入模块、参考设计模块、CORDIC设计模块和比较模块。其中输入数据是两个随机数,经过Gatewayin模块后进入参数设计模块和CORDIC设计模块这两个模块计算出来的数据进入比较模块,比较后的误差值作为输出显示。ReferenceDesign模块内部结构图如图6.3.4所示。图6.3.4浮点数计算参考模块从图6.3.4看出,参数设计模块实际是一个浮点数模块,直接计算出的值作为输出。该模块可以脱离SysetemGenerator在Simulink中独立运行,仿真时作为参考模块可以很方便地检验CORDIC模块设计的精度。CORDIC内部结构图如图6.3.5所示。

从图6.3.5看出,CORDIC设计模块主要由6个迭代模块组成,每个迭代模块只是参数设置不一样而已。其中,常数0.72998046875是对坐标旋转后模变化的补偿。图6.3.5CORDIC算法设计模块图6.3.6CORDIC模块与参考模块的比较结果双击SystemGenerator图标,得到SystemGenerator设置如图6.3.7所示。

单击Generate生成工程文件,然后在ISE8.2中对生成的工程文件进行综合,从综合报告中得到预计的消耗资源情况,为了比较方便,具体消耗资源情况将在下一小节中与使用SystemGenerator自带参考CORDIC模块的系统消耗FPGA资源以表的形式给出。图6.3.7SystemGenerator设置对话框

2.使用SystemGenerator自带的参考CORDIC模块的系统

为了方便设计者使用SystemGenerator进行数字系统设计,SystemGenerator系统在XILINXReferenceBlockset目录下提供了一些常用的数字处理模块,只需要简单的参数设置就可直接调用。本实验中就是调用其中的CORDIC计算模块替代上节中搭建的CORDIC计算模块,从试验中大家可以加深对系统自带数字处理模块的理解。

打开C:\SG\exercise\CORDIC\CORDIC_model_deff_6.mdl。

该系统与上面实验不同的地方在于用SystemGenerator中XILINXReferenceBlockset\图6.3.8用SystemGenerator系统自带CORDIC模块算法实现图图6.3.9自带CORDIC模块与参考模块的比较结果生成工程文件综合后,从综合报告中得到耗费资源的情况,与搭建CORDIC计算模块的系统所耗费的资源进行比较,如表6.3.2所示。 6.4时延数字正切锁相环

如图6.4.1所示为传统的数字正切锁相环(DigitalTanlockLoop,DTL)的结构图,由一个Hilbert转换器即90°的相位变换器、两个采样器、一个鉴相器、一个数字环路滤波器和一个数控振荡器构成。两个采样器受控于数字振荡器,同时对输入信号进行采样,采样器的输出信号具有90°的相位差。鉴相器的鉴相功能由函数实现,相位差经由数字滤波器滤波后作为数字振荡器的控制信号决定输出正弦波的周期。不难发现,当输入信号发生频率或相位有跳变时鉴相器输出的相位差信号也会变化,数字滤波器的输出控制信号以及数字振荡器的输出信号周期也会随之改变,因此两个采样器的采样率是随输入信号而改变的,最终达到与输入信号同频率即信号频率锁定。图6.4.1时延数字正切锁相环结构图在FPGA实现数字正切锁相环时,首先需要将模拟模块Hilbert转换器用一个时延环节替换,其余部分保持不变,因此称此锁相环为时延数字正切锁相环(Time-delayDigitalTanlockLoop,TDTL),得到如图6.4.2所示结构图。图6.4.2时延数字正切锁相环结构图6.4.1零阶时延数字正切锁相环

打开实例“TDTL_zero_order.mdl”,位于“C:\SG\example\TDTL\”路径下。本例实现一个零阶时延数字正切锁相环,如图6.4.3所示。图6.4.3零阶时延数字正切锁相环Simulink仿真结果图由图6.4.3可见,用CORDICATAN模块计算arctan[x(k)/y(k)],以实现鉴相器;以两个带使能端的寄存器实现采样器;用一个时延环节实现90°相位的延迟。系统时钟为50MHz,要求锁定的输入信号为以200kHz正弦信号,并在0.0002秒时跳变到220kHz的正弦信号。因此选择延迟量为62(≈50MHz/200kHz×4)个时钟周期。滤波器的结构如图6.4.4所示。图6.4.4零阶滤波器结构图此实例实现的

温馨提示

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

评论

0/150

提交评论