资源描述:
《基于fpga的快速傅立叶 变换(fft)的ip核设计 毕业论文》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
第1页共2页编号:毕业设计说明书题目:基于FPGA的快速傅立叶变换(FFT)的IP核设计题目类型:理论研究实验研究工程设计工程技术研究软件开发2011年6月10日 第1页共2页第2页共2页摘要快速傅立叶变换(FFT)作为时域和频域转换的基本运算,是数字谱分析的必要前提。传统的FFT使用软件或DSP实现,高速处理时实时性较难满足。FPGA是直接由硬件实现的,其内部结构规则简单,通常可以容纳很多相同的运算单元,因此FPGA在作指定运算时,速度会远远高于通用的DSP芯片。FFT运算结构相对比较简单和固定,适于用FPGA进行硬件实现,并且能兼顾速度及灵活性。本文介绍了一种通用的可以在FPGA上实现32点FFT变换的方法。设计复数乘法器为核心设计了FFT算法中的基-2蝶形运算单元,溢出控制单元和地址与逻辑控制模块等其它模块,并以这些模块和FPGA内部的双口RAM为基础组成了基-2FFT算法模块。整个模块采用基-2时域抽取,顺序输入,逆序输出的方法;利用Modelsim完成了FFT模块的前后仿真;利用Matlab编写了用于比较仿真结果和Matlab中FFT函数产生的结果的程序,从而验证了仿真结果的正确性。实验果表明,设计完成的系统能够在保证运算精度和实现复杂度的同时,切实可行地完成设计的总体要求。关键词:FPGA;FFT;IP核;基2;时域抽取 第2页共2页AbstractFastFourierTransform(FFT)asthetimedomainandfrequencydomaintransformationofthebasicoperationsisanecessaryprerequisitefordigitalspectrumanalysis.ThetraditionalFFTimplementationusingsoftwareorDSP,high-speedreal-timeprocessingismoredifficulttomeet.DirectlyfromtheFPGAhardware,anditsinternalstructurerulesaresimple,usuallytoaccommodatemanyofthesameoperationunit,soasspecifiedinFPGAcomputing,thespeedwillbemuchhigherthanthegeneralDSPchips.FFTcomputationstructureisrelativelysimpleandfixed,suitableforhardwareimplementationusingFPGA,andcantakeintoaccountthespeedandflexibility.ThispaperpresentsagenericFPGAcanbeimplementedon32pointsintheFFTtransformmethod.DesignacomplexmultiplierforthecoredesignoftheFFTalgorithmbased-2butterflyunit,overflowcontrolunitandaddresslogiccontrolmoduleandothermodules,andwithinthesemodulesandFPGA-baseddual-portRAMformedthebase-2FFTalgorithmmodule.Whenthemoduleisthebase-2domainextraction,theorderofinput,outputreversemethod;useModelsimbeforeandafterthecompletionoftheFFTmodulesimulation;preparedusingMatlabandMatlabsimulationresultsforthecomparisonfunctionintheFFTresultoftheprocedurestoverifythecorrectnessofthesimulationresults.Experimentalresultsshowthatthedesigniscompletedthesystemcanensuretherealizationofthecomplexityofcomputingprecisionandthesametime,practicalcompletionoftheoveralldesignrequirements.Keywords:FPGA;FFT;IPcore;Base-2;Time-domainextracti 第1页共2页目录引言11FPGA的基础知识21.1FPGA的简介21.2FPGA的基本结构和设计原则21.3开发流程和开发软件简介41.4VerilogHDL简介51.4.1Verilog概述51.4.2VerilogHDL的优点62IP核的制作72.1IP的基本特征72.2IP开发流程72.2.1IP设计的四大阶段72.2.2IP验证的主要过程82.3IP的规格定义92.3.2IP的打包提交92.4IP集成102.5IP集成的一般考虑102.5.1IP集成的关键技术102.6IP模块的评估与选择113FFT算法原理113.1FFT的主要算法113.1.1基-2FFT算法123.1.2基-2FFT算法基本原理124FFT处理器的FPGA的实现194.1整体设计194.2FFT处理器的工作过程204.3引脚说明204.4存储单元224.5旋转因子单元234.6原理与算法244.7逻辑控制模块26 第2页共2页5FFT系统仿真测试275.1FPGA前端设计275.1.1算法验证和RTL设计275.1.2仿真与综合285.1.3静态时序分析295.2FFT处理器的资源利用情况305.3仿真结果及分析315.3.1实线性信号的仿真325.3.2实单频正弦信号的仿真325.3.3实双频正弦信号的仿真335.3.4复单频正弦信号的仿真34总结35 第38页共38页引言在数字化高速发展的今天,对数字信号处理高速实时的要求也不断提高。因此为了满足这些要求,国内外都在研究实现数字信号处理的新方法,本论文主要研究基于FPGA的方法来实现FFT算法,并通过对算法结构的内部优化设计使其相较于传统的实现方法更具优势。快速傅立叶变换(FFT)是DFT的快速算法,是数据从时域到频域变换的基本运算。它是频谱分析的必要前提,是数字信号处理的核心工具之一。所以FFT在众多学科领域,例如数字语音编码、雷达信号处理、声纳信号分析、数字滤波、射电干涉等都有着十分广泛的应用。尤其是在要求较高的信号处理系统中,FFT的处理速度往往是整个系统设计性能的关键。[1]软件实现FFT运算速度慢,无法满足实时高速的系统性能要求。硬件实现FFT的方式主要有三种:通用数字信号处理器(DSP)、专用的FFT芯片(ASIC)、可编程逻辑器件(以FPGA为代表)。采用DSP方案通过软件编程来实现运算,虽然灵活性强,但是受到DSP本身性能及程序指令顺序执行的限制难以实现高速、大规模的FFT运算,同时也存在速度和精度之间的矛盾:若采用定点运算,舍入误差会降低最终处理结果的精度;若采用浮点运算,可以消除动态范围局限的问题,但由于实现结构复杂使处理速度难以达到要求,而且系统造价较高。采用ASIC芯片虽然可以达到较高的处理速度,但是灵活性差,特别是使用定制的大规模集成电路的时候,需要较高的开发和研制费用,不易扩展。随着超大规模可编程门阵列的迅速发展,新一代FPGA内部有高速数字信号处理(DSP)模块和大容量、高速RAM模块,这为利用FPGA实现FFT处理成为可能,既避免了软件方式所带来的速度方面的限制,又可以降低开发的成本和周期,是一种较为理想的开发方式。FPGA以高性能、高灵活性、友好的开发环境、在线可编程等特点可以使基于FPGA的设计满足实时数字信号处理的要求[2~4]。高速实时数字信号处理对系统性能要求甚高,因此,几乎所有的通用DSP都难以实现这一要求。可编程逻辑器件允许设计人员利用并行处理技术实现高速信号处理算法,并且只需单个器件就能实现期望的性能。在数据通信这样的应用中,常常需要进行高速、大规模的FFT及其逆变换IFFT运算。当通用的DSP无法达到速度要求时,唯一的选择是增加处理器的数目,或者采用定制门阵列产品。现在,随着微电子技术的发展,采用现场可编程门阵列(FPGA)进行数字信号处理发展迅猛。采用现场可编程器件不仅加快了产品上市时间,还可满足现在和下一代便携式设计所需要的成本、性能、尺寸等方面的要求,并提供系统级支持。FPGA是直接由硬件实现的,其内部结构规则简单,通常可以容纳很多相同的运算单元,因此FPGA在作指定运算时,速度会远远高于通用的DSP芯片。FFT运算结构相对而言比较简单和固定,适于用FPGA进行硬件实现,并且能兼顾其速度及灵活性。而采用DSP方式有很大的浪费,同时DSP芯片内部的乘法器资源 第38页共38页十分有限,FFT算法中乘法量较大,在实现实时处理方案时必须使用多个DSP芯片,从而提高了价格、增加了功耗和体积。而选择内部嵌有多个乘法器内核的FPGA芯片就可以很轻易地消除这一严重的资源浪费现象。尤其是近年来,高密度的可编程逻辑器件FPGA的集成度、速度不断提高,设计、调试手段更加完善,因而得到更为广泛的应用。本论文就是在这样一个背景下提出一种基于FPGA的32点基-2FFT算法的具体实现方法。旨在设计出用FPGA实现的、具有高速特点的、可实现定点FFT运算的IP核,从而满足系统要求。1FPGA的基础知识1.1FPGA的简介FPGA是英文FieldProgrammableGateArray的缩写,即现场可编程门阵列,相对其他可编程器件具有更高的集成度、更强的逻辑实现能力和更好的设计灵活性。FPGA由许多独立的可编程逻辑模块组成,用户通过编程将这些模块连接起来实现不同的设计,作为专用集成电路(ASIC)领域中的一种半定制电路,它既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。采用FPGA设计ASIC电路,用户不需要投片生产,就能得到可用的芯片;FPGA可做其它全定制或半定制ASIC电路的中试样片,内部有丰富的触发器和I/O引脚资源,设计周期最短、开发费用最低、风险小,采用高速CHMOS工艺,功耗低,可以与CMOS、TTL电平兼容。可以说,FPGA芯片是小批量系统提高系统集成度、可靠性的最佳选择之一。现在FPGA已经成功地应用于计算机硬件、工业控制、遥感遥测、达声纳、数据处理、智能仪表、广播电视和医疗电子等多种领域中。现代通信中,FPGA已经成功地用作程控交换、数字复接、压缩扩张、编译码和调制解调等。因此,在进入20世纪90年代以后,FPGA已成为半体集成电路中销售量增长最快的部分,它的前景也必将十分广阔。1.2FPGA的基本结构和设计原则1985年,Xilinx公司推出了世界上第一款FPGA,后来虽然生产厂家和产品种类众多,但它们的基本组成大致相同。FPGA由逻辑功能块排成阵列组成,并由可编程的互连资源连接这些逻辑功能块以及相应的输入/输出单元来实现不同的设计。其中,FPGA的功能由逻辑结构的配置数据决定。工作时,这些配置数据存放在片内的SRAM或熔丝上。用户可以控制加载过程,在现场修改器件的逻辑功能,即所谓的现场编程[7]。FPGA采用了逻辑单元阵列LCA(LogicCellArray)这个新概念,包括可配置逻辑模块CLB(ConfigurableLogicBlock)、输入输出模块IOB(InputOutputBlock)和互连资源 第38页共38页ICR(InterconnectCapitalResource)及用于存放编程数据的静态存储器SRAM(StaticRandomAccessMemory)。FPGA的基本结构如图1.1所示。CLB阵列实现用户指定的逻辑功能,它们以阵列的形式分布在FPGA中;IOB为内部逻辑与器件封装引脚之间提供了可编程接口,它通常排列在芯片四周;可编程互连资源分布在CLB的空隙,互连资源可以编程配置在模块之间传递的信号网络,用于实现各个CLB之间、CLB与IOB之间以及全局信号与CLB和IOB之间的连接。FPGA利用可编程查找表实现逻辑块;程序控制多路复用器实现其功能选择。图1.1FPGA的基本结构除了上述构成FPGA基本结构的四种资源以外,一般在FPGA中还可能包含以下可选资源:存储器资源(块RAM,分布式RAM、ROM);数字时钟管理单元(分频/倍频,数字延迟,时钟锁定);算术运算单元(高速硬件乘法器,乘加器);多电平标准兼容高速串行的I/O接口;特殊功能模块(以太网等硬IP核);微处理器(如PowerPC405等硬处理器IP核)。FPGA设计的一个重要指导原则是:面积和速度的平衡与互换。这里的“面积”是指一个设计消耗FPGA的逻辑资源的数量,而“速度”是指设计在芯片上稳定运行时所能够达到的最高频率。这两个指标贯穿着FPGA设计的始终,是对设计质量评价的终极标准。要求一个设计同时具备设计面积最小,运行频率最高是不现实的。更科学的设计目标应该是在满足设计时序要求(包含对设计频率的要求)的前提下,占用最小的芯片面积。或者在所规定的面积下,使设计的时序余量更大,频率跑得更高。这两种目标充分体现了面积和速度的平衡的思想,它们是和产品的质量和成本直接相关的。当两者发生冲突的时候,就要考虑面积和速度互换的问题了。我们在设计中应该综合考虑这两方面的要求,根据具体问题的需求设计出最合理的方案。 第38页共38页1.3开发流程和开发软件简介FPGA设计的一般流程包括设计准备、设计输入、功能仿真、设计处理、时序仿真、器件编程与测试几个步骤。设计流程图如图1.2所示。图1.2设计流程图(1)设计准备在对可编程逻辑器件的芯片进行设计之前,首先要进行方案论证、系统设计和器件选择等设计准备工作。(2)设计输入主要输入方法包括硬件描述语言和原理图,另外结构向导(ArchitectureWizard)和核生成器(CoreGenerator)可以辅助设计输入。(3)功能仿真功能仿真没有器件内部逻辑单元和连线的实际延时信息,只是初步验证系统的逻辑功能。(4)设计处理实现包括优化、综合、布局布线、时间参数提取,同时产生各种报告和文件。(5)时序仿真时序仿真中使用了电路延时的最坏情况,分析时序关系,检查和消除竞争冒险,并对器件的实际工作性能进行估计。(6)器件编程与测试设计实现以后,建立FPGA可识别文件,将编程数据下载到相应的FPGA器件中去。在FPGA设计的各个环节都有不同公司提供的不同的EDA工具,一般由FPGA厂商提供集成开发环境,如Altera公司的MaxplusII、QuartusII和Xilinx公司的ISE。为了提高设计效率,优化设计结果,很多厂家还提供了各种专业软件,用以配合FPGA芯片厂家提供的工具进行更高效的设计。对于优化和综合,如Synplicity公司的synplify软件和Synopsys公司的FPGAexpress软件。利用Model公司的Modelsim软件可以完成仿真工作。 第38页共38页本设计中要用到开发软件MaxplusII和仿真软件Modelsim。MaxplusII是Altera公司推出的第三代PLD开发系统(Altera第四代PLD开发系统为Quartus,主要用于设计6万~100万门的大规模CPLD/FPGA)。通过此开发软件,用户可以任意对芯片进行编程、加密或用软件代替硬件,以满足自己的设计需要。但用户需要更改设计时,又可以方便地将以前的配置擦除,重新进行配置,从而大大提高了设计速度。MaxplusII提供了原理图输入、文本输入(采用HDL语言)和波形输入等多种输入手段,并可以把这些输入方式任意组合使用。利用该工具所配备的编辑、编译、仿真、综合、芯片编程等功能,可将设计电路图或电路描述程序变成基本的逻辑单元写入到可编程的芯片中(如FPGA芯片),做成ASIC芯片。Modelsim软件是由Model公司开发的工业上最通用的仿真器之一,简单易用,且逻辑仿真功能强大。Modelsim软件还支持VHDL和Verilog混合仿真,无论是FPGA/ASIC设计的RTL级和门级电路仿真还是系统的功能仿真都可以用它来做,编译仿真速度快,编译的代码与平台无关,便于保护IP核,具有个性化的图形界面和用户接口,为用户加快调错提供强有力的手段,全面支持VHDL和Verilog语言的IEEE标准。1.4VerilogHDL简介1.4.1Verilog概述随着EDA技术的发展,使用硬件描述语言设计CPLD/FPGA成为一种趋势。目前最主要的硬件描述语言是VHDL和VerilogHDL。VHDL发展的较早,语法严格,而VerilogHDL是在C语言的基础上发展起来的一种硬件描述语言,语法较自由。VHDL和VerilogHDL两者相比,VHDL的书写规则比VerilogHDL烦琐一些,但VerilogHDL自由的语法也容易让少数初学者出错。国外电子专业很多会在本科阶段教授VHDL,在研究生阶段教授VerilogHDL。它们的共同特点是利于由顶向下设计,利于模块的划分与复用,可移植性好,通用性好,设计不因芯片的工艺与结构的变化而变化,更利于向ASIC的移植。VerilogHDL语言最初是于1983年由GatewayDesignAutomation公司为其模拟器产品开发的硬件建模语言。那时它只是一种专用语言。由于其模拟、仿真器产品的广泛使用,VerilogHDL作为一种便于使用且实用的语言逐渐为众多设计者所接受。在一次努力增加语言普及性的活动中,VerilogHDL语言于1990年被推向公众领域。OpenVerilogInternational(OVI)是促进VerilogHDL发展的国际性组织。1992年,OVI决定致力于推广VerilogOVI标准成为IEEE标准。这一努力最后获得成功,VerilogHDL语言于1995年成为IEEE标准,称为IEEEStd1364-1995。完整的标准在VerilogHDL硬件描述语言参考手册中有详细描述。VerilogHDL是一种硬件描述语言,用于从算法级、门级到开关级的多种抽象设计层次的数字系统建模。被建模的数字系统对象的复杂性可以介于简单的门和完整的电子数字系统之间。数字系统能够按层次描述,并可在相同描述中显式地进行时序建模。Verilog 第38页共38页HDL语言具有下述描述能力:设计的行为特性、设计的数据流特性、设计的结构组成以及包含响应监控和设计验证方面的时延和波形产生机制。所有这些都使用同一种建模语言。此外,VerilogHDL语言提供了编程语言接口,通过该接口可以在模拟、验证期间从设计外部访问设计,包括模拟的具体控制和运行。1.4.2VerilogHDL的优点数字信号处理(DSP)系统的研究人员一直在努力寻找各种优化的算法来解决相关的信号处理问题。当他们产生了比较理想的算法思路后,就在计算机上用C语言或其他语言程序来验证该算法,并不断修改以期完善,然后与别的算法作性能比较。在现代通信和计算机系统中,对于DSP算法评价最重要的指标是看它能否满足工程上的需要。而许多工程上的需要都有实时响应的要求,也就是说应需要数字信号处理(DSP)系统在限定的时间内,如在几个ms甚至于几个μs内,对所输入的大量数据完成相当复杂的运算,并输出结果。这时如果我们仅仅使用通用的微处理器,即使是专用于信号处理的微处理器,往往也无法满足实时响应的要求。因此,不得不设计专用的高速硬线逻辑来完成这样的运算。设计这样的有苛刻实时要求的复杂的高速硬线运算逻辑是一件很有挑战性的工作,即使有了好的算法而没有好的设计工具和方法也很难完成。传统的数字电路设计方法是采用电路原理图输入法。当时的系统设计规模比较小,也比较简单,其中所用到的FPGA或ASIC设计工作往往只能采用厂家提供的专用电路图输入工具来进行。为了满足设计性能指标,工程师往往需要花费好几天或更长的时间进行艰苦的手工布线。此外,工程师还得非常熟悉所选器件得内部结构和外部引线特点,才能达到设计要求。这种低水平的设计方法大大延长了设计周期。采用VerilogHDL设计电路时,由于它的标准化,可以很容易的把完成的设计移植到不同厂家的不同芯片中,并且在不同规模应用时可以比较容易地进行修改,以适应不同规模的应用。采用VerilogHDL设计电路的最大优点其实就是它的与工艺无关性,这就使得工程师在功能设计、逻辑验证阶段不必过多考虑门级及工艺实现的细节,只要利用系统设计时对芯片的要求,施加不同的约束条件,即可设计出实际的电路,大大减轻了工程师的劳动强度。VerilogHDL和传统的原理图输入方法的关系就好比是高级语言和汇编语言的关系。VerilogHDL的可移植性好,使用方便,但效率不如原理图;原理图输入的可控性好,效率高,比较直观,但设计大规模CPLD/FPGA时显得很烦琐,移植性差。在真正的CPLD/FPGA设计中,通常建议采用原理图和VerilogHDL结合的方法来设计,适合用原理图的地方就用原理图,适合用VerilogHDL的地方就用VerilogHDL,并没有强制的规定。在最短的时间内,用自己最熟悉的工具设计出高效,稳定,符合设计要求的电路才是我们的最终目的。由于VerilogHDL的设计方法与工艺无关,因此大大提高了Verilog 第38页共38页HDL模型的可重用性。通常把功能经过验证的、可综合的、实现后电路结构总门数在5000门以上的VerilogHDL模型称为“软核”(SoftCore),由软核构成的器件成为虚拟器件。在电路的设计过程中,利用软核和虚拟器件的可重用性,可以大大缩短设计周期,加快了复杂电路的设计速度。2IP核的制作2.1IP的基本特征 IP的本质特征是可重用性,其通常必然满足以下基本特征:一是通用性好,二是正确性有100%的保证,三是可移植性好。通用性好是指IP的功能在某一应用领域广泛通用,IP的实现一般满足子功能可配置、甚至可编程的特点,如最常见的IP嵌入式CPU模块就具有非常好的通用性。正确性有百分之百的保证是指IP的实现严格遵守一系列的可重用设计开发规范,IP的验证用例具有完备性,功能覆盖率、测试覆盖率都能够达到100%;并能够完全覆盖IP工作的临界条件,提供相应的大流量测试、随机性测试、甚至能够提供软硬件协同仿真的测试环境等。可移植性好是指IP的实现如行为描述、网表、GDSII文件具有可移植性,其设计输入可以在不同的开发平台上重现;综合用批处理文件具有可移植性,IP的综合结果可以用不同的综合工具,在不同的综合库条件下正确重现;仿真用测试用例可重用,测试环境可以很方便的重现,IP的验证可以用不同的仿真器,在不同的仿真库条件下重现。2.2IP开发流程 IP开发的流程主要包括两条主线:IP设计和IP验证。IP设计流程一般可划分为确定规格和模块划分、子模块的定义和设计、顶层模块的设计、产品化等四个阶段。IP验证流程包括了建立参照模型、建立测试平台和准备验证用例、回归测试、形式验证。2.2.1IP设计的四大阶段(1)确定规格和划分模块IP的规格至少包含以下内容:概述、功能需求、性能需求、物理需求、详细的结构模块框图、对外系统接口的详细定义、可配置功能详细描述、需要支持的制造测试方法、需要支持的验证策略等。确定规格的过程一般又包括行为建模进行功能论证,可行性分析就性能和成本进行折中等活动。划分模块是指规划师在给出IP结构模块框图的同时,对于每个子模块给出一个详细的功能描述,同时必须明确子模块之间的接口的时序要求。只有规划好,才能够建设好。确定规格和划分模块是IP开发是否成功最为关键的一步。(2)子模块定义和设计 第38页共38页设计小组对所有子模块的规格进行讨论和审查,重点检查时序接口和功能接口的一致性。设计者编写时间约束文件、综合的批处理文件、子模块验证用测试平台(testbench)和测试套件(testsuite)等。当这些工作完成并通过代码规范性检查、测试覆盖率检查、功能覆盖率检查、性能分析包括DFT、STA检查、功耗分析检查等验收以后,这个子模块就可用来与其他模块一起集成了。(3)顶层模块设计顶层模块的设计就是把子模块集成起来,产生顶层模块,并对它做综合处理和功能验证。综合过程包括编写综合的批处理文件,在不同的参考库上综合,针对在制造上的可测试性插入扫描链、ATPG,并进行最终的性能分析和功耗分析等。验证过程包括根据由行为模型发展来的测试向量对顶层模块进行仿真测试,针对IP模块的可配置选项进行多种配置条件下的回归测试,利用仿真工具检验测试向量的覆盖率等。(4)IP的产品化 IP产品化的过程包括以下几个部分:提供IP设计和验证用testbench,用商用转换器进行打包提交,但转换后需要重新验证,比如做回归测试以确保转换有效,并强调在几个主流仿真器上做仿真,在几种主要工艺库上做综合,做门级仿真,做形式验证以保证网表和RTL级的一致性,产生或更新用户文档等。如果是硬IP的开发,还需要在顶层模块(软IP)的基础上进行布局布线,版图提取,时序分析和形式验证,集成到试用该IP的原型芯片内进行试制投片,并在演示板上得到验证。2.2.2IP验证的主要过程(1)建立参照模型 这里的参照模型主要用于对系统功能进行验证以及和RTL模型的对照验证,是验证方法学提出的范畴。该模型可用SystemC/SpecmanE/Vera/Verilog/VHDL等语言来构造;(2)测试平台的建立 测试平台的建立是指与子模块设计并行,由验证组的一些成员开始搭建验证环境和开发测试用例,并针对IP的行为级模型对测试环境和测试用例进行调试,从而同步准备好用来仿真测试RTL级IP的验证环境和测试用例。(3)回归测试 回归测试解决的问题是设计在修改一个错误的同时,却引入了另外一个错误。回归测试保证在修改一个错误或加入一个新功能时,已经验证过的基本功能仍然正确。验证工程师应该注意在验证过程中找到一个错误,或加入一个新的功能时,要把它们对应的测试用例及时加入到我们的回归测试集中。(4)形式验证 第38页共38页 形式验证是一种系统级的验证手段,不需要测试向量,而是根据“静态”地通过判断两个设计是否等价来确认它们的功能是否一致,因此,形式验证必须事先有一个参照设计。在IP验证过程中,前面建立的参照模型就是我们的参照设计。形式验证常用来判断一个设计更改后和更改前实现的功能是否一致。同时,形式验证也被用来确认综合后、插入扫描链后、版图提取后网表实现的功能前后是否一致。2.3IP的规格定义IP模块的规格定义必须能够解决以下问题:一是明确IP需要提供什么样的功能,性能需要达到什么样的技术指标。二是定义好IP模块与外部系统的接口。三是定义好该IP模块在可移植性方面所做的努力。四是定义好IP模块的面积和功耗等物理特性。这里我们只重点探讨IP与外部系统接口标准化的问题。 为了使开发的IP能够高效的集成到新的设计中去,标准化是必由之路。这包括IP模块接口的标准化,IP封装的标准化等内容。方便快捷的连接各虚拟器件的方法是片上总线。然而太多的总线专利在使用,没有一个完美的片上总线能适应所有的情况。这是因为片上系统的环境和性能需求差异非常大。国际上VSIA组织的一个片上总线工作组先定义了各种片上总线的属性,然后定义了能够连接各种片上总线的VirtualComponentInterface。IP模块接口只要遵从VCI规范标准,就能用一个接口设计而适应多个不同的片上总线。2.3.1IP的验证 IP的验证必须是完备的、具有可重用性的。IP验证的完备性首先要求在设计IP仿真测试方案时必须体现出以下几个方面:1.从IP的规格出发,对每一个模块测试功能点(testfeature)进行分析,定义每个子模块的仿真测试目标,并确定哪一个测试向量可以验证该测试功能点。2.整理一个明确的测试列表,包括对目标的估计的和测试覆盖情况。3.对测试用例的详细设计,并定义验证通过的标准。其次,IP的验证必须覆盖以下测试类型:一致性测试、回归测试、边界条件测试、长时间随机测试、实际应用环境测试等。IP验证的测试覆盖率、功能覆盖率都需达到100%。IP验证的可重用性首先要求搭建的IP仿真环境是由一系列可重用的测试组件构成的,如定义总线功能模型,通用的数据处理任务集等。对每一个组件,都应该有关键特征的描述。其次,IP验证要求列出采用的仿真器、仿真库及其版本。2.3.2IP的打包提交IP打包技术是指在IP开发基本结束后,将零散分布的设计信息集成的过程。其主要目的是使得设计者提供完整、清晰、明了的设计信息。软IP开发者提交给用户的信息至少应包括:(1)可综合的HDL代码和它的子模快;(2)综合脚本文件及时间约束文件;(3)插入扫描链和做ATPG的脚本文件;(4 第38页共38页)综合和仿真用参照库模型;(5)验证中使用的总线功能模型和其他的系统组件型;(6)测试激励文件及相应测试向量;(7)用户文档包括用户手册/功能描述、数据手册等;(8)应用要点,包括该IP使用的具体的例子,可配置特性等。对需要软件支持的IP,还应该提供相应的嵌入式软件信息。2.4IP集成IP集成面临着一系列的挑战。在现实的市场上,很少的IP模块是可以立刻重复使用的,因为许多IP在设计之初都是针对特定的应用,而很少考虑到要与外来电路搭配使用。IP模块本身的缺陷给IP集成带来的一系列问题有:IP模块的接口不能够和系统芯片(SoC)定义的片上总线很好地匹配,IP模块提供的验证模型如BFM等很难集成到SoC的验证环境,IP模块提供的技术文档不完善,IP模块提供的技术支持不充分、不及时等。这些问题的关键在于IP的定义没有一个通用的接口标准,这是因为芯片实现的功能千差万别,性能方面的要求也由于应用领域的差异而不同,即使同样功能的IP模块在速度、面积、功耗、对外接口等方面也表现各异。国际上,一些大公司的解决办法是逐步定义公司内部甚至是几个公司间通用的片上总线标准,这方面最著名的是国际上的VSIA组织。一些专业IP公司的解决办法是建立单一的开发平台,专注于某一个的应用领域提供不断完善的IP模块和设计服务。我们认为,成功的IP集成必须解决好以下问题。2.5IP集成的一般考虑首先,在系统结构设计做好模块划分时,必须考虑好系统芯片采用什么样的片上总线结构,确定哪些模块是可以来自于IP库,哪些模块需要购买IP,IP模块的对接需要增加哪些连接性设计。哪些模块需要从头开始设计。其次,模块间的接口协议要尽可能简单,模块间的接口定义尽可能与国际上通用的接口协议完全一致。一个常用的设计技巧就是在数据传送的接口建立申请和应答机制。这虽然会造成芯片在时序、面积、功耗等方面的损耗,但对于加快系统芯片的上市速度大大有利。第三,要注意积累IP和IP集成的经验。一旦成功地集成了一个IP到一个系统设计,设计组会对该IP的接口特性非常熟悉。这时候就应该进一步完善该IP,使之对下一个设计的可重用性更好,并逐步建立一系列的衍生IP模块;同时,把集成该IP的经验教训及时记录下来形成技术文档,这将对下一个IP集成者大大有利。 第四,如果是对应IP的集成,还必须在时钟分布,关键路径的走线,电源、地线的走线,IP模块支持的测试结构等方面考虑与系统芯片保持一致。2.5.1IP集成的关键技术 第38页共38页IP集成的关键在于建立正确、高效、灵活的片上总线结构,构造以功能组装为基础的芯片开发模型。片上总线技术是IP集成的关键技术。片上总线技术包括两个方面,一是选用国际上公开通用的总线结构,二是根据特定领域开发的需要自主开发片上总线。国际上比较成熟的总线结构有PCI总线、ARM公司的AMBA总线、IBM公司提出的ProcessorLocalBus,On-ChipPeripheralBus,DeviceControlRegisterBus等。片上总线的开发我们还不熟悉,需要进一步跟踪和探讨。值得注意的是在确定片上总线结构时,并不排斥在IP模块内部做一些接口转换的设计,问题是这种设计的内容要尽可能简单。2.6IP模块的评估与选择IP的评估是指通过一个完整的Checklist来系统地检查IP设计。评测分为系统设计、编码、综合和验证等不同部分进行,并根据评测规则的重要程度为不同的规则检查分配不同的权值。这样在评测之后,就可以直观地看出整个设计的可重用性和分别在每一部分上的得失。它有助于设计者和管理者了解一个设计的可重用程度,以帮助体系结构的设计工程师针对性能、规模、成本和功耗等不同方面来评估IP模块。目前业界比较具有影响力的评测标准是由Synopsys和Mentor联合开发推行的、基于RMM的OpenMORE评测标准。选择IP模块时首要考虑的因素是IP与目标系统的配合程度。一般说来,在进行集成之前,最好选择那些无需修改的IP模块。但是如今的大多数情况是设计人员在获得了IP模块后必须进行修改,修改的范围包括各个设计层次上的IP模型。这种修改会耗费大量的时间和资源,不仅会耽误产品的研发进度,还会给整个设计流程引入风险,并让IP厂商的支持变得困难重重。虽然某种程度的修改是不可避免的,但是如果设计人员能够牺牲一点芯片面积或功能来换取尽可能少地修改IP模块,那么情况就会有所改善。即使某些模块的功能可能超过了系统的需求,但是为了尽量少地进行IP的修改,我们也应该在某些不太重要的功能上做出妥协,以便直接使用一些我们需要的功能模块。选择IP模块时必须考虑的另外一个重要因素是:评估IP模块的品质、集成的方便程度和可重用性,并考虑IP提供者所能提供的技术支持程度等。如:使用手册的内容是否详尽完备、是否提供完整的设计和验证环境,是否有成功集成的先例,接口定义标准的遵从程度、未来发展升级的可能性、获取IP授权的效率以及合作厂商的可信赖程度等。3FFT算法原理3.1FFT的主要算法FFT算法并不是一种新的理论算法,它只是用来计算DFT的快速算法,所以它是以DFT为基础的。本课题采用的是基-2FFT算法实现的,所以会详细介绍基-2 第38页共38页FFT算法。基-2FFT算法是目前应用最为广泛的一种FFT算法,并且得到了很好的实际效果。3.1.1基-2FFT算法长度为N的有限长序列x(n)的DFT的表达式为(3-1)x(n)在一般情况下是为复数序列的。如果直接按(3-1)式计算X(k)值,那么对于某一个k值而言,需要N次复数乘法和(N-1)次复数加法。那么对于N个k值,一共需要次复数乘法以及N(N-1)次复数加法运算。当N>>1时,N(N-1)≈。从上面的说明中可以看出,N点DFT的乘法和加法运算次数均与成正比。当N较大时,运算量是十分庞大的。如果N取32,那么将达到1024。如此巨大的计算量对于实时信号处理来说其运算速度是难以达到的。所以要想使得DFT在各种科学和工程计算中得到广泛的应用就必须想办法减少其运算量。在前面已经讲到,N点DFT的复乘次数等于。其实一个N点DFT可以看做是由几个较短的DFT组成的。基于这一思想,可以将N点DFT分解为几个较短的DFT,这样一来乘法次数将大大减少,能够非常明显地降低DFT的运算量。此外,旋转因子具有明显的周期性和对称性。其周期性表现为:(3-2)其对称性表现为(3-3)不断的把长序列的DFT分解成几个短序列的DFT,并且利用的周期性和对称性来减少DFT的运算次数,这就是FFT算法的基本思想。比较常用的FFT算法有基-2FFT和基-4FFT两种。基-2FFT中的基2指的是N=,即有限长序列的长度N要到等于2的整数次幂)。下面就以8点的FFT为例详细分析基-2FFT算法。3.1.2基-2FFT算法基本原理基-2FFT算法基本上分为时域抽取法FFT(DIT-FFT)和频域抽取法FFT(DIF-FFT)两大类。由于这两种算法的基本原理是相同的,所以下面主要介绍DIT-FFT算法。本课题采用的就是DIT-FFT这一算法。设序列x(n)的长度为N,并且有以下的条件成立,M为自然数(3-4) 第38页共38页x1(r)和x2(r)是x(n)按n的奇偶性分解成的两个N/2点的子序列,如下式所示,(3-5),(3-6)那么x(n)的DFT为(3-7)由于(3-8)所以(3-9)=0,1,…,N-1其中X1(k)和X2(k)分别为x1(r)和x2(r)的N/2点DFT,即(3-10)(3-11)又由于X1(k)和X2(k)都是以N/2为周期,且(3-12)所以X(k)又可以表示为如下所示的表达式(3-13)(3-14)这样一个N点的DFT就被拆分成为了两个N/2点的DFT。式(3-7)和式(3-8)说明了原N点的DFT和这两个N/2点的DFT之间的关系。通常为了后续说明的方便,和其它许多文献一样,在本文中也将式(3-13)和式(3-14)的运算用图2. 第38页共38页1所示的一个流图符号表示。因为这个流图符号形状酷似一只蝴蝶,所以称其为蝶形运算符号。图3.1蝶形运算符号采用蝶形运算符号的这种图示方法,可以用图3.2来表示前面所讲到的运算。在图3.2中,N==8,式(3-13)给出了X(0)~X(3)的计算方法,而式(2-14)给出了X(4)~X(7)的计算方法。图3.2N点DFT的一次时域抽取分解图(N=8)由图3.1可以看出,要完成一个蝶形运算,需要一次复数乘法和两次复数加法运算。由图3.2可以看出,经过一次分解后,计算一个N点DFT共需要计算两个N/2点DFT和N/2个蝶形运算。由前面的说明可以知道,计算一个N/2点DFT需要次复数乘法和N/2(N/2-1)次复数加法。那么按图3.2计算N点DFT共需要+N/2=N(N+1)/2≈/2(N>>1)次复数乘法和N(N/2-1)+2N/2=/2次复数加法运算。通过对比可以看出,只进行过这样的一次分解就使得运算量减少了近一半,充分说明了这样分解对减少DFT的运算量是十分有效的。由于这里N=,N/2仍然是偶数,为了使得计算量能够得到进一步的减少,可以仿效前面的做法对N/2点DFT再做进一步分解。与第一次分解相同,x3(l)和x4(l)为x1(r)按奇偶分解成的两个长为N/4的子序列,即(3-15)那么,X1(k)又可表示为 第38页共38页==(3-16)其中(3-17) (3-17)同理,由X3(k)和X4(k)的周期性和的对称性最后得到:(3-19)同理可得(3-20)其中有(3-21)(3-22)(3-23)这样,如图3.3所示,经过第二次的分解,一个N/2点的DFT就被拆分成为了两个N/4点的DFT了。式(3-10)和式(3-11)说明了原N/2点的DFT和这两个N/4点的DFT之间的关系。依次类推,经过M-1次分解,最后将N点DFT分解成N/2个2点DFT。将前面两次分解的过程综合起来,就得到了一个完整的8点DIT-FFT运算流图,如图2.4所示。图中用到关系式。图中的输入序列不是顺序的,但是后面会看到,其排列是有规律的。 第38页共38页图3.3N点DFT的第二次时域抽取分解图(N=8)图3.4N点DIT-FFT运算流图(N=8)(3)DIT-FFT算法与直接计算DFT运算量的比较由DIT-FFT算法的分解过程及图3.4可见,N=时,其运算流图应该有M级蝶形,每一级都由N/2蝶形运算构成。每一级运算都需要N/2次复数乘和N次复数加(每个蝶形需要两次复数加法)。所以,M级运算总共需要的复数乘次数为(3-24)复数加次数为(3-25)而由前面的介绍,直接计算N点的DFT需要次复数乘法以及N(N-1)次复数加法运算。当N>>1时,N(N-1)是约等于的。当N==1024时,可以求得直接计算N点的DFT和使用基-2DIT-FFT算法的所需乘法次数的比值为(3-26)这样,运算效率就提高了200多倍。图3.5为FFT算法与直接计算DFT所需乘法次数的比较曲线。由此图更加直观地看出FFT算法的优越性,从图3 第38页共38页-5可以明显的看出,N越大时,优越性就越明显。图3.5FFT算法与直接计算DFT所需乘法次数的比较曲线(4)DIT-FFT的一些运算规律DIT-FFT运算中是存在一些规律的,下面简单的介绍一下这些规律。原址计算由图3.5可以看出,DIT-FFT的运算过程是很有规律的。N=点的FFT共需要进行进行M级运算,每级由N/2个蝶形运算组成。在同一级运算中,每一个蝶形运算是有两个输入和两个输出的。这两个输入、输出数据节点在同一水平线上,并且它们只对本蝶形运算有效,对其它的蝶形运算是无效的。因为这样,当计算完一个蝶形以后,所得输出数据可立即存入原输入数据所占用的存储单元。以此类推,当M级运算都计算完毕以后,原来存放输入序列数据的N个存储单元中便依次存放了X(k)的N个值。这种利用同一存储单元存储蝶形运算计算输入、输出数据的方法就称为原址计算。很明显原址计算可以节省存储资源,从而降低硬件的成本。旋转因子的变化规律由8点DIT-FFT的运算流图可以推得在N点DIT-FFT运算流图中,每级都有N/2个蝶形。每个蝶形都要乘以因子。被称为旋转因子,其中p为旋转因子的指数。通过观察图3-4可以推得,第L级共有个不同的旋转因子。N==8时的各级旋转因子表示如下:(3-27)(3-28)(3-29)对的一般情况,第L级的旋转因子为 第38页共38页(3-30)(3-31)(3-32)(3-33)蝶形运算规律设序列x(n)经时域抽选(倒序)后,存入数组X中。如果蝶形运算的两个输入数据相距B个点,应用原位计算,则蝶形运算可表示成如下形式:(3-34)(3-35)其中(3-36)下标L表示第L级运算,(J)则表示第L级运算后数组元素X(J)的值。序列的倒序仔细分析可以发现看似毫无规律可循的DIT-FFT算法的输入序列的排序其实是很有规律的。由于N=,所以顺序数可用M位二进制数()表示。当N=8时,这种规律就可以用图3.6和表3.1来表示。图3.6形成倒序的树状图(N=)表3.1顺序和倒序二进制数对照表顺序倒序十进制数I二进制数二进制数十进制数J00000001100110042010010230111106 第38页共38页41000011510110156110011371111117DIT-FFT的输入顺序输出倒序的信号流图DIT-FFT的信号流图的形式不是唯一的,它还有多种表现形式。图3.7是DIT-FFT的一种变形的运算流图,其中蝶形运算的旋转因子、运算量与图3.4相同。从图中很容易看出它是一种顺序输入,倒序输出的方式。这种结构的信号流图有一个非常特别的优点就是前一级的旋转因子刚好是后一级上一半蝶形运算的旋转因子,且顺序不变,如果旋转因子的计算采用查表法,只要构造出一个N/2点的,就可以用它来计算N、N/2、N/4、…长度的FFT。因此在大型数据处理系统的FFT算法中,较多采用的是图3.7所示的流图算法。本课题也是采用的图3.7所示的流图算法。图3.7DIT―FFT的顺序输入倒序输出形式4FFT处理器的FPGA的实现4.1整体设计基-2FFTIP核设计主要由4个部分组成:旋转因子单元存储单元、逻辑控制单元、双引擎蝶形运算单元,如图4.1所示。 第38页共38页FFT运算RAM1逻辑控制单元双引擎蝶形运算单元旋转因子RAMFFT运算RAM2图4.14.2FFT处理器的工作过程(1)当收到控制模块发出的启动命令后,进入正常工作状态。这时首先启动输入数据单元,将原始数据存储到双口RAM中。数据存储完毕后,进入FFT工作模式,对数据进行处理;(2)进入FFT工作状态后,首先启动控制模块,读取双口RAM中的原始数据;(3)RAM采用乒乓结构对数据进行存储和读取;(4)在进行本级蝶形运算之前,控制模块读取旋转因子的实部与虚部之和、实部与虚部之差和实部。三路数据一起输出至蝶形运算模块;(5)启动FFT蝶形运算模块,蝶形运算结果输出;(6)将运算结果写入双口RAM,作为下一级运算的输入;(7)控制模块产生新的地址进行第二次蝶形运算;(8)当最后一次蝶形运算结束后,控制模块从RAM中读出计算结果;(9)当一组数据处理完成之后,等待来自控制模块发出启动命令来进行下一组数据的处理。由上述可以将FFT处理器工作的全过程分为3种模式:输入模式、FFT模式和输出模式。输入模式对原始数据进行存储,FFT模式对数据进行FFT运算和缓存,输出模式对结果进行输出。4.3引脚说明 第38页共38页图4.2FFT处理器符号图如图4.2所示:CLK:工作时钟输入引脚,最高工作频率为153MHz,推荐工作在150MHz。RST:复位引脚,低电平有效,恢复初始状态。Start:启动信号,高电平有效,至少维持2个时钟。第2个时钟开始的同时第一个有效输入数据必须出现在输入端。In_im[15..0]:复数的虚部,位宽16位,但有效位不得超过14位。Start拉高的同时,必须出现第一个有效的虚部数据。In_re[15..0]:复数的实部,位宽16位,但有效位不得超过14位。Start拉高的同时,必须出现第一个有效的实部数据。Busy:在Start生效之后,FFT运算器将其拉高。表明开始一帧数据的输入,运算与输出。此时不能将Start再次拉高,只有Busy恢复低电平时,才能将Start拉高进行下一帧。Data_valid:结果输出数据有效标志,高电平有效。Out_im[15..0]:在Data_valid拉高的同时,输出位宽为16位的虚部数据。Out_re[15..0]:在Data_valid拉高的同时,输出位宽为16位的实部数据。Scale_tick[3..0]:在Data_valid拉高的同时,输出数据结果被衰减的次数,而Scale_tick*4为实际衰减的倍数。图4.3输入时序图,图4.4输出时序图:图4.3输入时序图 第38页共38页图4.4输出时序图4.4存储单元在FFT处理单元中存储器是必不可少的单元,蝶形运算数据的输入输出和中间结果的存储都要经过存储器,因此它们的频繁读写操作对整个FFT处理速度影响较大。为了加快FFT的运算速度,需要构造双端口RAM来加快数据传输的吞吐量。存储器的使用通过状态机来调用。本设计双端口RAM存储器采用了乒乓操作,用了4组RAM存储模块,A(A1,A2),B(B1,B2)组交替读写数据。其最大特点是在计算的过程中,输入数据首先存入RAMA,经过第一级运算后数据放入RAMB;进行第二级运算时,将RAMA中的数据取出,经过第二级运算后数据放入RAMB,依次循环M次(对于512点的FFT依次循环9次)。两组RAM始终保持一组读一组写,即在计算每一级的第k个蝶形运算时,RAMA的第k个蝶形运算对应的地址准备写入数据,RAMB的第(k+1)个蝶形运算对应的地址准备读出数据;在每一级计算结束时两组存储器的读写功能进行交换。同时,通过观察任一个大于2点的蝶形图可以发现,蝶形的上、下两部分是对称的。表现为不仅仅是运算的形式,还包括旋转因子和双端口的读写地址是对称的。对称结构对于FPGA意味着运算效率提升一倍,可以用两个蝶形运算单元同时进行两路的运算,即在数据输入到一半时(N/2个点),启动一个蝶形运算单元开始运算。这也是为什么本设计采用四组双口RAM的原因所在。这样就不必将所有数据都读入才开始运算,节约了时间,提高了效率,且易于实现。图4.2为一个8点的双口RAM的示意图。把乒乓操作模块看作是一个整体,站在这个模块的两端看数据,输入数据流和输出数据流是连续不断的,没有任何停顿,因此非常适合对数据口进行流水线式处理。所以采用乒乓操作实现FFT算法可以提高计算速度。以下介绍双端口RAM的具体实现过程。Altera公司提供了强大而又便捷的QuartusII和MegaWizardPlug-InManager工具,可以帮助设计者简单快捷地实现双端口RAM存储器。启动QuartusII软件中MegaWizardPlug-InManager工具,并选择lpm_ram_dp,如图4.5所示。 第38页共38页图4.5MegaWizard工具的lpm_ram_dp模块然后根据设计要求,按照向导进一步设计各个参数,最后形成双端口的RAM模块,再添加必要的输入输出引脚,即完成了双端口RAM的初步设计如图4.6所示。从上述过程可以看到,Altera公司提供的QuartusII软件在实现内嵌式双端口RAM功能上具有方便快捷的特点,可以加快整个设计的速度,并保证了设计的正确性。图4.6QuartusII软件中实现的双端口RAM模块4.5旋转因子单元旋转因子单元是用于存储FFT运算所需的旋转因子W′N=exp(-j2πr/N)。在Matlab中旋转因子分为实部和虚部产生,由于它们是小于1的小数,故在设计中需将其定点化。其过程是将旋转因子扩大16384倍,取整数部分转化为16位定点数,以.hex文件格式保存,利用QuartusⅡ软件的Megawizard工具设计ROM,并将.hex文件固化在其中。根据旋转因子的对称性和周期性,在利用ROM存储旋转因子时,可以只存储旋转因子表的一部分,通过地址的改变查询出每级蝶形运算所需的旋转因子。蝶形运算后将运算结果右移14位后作为第二个运算结果存入RAM中,作为下一级的输入数据。设M为蝶形运算总级数,L为当前运算的级数,N为运算点数,则有旋转因子每级的步长系数K=2M-L,例如N=16,M=4,可以列出下式:L=1,K=23,,,,,,,L=2,K=22,,,,,,, 第38页共38页L=3,K=21,,,,,,,L=4,K=20,,,,,,,图4.7QuartusII软件中实现的旋转因子模块图4.8旋转因子实部的ROM初始化文件4.6原理与算法在之前我们已经介绍了课题所选的算法是DFT基-2FFT算法,蝶形单元是该算法的核心单元。图4.9给出了8点FFT,倒序输入,顺序输出的蝶形运算示意图;图4.98点FFT运算示意图 第38页共38页由图4.9可以看出,FFT的计算过程是由许多蝶形单元按照一定规则连接而成的,每一个蝶形单元用于计算两点的FFT,如图4.10所示图4.10单个蝶形单元示意图假设图中两输入数据分别为复数A、B,角标R代表实部,i代表虚部:A=A+jA(4-1)B=B+jB(4-2)旋转因子(4-3)从而得到了两点FFT的运算过程,如式(4-4)和(4-5)所示:(4-4)=(4-5)=其中,复数乘法算式如式(4-6)所示:(4-6)=由式(4.4)~(4.6)可以看出,基2FFT运算的基本单元是蝶形运算单元,其每一级的运算都由N/2个蝶形运算构成。将该单元映射到FPGA的实现上,需要2个复数加、减法器,即4个加、减法器同时工作。另外需要1个复数乘法器来完成整个蝶形运算。整个FFT运算就是这些蝶形运算的组合,在FPGA里就是把这些单元通过时序的设计让其有步骤的运行。本设计中采用了两个蝶形运算单元同时工作,即双引擎方式。这样运算时间缩短一倍。图4.11QuartusII软件中实现的加法器 第38页共38页图4.12QuartusII软件中实现的减法器图4-13QuartusII软件中实现的复乘法器4.7逻辑控制模块控制单元为整个系统的控制核心。整个模块包括中央控制单元、地址产生单元、溢出控制单元等。功能模块之间的数据传递均通过中央控制单元。中央控制单元记录当前蝶型运算所处的级数和个数,传递给地址产生单元。地址产生元在产生数据和旋转因子的地址。中央控制单元读取地址,向处于伺服状态的运算RAM和旋转因子查找表发出读使能请求。之后数据和旋转因子被读出。读出的数据进行必要的延迟和定标处理,送给蝶型运算器。运算结果将被连续算出并写入RAM。同时,控制单元对每级蝶形运算输出的结果进行溢出判断,判断的依据是比对数据的高两位,若高两位不相等则将溢出,所以在读出下一级所需数据时对其右移两位,即缩小4倍再参与运算。在最终输出数据时,将总共缩小的倍数输出,用户可将输出数据与之相乘得到真实的数据大小。整个过程通过内部计数器控制状态机的翻转来完成。状态图如4.14所示。图4.14状态机图4.14中,各状态的说明如下:状态s_idle:空闲状态,等待数据的传输,在信号start为高电平、信号busy为低电平时,进入状态s_read_half。状态s_read_half:读取前半部分数据状态,在计数机count为14的时候,进入状态s_read_whole。 第38页共38页状态s_read_whole:所有数据读取状态,在计数机count等于37的时候,进入状态s_init。状态s_init:蝶形运算初始化状态,对蝶形距离、大碟型偏移地址、旋转因子持续时钟、旋转因子步进等进行初始化,之后进入状态s_fly_inside。
状态s_fly_inside:小蝶形状态,进行的是一级大蝶形中的单个小蝶形的运算,在蝶形级数L=6的时候,进入状态s_fly_outside。状态s_fly_outside:大蝶形状态,进行的是一整级大蝶形(包括多个小蝶形)的运算,前一级运算完后结果存入RAM中,再由控制单元控制进入下一级大蝶形的运算。在记录输出数据个数的计数器count_XK=31的时候,整个32点FFT运算完毕,回到状态s_idle。5FFT系统仿真测试完成了对所要求系统的设计,还要对运算结果进行仿真验证,才能证明该系统的可靠性和可行性。故本章将通过对具体实例的验证结果进行分析,并得出结论。5.1FPGA前端设计本节将结合课题对FFT处理器设计流程中的各个步骤的设计方法进行详细的讨论,包括:算法验证、RTL编码、仿真、综合、静态时序分析。5.1.1算法验证和RTL设计32点复数FFT处理器是一个数据密集型的信号处理电路。对于数字信号处理电路的设计,通常使用Matlab编程来对定点算法进行算法级建模。Matlab定点算法程序不仅可以在行为级描述数据处理过程,达到算法级验证的目的,而且可以为RTL级VerilogHDL编码提供一个有效的参考。了解同步电路设计要求,是进行RTL设计的第一步。典型的同步电路结构如图5.1所示。图5.1同步电路结构组合逻辑实现设计所需的功能,例如,图5.1中的组合逻辑可能是加法器、乘法器、编码器等复杂的逻辑。寄存器用于暂存数据,它由时钟控制,只有当时钟进行有效跳变时,才能将新的数据锁存起来,否则数据一直保持原值。 第38页共38页编码前首先要查阅流片所用的综合库中基本单元信息,例如基本门的延时,触发器的setup/hold时间。标准单元库中的单元信息是指导RTL数据最重要的一个方面,了解了单元库中的信息,在编码过程中就可以预估路径上能放多少逻辑。熟悉了单元库,接下来就是RTL编码。RTL编码遵循一定的编码风格,以使HDL代码具有良好的可读性、可修改性、可综合性和可扩展性。针对VerilogHDL,常见的RTL编码风格如下:(1)在每个源程序的开始,要注明模块名称、作者、功能描述、日期、修改记录等。(2)尽量多加注释。尽量对每个信号、寄存器、函数、进程都给出注释,特别是代码中较复杂、难以理解的地方,要给出清楚的说明,以便于阅读。(3)每行只写一条代码,每行代码长度最好不要超过72个字符。这个规定是为了保证代码具有较好的可读性。(4)使用缩进格式书写条件和循环部分代码,以增强代码的可读性。(5)不要使用HDL的保留字来命名信号或变量,不要将VHDL的保留字用于VerilogHDL,也不要将VerilogHDL中的保留字用于VHDL。(6)当编写具有优先级的编码器时,尽量使用if-else结构。对于无优先级的结构,采用case语句。(7)避免产生组合逻辑反馈。(8)所有模块的输出最好都采用寄存器输出,这样能给下级电路的时序留下余量。5.1.2仿真与综合在FFT处理器设计过程的每一个阶段,都需要进行仿真。逻辑设计级的仿真分为RTL仿真与门级仿真两种。RTL仿真的目的是为了验证给定的RTL描述是否能够实现所需的功能。门级仿真是完成逻辑综合后正对门级网表的仿真,此时的仿真包括了门单元延时信息,因而门级仿真需要相应工艺的仿真库的支持。为了完成仿真,需要搭建一个测试平台(Testbench),一个测试平台包括以下几个部分:待测试设计、测试向量(Testbench)、响应比较电路。一个好的Testbench通过读取激励数据,添加到待测逻辑单元输出一个响应信号,然后在行为级将电路的响应信号和一个行为级的正确结果相比较,从比较后的输出仿真结果就可知道电路正确与否。用VerilogHDL设计电路,需要将语言描述转换为电路图描述,即用芯片制造商提供的基本电路单元(综合库)实现硬件描述语言描述的RTL电路功能,这个过程就称为综合。综合有逻辑综合和行为综合之分。由于行为综合离实际应用还有一定的距离,本文讨论的综合是指逻辑综合(RTL的综合)。综合过程可以细分为以下三个步骤。(1) 第38页共38页转译(Translation)读入电路的RTL级描述,将语言转译成每条语句所对应的功能模块以及功能块之间的拓扑结构,这一过程的结果是在综合器内部生成电路的布尔函数表述,不做任何的逻辑重组和优化。(1)优化(Optimization)基于所施加的时序和面积的约束条件,综合器按照一定的算法将转译结果做逻辑重组和优化。(2)映射(Mapping)根据所时间的时序和面积的约束条件,综合器从目标工艺库中搜索符合条件的单元来构成实际电路。由芯片制造商(Foundry)提供的工艺库,有一系列的基本单元,如与非门、或非门、反相器、锁存器、触发器、选择器、全加器等等,以及对这些单元的电气特性进行描述。例如:单元的面积、输入端电容、输出端的驱动能力,单元的逻辑功能、单元的时序、功耗等等。综合的目的就是用工艺库文件提供的单元来实现RTL代码描述的逻辑功能,并满足设计者提出的面积和时序要求。5.1.3静态时序分析静态时序分析是检查IC系统时序是否满足要求的主要手段。静态时序分析工具根据网表中各节点的负载,利用综合库中各单元的延时查找表,计算出单元延时及连线延时,从而可以判断在该设计中寄存器之间的最长路径、最短路径上的延时有多少,是否满足最大、最小时钟约束。如果不满足,则静态时序分析工具会给出时序violations。以往时序验证依赖于仿真。采用仿真方法,覆盖率跟所施加的激励有关,有些时序violations会被忽略。此外,仿真方法效率非常低,会延长产品的开发周期,静态时序分析工具能很好地解决这两个问题。它不需要激励向量(testbench),可以报出芯片中所有时序路径的violations,并且它的分析速度非常快,适合较大规模的系统的时序检查。静态时序分析的步骤如图5.2所示。通常在网表综合完成以后,需要进行静态时序分析,在自动布局布线完成后,再进行一次静态时序分析。图5.2静态时序分析步骤 第38页共38页进行静态时序分析时,需要读入以下内容:门级网表、综合库、时序约束条件等等。逻辑综合完成后,静态时序分析的门级网表是由综合工具写出的;自动布局布线后,静态时序分析的门级网表是由自动布局布线工具写出的,其中包括布局布线工具对逻辑综合后电路的一些优化,并添加了时钟树逻辑。5.2FFT处理器的资源利用情况在整个FFT处理器的设计流程中,完成了VerilogHDL设计输入以及对设计成功综合、布局布线之后,只能说明设计符合一定的语法规范,但其并不能保证能满足所设计的功能要求,因此需要通过仿真对设计进行验证。仿真的目的就是在软件环境下,验证电路的行为和设想中的电路功能是否一致。一般在FPGA中的仿真分为功能仿真和时序仿真。功能仿真是在设计输入之后,还没有综合、布局布线之前的仿真,又称为行为仿真或前仿真,它是直接对VerilogHDL描述的逻辑功能进行测试模拟,以了解其实现的功能是否满足原设计要求的过程,仿真过程不涉及任何具体器件的硬件特性,不经历适配阶段,也就是在不考虑电路的逻辑和门的时间延迟,重点考虑电路在理想环境下的行为和设计构想的一致性。时序仿真又称为后仿真,是在综合、布局布线后,考虑器件延时的情况下对布局布线后生成的网表文件进行的一种仿真,也就是接近真实器件运行特性的仿真,仿真文件中已包含了器件硬件特性参数。因而,仿真精度非常高。Cyclone器件的可编程资源主要来自逻辑阵列块(LAB),而每个LAB都是由多个LE构成,LE是Cyclone系列FPGA器件的最基本的可编程单元。FFT处理器完成的运算操作主要有蝶形运算、数据存储和数据输入输出。实现FFT处理器需要占用FPGA的硬件资源主要包括LE和片内RAM。实验选用Cyclone系列芯片,型号EP3C16Q240C8,具有15408个LE,516100bit的嵌入RAM,四个锁相环(PLL),161个用户I/O管脚,可使用Altera的Nios软核和丰富的IP库,快速实现完整的可编程单芯片系统。Cyclone系列器件是Altera公司的一款低成本、高性价比的FPGA。通过对FFT处理器进行综合后,利用QuartusII工具对系统进行实现,包括编译综合、布局布线、仿真三个步骤。以下是从布局布线后生成的报告中摘录的关于资源的利用情况。由资源利用报告图5.3可知,整个FFT处理系统使用了1952个LE,约占芯片LE总数的13%,使用的RAM为芯片的内嵌硬件资源,共使用RAM资源81920bit约占RAM总资源的16%,使用了73个用户I/O管脚,约占芯片总管脚的45%。图5.4是MODELSIM环境下的输入信号,图5.5是MODELSIM仿真后所得结果。 第38页共38页图5.3FFT处理器资源利用表图5.4输入数据图5.5仿真结果5.3仿真结果及分析根据业界数据集成电路的设计经验,后仿真正确的电路流片成功率在95%以上。本节将以复信号为例对几种典型的电路结构进行后仿真。本设计采用Matlab和VerilogHDL相结合的方法来验证,如图5.6所示。Matlab数据产生Matlab数据分析Matlab文件操作命令数据文件VerilogHDL文件操作系统任务Modelsim仿真器图5.6数据仿真过程首先通过Matlab产生仿真输入数据,并用Matlab文件操作命令将仿真输入数据输出到一个数据文件,然后用VerilogHDL文件操作系统任务读入数据文件,作为电路仿真的激励信号,由后仿真工具Modelsim进行仿真,并将电路的仿真输出结果输出到一个数据文件中,最后使用Matlab对仿真输出文件进行读取并求摸与之前matlab产生的数据得到的频谱进行对比来达到验证的目的。 第38页共38页5.3.1实线性信号的仿真图4.7是使用Matlab产生一个实部是斜率为1、幅值线性递增,虚部为0的线性信号:完成后仿真后的输出数据和Matlab分析的结果如图4.8所示。上图表示的是matlab产生的信号频谱图;下图表示的是由系统输出的数据求摸后的频谱图。从图中可知信号功率分布于k=1、k=32两个频率点,且两者的幅值完全相同。图5.732点线性信号图5.832点线性信号的频谱图比较5.3.2实单频正弦信号的仿真图5.9是使用Matlab产生一个实部为采样率为20Hz、频率为1Hz、幅值为16,虚部为0的正弦信号: 第38页共38页完成后仿真后的输出数据和Matlab分析的结果如图5.10所示。上图表示的是matlab产生的信号频谱图;下图表示的是由系统输出的数据求摸后的频谱图。从图中可知信号功率分布于k=3、k=31两个频率点,且两者的幅值误差可以忽略不计。图5.932点单频点正弦信号图5.1032点单频点正弦信号的频谱图比较5.3.3实双频正弦信号的仿真图5.11是使用Matlab产生一个实部为采样率为33.3Hz、频率为2Hz与4Hz、幅值为16,虚部为0的正弦信号: 第38页共38页完成后仿真后的输出数据和Matlab分析的结果如图5.12所示。上图表示的是matlab产生的信号频谱图;下图表示的是由系统输出的数据求摸后的频谱图。从图中可知信号功率分布于k11=3、k12=31、k21=5、k22=29四个频率点,且两者的幅值误差在1%以内,达到了高性能FFT的运算要求。图5.1132点双频点正弦信号图5.1232点双频点正弦信号的频谱图比较5.3.4复单频正弦信号的仿真使用Matlab产生一个实部为采样率为20Hz、频率为1Hz、幅值为16的余弦信号,虚部为参数相同的正弦信号:完成后仿真后的输出数据和Matlab分析的结果如图5.13所示。上图表示的是matlab 第38页共38页产生的信号频谱图;下图表示的是由系统输出的数据求摸后的频谱图。从图中可知信号功率分布于k=3频率点上。与图5.10相比,信号的镜像频点得到消除,达到了复数FFT的目的。且两者的幅值误差在系统允许的范围内。图5.13复数32点单频点正弦信号的频谱图比较总结本文介绍了一种通用的利用FPGA实现FFT的方法,主要完成的工作如下:(1)介绍了FPGA的概念,特点以及其开发的流程;基-2FFT这一常用的算法;利用硬件的手段来实现数字信号处理算法所需要了解的一些基本知识。
(2)以复数乘法器、加减法器为核心设计了FFT算法中的基-2蝶形运算单元,并且设计了溢出控制模块和地址与控制模块等其它模块,并以这些模块和FPGA内部的双口RAM为存储单元组成了基-2FFT算法模块。
(3)利用Matlab编写了用于比较Modelsim产生仿真结果和Matlab中FFT函数产生的结果的程序,从而验证了设计结果的正确性。该模块最后能够在CycloneEP3C16Q240C8型FPGA上稳定运行,能够满足一般工程的要求。该方法也可以用于实现更低点数或是更高点数的FFT运算。本设计是利用半流水线结构实现的,所以在一定程度上制约了FFT运算的速度。利用FPGA来实现FFT算法就是一个资源和速度的折中。速度越快,需要耗费的FPGA的片上资源也就越多;速度越慢,所需要耗费的FPGA的片上资源也就越少。所以在实际工程当中都是综合FPGA的片上资源和所需要的FFT的运算时间这两个指标来确定设计方案的。总的来说,还可以从以下两个方面来改进本课题:
(1)如果在资源允许的情况下,可以使用基-4FFT算法来实现设计。相对于利用基-2FFT算法来说,采用基-4 第38页共38页FFT算法实现的设计能够提高一倍左右的运算速度,但是与之相对应的就是所耗费的FPGA的片上资源也会提高近一倍。
(2)如果想获得非常高的FFT的运算速度,那么就要选择片上资源非常丰富的FPGA器件利用并行结构的方式来实现设计。而且设计中还要适当的运用流水线等设计技巧,以提升系统工作的频率致谢本文是在 第38页共38页老师的精心指导下完成的。在我进行本论文的研究期间,老师从开题论证、方案设计到论文的完成都给予了我相当大的帮助,每一个环节都倾注了老师大量的心血和精力。在论文的完成过程中,老师渊博的学识、丰富的实践经验和严谨的治学态度使我受益非浅。在此谨向他表示深深的敬意,并对他为学生所付出的大量心血表示衷心地感谢。
同时,在2年的学习生活中得到本学院各位老师给予我的耐心指导和热情帮助,他们在工作中的严格要求和严谨认真的治学态度永远是我学习的榜样。在此对各位老师致以由衷地感谢!
我还要感谢同学们给予我的热情帮助,她们认真、努力的工作态度和对我的支持帮助鼓励着我,使我不断的学习、进步。
最后再次对关心、帮助、支持和鼓励我的所有领导、老师和同学表示诚挚的谢意。 参考文献[1]于效宇.基于FPGA的FFT处理器的实现[D].[哈尔滨理工大学硕士学位论文],2005:28-30. 第38页共38页[2]植强.一种基于FPGA的FFT阵列处理器[J].电子对抗技术,2002,17(6):36-39.[3]刘国栋,陈伯孝,陈多芳.FFT处理器的FPGA设计[J].航空计算技术,2004,31(3):101-104.[4]王诚,吾继华,范丽珍,等.AlterFPGA/CPLD设计(基础篇)[C].北京:人民邮电社.2005:96-108.[5]陈丽安,张培铭.定点DSP块定点算法及其实现技术[N].福州大学学报(自然科学版),2004,32(6):689-693.[6]ZhangQi,YiQingming.ANewBase-6FFTAlgorithm.SemiconductorPhotonicsandTechnology,2002,9(1):23-25.[7]CurrieSM.ImplementationofaSingleChip,Pipelined,Complex,One-DimensionalFastFourierTransformin0.25umBulkCMOS.Application-SpecificSystems,ArchitecturesandProcessors,2002.Proceeding.TheIEEEInternationalConferenceon,17-19July2002:335-343.[8]BidetE.AFastSingleChipImplementationof8192ComplexPointFFT.Solid-StateCircuits,IEEEJournalof,Volume:30,Issue:3,March1995:300-305.[9]BiB,JoneyE.V.APipelinedFFTProcessorforWordSequentialData.Acoustics,Speech,andSignalProcessing,IEEETransactions,Volume:37,Issue:12,Dec.1989:1982-1985.[10]GoldB,BiallyT.ParallelisminFastFourierTransformHardware.AudioandElectoacoustics,IEEETransactionson,Volume:21,Issue:1,Feb1973:5-16.[11]LenartT,OwallV.A2048ComplexPointFFTProcessorUsingANovelDataScalingApproach.CircuitsandSystems,2003.ISCAS’03.Proceedingofthe2003InternationalSymposiumon,Volume:4,25-28May2003:IV45-IV48.[12]唐江,刘桥.基于FPGA的基-4FFT算法的硬件实现[N].重庆工学院报,2007,21(3):82-84.[13]潘明海,刘英哲,于维双.一种基于FPGA实现的FFT结构.微计算机信息2005,21(9-2):156-158[14]JessaniRM,PulrinoM.Comparisonofsignal-anddual-passmultiply-addfusedfloating-pointunits[J].IEEETransCompute,1998,47(9):927-937[15]任淑艳,关丛荣,杨永刚,等.应用VHDL语言的FFT算法实现[N].哈尔滨理工大学学报2005,8(6):24-26