基于FPGA的DDS正弦波发生器设计【开题报告+文献综述+毕业论文】

基于FPGA的DDS正弦波发生器设计【开题报告+文献综述+毕业论文】

ID:463539

大小:678.08 KB

页数:44页

时间:2017-08-05

上传者:U-944
基于FPGA的DDS正弦波发生器设计【开题报告+文献综述+毕业论文】_第1页
基于FPGA的DDS正弦波发生器设计【开题报告+文献综述+毕业论文】_第2页
基于FPGA的DDS正弦波发生器设计【开题报告+文献综述+毕业论文】_第3页
基于FPGA的DDS正弦波发生器设计【开题报告+文献综述+毕业论文】_第4页
基于FPGA的DDS正弦波发生器设计【开题报告+文献综述+毕业论文】_第5页
资源描述:

《基于FPGA的DDS正弦波发生器设计【开题报告+文献综述+毕业论文】》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

本科毕业论文系列开题报告电气工程及其自动化基于FPGA的DDS正弦波信号发生器设计一、课题研究意义及现状这些年来随着我国对超大规模集成电路的重视,也发表了许多关于DDS技术的论文,逐步走上了发展的道路,但是在这之中主要是利用DDS技术去实现功能的改进和对性能指标的提高,几乎是没有关于DDS芯片的设计和研发,因此我国在DDS的研究上与国际水平还是有很大的差距。近几年来我国芯片产业的快速发展,对DDS的研究已经有了突破性的进展从而推动数字信号处理器的飞速发展,使微处理器具有先进的数字信号处理技术,能实现多种功能,对正弦波发生器而言,随着DDS技术的诞生,使波形发生器技术得到进一步的飞跃。相对与其他频率合成技术,DDS技术产生的正弦波具有全数字化、输出频率精度高、波形失真小、频率稳定度高、分辨率高、输出相位连续可调、控制灵活方便、可产生宽带正交信号及其他多种调制信号以及等特点。本次研究课题是基于FPGA的DDS正弦波发生器设计,现在FPGA的主流发展趋势就是在FPGA中嵌入可编程的低功耗、高速收发器,具有嵌入式高速收发器的FPGA为数据传输提供了可行的单芯片解决方案,能够快速地解决协议和速率的变化问题,以及为了提高性能和为产品增加新功能时所做的设计修改所需的重新编程问题。本课题采用FPGA设计实现DDS电路的可行性和可靠性,也更为灵活,可以根据不同的需要对控制方式和接口进行相应的修改,要想使DDS电路产生正弦波形,只要对FPGA中ROM表的数据进行修改。另外FPGA设计还具有相对较宽的带宽、频率转换时间较短、相位连续变化、频率分辨率高等优点。同时FPGA芯片还可以对体统进行现场修改和调试,性能也使用要求,所以将DDS设计嵌入到FPGA片所构成的系统中,将使系统具有很高的性价比。本次研究主要利用的是QuartusⅡ软件进行DDS正弦波信号发生器功能的实现进行编译,仿真,培养了自己的动手能力把理论和实际结合起来。二、课题研究的主要内容和预期目标1.主要内容本次课题的主要内容就是采用DDS技术设计一个正弦波发生器,主控要求用FPGA实现。掌握DDS工作原理、基本结构和DDS设计思路,了解FPGA芯片的功能及应用,QuartusⅡ 软件应用,以FPGA为主控确定正弦波信号发生器的实现结构图,并可以对正弦波的频率、幅值等进行设定,通过VHDL语言进行程序设计,并软硬件综合调试通过。2.预期目标1)预期设计一个DDS技术正弦波信号发生器,主控以FPGA实现。采用FPGA设计,首先要考虑它的输入、输出接口方案,确定输入和输出的数据量和控制量、位数、I/O位置等,以及和外围电路的接口及控制时序、控制方式等。另外,由于信号都是由FPGA在数字域进行处理,可以将FM和AM等调制在数字域实现。调制电路的功能基本都是由FPGA内部的数字逻辑电路来实现,从而使整个系统的电路更加简单,同时数字调制避免了模拟调制带来的误差和干扰,提高了调制的性能。仅用单片FPGA就实现了直接数字频率合成技术(DDS),产生稳定的正弦波,调制信号参数由FPGA内部输入,也可以从外部输入。整个系统结构紧凑,电路简单,功能强大,可扩展性强。2)由于主要是以FPGA为主的主控模块进行实现,在FPGA中DDS的基本结构系统主要包括有相位累加器、正弦ROM表、D/A转换器、低通滤波组成,相位累加器由一个N位的加法器和N位的寄存器构成,在控制时钟信号作用下,累加器将与输出信号频率对应的频率字进行累加,然后与相位字相加以形成最终相位信息,从而使每一个时钟周期输出结果递增K(频率控制字)。相位调制器接收相位累加器的相位输出,主要用于信号的相位调制,其输出的数据作为查找表的相位取样地址。这样就可把存储在波形ROM内的波形抽样值(--进制编码)经查找表查出,完成相位到幅值转换,再经DAC将数字量形式的波形幅值转换成所要求频率的模拟量形式信号,最后由低通滤波器将DAC输出的阶梯状波形平滑为所需的连续波形,即可得到由频率控制字决定连续变换输出的正弦波,这样就可以通过FPGA控制对正弦波的频率幅值等参数进行设定了。3)然后利用VHDL语言进行编译并通过QuartueⅡ软件进行仿真。在这一步中可以发现程序存在的实际问题,然后经过修正后使其满足控制要求。三、课题研究的方法及措施1.研究方法首先要对FPGA和DDS技术正弦波发生器进行了解,这需要查阅一定的资料,了解DDS工作原理、基本结构,各项功能的实现,FPGA的硬件功能和其内部的逻辑功能。因为本次研究要完成的是通过FPGA主控的DDS正弦波发生器的设计,主要利用QuartueⅡ 软件对DDS正弦波信号发生要实现的功能来进行编程,并调式通过。并通过来FPGA实现各种功能的控制。在这个过程中,需要查阅相关资料。并编写完整程序,通过调试达到预期的效果。2.研究措施1)收集查阅DDS正弦波发生器的相关资料,对FPGA的应用设计情况进行了熟悉了解;了解不同的设计实现方法,比较现有的相关方案,确定本课题研究和实现方案,然后对方案中的各单元进行了必要的分析和研究。2)对所研究的DDS正弦波功能进行分类,并利用QuartueⅡ软件对各个功能进行软件编程。3)根据DDS正弦波信号发生器所要实现的功能,根据功能来分配I/O接口。完成了编程以后,进行调试,看是否满足预先所设想的功能。FPGA控制框图如下:LED显示FPGA控制器DA输出键盘FPGA控制框图根据以上模块,在综合利用QuartueⅡ软件,大致确定定I/O点数,综合FPGA的性价比。选定FPGA芯片。4)在硬件的调试过程中可能不能达到技术指标,所以需要反复调试,最终达到预期目标。5)具体实现中,充分考虑稳定性,可靠性和可拓展性等相关问题。四、课题研究进度计划1.2010年10月15日至2010年12月3日分析设计任务,查阅DDS发生器设计和应用资料,确定系统实现总体方案设计;完成开题报告、文献综述、外文翻译等相关工作。2.2010年12月4日至2010年12月31日设计与写论文,包括软件程序设计和硬件电路调试等,撰写设计报告与论文。3.2011年1月1日至2011年3月22日设计作品的继续完善,论文修改,毕业答辩准备等4.2011年3月23日至2011年4月24日 完成综合调试,完成毕业设计论文;做好答辩用的PPT,并做好答辩准备五、参考文献[1]刘延飞等.基于AlteraFPGA/CPLD的电子系统设计及工程实践[M].北京:人民邮电出版社,2009年9月.[2]周润景等.基于QuartusⅡ的FPGA/CPLD数字系统设计实例[M].北京:电子工业出版社,2007年8月.[3]杨晓慧等.基于FPGA的EDA/SOPC技术与VHDL[M].北京:国防工业出版社,2007年10月.[4]StephenBrown,ZvonkoVranesic.FundamentalsofDigitalLogicwithVerilogDesign(2ndEdition)[M].NewYork:McGraw-Hill,2007,5.[5]贾立新等.电子系统设计与实践[M].北京:清华大学出版社,2007年4月.[6]常晓明,李媛媛.Verilog-HDL工程实践入门(附光盘)[M].北京:北京航空航天大学出版社,2005年8月.[7]Ming-BoLin.DigitalSystemDesignsandPractices:UsingVerilogHDLandFPGAs[M].NewYork:McGraw-Hill,2008,8..[1]刘韬等.FPGA数字电子系统设计与开发实例导航[M].北京:人民邮电出版社,2005年6月.[2]张庆玲等.FPGA原理与实践[M].北京:北京航空航天大学出版社,2006年4月.[3]黄智伟.锁相环与频率合成器电路设计[M].西安:西安电子科技大学出版社,2008年1月.[4]白居宪.直接数字频率合成[M].西安:西安交通大学出版社,2007年7月. 毕业论文文献综述电气工程及自动化DDS正弦波信号发生器的实现摘要:利用FPGA芯片及D/A转换器,采用直接数字频率合成技术,设计实现DDS正弦信号发生器,同时阐述了直接数字频率合成(DDS)技术的工作原理、电路结构,及设计的思路和实现方法。关键词:DDS;FPGA;正弦波信号发生器随着通信应用的扩展,直接数字频率合成(DDS)技术是从相位概念出发直接合成所需波形的一种新的频率合成技术,它在相对带宽、频率转换时间、相位连续性、正交输出、高分辨率及集成化等一系列性能指标方面已超过了传统频率合成技术,频率合成技术是将一个(或多个)基准频率变换成另一个(或多个)合乎质量要求的所需频率的技术,在通信、雷达、导航、电子侦察、干扰与抗干扰等众多领域都有应用[1]。DDS技术是一种从相位概念出发直接合成所需要的波形的新的全数字频率合成技术,同传统的频率合成技术相比,它具有极高的频率分辨率、极快的变频速度,变频相位连续、相位噪声低,易于功能扩展和全数字化便于集成,容易实现对输出信号的多种调制等优点,满足了现代电子系统的许多要求,因此得到了迅速的发展。以正弦波信号发生器为例,利用DDS技术可以根据要求产生不同频率的正弦波,而且可以控制其初始相位和幅度,同样也可以利用DDS技术产生任意的波形[2]、[3]。DDS原理图如图1所示。相位字输入频率字输入相位累加器ROM查找相位调制器基准时钟CLK输出LPFD/A图1DDS的结构原理DDS是一种全数字化的频率合成器,由相位累加器、波形ROM查找表、D/A转换器和低通滤波器LPF构成。时钟频率给定后,输出信号的频率取决于频率控制字,频率分辨率取决于累加器的位数,相位分辨率取决于ROM的地址线位数,幅度量化噪声取决于ROM数据位字长和 D/A转换器的位数[4]、[5]。相位累加器是DDS技术的系统的核心,它是由一个N位累加器和N个位寄存器组成的,主要是对频率控制字的2进制码进行累加运算,是典型的反馈电路。相位调节器主要用于信号的相位的调节。波形ROM查找表主要是存储波形抽样值,D/A转换器就是将数字量波形幅值转换求频率的模拟量信号。低通滤波器就是将频率的模拟量信号转换成正弦波信号输出[6]、[7]。目前实现DDS的主要有三种实现方案:一,采用传统的硬件电路组合实现,可靠性差、系统庞大、灵活性小、线路复杂、调试安装都不方便,且扩展功能困难,不宜在短时间内完成。二,采用单片机为核心实现,单片机处理速度使DDS的频率范围非常有限,加上单片机本身端口较少,对于一个外部频率选择键盘输入、ROM地址查表输出以及LED数码管显示的系统来说,端口资源变得非常紧张。三,采用FPGA作为控制器,利用其丰富的I/O资源,并行处理数据。具有高密度、高速度、多功能、低功耗、设计灵活方便、可无限次反复编程等特点,由FPGA完成信号的产生、频率控制、LED显示等,其优点在于系统结构紧凑,可以实现复杂的测量与控制[8]、[9]。本研究的课题主要根据方案三来设计,该方案的系统主要由健盘模块、LED显示模块、FPGA单元控制模块、D/A转化模块和低通滤波器组成,以FPGA为主控制芯片,结合DDS直接数字频率合成技术产生正弦波信号[10]。键盘模块,主要是通过键盘电路改变频率控制字K,从而实现对正弦信号的频率、相位的初始化设置。为了节省FPGA的I/O端口,简化硬件线路,键盘电路采用4×4矩阵式健盘。键盘共设有14个键,其中包括4个功能健。按键0~9设置为输出频率,ENTER键为确定,用于对波形信号设置的确认,波形信号的设置必须“确定”后才有效,CLR键为清零,将频率数字快速全部清零,“↑”和“↓”键为增减信号频率。使用时先通过“0~9”、“↑”、“↓”12个设置按键输入所需信号频率,再按下ENTER执行健,刷新频率控制字K,使输出信号频率发生变化。CLR键用于将原有的设定值清零[11]。LED显示模块,主要是完成频率控制字的显示,采用八位的由键盘输入的频率控制字,累计寻址,读取8位地址长度256点的一个周期波形的数字幅度信息,所以频率控制字控制着频率的大小,而恰好此时的频率控制字就是系统输出波形的频率,所以,LED显示的也是波形的频率。此模块主要的功能是将外部键盘的8位二进制数转换成三位BCD码。FPGA控制模块包括键盘转换频率控制字、LED显示控制、相位累加器、ROM查询表的实现。键盘电路是一组按键开关的集合,FPGA扫描键盘电路的电平信号,在基准时钟控制下,通过FPGA中指定程序转化为频率控制字K输入到相位累加器, 以得到相应相位数据,而相位累加器的相位频率就是DDS输出信号频率[12]。相位调制器接收相位累加器的相位输出,主要用于信号的相位调制,其输出的数据作为查找表的相位取样地址。这样就可把存储在波形ROM内的波形抽样值(--进制编码)经查找表查出,完成相位到幅值转换,再经DAC将数字量形式的波形幅值转换成所要求频率的模拟量形式信号,最后由低通滤波器将DAC输出的阶梯状波形平滑为所需的连续波形,即可得到由频率控制字决定连续变换输出的正弦波。低通滤波电路模块,滤波器是一种能通过有用频率信号而同时抑制(或衰减)无用频率信号的电子装置。由于运算放大器具有近似理想的特性,且可以省去电感,得到接近理论预测的频率响应特性。构成有源滤波电路后还具有一定的电压放大和缓冲作用,并能减小体积,使用低通滤波器将滤除阶梯信号中的谐波分量,一般采用2阶低通滤波电路,阶梯信号通过低通滤波,使得输出信号频谱纯度较好,失真较小。利用VHDL语言在QuartueⅡ软件中对DDS正弦波信号发生器要实现的功能进行编程,对设计进行仿真,观察仿真结果是否和预想的效果相同[13]、[14]。基于FPGA进行直接数字频率合成(DDS)的设计,实现了一个正弦波信号发生器,实现DDS调频信号电路,只要改变FPGA中ROM内的数据和控制参数,DDS就可以产生任意调制波形,且分辨率高,具有相当大的灵活性。DDS技术嵌入到FPGA芯片所构成的系统中,所需要的成本远远低于专用芯片的价格。所以采用FPGA来设计DDS系统具有很高的性价比[15]参考文献:[1]StephenBrown,ZvonkoVranesic.FundamentalsofDigitalLogicwithVerilogDesign(2ndEdition)[M].NewYork:McGraw-Hill,2007,5.[2]李海松等.DDS的相位截断及相应的杂散信号分析[J].微电子学与计算机,2006,23(2):141—143.[3]Ming-BoLin.DigitalSystemDesignsandPractices:UsingVerilogHDLandFPGAs[M].NewYork:McGraw-Hill,2008,8.[4]白居宪.直接数字频率合成[M].西安:西安交通大学出版社,2007.7.[5]黄智伟.锁相环与频率合成器电路设计[M].西安:西安电子科技大学出版社,2008.1.[6]刘延飞等.基于AlteraFPGA/CPLD的电子系统设计及工程实践[M].北京:人民邮电出版社,2009,9.[7]杨晓慧等.基于FPGA的EDA/SOPC技术与VHDL[M].北京:国防工业出版社,2007.7.[8]刘皖等.FPGA设计与应用[M].北京:清华大学出版社,2006.6. [9]赵雅兴.FPGA的原理、设计与应用[M].天津:学出版社,2003.11.[10]张庆玲等.FPGA原理与实践[M].北京:北京航空航天大学出版社,2006.4.[11]朱恭生等.FPGA/CPLD系统设计与应用案例[M].北京:中国电力出版社,2009.[12]刘韬等.FPGA数字电子系统设计与开发实例导航[M].北京:人民邮电出版社,2005.6.[13]乔长阁等.用VHDL设计电子线路[M].北京:清华大学出版社,2000.8.[14]周润景等.基于QuartusⅡ的FPGA/CPLD数字系统设计实例[M].北京:电子工业出版社,2007年8月.[15]贾立新等.电子系统设计与实践[M].北京:清华大学出版社,2007年4月. 毕业设计(20__届)基于FPGA的DDS正弦波发生器设计摘要 现代测试领域中,经常需要信号发生器提供多种多样的测试信号去检验实际电路中存在的设计问题,目前以FPGA为主控的DDS正弦波信号发生器正在得到广泛的应用。该系统主要由健盘电路、LED显示、FPGA单元、D/A转化和低通滤波器构成,以FPGA为主控制芯片,结合DDS直接数字频率合成技术产生正弦波信号,同时产生稳定的正弦波。该设计只要通过改变FPGA中ROM内的数据和控制参数,DDS就可以产生任意调制波形,且分辨率高。该正弦波发生器具有相当大的灵活性。最后利用VHDL语言进行编译并通过QuartusⅡ软件进行仿真,经过实际仿真表明,正弦波信号发生器工作正常,结果基本符合设计要求。关键词:FPGA;DDS;正弦波信号发生器;QuartusIIAbstractSignalgeneratorisoftenneededtoprovidediversetestsignalfortestingthe designproblemofcircuitinthemoderntestingfield.Atpresent,atestingsystemnamedDDSsinewavesignalgeneratorwhichisbasedontheFPGAisbeingusedbroadly.Thissystemiscomposedofkeyboardcircuit,LEDdisplay,FPGAmodule,D/AconversionandlowLow-passfilter.TheFPGAworksasthecontrolchipcombineswiththedirectdigitalfrequencysynthesisproducesstablesinewaveandsinewavesignalsimultaneously.ThisdesigncanhelptheDDSemerginganykindofwaveformwithahighresolutionratioonlythroughchangingtheROMdataandcontrolsparameterofFPGAandthesign-wavegeneratorisextremelyflexible.Atlast,youcanusetheVHDLforcompilingandQuartusIIforemulating.Throughthisprocess,ifthesign-wavegeneratoroperatessmoothly,thissystemisprovedtobecompliedwiththedesigndemandbasically. Keywords:FPGA;DDS;Sinewavesignalgenerator;QuartusII 目录1引言12实现方案的确定22.1DDS的实现原理22.2DDS芯片实现信号发生器42.3利用微处理器实现DDS信号发生器42.4利用FPGA实现DDS信号发生器53功能模块设计与实现73.1数字/模拟转换器模块83.2波形数据表模块93.3相位累加器模块103.4显示电路模块123.5键盘电路模块133.6控制时钟电路模块164综合调试和结论174.1顶层电路174.2过程调试195展望21致谢22参考文献23附录1VHDL程序清单24 1引言这些年来随着我国对超大规模集成电路的重视,也发表了许多关于DDS技术的论文,逐步走上了发展的道路,但是在这之中主要是利用DDS技术去实现功能的改进和对性能指标的提高,几乎是没有关于DDS芯片的设计和研发,因此我国在DDS的研究上与国际水平还是有很大的差距。但是近几年来我国芯片产业的快速发展,对DDS的研究已经有了突破性的进展从而推动数字信号处理器的飞速发展,使微处理器具有先进的数字信号处理技术,能实现多种功能,对正弦波发生器而言,随着DDS技术的诞生,使波形发生器技术得到进一步的飞跃。相对与其他频率合成技术,DDS技术产生的正弦波具有全数字化、输出频率精度高、波形失真小、频率稳定度高、分辨率高、输出相位连续可调、控制灵活方便、可产生宽带正交信号及其他多种调制信号以及等特点[1]。现场可编程门阵列(FPGA)作为一种新型的可编程逻辑器件,在短短二十多年的时间就成为了数字系统的核心器件,在诸多领域得到了广泛的应用,如计算机硬件、航空航天等。随着工艺技术的进步和设计理念的创新,推动着集成电路产业不断向前发展。现场可编程门阵列FPGA是大规模可编程器件,它具有速度高、规模大、可编程以及有强大的EDA软件设计平台的支持等特性。同时,FPGA厂商正努力将CPU/DSP、存储器、模拟电路与可编程逻辑器件集成在一起,使FPGA向着片上硬件可编程系统方向发展的主流。本次研究课题是基于FPGA的DDS正弦波发生器设计,采用FPGA设计实现DDS电路的可行性和可靠性,也更为灵活,可以根据不同的需要对控制方式和接口进行相应的修改,要想使DDS电路产生正弦波形,只要对FPGA中ROM表的数据进行修改。另外FPGA设计还具有相对较宽的带宽、频率转换时间较短、相位连续变化、频率分辨率高等优点。同时FPGA芯片还可以对体统进行现场修改和调试,性能也使用要求,所以将DDS设计嵌入到FPGA片所构成的系统中,将使系统具有很高的性价比[2]。 2实现方案的确定目前实现DDS的主要有三种实现方案:采用DDS信号发生器芯片实现DDS信号发生器、利用微处理器实现DDS信号发生器和利用FPGA实现DDS信号发生器。2.1DDS的实现原理一个基本的DDS系统由数控振荡器(NCO)、数模转换器(DAC)和低通滤波器(LPF)3部分构成,如图2-1所示。FoutFW(N-1:0)NCOLPFDACfc图2-1DDS的基本原理数控振荡器(NOC)产生频率可控制的数字正弦载波,通过数模转换器(DAC)得到模拟正弦波,最后经过低通滤波器(LPF)除去各种干扰信号。另外DDS工作原理框图如图2-2所示。ROM查询表相位累加器DACMLNCO频率控制字滤波器FoutNN图2-2DDS原理框图DDS工作原理的实质是以基准频率源(系统时钟)对相位进行等间隔采样。如图2-2所示,DDS由相位累加器和波形存储器(即ROM查询表)构成的数控振荡器(NumericallyControlled Oscillators,NCO)、数模转化器(DAC)以及低通滤波器(LPF)3部分组成。在每一个时钟周期,N位相位累加器与其反馈值进行累加,其结果的高L位作为查询表的地址,然后从ROM中读出相应的幅度值送到DAC。再由DAC将其转换成阶梯模拟波形,最后由具有内插作用的LPF将其平滑为连续的正弦波形作为输出[3]。因此,通过改变频率控制字K就可以改变输出频率f0。相位输入字在DDS的设计中其最基本的构造是相位累加器和波形存储器。通常也可在波形存储器前面加一个相位调制器,使其具有相位调制的功能,为了防止频率控制字、相位控制字改变时干扰相位累加器和相位调制器的正常工作,分别在这两个模块前面加入两组寄存器,从而灵活且稳定地控制频率字和相位字的输入,如图2-3所示。寄存器N频率输入字寄存器寄存器MNN正弦ROM查找表D/A相位调制器Clk相位累加器系统时钟图2-3DDS设计结构图2-3中相位累加器(Phaseaccumulator)是整个DDS系统的核心,在这里完成相位累加功能,其输入是相位增量,又可称为频率控制字。相位调制器(Phasemodulator)接收相位累加器的相位输出,在这里加一个相位偏移值,主要用于实现信号的相位调制,如PSK(相移键控)等,在不使用时可以去掉该部分,或加一个固定的相位控制字。波形存储器(即正弦ROM查找表)(WaveformMemory)把存储在相位累加器中的抽样值转换成正弦波幅度的数字量函数,可理解相位到幅度的转换。它的输入是相位调制器输出的高M位(而并非全部N位)值,将其作为正弦ROM查找表的地址值;查找表把输入的地址相位信息映射成正弦波幅度信号;输出送往DAC,转化为模拟信号[4]。 2.2DDS芯片实现信号发生器目前常见的DDS信号发生器芯片主要有AD9850,器功能框图如图2-4所示。正弦信号输出参考时钟输入高速DDS10位数字、模拟转化器芯片复位32位频率控制字5位相位控制字正弦信号输入频率/相位数据寄存器输出刷新方波信号输出控制字装载输入数据寄存器比较器串行装载并行装载8位X51位X40图2-4AD9850的功能方框图AD9850把DDS技术和高速数字/模拟转换器结合在一起,形成一个全数字化、可编程的信号发生器。在一个精确的参考时钟源的控制下,它可以产生一个频谱较纯、频率/相位可编程的模拟正弦信号,这个正弦信号就是用作信号源。AD9850的频率控制字为32位;相位控制字为5位;时钟最高频率为125MHz;输出频率调节速率达每秒23兆次。当采用125MHZ的时钟频率时,AD9850的频率分辨率为0.0291Hz,最高输出频率为62.5MHz。使用DDS信号发生器芯片的最大优点是输出频率较高,缺点是用户不能修改输出信号波形。2.3利用微处理器实现DDS信号发生器利用微处理器能够实现相位累加器、希望产生波形的数据表以及数字/模拟转换器的控制时序。 相位累加器的位数越多,输出信号的频率分辨率越好,也就是输出信号的频率可以被调整的越准确。如果使用微处理器数据位数低于累加器的位数,这时可以通过多次运算来完成相位累加。例如,使用MSCS51系列单片机,单片机时钟电路的频率为12MHz,数字/模拟转换器使用DA0832产生正弦波,采用查表的方法输出一个正弦函数值将需要14个机器周期,即14us。如果正弦波的数字波形表用36个点来描述一个完整的正弦波,因此所产生的正弦信号的最小周期为504us,即最高频率有1984Hz。系统产生的正弦信号频率的调整可以通过在程序中添加具有延时功能的指令或者子程序来实现。在产生一个正弦函数值的过程中增加一句空操作指令NOP可以实现1us的最小延时,这时系统产生一个正弦函数值则需要15个机器周期,即15us。产生一个完整正弦波则需要540个机器周期,即540us,对应的信号频率约为1851Hz。综上所述,从原理来说,利用微处理器能够实现DDS技术的电路结构,并能产生所需要的任意波形,但是输出信号的最高频率受到很大的限制。使用具有高数据位数和高时钟频率的微处理器在一定程度上可以克服这个缺点,但这将导致成本提高。2.4利用FPGA实现DDS信号发生器基于FPGA设计的正弦信号发生器组成框图如图2-5所示,它包括显示电路、键盘电路、可编程逻辑器件电路、模拟信号放大电路和低通滤波器[5]。显示电路信号输出低通滤波器模拟信号放大电路键盘电路DDS核电路DAC7611图2-5正弦信号发生器组成框架如图2-5所示的正弦信号产生器的输出频率是由键盘控制。由于输出信号频率包含多位数据,因此在使用键盘输入信息的过程之中,输出信号频率需要保持不变。当所有信息输入完成之后,通过按下执行键,刷新DDS核的输入频率字,使得输出信号频率发生相应的变化。 显示电路在这里也是既被用来显示输出信号的频率值,也被用来显示键盘电路的调整过程。小型系统的显示电路常采用数码管或者液晶显示器件。前者电路简单,后者不仅可以显示数据,而且可以显示字符。为简化设计,这里采用数码管。现场可编程门阵列器件被用来实现相位累加器、希望产生波形的数据表以及数字模拟转换器的控制时序。这些具体的电路功能可以使用QuartusII集成开发软件来开发,这部分是本设计的核心部分。由波形的数据表输出的数据波形通过数字模拟转换器的控制代码送到数字模拟转换器DAC7611,产生需要的正弦波形。DAC7611是一种具有串行同步接口的12位数字模拟转换器,使用该器件简化电路,但是它的转换速率对输出信号的最高频率有影响。数字模拟转换器输出的正弦信号是由许多小台阶来模拟产生的,基于DDS原理的信号源,无论它的工作频率如何,这些小台阶的周期都是一个确定值,因此一个上限频率确定的低通滤波器可以被用来滤除输出信号中的谐波分量。电路中所使用运算放大器的频带宽度需要被仔细考虑以满足输出频率范围的要求。由于随着工作频率的提高,运算放大器的放大倍数将下降,因此需要选择具有足够工作频率范围的运算放大器器件。另外,通过合适的选择运算放大器的器件型号还可以同时实现低通滤波器的作用。如图2-6所示正弦信号产生器的系统代码框图中,键盘识别模块用来完成按键有效地识别,并产生相应的按键有效信号。由于输入的频率包括多位有效数字,键盘输入处理模块需要识别当前正在调整的数位,并根据具体情况调整对应数位的数值。显示键盘识别频率字波形数据形相位累加器译码图2-6正弦信号发生器的系统代码框图 输入的信号频率值采用十进制,单位为Hz。这个频率值一方面被送到显示模块;一方面被送到译码模块。在显示模块中,这个频率值也要进行译码,转换成对应的显示代码,用来驱动多位7段数码管。在译码模块中,这个频率值将被转换为对应的频率字送到相位累加器。频率数值到对应的频率字的转换包括两个过程:输入频率的多位有效数字被合成为一个数据;十进制数制到二进制数制的转换[6]。控制时钟有效时,频率字中的数据加入相位累加器。相位累加器循环累加,进位位被丢弃。它的溢出率即为输出信号的频率,改变频率字就可以改变这个溢出率,从而实现输出信号频率的调整。为提高输出信号频率的分辨率,相位累加器的位数高于波形数据表的地址为数,因此需要截取相应累加器输出的部分高数据位来产生需要的地址。波形数据表输出其地址对应的波形数据到数字模拟转换器控制模块。在数字模拟转换器控制模块中,波形数据被编入控制时序中,结合其他所需要的控制信息一起以串行同步的数据传输方式被送到数字模拟转换器。所以采用FPGA作为控制器,利用其丰富的I/O资源,并行处理数据。具有高密度、高速度、多功能、低功耗、设计灵活方便、可无限次反复编程等特点,由FPGA完成信号的产生、频率控制、LED显示等,其优点在于系统结构紧凑,可以实现复杂的测量与控制。本研究的课题主要根据方案三来设计,以FPGA为主控制芯片,结合DDS直接数字频率合成技术产生正弦波信号。这里主要介绍采用FPGA实现DDS信号发生器。 3功能模块设计与实现根据前面确定的方案,正弦波发生器功能模块主要是由数字/模拟转换器模块、波形数据表模块、相位累加器模块、显示电路模块、键盘电路模块和控制时钟电路模块组成,以FPGA为控制核心,配以相应硬件电路,完成正弦波的频率,幅值等功能的调试。下面就各个模块的设计、仿真调试和结果等作概要的介绍。3.1数字/模拟转换器模块数字/模拟转换器模块的功能仿真模块图如图3-1所示,功能上是参照美国BURR-BROWN公司产生的DAC7611芯片功能设计的,在完成硬件电路的设计和软件编程之后还需要对单元的工作情况进行测试[7]。图3-1数字/模拟转换器模块图这里的数字模拟转换器DAC7611的工作可以分为两步:接受数据和完成数字模拟转换。接收数据采用串行同步接口,每来一个时钟接收一个数据。从DAC7611的数据手册得到,时钟最小周期为60ns,完成12位数据需要720ns。完成数字模拟转换比较慢,这个过程需要7us。数字接收和数字模拟转换是相互独立的,在信号产生器设计中数字模拟转换器需要连续工作,因此,可以把数据接收需要的时间和数字模拟转换需要的时间设置为相等[8]。DAC7611最大转换速率测量可以通过向它传送循环叠加的数据来实现,这时数字模拟转换器将输出锯齿波。逐渐加大系统的时钟信号频率,由观察输出信号的波形是否失真可以获得完成数字模拟转换的最小时间,即数字模拟转换的速率 最大转换速率测量代码包括3部分:程序示例所示的DAC7611控制时序VHDL代码模块、DAC7611输入数据产生代码模块以及控制上述两个部分协调工作的控制代码模块。程序示例所示的DAC7611控制时序VHDL代码完成一次包括接收数据和数字模拟转换的完整过程至少需要26个状态,或者需要26个输入时钟。为简化代码设计以及测量数据的处理,控制DAC7611时序产生代码模块和输入数据产生代码模块两个部分协调工作的控制代码模块使用30个输入时钟为一个工作周期。控制代码模块在每个周期开始的前几个周期产生正脉冲,这个正脉冲用作DAC7611的复位信号reset和输入数据产生代码模块的计数信号。复位信号reset结束的时候,输入数据产生代码模块已经完成数据调整,控制DAC7611时序产生代码模块把这个数据发送到数字模拟转换器。输入数据产生代码模块包含12位加法计数器,在控制代码模块产生的正脉冲作用下完成加法,加数的数值取决于每个锯齿波周期包含的阶梯数。控制代码模块产生的正脉冲频率就是数字模拟转换速率,这个速率为时钟频率的1/30。时钟信号频率从1MHZ开始往上调,当调节到4MHZ时发现示波器上显示的锯齿波出现失真。数字/模拟转换器仿真波形图如图3-2所示。图3-2数字/模拟转换器仿真波形图3-2中,给出当数字信号分别为“0101010101”和“1010101010”时的仿真时序图。当完成数字/模拟转换器DAC7611传送一次数据,程序将停在最后一个状态,也就是状态为26时,它产生的下一个状态仍为26,只有当复位信号有效时,当前状态被设置为初始状态。根据前面介绍的DDS理论,设相位累加器的位数为N,频率控制字内的相位增量为K,参考时钟频率为fc,则DDS系统输出的信号频率f0=fc*K/2N ,这里的最高信号频率最高为2MHz,所以使用DAC7611数字模拟转换器来产生正弦波的最高频率为70KHZ。由于本设计使用30个输入时钟为一个工作周期,所以产生一个完整周期的正弦波信号至少需要30个输出点,这时产生的正弦波最高频率约为5KHz[9]。3.2波形数据表模块信号波形的数据表中的数据为正弦信号波形数据,因此它可以产生正弦信号波形[9]。正弦信号波形数据表包含以相位地址的一个周期待产生信号数字幅度信息,每个地址对应于待产生信号中0o~360o范围内的一个相位点。数据表中的数字幅度信息量受到数字/模拟转换器分辨率的限制,它一般都低于相位累加器的位数,所以取相位累加器的高位输出做数据表的地址输入。在相同的参考时钟频率下,输出一个完整周期的波形点数的变化使得信号输出周期/频率发生改变。恰当的选择相位增量的值,就可以获取所需要的输出信号频率。使用键盘输入相位增量的信息就可以实现输出信号频率的调整。这里波形数据表模块采用的原理编辑完成顶层文件的输入,因此波形数据表直接使用QuartusII软件提供的参数可调整模块定制只读存储器的方法来实现,波形数据表具有256字节,每字节10位,如图3-3为波形数据模块的模块图,图3-4为波形数据模块的仿真波形。图3-3为波形数据模块的模块图图3-4波形数据模块的仿真波形 如图3-4所示,在输入时钟脉冲周期为10ns的情况下,address地址输入来自于相位累加器的输出,当ROM表内地址为0时,q的输出为63,当ROM表内地址为1时,q的输出为62当ROM表内地址为2时,q的输出为61,当ROM表内地址为3时,q的输出为60,当ROM表内地址为4时,q的输出为59,当ROM表内地址为5时,q的输出为58,直到当ROM表内的地址为63时,q的输出为0。3.3相位累加器模块相位累加器是DDS技术的核心[11]。它类似一个计数器。首先,软件设置相位累加器的基数为0,并通过时钟信号clk上升沿触发,基数与频率控制字K相加,相加后的值反馈到相位累加器的输入端作为下一次的基数。当相位累加器的溢出时,完成一个周期性的动作,这个周期就是DDS合成信号的一个频率周期,累加器的溢出频率就是DDS输出的信号频率。它有一个N位的全加器和一个寄存器构成,当系统时钟上升沿的时候,上一个时钟周期的相位值与频率字的相位值被送到累加器,输出高W到波形存储器的地址线,相位值又回到全加器进行相位累加。相位累加器流程图如图3-5所示。开始NO时钟上升沿到?相位累加累加器寄存是否高W位输出?高W位输出NO结束图3-5累加器流程图如图3-6和图3-7所示分别为相位累加器的模块图和仿真波形图。 图3-6相位累加器的模块图图3-7相位累加器的仿真波形图如图3-7所示,输入频率字fre代表相位累加器的频率字。变量phase代表相位累加器,每来一个时钟完成一次相位累加,相位累加器输出的高10位用来做波形数据表的地址,由管脚add_pio输出。相位累加器的输入信号包括来自控制时钟产生电路的相位累加器信号clk_phase和来自键盘电路的频率字。输出信号为送到波形数据表的地址信号。3.4显示电路模块数码管有共阴极和共阳极两种类型。前者在使用时管脚COM应接低电平,当数码管其余的某个管脚接高电平,则该管脚对应的发光段被点亮;后者在使用时管脚COM应接高电平,当数码管其余的某个管脚接低电平,则该管脚对应的发光段被点亮。数码管的管脚a到g可以直接与可编程逻辑器件的输入输出管脚连接或者通过一个限流电阻再与可编程逻辑器件的输入输出管脚连接,那么管脚COM可以直接与电源相连;如果数码管的管脚直接与可编程逻辑器件的输入输出管脚连接,那么管脚COM必须通过一个限流电阻再与电源连接。显示电路不使用数码管的小数点,管脚dp可以开路。 采用数码管的管脚通过一个限流电阻再与可编程逻辑器件的输入输出管脚连接的方法在显示不同字符的时候亮度一致,但是需要7个限流电阻;采用管脚COM通过一个限流电阻与电源连接的方法,只需要一个限流电阻,但是在显示不同字符的时候亮度不一致。限流电阻被用来防止电流过大损坏电路器件。由于不同型号的发光二极管的技术参数不同,应根据具体情况来确定限流电阻的阻值,限流电阻的取值范围是100Ω到1KΩ。为保证电路的安全,限流电阻可以开始选取大一些,如果数码管的亮度不够,在逐渐减小限流电阻的值,知道数码管的亮度满足要求。3个数码管设计为独立工作,它们各自接收需要显示的数据。准备显示的数据在可编程逻辑器件中进行译码,产生的显示代码被送到7段数码管实现数据的显示。由于3个数码管电路完全一样,下面给出其中一路的VHDL代码,该代码支持共阴极数码管的工作[12]。正弦信号产生器采用数码管来显示工作状态。为简化设计,显示电路包括3位数码管,用来显示1Hz到999Hz的输出信号频率。其原理模块图和仿真波形图如图3-8和图3-9所示:图3-8显示电路的模块图图3-9显示电路的仿真波形 如图3-9所示当data输入为0000时,则对应的seven_seg显示为0,当data输入为0001时,则对应的seven_seg显示为1,当data输入为0010时,则对应的seven_seg显示为2,当data输入为0011时,则对应的seven_seg显示为3,当data输入为0100时,则对应的seven_seg显示为4,当data输入为0101时,则对应的seven_seg显示为5,当data输入为0110时,则对应的seven_seg显示为6,当data输入为0111时,则对应的seven_seg显示为7,当data输入为1000时,则对应的seven_seg显示为8,当data输入为1001时,则对应的seven_seg显示为9.3.5键盘电路模块在键盘包含的按键开关较少的情况下,例如只包含4个按键开关,独立式键盘占用的输入输出管脚是可以接受的。具有4个按键的独立式键盘电路如图3-10所示。图3-10独立式键盘电路4个按键开关分别于4个不同的输入输出管脚相连接。这里的按键开关采用常开开关,即在没有执行按键动作的时候,开关时断开的。当某个开关断开时对应的输入输出管脚通过一个限流电阻与电源相连接,这时该管脚输入高电平。当某个按键开关被按下,对应的输入输出管脚被接地,这时该管脚的输入是低电平。键盘中的4个按键分别扮演2个不同的用途:输入数据和刷新DDS的频率状态字。输入数据通过按键KEY0、KEY1、KEY2实现,其中按键KEY0被用来调整输出信号频率的个位,按键KEY1被用来调整输出信号频率的十位,按键KEY2被用来调整输出信号频率的百位。按键KEY3被用来刷新DDS的频率状态字,因此它被称作执行键。 在输入数据的过程中,输出信号的频率保持原数值,这时只改变对应的数据存储单元的内容,并利用数码管把当前内容显示出来以方便数据调整。当按下执行键,输入的频率值被转换成新的DDS的频率状态字。数据调整键KET0、KEY1、KEY2、中的每一个都对应一个存储单元,每按一次按键,该按键对应的存储单元的内容加一。这个过程一直到内容9,每次按键将使得存储单元的内容清零。为避免一次按键导致存储单元的内容变化太大,键盘电路的时钟应该选的较低,例如1Hz。在按键被按下,同时时钟信号的前沿到来时,该按键对应的存储单元的内容加1,利用数码管把当前内容显示出来。当显示的数值为需要的数据时,释放按键[13]。开始键盘扫描流程图如图3-11。初始化扫描键盘是否有按键按下NY读取键值送LED显示函数返回图3-11键盘扫描流程图其模块原理图和波形仿真如图3-12和图3-13所示。3-12键盘电路模块图 3-13键盘电路仿真波形图如图3-13所示,该图描述了逐次按下按键KEY0、KEY1、KEY2、KEY3时仿真波形,当按下数据调整键时,对应的数据存储器内容比调整,该内容以BCD码形式输出,当按下执行键时,3个数据调整对应的数据存储器内容分别被转换成频率字,接着把这3个频率字通过相加形成要求的输出信号频率对应的频率字。3.6控制时钟电路模块本设计信号产生器系统所需要的各种时钟的产生电路。系统可以划分键盘电路和数码管显示电路的人机界面和DDS核电路以及数字模拟转换器控制代码的产生模块。前者的时钟可以直接由系统时钟通过分频获得;后者不仅需要产生多种频率的时钟信号,而且这些信号之间还需要满足一定的时间关系。为了更好的产生DDS核电路以及数字模拟转换器控制代码的产生模块需要的各种时钟信号,其工作过程:相位累加器接收从键盘电路送来的频率字,在它的时钟信号的作用下完成相位累加;相位累加器的高8位输出作为波形数据表的地址,在该地址信号稳定以后,波形数据表在它的时钟信号的作用下把地址对应的波形数据送出;在波形数据信号稳定以后,DAC7611数字模拟转换器开始装入控制信号,完成一次控制信号的装入需要26个时钟信号。由于DAC7611数字/模拟转换器完成一次转换的时间远大于其他部分所需的时间,这里首先确定它的工作速度,为方便晶体的选择,这里采取100KHZ的数字/模拟转换速率。考虑到完成一次数字/模拟转换需要26个时钟信号,因此选择系统时钟clk_sys频率为3MHZ,周期为333ns。以系统时钟为基准,30个状态为一个循环产生各种各样时钟信号。在系统时钟clk_sys的作用下,DAC7611数字/模拟转换器开始装入信号[14]。如图3-14和3-15分别为控制时钟的模块图和仿真波形图。 图3-14控制时钟的模块图图3-15控制时钟的仿真波形图如图3-15所示的仿真波形图键盘的时钟信号clk_1hz为1Hz,相位累加器的时钟信号为clk_phase,波形数据表的读数时钟信号为clk_data,DAC7611数字/模拟转换器的状态复位信号reset_dac。 4综合调试和结论4.1顶层电路在设计完各个模块后,需要将各个模块有机地组合成一个整体,最后来实现系统的功能在数字频率计的设计中,同时采用了电路原理图的设计以及VHDL语言来编写的顶层电路[15]。电路原理图见图4-1,仿真图如图4-2所示。图4-1顶层文件模块图 图4-2正弦波仿真图在前面,我们已经把发生器各组成模块的程序进行了编写,并用QuartusII7.2进行了编译仿真,从仿真时序图中可以看出,各模块实现了各自的功能,达到了预期的目标。4.2过程调试这里所采用的芯片是Altera公司生厂的CycloneII系列的EP2C5T144C8芯片,其PIN脚的设置如图4-3所示。图4-3pin脚的设置 通过万用表检测各主要部件的输入电压均处于正常值;用示波器检测晶振是否正常工作,并检测接口与主要部件是否有信号输入;完成电路板与示波器的链接。把程序下载到FPGA内。在调试过程中遇到的问题主要有:(1)程序无法烧进芯片。解决方法是检查接口,对电路板复位(2)电路板无法正常工作。解决方是可通过稳压电源供电,电路板正常。(3)芯片发烫,解决方法是将未用引脚设为三态,并接地。在编译后工程文件夹中就会生成一个.sof文件,用于下载到FPGA中实现设计的功能。在下载前必须对硬件进行连接和设置。当确认后,在QuartusⅡ中作必要的设置,点击Tool-Programmer,点击HardwareSetup,打开一个对话框如图4-4所示,在点击AddHardware。图4-4硬件设置一般情况下QuartusⅡ能够自动的监测到.sof文件。最后点击Stater下载到FPGA中。这里采用实验板是EDA-1数字电子技术实验板如图4-5所示。 图4-5EDA-1数字电子技术实验板最后通过FPGA连接示波器在示波器上调出正弦波,如图4-6和图4-7所示。图4-6正弦波在示波器上的显示 图4-7正弦波在示波器上显示调试结论和设计总结:当示波器上显示出正弦波后,如果想要调节波形的幅值,可以通过调节电位器阻值来改变幅值。想要改变正弦波的频率可以空过键盘电路(KEY0、KEY1、KEY2、KEY3)输入的频率控制字来实现频率的变化,同时当前频率会显示在数码管上,如图4-7所示的波形频率为20Hz。本次设计通过掌握DDS工作原理、基本结构和DDS设计思路,并在此基础上确定实现方案,然后确定正弦信号发生器实现结构图,具体正弦波信号的各个参数,包括频率、幅值等在信号不失真的前提下设定(通过键盘模块设定),用VHDL语言对各个模块进行程序设计,并调试通过,同时完成ROM初始化文件设计和ROM元件定制,最终显示的正弦波基本符合任务书要求。 5展望通过本次基于FPGA的DDS正弦波发生器的设计,利用VHDL语言编程实现对正弦波信号发生器的操作,是对传统的信号发生器的一大改进。它极大的提高了效率。在对几种基于不同技术构造的信号发生器的比较后,采用FPGA芯片的DDS正弦波发生器具有高密度、高速度、多功能、低功耗、设计灵活方便、可无限次反复编程等特点。在FPGA应用领域中,其运用还有着更显著的效果。上面所演示和介绍的运用DDS技术所实现的正弦波发生器的控制功能,只是运用DDS技术的小部分。本设计从FPGA着手,用VHDL语言,实现了数字直接频率合成技术(DDS)。首先通过对DDS输出信号理论分析,总体上提出实现DDS方案。然后通过相位累加器,ROM的设计,用FPGA实现了正弦波,完成了波形发生器的软件设计和调试,设计键盘,显示电路,最终实现了正弦波。同时,设计中还存在一些不足之处,主要表现在以下几个方面。第一,外围电路的控制模块不够理想,成为影响DDS的主要因素,可以用单片机控制输入部分。第二,累加器没采用流水线结构,累加器影响其频率可靠度。第三,波形ROM针对输出平坦度不够的问题,可以通过软硬件修正的方法来解决,可以扩充ROM的容量,第四,本设计主要实现的是正弦波,未能实现其他波形。通过对这次课题的研究,使我对FPGA和DDS技术具有了更加深的认识,也让我的编程能力得到了很大的提高。并且也提高了我的工程实践能力。将自己所学的专业知识充分的运用到了实践中。且通过这次课题研究,使我的相关理论知识更加扎实。并且充分学习了QuartusII软件,让我在研究过程中充分得到了锻炼。当然,在研究中也曾遇到了很多困难,查阅相关资料,逐步摸索方法,克服困难,解决了很多难题。这些经历是在以前学习中所未经历过的,相信在日后的工作中对我会有很大的帮助。 参考文献[1]StephenBrown,ZvonkoVranesic.FundamentalsofDigitalLogicwithVerilogDesign(2ndEdition)[M].NewYork:McGraw-Hill,2007,5.[2]贺敬凯.基于FPGA的信号发生器的设计[J].深圳信息职业技术学院学报,2006,6,36(6):154~157.[3]Ming-BoLin.DigitalSystemDesignsandPractices:UsingVerilogHDLandFPGAs[M].NewYork:McGraw-Hill,2008,8.[4]白居宪.直接数字频率合成[M].西安:西安交通大学出版社,2007.7.[5]黄智伟.锁相环与频率合成器电路设计[M].西安:西安电子科技大学出版社,2008.1.[6]刘延飞等.基于AlteraFPGA/CPLD的电子系统设计及工程实践[M].北京:人民邮电出版社,2009,9.[7]罗苑棠等.CPLD/FPGA常用模块与综合系统设计实例精讲[M].北京:电子工业出版社,2007.7.[8]雷伏容.VHDL电路设计[M].北京:清华大学出版社,2006.6.[9]潘松等.EDA技术与VHDL[M].北京:清华大学出版社,2005.11.[10]张庆玲等.FPGA原理与实践[M].北京:北京航空航天大学出版社,2006.4.[11]朱恭生等.FPGA/CPLD系统设计与应用案例[M].北京:中国电力出版社,2009.[12]刘韬等.FPGA数字电子系统设计与开发实例导航[M].北京:人民邮电出版社,2005.6.[13]乔长阁等.用VHDL设计电子线路[M].北京:清华大学出版社,2000.8.[14]周润景等.基于QuartusⅡ的FPGA/CPLD数字系统设计实例[M].北京:电子工业出版社,2007年8月.[15]贾立新等.电子系统设计与实践[M].北京:清华大学出版社,2007年4月. 附录1VHDL程序清单--控制时钟产生电路的VHDL代码:libraryieee;useieee.std_logic_1164.all;entityclockisport(clk_sys:instd_logic;clk_1hz:outstd_logic;clk_phses:outstd_logic;clk_data:outstd_logic;reset_dac:outstd_logic);endclock;architecturebehaveofclockissignalaqi:integerrange0to29;signalbqi:integerrange0to2999999;beginprocess(clk_sys)beginif(clk_sys'eventandclk_sys='1')thenif(aqi<29)thenaqi<=aqi+1;elseaqi<=0;endif;endif;endprocess;process(clk_sys,aqi)beginif(clk_sys'eventandclk_sys='1')thenif(aqi=0)thenclk_phses<='1';elseclk_phses<='0';endif;endif;endprocess;process(clk_sys,aqi)beginif(clk_sys'eventandclk_sys='1')thenif(aqi=1)thenclk_data<='1'; elseclk_data<='0';endif;endif;endprocess;process(clk_sys,aqi)beginif(clk_sys'eventandclk_sys='1')thenif(aqi<2)thenreset_dac<='1';elsereset_dac<='0';endif;endif;endprocess;process(clk_sys)beginif(clk_sys'eventandclk_sys='1')thenif(bqi<2999999)thenbqi<=bqi+1;clk_1hz<='0';elsebqi<=0;clk_1hz<='1';endif;endif;endprocess;endbehave;--键盘电路的VHDL代码libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entitykeyboardisport(clk_1hz:instd_logic;key_data:instd_logic_vector(3downto0);seven_sega,seven_segb,seven_segc:outstd_logic_vector(3downto0);fre:outstd_logic_vector(21downto0));endkeyboard;architecturebehaveofkeyboardissignalkey_rama,key_ramb,key_ramc:std_logic_vector(3downto0);beginprocess(clk_1hz,key_data)variablefre_a,fre_b,fre_c:std_logic_vector(21downto0);begin if(clk_1hz'eventandclk_1hz='1')thenif(key_data="1110")thenif(key_rama<"1001")thenkey_rama<=key_rama+1;elsekey_rama<="0000";endif;endif;if(key_data="1101")thenif(key_data<="1001")thenkey_ramb<=key_ramb+1;elsekey_ramb<="0000";endif;endif;if(key_data="1011")thenif(key_ramc<="1001")thenkey_ramb<=key_ramc+1;elsekey_ramc<="0000";endif;endif;if(key_data="0111")thencasekey_ramaiswhen"0000"=>fre_a:="0000000000000000000000";when"0001"=>fre_a:="0000000000000000001010";when"0010"=>fre_a:="0000000000000000010100";when"0011"=>fre_a:="0000000000000000011111";when"0100"=>fre_a:="0000000000000000101001";when"0101"=>fre_a:="0000000000000000110100";when"0110"=>fre_a:="0000000000000000111110";when"0111"=>fre_a:="0000000000000001001001";when"1000"=>fre_a:="0000000000000001010011";when"1001"=>fre_a:="0000000000000001011110";whenothers=>null;endcase;casekey_rambiswhen"0000"=>fre_b:="0000000000000000000000";when"0001"=>fre_b:="0000000000000001101000";when"0010"=>fre_b:="0000000000000011010001";when"0011"=>fre_b:="0000000000000100111010";when"0100"=>fre_b:="0000000000001101000110";when"0101"=>fre_b:="0000000000001001110101";when"0110"=>fre_b:="0000000000001011011110"; when"0111"=>fre_b:="0000000000001011011110";when"1000"=>fre_b:="0000000000001101000110";when"1001"=>fre_b:="0000000000001110101111";whenothers=>null;endcase;casekey_ramciswhen"0000"=>fre_b:="0000000000000000000000";when"0001"=>fre_b:="0000000000010000011000";when"0010"=>fre_b:="0000000000100000110001";when"0011"=>fre_b:="0000000000110001001001";when"0100"=>fre_b:="0000000001000001100010";when"0101"=>fre_b:="0000000001010001111010";when"0110"=>fre_b:="0000000001100010010011";when"0111"=>fre_b:="0000000001110010101100";when"1000"=>fre_b:="0000000010000011000100";when"1001"=>fre_b:="0000000010010011011101";whenothers=>null;endcase;endif;endif;fre<=fre_a+fre_b+fre_c;endprocess;seven_sega<=key_rama;seven_segb<=key_ramb;seven_segc<=key_ramc;endbehave;--显示电路的VHDL代码:libraryieee;useieee.std_logic_1164.all;entityxianshiisport(data:instd_logic_vector(3downto0);seven_seg:outstd_logic_vector(6downto0));endxianshi;architecturebehaveofxianshiisbeginwithdataselectseven_seg<="0111111"when"0000","0000110"when"0001","1011011"when"0010","1001111"when"0011","1101101"when"0100","1111101"when"0101","0000111"when"0110","1111111"when"1000", "1101111"when"1001","0000000"whenothers;endbehave;--相位累加器的VHDL代码:LIBRARYieee;USEieee.std_logic_1164.ALL;USEieee.std_logic_unsigned.ALL;ENTITYadderISPORT(clk:INSTD_LOGIC;fre:INSTD_LOGIC_vector(21DOWNTO0);add_pio:OUTSTD_LOGIC_vector(7DOWNTO0));ENDadder;ARCHITECTUREbehaveOFadderISBEGINPROCESS(clk,fre)VARIABLEphase:STD_LOGIC_VECTOR(21DOWNTO0);BEGINIF(clk'EVENTANDclk='1')THENphase:=phase+fre;ENDIF;add_pio<=phase(21DOWNTO14);ENDPROCESS;ENDbehave;--DAC7611数字/模拟转换器控制模块VHDL代码libraryieee;useieee.std_logic_1164.all;entitye_g0706isport(reset,clock:instd_logic;d_in:instd_logic_vector(11downto2);sdi,clk,cs,ld:outstd_logic);ende_g0706;architecturestyle2ofe_g0706issignalcurrent_state,next_state:integerrange0to26;signalsdi_t,clk_t,cs_t,ld_t:std_logic;beginreg:process(reset,clock)beginif(reset='1')thencurrent_state<=0;elsif(clock'eventandclock='1')then current_state<=next_state;sdi<=sdi_t;clk<=clk_t;cs<=cs_t;ld<=ld_t;endif;endprocessreg;com:process(d_in,current_state)begincasecurrent_stateiswhen0=>next_state<=1;sdi_t<='0';clk_t<='0';cs_t<='0';ld_t<='1';when1=>next_state<=2;sdi_t<=d_in(11);clk_t<='0';cs_t<='0';ld_t<='1';when2=>next_state<=3;sdi_t<=d_in(11);clk_t<='1';cs_t<='0';ld_t<='1';when3=>next_state<=4;sdi_t<=d_in(10);clk_t<='0';cs_t<='0';ld_t<='1';when4=>next_state<=5;sdi_t<=d_in(10);clk_t<='1';cs_t<='0';ld_t<='1';when5=>next_state<=6;sdi_t<=d_in(9);clk_t<='0';cs_t<='0';ld_t<='1';when6=>next_state<=7;sdi_t<=d_in(9);clk_t<='1';cs_t<='0';ld_t<='1';when7=>next_state<=8;sdi_t<=d_in(8);clk_t<='0';cs_t<='0';ld_t<='1';when8=>next_state<=9;sdi_t<=d_in(8);clk_t<='1';cs_t<='0';ld_t<='1';when9=>next_state<=10;sdi_t<=d_in(7);clk_t<='0';cs_t<='0';ld_t<='1';when10=>next_state<=11;sdi_t<=d_in(7);clk_t<='1';cs_t<='0';ld_t<='1';when11=> next_state<=12;sdi_t<=d_in(6);clk_t<='0';cs_t<='0';ld_t<='1';when12=>next_state<=13;sdi_t<=d_in(6);clk_t<='1';cs_t<='0';ld_t<='1';when13=>next_state<=14;sdi_t<=d_in(5);clk_t<='0';cs_t<='0';ld_t<='1';when14=>next_state<=15;sdi_t<=d_in(5);clk_t<='1';cs_t<='0';ld_t<='1';when15=>next_state<=16;sdi_t<=d_in(4);clk_t<='0';cs_t<='0';ld_t<='1';when16=>next_state<=17;sdi_t<=d_in(4);clk_t<='1';cs_t<='0';ld_t<='1';when17=>next_state<=18;sdi_t<=d_in(3);clk_t<='0';cs_t<='0';ld_t<='1';when18=>next_state<=19;sdi_t<=d_in(3);clk_t<='1';cs_t<='0';ld_t<='1';when19=>next_state<=20;sdi_t<=d_in(2);clk_t<='0';cs_t<='0';ld_t<='1';when20=>next_state<=21;sdi_t<=d_in(2);clk_t<='1';cs_t<='0';ld_t<='1';when21=>next_state<=22;sdi_t<='0';clk_t<='0';cs_t<='0';ld_t<='1';when22=>next_state<=23;sdi_t<='0';clk_t<='1';cs_t<='0';ld_t<='1';when23=>next_state<=24;sdi_t<='0';clk_t<='0';cs_t<='0';ld_t<='1';when24=>next_state<=25;sdi_t<='0';clk_t<='1';cs_t<='0';ld_t<='1';when25=>next_state<=26;sdi_t<='0';clk_t<='0';cs_t<='0';ld_t<='1'; when26=>next_state<=26;sdi_t<='1';clk_t<='0';cs_t<='0';ld_t<='1';endcase;endprocesscom;endstyle2;

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
关闭