基于FPGA的函数发生器设计.docx
基于FPGA的函数发生器设计本设计中的函数发生器是通过VHDL语言来描绘的,通过这样一种硬件描绘语言,根据设计要求中所需要使用到的功能,尽可能的知足了实际应用中的详细需求。设计要求通过本设计产生频率可控的正弦波,方波,三角波和锯齿波等波形。5.1软件设计思路数字频率合成器DDFS技术是一种可把一系列数字量形式信号通过DAC转换成模拟量形式信号的合成技术9。目前使用最广泛的一种DDFS方式是利用高速存储器作查寻表,然后通过高速DAC产生已用数字形式存入的正弦波。图5-1是DDFS的根本原理图。图5-1DDFS根本原理图相位累加器由N位加法器与N位累加存放器级联构成。时钟脉冲每触发一次,加法器便将频率控制数据与累加存放器输出的累加相位数据相加,然后把相加后的结果送至累加存放器的数据输入端。累加存放器将加法器在上一个时钟作用后所产生的新相位数据反应到加法器的输入端,以使加法器在下一个时钟的作用下继续与频率控制数据相加。这样,相位累加器在参考时钟的作用下将进展线性相位累加,相位累加器累加满量时,就会产生一次溢出,以完成一个周期性的动作,这个周期就是DDFS合成信号的一个频率周期,累加器的溢出频率就是DDFS输出的信号频率。用相位累加器输出的数据作为取样地址来对正弦波波形存储器进展相位幅值转换,即可在给定的时间上确定输出的波形幅值。通过DAC可将数字量形式的波形幅值转换成所要求的合成频率模拟量形式信号,低通滤波器用于衰减和滤除不需要的取样分量,以便输出频谱纯洁的正弦波信号10。对于计数容量为2N的相位累加器和具有M个相位取样的正弦波波形存储器,假设频率控制字为K,那么DDFS系统输出信号的频率为:fofcK/2N,而频率分辨率那么为:ffominfc/2N。波形的数据存放在RAM里,主要有正弦波、三角波、锯齿波包括半正弦波、半三角波和半锯齿波的数据。要到达较高的频率精度,必须利用DDFS来实现对输出波形频率的控制并按频率要求对相位增量进展累加,然后以累加相位值作为地址码来读取存放在存储器中的波形数据。通过改变相位增量存放器的增量值即步长,使相位累加器可以输出根据相位增量存放器所给出的步长来改变波形存储器的地址,进而改变波形每周期的点数,进而到达改变输出波形频率的目的。该电路的设计关键在于用硬件构造一个多位累加器来实现相位的累加。根据DDFS的原理,输出信号频率fo与累加器时钟fclk,累加器位数M,相位增量N的关系如下:fo(fclk*N)/2M5.2源程序的讲明以下是数字函数发生器设计的局部源程序讲明。完好程序请见附录1.调用双口RAM:双口RAM拥有两套读写资源,可以同时进展读写而互相不受影响。这里使用双口RAM来实现波形查找表的功能,可以方便地使用外部控制器更改查找表中的内容,也就更改了输出波形的类型,进而简单的实现任意波的输出。altsyncram_component:altsyncramGENERICMAP(intended_device_family=ACEX1K,operation_mode=DUAL_PORT,width_a=8,widthad_a=10,numwords_a=1024,width_b=8,widthad_b=10,numwords_b=1024,lpm_type=altsyncram,width_byteena_a=1,outdata_reg_b=UNREGISTERED,indata_aclr_a=NONE,wrcontrol_aclr_a=NONE,address_aclr_a=NONE,address_reg_b=CLOCK0,address_aclr_b=NONE,outdata_aclr_b=NONE,read_during_write_mode_mixed_ports=DONT_CARE,power_up_uninitialized=FALSE,init_file=sin_rom1024_2.mif)2.频率合成输出:在每一个时钟周期,频率累加器以输入的频率字为步进进展自增累加;累加结果的高位送给相位累加器与相位字进展累加,可以理解为在这里加上相位偏置;相位累加器的输出作为波形查找表的地址从查找表中读出相应的数据后送给D/A转换器,最后经过低通滤波器,后级放大等信号调理电路形成模拟量的波形输出。FREQ_WORDS=XEEEEEPHASE_WORDS=0000000000FreqAcc:PROCESS(CLK)BEGINIF(CLKEVENTANDCLK=1)THENreg_G_FreqWords=FREQ_WORDS;-频率字输入同步reg_G_PhaseWords=PHASE_WORDS;-相位字输入同步arith_G_FreqAcc=arith_G_FreqAcc+reg_G_FreqWords;-相位累加器ENDIF;ENDPROCESSFreqAcc;-相位累加器arith_G_PhaseAcc=arith_G_FreqAcc(freq_adder_width-1DOWNTOfreq_adder_width-phase_words_width)+reg_G_PhaseWords;-取累加器高位送LUTreg_G_LUTAddress=arith_G_PhaseAcc(phase_adder_width-1DOWNTOphase_adder_width-lut_add_width);DDFSOUT=reg_G_OutRegister;5.3系统的时序仿真实现和验证在完成了软件局部的设计就可以在所选用的仿真软件上进展调试,以验证所编写的程序是否可以实现预先设定的功能。5.3.1使用QuartusIITextEditor建立设计QuartusIITextEditor11是一个灵敏的工具,用于以AHDL、VHDL和VerilogHDL语言以及Tcl脚本语言输入文本型设计。还可以使用TextEditor输入、编辑和查看其它ASCII文本文件,包括为QuartusII软件或者由QuartusII软件建立的那些文本文件。还可以用TextEditor将任何AHDL语句或者节段模板、Tcl命令或者任何支持的VHDL或者VerilogHDL构造模板插入当前文件中。AHDL、VHDL和VerilogHDL模板为您输入HDL语法提供了一个简便的方法,可以进步设计输入的速度和准确度。还可以获取有关所有AHDL元素、关键字和语句以及宏功能模块和根本单元的上下文相关帮助。5.3.2使用AssignmentEditor指定初始设计的约束条件AssignmentEditor是用于在QuartusII软件中建立和编辑分配的界面。分配用于在设计中为逻辑指定各种选项和设置,包括位置、I/O标准、时序、逻辑选项、参数、仿真和引脚分配。使用AssignmentEditor可以选择分配种别;使用QuartusIINodeFinde选择要分配的特定节点和实体;显示有关特定分配的信息;添加、编辑或者删除选定节点的分配。还可以向分配添加备注,可以查看出现分配的设置和配置文件。以下步骤描绘使用AssignmentEditor进展分配的根本流程:1.翻开AssignmentEditor。2.在Category栏中选择相应的种别分配。3.在NodeFilter栏中指定相应的节点或者实体,或者使用NodeFinder对话框查找特定的节点或者实体。4.在显示当前设计分配的电子表格中,添加相应的分配信息。AssignmentEditor中的电子表格提供适用的下拉列表,或者允许您键入分配信息。当您添加、编辑和删除分配时,消息窗口中将出现相应的Tcl命令12。还可以将数据从AssignmentEditor导出到Tcl脚本文件(.tcl)或者与电子表格兼容的文件中。建立和编辑分配时,QuartusII软件对适用的分配信息进展动态验证。假如分配或者分配值无效,QuartusII软件不会添加或者更新数值,改为转换为当前值或者不承受该值。当您查看所有分配时,AssignmentEditor将显示为当前工程而建立的所有分配,但当您分别查看各个分配种别时,AssignmentEditor将仅显示与所选特定种别相关的分配。图5-3QuartusIIAssignmentEditor5.3.3使用QuartusIIVHDL可以使用AnalysisSynthesis分析并综合VHDL和VerilogHDL设计13。AnalysisSynthesis包括QuartusIIIntegratedSynthesis,它完全支持VHDL和VerilogHDL语言,并提供控制综合经过的选项。如图5-4中所示。图5-4Settings对话框的VHDLInput页AnalysisSynthesis构建单个工程数据库,将所有设计文件集成在设计实体或者工程层次构造中。QuartusII软件用此数据库进展其余工程处理。其它Compiler模块对该数据库进展更新,直到它包含完全优化的工程。开场时,该数据库仅包含原始网表;最后,它包含完全优化且适宜的工程,工程将用于为时序仿真、时序分析、器件编程等建立一个或者多个文件。当它建立数据库时,AnalysisSynthesis的分析阶段将检查工程的逻辑完好性和一致性,并检查边界连接和语法错误。AnalysisSynthesis还在设计实体或者工程文件的逻辑上进展综合和技术映射。它从VerilogHDL和VHDL中推断触发器、锁存器和状态机。它为状态机建立状态分配,并作出能减少所用资源的选择。此外,它还用Altera参数化模块库(LPM)函数中的模块交换运算符,例如+或者-,而该函数已为Altera器件做了优化。AnalysisSynthesis使用多种算法来减少门的数目,删除冗余逻辑以及尽可能有效地利用器件体系构造。可以使用逻辑选项分配自定义综合。AnalysisSynthesis还应用逻辑综合技术,以协助施行工程时序要求,并优化设计以知足这些要求。消息窗口和Report窗口的消息区域显示AnalysisSynthesis生成的任何消息。Status窗口记录工程编译期间在AnalysisSynthesis中处理所花的时间。5.3.4控制AnalysisSynthesis可以使用以下选项和功能来控制QuartusIIAnalysisSynthesis:l编译器指令和属性lQuartusII逻辑选项lQuartusII综合网表优化选项1使用编译器指令和属性QuartusII软件支持编译器指令,这些指令也称为编译指示。可以在VerilogHDL或者VHDL代码中包括translate_on和translate_off等编译器指令作为备注。这些指令不是VerilogHDL或者VHDL命令;但是,综合工具使用它们以特定方式推动综合经过。仿真器等其它工具那么忽略这些指令并将它们作为备注处理。还可以指定属性,这些属性有时称为编译指示或者指令,用于推动特定设计元素的综合经过。它还提供一些属性,作为QuartusII逻辑选项。2使用QuartusII逻辑选项QuartusII逻辑选项允许您在不编辑源代码的情况下设置属性。可以在AssignmentEditor中指定QuartusII逻辑选项。QuartusII逻辑选项用于保存存放器、指定通电时的逻辑电平、删除重复或者冗余的逻辑、优化速度或者区域、控制扇出、设置状态机的编码级别以及控制其它很多选项。使用QuartusII综合网表优化选项QuartusII综合优化选项用于设置选项,在很多Altera器件系列的综合期间优化网表。这些优化选项对标准编译期间出现的优化进展补充,并且是在全编译的AnalysisSynthesis阶段出现。这些优化对综合网表进展更改,通常有利于区域和速度的改善。Settings对话框Assignments菜单的NetlistOptimizations页用于指定网表优化选项,其中包括以下综合优化选项:l进展WYSIWYG根本单元再综合l进展逻辑门级存放器重新定时l允许存放器重新定时,在Tsu/Tco和Fmax之间进展取舍5.3.5使用QuartusII仿真器进展仿真设计可以使用QuartusII仿真器在工程中仿真任何设计14。视所需的信息类型而定,可以进展功能仿真以测试设计的逻辑运算,也可以进展时序仿真以在目的器件中测试设计的逻辑运算和最差时序。QuartusII软件可以仿真整个设计,或者仿真设计的任何局部。可以在工程中将任何设计实体指定为仿真焦点。在仿真设计时,仿真器仿真焦点实体及其所有附属设计实体指定仿真器设置通过建立仿真器设置,指定要仿真的类型、仿真涵盖的时间段、鼓励向量以及其它仿真选项。可以使用Settings对话框Assignments菜单或者仿真器SettingsWizardProcessing菜单建立仿真器设置的自定义组,也可以使用每次建立新工程时自动生成的默认仿真器设置。建立波形文件QuartusIIWaveformEditor可以建立和编辑用于波形格式仿真的输入矢量。使用WaveformEditor,可以将输入矢量添加到波形文件中,此文件描绘设计中的逻辑行为。QuartusII软件支持矢量波形文件(.vwf)、表文件(.tbl)、矢量文件(.vec)和矢量表输出文件(.tbl)格式的波形文件。可以在MAX+PLUSII软件中将MAX+PLUSII仿真器通道文件(.scf)另存为表文件,然后使用WaveformEditor翻开表文件并另存为矢量波形文件。图5-5QuartusIIWaveformEditor5.3.6在QuartusII软件中进展时序分析TimingAnalyzer在全编译期间对设计自动进展时序分析。以下准那么描绘了使用QuartusIITimingAnalyzer可以完成的一些任务:l使用定时设置向导Assignments菜单、Settings对话框Assignments菜单和AssignmentEditor,指定初始工程范围的时序要求和个别时序要求。l在全编译期间进展时序分析或者在初始编译之后单独进展时序分析。l使用报告窗口、时序逼近布局图和list_pathsTcl命令查看时序结果。指定时序要求时序要求允许为整个工程、特定的设计实体或者个别实体、节点和引脚指定所需的速度性能。可以使用定时设置向导Assignments菜单帮助您建立初始工程范围时序设置。指定初始时序设置之后,可以再次使用定时设置向导或者使用Settings对话框Assignments菜单修改设置。可以使用AssignmentEditorAssignments菜单进展个别时序设置。指定工程范围时序分配和/或者单个时序分配之后,通过编译设计或者在初始编译之后通过单独运行TimingAnalyzer来运行时序分配。假如未指定时序要求设置或者选项,QuartusIITimingAnalyzer将使用默认设置运行分析。默认情况下,TimingAnalyzer计算并报告每个存放器的fMAX、每个输入存放器的tSU和tH、每个输出存放器的tCO、所有引脚至引脚途径间的tPD、延缓时间、保持时间、最小tCO以及当前设计实体的最小tPD。使用Settings对话框或者定时设置向导,可以指定以下时序要求和其它选项:l工程的总频率要求或者各个时钟信号的设置l延时要求、最短延时要求和途径切割选项l报告选项,包括数字或者源以及目的存放器,且不包括途径l时序驱动编译选项指定工程范围的时序设置工程范围的时序设置包括最大频率、建立时间、保持时间、时钟至输出延时和引脚至引脚延时以及最低时序要求。还可以设置工程范围的时钟设置和多个时钟域、途径切割选项和默认外部延时15。1.要求描绘a)fMAX最大频率在不违背内部建立(tSU)和保持(tH)时间要求下可以到达的最大时钟频率。b)tSU时钟建立时间在触发存放器计时的时钟信号已经在时钟引脚确立之前,经过数据输入或者使能端输入而进入存放器的数据必须在输入引脚处出现的时间长度。c)tH时钟保持时间在触发存放器计时的时钟信号已经在时钟引脚确立之后,经过数据输入或者使能端输入而进入存放器的数据必须在输入引脚处保持的时间长度。d)tCO时钟至输出延时时钟信号在触发存放器的输入引脚上发生转换之后,在由存放器馈送信号的输出引脚上获得有效输出所需的时间。e)tPD引脚至引脚延时输入引脚处信号通过组合逻辑进展传输并出如今外部输出引脚上所需的时间。f)最小tCO时钟至输出延时时钟信号在触发存放器的输入引脚上发生转换之后,在由存放器馈送信号的输出引脚上获得有效输出所需的最短时间。这个时间总是代表外部引脚至引脚延时。g)最短tPD时钟至输出延时指定可承受的最少的引脚至引脚延时,即输入引脚信号通过组合逻辑传输并出如今外部输出引脚上所需的时间。2.指定个别时序分配可以使用AssignmentEditor对个别实体、节点和引脚进展个别时序分配。个别时序分配超越工程范围要求假如它们比工程范围要求更加严格。AssignmentEditor支持点到点时序分配和通配符,用于在做分配时标识特定节点。输入的引脚和节点时序要求保存在当前层次构造中最高层实体的实体设置文件(.esf)中。可以在TimingAnalyzer中进展以下类型的个别时序分配:l个别时钟设置:允许通过定义时序要求和设计中所有时钟信号之间的关系,进展准确的多时钟时序分析l多周期途径:需要一个以上时钟周期才能稳定下来的存放器之间的途径。可以设置多周期途径,指示TimingAnalyzer调整其度量,并防止不当地违背建立或者保持时间。l剪切途径:默认情况下,假如没有设置时序要求或者只使用默认的fMAX时钟设置,QuartusII软件将切断不相关时钟域之间的途径。假如设置了各个时钟分配,但没有定义时钟分配之间的关系,QuartusII也将切断不相关时钟域之间的途径。还可以定义设计中特定途径的剪切途径。_最少延时要求:特定节点或者组的个别tH、最小tCO和最小tPD时序要求。可以对特定节点或者组进展这些分配,以超越工程范围最小时序要求。l外部延时:指定信号从外部存放器器件之外到达输入引脚的延时。l设计中特定节点的个别tSU、tPD和tCO要求。3.进展时序分析指定时序设置和分配之后,就可以通过全编译运行TimingAnalyzer。完成编译之后,可以使用StartStartTimingAnalyzer命令Processing菜单重新单独运行时序分析,或者通过选择StartStartMinimumTimingAnalysisProcessing菜单运行最少时序分析。4.查看时序分析结果运行时序分析之后,可以在编译报告的TimingAnalyzer文件夹中查看时序分析结果。然后,可以列出时序途径以验证电路性能,确定关键速度途径以及限制设计性能的途径,并进展另外的时序分配。此外,还可以使用list_pathsTcl命令查找并查看设计中任何延时途径的信息。报告窗口的时序分析局部列出报告的时钟建立和保持的时序信息;tSU、tH、tPD、tCO;最小脉冲宽度要求;在时序分析期间忽略的任何时序分配;以及TimingAnalyzer生成的任何消息。默认情况下,TimingAnalyzer还报告最正确情况最少时钟至输出时间和最正确情况最少点到点延时。报告窗口包括以下类型的时序分析信息:l时序要求的设置l停滞和最少停滞l源和目的时钟名称l源和目的节点名称l所需的和实际的点到点时间l所需的保持关系l实际fMAX图5-6Report窗口中的时序分析结果可以从Report窗口的TimingAnalyzer局部直接进入AssignmentEditor、ListPaths和LocateinTimingClosureFloorplan命令,进而可以进展个别时序分配和查看延时途径信息。此外,还可以使用list_pathsTcl命令列出延时途径信息。可以使用AssignmentEditor在TimingAnalyzer报告中对任何途径进展个别时序分配。此功能还可以用来方便地对途径进展点到点分配。以下步骤描绘在AssignmentEditor中进展个别时序分配的根本流程:1.在Category栏中,单击Timing,以指示您要做的分配的种别。2.在电子表格中单击DestinationName(To)单元格并使用NodeFinder查找节点,或者键入标识要分配目的节点的节点名称和/或者通配符。3.在电子表格中单击SourceName(From)单元格并使用NodeFinder查找节点,或者键入标识要分配源节点的节点名称和/或者通配符。4.在电子表格中,双击Option单元格并选择您要做的时序分配。对于要求赋值的分配,可以双击Value单元格并键入或者选择相应的分配值。还可以使用LocateinTimingClosureFloorplan命令Project菜单在时序逼近布局图中查找途径,允许利用时序逼近布局图功能对特定途径做分配。可以使用ListPaths命令右边按钮弹出菜单,在消息窗口的TimingAnalyzer报告小窗口中显示任何途径的中间延时。它允许用户查找引脚至引脚、存放器至存放器和时钟至输出引脚延时途径,并显示在Report窗口中出现的设计的任何延时途径的信息。请参见图5-7。图5-7OutputfromListPaths命令结果:最后在示波器上可以观察到频率可控的正弦波,方波,锯齿波三角波。6结论本文通过对FPGA器件和数字函数发生器的具体阐述,通过仔细研究FPGA和DDFS原理后,根据工程设计的背景及实际需要,基于FPGA器件设计并实现了数字函数发生器的设计,完成了实现正弦波,三角波,锯齿波,方波的功能要求,并用DICE-EH2000实验箱和示波器实现了其功能。与使用单片机、DSP或者嵌入式ARM等其他芯片实现数字函数发生器相比,本设计更符合整个工程开发经过中的实际情况,用FPGA进展数字系统的设计灵敏方便,周期短。而且,当参考时钟频率和相位累加器的位宽知足一定的要求时,输出分辨率可以非常小。使用DDS技术产生的任意波在精度上非常高,误差很小。总的来讲,本设计利用FPGA构建数字函数发生器,一方减少了使用专用集成芯片带来的本钱增加和资源浪费;另一方面,通过软件时序仿真,减少了设计周期,进步了系统的稳定性。设计完成后,在DICE-EH2000实验箱和示波器上进展了硬件验证,并获得通过。可以讲,在多数场合中,可以用它来实现数字函数发生器的根本功能。