基于FPGA的直接数字频率合成器的设计本科毕业设计_第1页
基于FPGA的直接数字频率合成器的设计本科毕业设计_第2页
基于FPGA的直接数字频率合成器的设计本科毕业设计_第3页
基于FPGA的直接数字频率合成器的设计本科毕业设计_第4页
基于FPGA的直接数字频率合成器的设计本科毕业设计_第5页
已阅读5页,还剩50页未读 继续免费阅读

下载本文档

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

文档简介

河南理工大学毕业设计(论文)说明书PAGEPAGE50毕业设计论文基于FPGA的直接数字频率合成器的设计摘要在频率合成领域,常用的频率合成技术有直接模拟合成、模拟锁相环、小数分频锁相环等,直接数字频率合成(DirectDigitalFrequencySynthesis,DDFS,简称DDS)是近年来的新的频率合成技术。本文介绍了直接数字频率合成器的基本组成及设计原理,给出了基于FPGA的具体设计方案及编程实现方法。仿真结果表明,该设计简单合理,使用灵活方便,通用性好,可写入各种FPGA芯片,最高可将频率提高100万倍。具有良好的性价比。关键词直接数字频率合成器(DDS)FPGADesignofdirectdigitalfrequencysynthesizerbasedonFPGAAbstractInFrequencydomain,thecommonSynthesistechnologyhasDirectsimulation,phaselockloopsimulation,decimalFrequencyandphaselockloop,DirectDigitalFrequencySynthesis(assomeDDFS,Digital,referredtoasspuriousbio-synthesis)inrecentyearsisthenewFrequencySynthesistechnology.ThestructureandprinciplesofDirectDigitalFrequencySynthesizerisintroduced.AlsoadetaileddesignandthemethodofprogramrealizationbasedonFPGAareintroduced.Theresultofsimulationshowsthatthedesignissimpleandfeasible,convenientandflexible,highuniversality,writeablevariousFPGAchip,thehighestfrequencycanbe100milliontimes.Ratioforqualitytoprice.KeywordsDirectDigitalfrequencySynthesizer(DDS)FPGA前言在频率合成领域,常用的频率合成技术有直接模拟合成、模拟锁相环、小数分频锁相环等,直接数字频率合成(DDS)是近年来的新的频率合成技术。DDS以稳定度高的参考时钟为参考源,通过精密的相位累加器和数字信号处理,再通过高速D/A变换器产生所需的数字波形,这个数字滤波经过一个模拟滤波器后,得到最终的模拟信号波形。DDS是产生高精度、快速频率变换、输出波形失真小的优先选用技术。随着可编程逻辑器件的飞速发展,使用FPGA(Field-ProgrammableGateArray)设计DDS系统成为一种很好的选择,由于FPGA现场可编程,设计复杂或者简单系统完全从实际需要出发,通过重写RAM/ROM数据,可以做到任意波形输出和动态波形输出,这是其他方法所无法比拟的。本章提出了一种基于FPGA的直接数字频率合成设计方法,并利用比例乘法器,将频率分辨率提高到惊人的程度。目录1DDS原理 11.1直接模拟(DAS) 11.2间接式频率合成(PLL) 11.3直接数字频率合成(DDS) 22系统设计 62.1 微控制器接口模块 82.2相位累加寄存器 82.3 双端口RAM 83 模块设计与实现 153.1微控制器接口模块 153.1.1 分频寄存器(FWORD1-FWORD4) 163.1.2 控制寄存器(DDSCR) 163.1.3 数据输入寄存器(DATA) 173.2比例乘法器模块 313.3相位累加器模块 373.4双端口RAM模块 39TOC\o"1-1"\h\z\u致谢 48参考文献 49DDS原理顾名思义频率合成技术,就是能从一个高稳定和准确度的标准频率中产生千百万个同一高稳定度和准确度的频率。频率合成技术广泛地应用于通信、导航、雷达、仪器仪表、军事装备等领域、现代的电子系统对频率合成器提出越来越高的要求,主要表现在:转换速度快、频段宽、步进间隔小、杂散小、体积小、重量轻、功耗低等。随着大规模集成电路的发展,频率合成技术日趋完善,目前,主要有以下几种方式。1.1直接模拟(DAS)直接模拟合成技术是通过对标准参考频率进行加、减、乘、除运算而合成一系列相干频率,其换频率速度主要由电路部件响应速度决定,相位噪声指标也还不错。主要技术问题是杂波干扰,由于直接模拟合成引入了大量的混频器、倍频器、分频器,这些非线性的部件使得杂波抑制相当困难、在实际应用中,这种技术的电路结构比较复杂,体积、重量、成本等方面缺点大大限制其应用、1.2间接式频率合成(PLL)间接式频率合成技术重要有鉴频器、环路滤波器、压控振荡器、分频器等4个基本部件构成,如下图1-1所示。锁相环是一个相位误差反馈控制系统,它比较输入信号和压控振荡器经分频后输出信号之间的相位差,从而产生误差控制电压来调整压控制振荡器的输出频率,以达到与输入信号倍频的关系。锁相环的频率转换速度与环路滤波器的带宽有关,环路带宽越宽,转换速度越快,而环路带宽又取决于鉴相器频率。才用这种技术产生的频谱较纯,系统体积小、重量轻、成本低、易集成,具有广泛的应用前景。但是,它也有一个致命的缺点,就是在高分辨率情况下,换频速度较慢。分频器分频器鉴相器压控振荡器低通滤波器合成频率参考频率图1-1锁相环电路基本结构为了解决高分辨率于高鉴相频率之间的矛盾,可以采用多环技术或者小数分频技术。如果要求分辨率很高,那么采用多环PLL就显得电路结构复杂、成本高、调试困难;而采用小数分频技术,可以轻易解决高分辨率问题,但是小数分频的主要问题是“尾数难抑”,国内外对这方面的研究不少,但是还没有彻底解决。1.3直接数字频率合成(DDS)DDS的概念最初是有美国学者J.Tierncy,C.M.Rader和B.Gold提出的,它是以全数字技术,从相位概念出发直接合成所需波形的一种新的频率合成技术,典型的DDS系统由相位累加器,波形查找表(ROM/RAM),D/A,低通滤波器(LowPassFilter简称LPF)构成,如图1-2所示。低通滤波器低通滤波器m相位累加器波形查找表D/A图1-2DDS原理框图图中,m为相位累加器步长,也有资料称为频率控制字,是参考频率,是合成频率。其系统的核心是相位累加器,它由一个累加器和一个n位相位寄存器组成(也可用带有输出锁存的累加器代替),如图1-3所示。每来一个时钟脉冲,相位累加器以步长m累加,其结果作为波形查找表地址。当相位累加器加满量程,就会产生一次溢出,完成一个周期性的动作,这个周期是合成信号的一个周期,换句话说,累加器的溢出频率也就是DDS的合成信号频率。相位累加器的输出数据作为波形查找表地址,进行波形的相位—幅值的转换,即可在给定的时间上确定输出波形的抽样幅值,如图1-4所示。n位的寻址RAM/ROM相当于把正弦信号离散成具有个样值的序列,以二进制数值形式存储在个地址单元,按照地址不同输出相应的信号幅值。D/A转换器的作用是把合成的数字波形转换成模拟波形。离散量化幅度序列S(n)经D/A转换后变成了阶梯波S(t),值得注意的是,频率合成系统对D/A转换器的分辨率有一定要求,D/A转换器的分辨率越高,合成的阶梯波S(t)台阶数越多,输出的波形的精度也就越高,减少了量化失真。寄存器寄存器累加器步长m参考时钟相位码序列图1-3相位累加器波形存储器波形存储器(ROM/RAM) 幅度量化序列幅度量化序列数据相位吗序列地址图1-4相位幅度变换原理图低通滤波器的作用不容忽视。对D/A输出的阶梯波S(t)进行频谱分析,可知S(t)中除了主频外,还存在分布在,2……两边±处的非谐波分量。因此,为了取出主频,必须在D/A转换器的输出端接入截止频率为的低通滤波器。DDS具有以下特点:(1)频率分辨率高。DDS的频率分辨率在固定时,取决于相位累加器的位数n,只要n足够大,理论上就可以获得相应的分辨率精度,这是传统方法难以实现的。(2)频率变换速度快。在DDS中,一个频率的建立时间通常取决于滤波器的带宽。影响因素为相位累加器,ROM/RAM的工艺结构,D/A转换器及它信号处理过程中可能产生的时延。其中,信号处理的时延与时钟周期相关。由于DDS中不要相位反馈控制,频率建立及切换快,与频率分辨率,频谱纯度相互独立,明显优于PLL。(3)DDS中相位改变是线性过程。数字相位累加器是优良的线性数字增值发生器。因此,DDS的相位误差主要依赖于时钟的相位特性,相位误差小。另外,DDS的相位是连续变化的,形成的信号具有良好的频谱特性,这是传统的直接频率合成法所无法实现的。(4)输出频率范围宽。理论上,DDS输出的频率范围在,实际上,考虑到低通滤波器的设计,为,而FPGA的时钟频率可达到100MHz,因此,利用FPGA,可以实现输出频率范围很宽的信号。根据前面的讲述,可以得到一下公式:其中,是输出波形的周期,n是相位累加器位数,m是相位累加器步长,是输入波形周期。是参考频率,是输出波形频率,是最小分辨率,是最高合成频率。根据奈奎斯特(Nyquist)定理,即采样频率必须不小于被采样信号的最高频率,否则原信号不能被恢复,所以当时,得到最高合成频率,当然,这仅是理论值,实际上与D/A精度、转换速度,滤波网络性能密切相关,一般取,例如,晶振时钟为100MHz时,可知输出合成波频率将出现在较宽频段上。2系统设计本章所需要设计的直接数字频率合成系统与前面介绍的DDS原理完全一致。从实现方式上看,有如下特色:(1)引入8级级联的BCD比例乘法器,将频率分辨率提高100万倍!(2)利用FPGA内部嵌入式存储单元,在FPGA内部集成了2Kbit容量双端口RAM,降低了硬件难度,提高了系统可靠性。从前面的介绍中可以知道,增加相位累加器的位数n,可以提高频率分辨率,最低输出频率可达Hz、mHz甚至是μHz,即DDS的最低合成频率接近零频。有人计算过,如果为50MHz,那么当n为48位时,其分辨率可达179nHz。但是,增加相位累加器的位数n将使加法算法过于庞大,消耗惊人的FPGA资源。何不从入手,对实现任意可分频,利用降低来换取高分辨率呢?事实证明,使用比例乘法器是可行的,经过8级BCD比例乘法器的分频,分频比达到,例如,晶振频率为100MHz,经过分频可以是Hz任意整数频率,整个分频模块仅消耗65个宏单元。现代FPGA内部集成了存储单元,这些是宝贵的存储资源,通常只有通过利用开发商提供的知识产权核(IPCORE)才能使用,这些知识产权核经过严格的测试和优化,可以在特定器件上发挥最大效能,利用这些模块,就是将优秀EDA开发人员的硬件成果嵌入到自己设计中,缩短了开发时间,提高了效率。本章设计的参数选取如下。由相位累加器位数n=8,存储容量256×8=2048bit,晶振频率为100MHz,可知:(1)频率分辨率Hz(2)最高合成频率 MHZ前面讲过,这仅是理论值,实际中与具体电路(D/A,滤波器)有关。(3)相位步进本设计按照模块化层次化设计方法,根据结构功能,可以划分出3个功能模块,即微控制器接口模块、相位累加器模块、双端口RAM模块,其连接关系如图2-1所示。图2-1微控制器接口模块微控制器接口模块向微控制器提供友好,方便的操作接口,MCU可通过片选(CS)、地址选通(AS)、数据选通(DS)、数据总线和地址总线来操作其内部寄存器。微控制器接口模块内部实现了6个寄存器,其中,4个位分频寄存器,1个位控制寄存器,1个位数据输入寄存器。此外,8级比例乘法器组成的分频模块以端口映射的方式例化在控制器接口模块中,对外输出参考时钟频率fclk。2.2相位累加寄存器相位累加寄存器是系统的核心模块,使用经过分频器分频后的时钟,范围相当宽广。相位累加器输出相位码序列,作为查寻地址送入双端口RAM,相应地,还有读使能和读时钟信号。相位累加步长m可取,n=0,1,2,…,7这里,为了减小失真,一般m取值不超过32双端口RAM利用ALtera提供的MegaWizardPlug-InManager定制了数据线和地址线宽度均为8位,存储容量为2048bit的双端口RAM,独立的两套读/写接口,有兴趣的读者不妨使用MegaWizardPlug-InManager定制其他的存储器,看看哪种存储器使用起来最方便。接口信号说明如下:RESET,系统复位,低电平有效;CS,片选信号,低电平有效;AS,地址选通信号,低电平有效;DS,数据选通信号,低电平有效;DATABUS,数据总线;宽度为8位;ADDRBUS,地址总线,宽度为3位。顶层实体的VHDL程序如下:--dds.vhdLIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;ENTITYddsIS PORT( --与微控制器接口信号 --全局复位 reset :IN STD_LOGIC; --全局时钟 clk :IN STD_LOGIC; --地址总线 addrbus :IN STD_LOGIC_VECTOR(2DOWNTO0); --数据总线 databus :IN STD_lOGIC_VECTOR(7DOWNTO0); --片选 cs :IN STD_LOGIC; --地址选通 as :IN STD_LOGIC; --数据选通 ds :IN STD_LOGIC; --数据输出,送至D/A转换器 q :OUT STD_LOGIC_VECTOR(7DOWNTO0) );ENDdds;ARCHITECTURErtlofddsIS--元件说明--接口模块COMPONENTinterface port( --与微控制器接口信号 --全局复位 reset :IN STD_LOGIC; --全局时钟 clk :IN STD_LOGIC; --地址总线 addrbus :IN STD_LOGIC_VECTOR(2DOWNTO0); --数据总线 databus :IN STD_lOGIC_VECTOR(7DOWNTO0); --片选 cs :IN STD_LOGIC; --地址选通 as :IN STD_LOGIC; --数据选通 ds :IN STD_LOGIC; --与内部模块接口信号 --DDS扫频使能 ddsen :OUT STD_LOGIC; --经比例乘法器分频后的时钟 fclk :OUTSTD_LOGIC; --步长 m :OUT STD_LOGIC_VECTOR(7DOWNTO0); --数据输出,送至双端口RAM dataout :OUT STD_LOGIC_VECTOR(7DOWNTO0); --地址输出,送至双端口RAM addrout :OUT STD_LOGIC_VECTOR(7DOWNTO0); --双端口RAM写使能 wren :OUT STD_LOGIC; --双端口RAM写时钟 wrclock :OUT STD_LOGIC );ENDCOMPONENT;--双端口RAMCOMPONENTramdp PORT( wren :IN STD_LOGIC; wrclock :IN STD_LOGIC; rden :IN STD_LOGIC; rdclock :IN STD_LOGIC; data :IN STD_LOGIC_VECTOR(7DOWNTO0); wraddress:IN STD_LOGIC_VECTOR(7DOWNTO0); rdaddress:IN STD_LOGIC_VECTOR(7DOWNTO0); q :OUT STD_LOGIC_VECTOR(7DOWNTO0) );ENDCOMPONENT;--相位累加器COMPONENTphasesum PORT( --全局复位 reset :IN STD_LOGIC; --分频时钟 fclk :IN STD_LOGIC; --扫频使能 ddsen :IN STD_LOGIC; --相位累加步长 m :IN STD_LOGIC_VECTOR(7DOWNTO0); --读RAM时钟 rdclock :OUT STD_LOGIC; --读RAM使能 rden :OUT STD_LOGIC; --读RAM地址 rdaddress:OUT STD_LOGIC_VECTOR(7DOWNTO0) );ENDCOMPONENT;--信号说明SIGNALddsen :STD_LOGIC;SIGNALfclk :STD_LOGIC;SIGNALwren :STD_LOGIC;SIGNALwrclock :STD_LOGIC;SIGNALrdclock :STD_LOGIC;SIGNALrden :STD_LOGIC;SIGNALdataout :STD_LOGIC_VECTOR(7DOWNTO0);SIGNALaddrout :STD_LOGIC_VECTOR(7DOWNTO0);SIGNALm :STD_LOGIC_VECTOR(7DOWNTO0);SIGNALrdaddress :STD_LOGIC_VECTOR(7DOWNTO0);BEGIN --元件例化 INTER_CONTROL:interface PORTMAP( --与微控制器接口信号 --全局复位 reset =>reset, --全局时钟 clk =>clk, --地址总线 addrbus =>addrbus, --数据总线 databus =>databus, --片选 cs =>cs, --地址选通 as =>as, --数据选通 ds =>ds, --与内部模块接口信号 --DDS扫频使能 ddsen =>ddsen, --经比例乘法器分频后的时钟 fclk =>fclk, --步长 m =>m, --数据输出,送至双端口RAM dataout =>dataout, --地址输出,送至双端口RAM addrout =>addrout, --双端口RAM写使能 wren =>wren, --双端口RAM写时钟 wrclock =>wrclock ); --双端口RAM DP_RAM:ramdp PORTMAP( wren =>wren, wrclock =>wrclock, rden =>rden, rdclock =>rdclock, data =>dataout, wraddress=>addrout, rdaddress=>rdaddress, q =>q ); --相位累加器 PHASE_ADDER:phasesum PORTMAP( --全局复位 reset =>reset, --分频时钟 fclk =>fclk, --扫频使能 ddsen =>ddsen, --相位累加步长 m =>m, --读RAM时钟 rdclock =>rdclock, --读RAM使能 rden =>rden, --读RAM地址 rdaddress=>rdaddress );ENDrtl;图2-2是顶层实体仿真波形,由图中可以看到,首先,向地址为000的寄存器写数据00010000,表示将晶振频率10分频,然后向地址为100的寄存器写数据10000000,表示相位累加器使能,随后,输出波形。读者可能暂时还不能理解整个系统的工作原理,这里只需了解系统的轮廓即可,后面会详细介绍各模块的设计与实现。模块设计与实现如前面所述,顶层实体由3个模块构成:微控制器接口模块、相位累加器模块及双端口RAM模块。由8个比例乘法器级联组成的分频器模块以端口定义的形式例化在微控制器模块中,属于后者的子模块,但是由于比例乘法器的本设计中所发挥的作用很大,加之相关资料少之又少,为了加深读者的领悟,决定单独作为一节。3.1微控制器接口模块微控制器接口向8位、16位、32位微处理器级微控制器提供友好的操作接口,如图3-1所示。其输入引脚前面已经介绍过,这里不再重复。现在,介绍一下输出引脚。图3-1ddsen:相位累加器使能,有效时为高电平;fclk:分频时钟,作为相位累加器的输入时钟;m:相位累加步长,m=,n=0,1,2,…,7;dataout:数据输出,作为RAM输入数据;addrout:地址输出,作为RAM输入地址;wern:RAM写使能信号;wrclock:RAM写时钟信号。前面已经提到,DDS内部实现了6个寄存器,其中,4个位分频寄存器,1个位控制寄存器,1个位数据输入寄存器,这些寄存器的地址在表3-1中。表3-1寄存器地址名称访问属性地址FWORD1Write000FWORD2Write001FWORD3Write010FWORD4Write011DDSCRWrite100DATAWrite101分频寄存器(FWORD1-FWORD4)以FWORD1为例,如表3-2所示。分频寄存器用于存储分频系数,分频模块由8个BCD比例乘法器构成。每一个比例乘法器需要4位二进制码来确定分频系数,4×8=32bit,也就是4byte。FWORD1对应第一级和第二级比例乘法器,FWORD2对应第三级和第四级比例乘法器,以此类推,FWORD4对应第七级和第八级比例乘法器。表3-2分频寄存器FWORD1BIT7BIT6BIT5BIT4BIT3BIT2BIT1BIT0控制寄存器(DDSCR)如表3-3所示,控制寄存器只有4位是有意义的,ddsen为相位累加器使能,当其为有效时(逻辑1),相位累加器工作,输出波形。m2、m1、m0是相位累加步长控制字,由于系统设计中规定相位累加步长m=,n=0,1,2,…,7,所以使用3位表示他们足够了,对应的累加步长值如表3-4所示。表3-3控制寄存器BIT7BIT6BIT5BIT4BIT3BIT2BIT1BIT0DDSEN0000M2M1M0表3-4m2m1m0与相位累加步长m对照表m2m1m0m0001001201040118100161013211064111128数据输入寄存器(DATA)如表3-5所示,微控制器通过数据输入寄存器缓冲,将数据写入双端口RAM中。复位时,地址为0,每向DATA寄存器写一次数据,地址自动加1,直到地址写满,自动清零,准备下一次写入过程。这意味着可以重复多次写波形数据,从而实现任意波形输出和动态波形输出的功能。表3-5控制寄存器BIT7BIT6BIT5BIT4BIT3BIT2BIT1BIT0DATA7DATA6DATA5DATA4DATA3DATA2DATA1DATA0本模块通过片选信号、地址选通信号、数据选通信号来锁定地址和数据,当片选信号CS和地址选通信号AS有效时,根据地址总线内容使能对应寄存器。在检测到数据选通信号DS下降沿后,在系统时钟的上升沿将数据写入选中的寄存器中。微控制器接口模块的状态机如图3-2所示:(1)IDLE。当系统上电或复位后,微控制器接口处于此状态。此状态等待片选信号有效和AS信号的下降沿,当条件满足时,状态机切换到STROBE状态。(2)STROBE。当片选信号有效时,状态机在此状态等待,直到DS信号出现下降时沿,切换到DATA_LAUNCH状态;当片选信号无效时,状态机切换到IDLE状态。(3)DATA_LAUNCH。此状态只持续1个时钟周期,在时钟上升沿写入数据,返回IDLE状态。图3-2微控制器接口状态机文件interface内部的各进程说明:第一个进程延迟信号,目的是检测信号跳变。第二个进程是状态寄存器,同步状态。第三个进程是主状态机。第四个进程是写RAM状态机。第五个进程根据地址译码,使能对应寄存器。第六个进程根据使能,写对应寄存器。描述微控制器接口模块的VHDL程序如下:--interface.vhdLIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;ENTITYinterfaceIS port( --与微控制器接口信号 --全局复位 reset :IN STD_LOGIC; --全局时钟 clk :IN STD_LOGIC; --地址总线 addrbus :IN STD_LOGIC_VECTOR(2DOWNTO0); --数据总线 databus :IN STD_lOGIC_VECTOR(7DOWNTO0); --片选 cs :IN STD_LOGIC; --地址选通 as :IN STD_LOGIC; --数据选通 ds :IN STD_LOGIC; --与内部模块接口信号 --DDS扫频使能 ddsen :OUT STD_LOGIC; --经比例乘法器分频后的时钟 fclk :OUTSTD_LOGIC; --步长 m :OUT STD_LOGIC_VECTOR(7DOWNTO0); --数据输出,送至双端口RAM dataout :OUT STD_LOGIC_VECTOR(7DOWNTO0); --地址输出,送至双端口RAM addrout :OUT STD_LOGIC_VECTOR(7DOWNTO0); --双端口RAM写使能 wren :OUT STD_LOGIC; --双端口RAM写时钟 wrclock :OUT STD_LOGIC );ENDinterface;ARCHITECTURErtlofinterfaceIS--元件说明--8个比例乘法器级联COMPONENTfre_div PORT( --输入时钟 FIN :INSTD_LOGIC; --分频系数 BCD1 :IN STD_LOGIC_VECTOR(3DOWNTO0); BCD2 :IN STD_LOGIC_VECTOR(3DOWNTO0); BCD3 :IN STD_LOGIC_VECTOR(3DOWNTO0); BCD4 :IN STD_LOGIC_VECTOR(3DOWNTO0); BCD5 :IN STD_LOGIC_VECTOR(3DOWNTO0); BCD6 :IN STD_LOGIC_VECTOR(3DOWNTO0); BCD7 :IN STD_LOGIC_VECTOR(3DOWNTO0); BCD8 :IN STD_LOGIC_VECTOR(3DOWNTO0); --分频时钟 FOUT :OUT STD_LOGIC );ENDCOMPONENT;--常数声明CONSTANTRESET_ACTIVE :STD_LOGIC:='0';CONSTANTFWORD1_ADDR :STD_LOGIC_VECTOR(2downto0):="000";CONSTANTFWORD2_ADDR :STD_LOGIC_VECTOR(2downto0):="001";CONSTANTFWORD3_ADDR :STD_LOGIC_VECTOR(2downto0):="010";CONSTANTFWORD4_ADDR :STD_LOGIC_VECTOR(2downto0):="011";CONSTANTDDSCR_ADDR :STD_LOGIC_VECTOR(2downto0):="100";CONSTANTDATA_ADDR :STD_LOGIC_VECTOR(2downto0):="101";--信号声明SIGNALas_delay :STD_LOGIC;SIGNALds_delay :STD_LOGIC;SIGNALbcd8 :STD_LOGIC_VECTOR(3downto0);SIGNALbcd7 :STD_LOGIC_VECTOR(3downto0);SIGNALbcd6 :STD_LOGIC_VECTOR(3downto0);SIGNALbcd5 :STD_LOGIC_VECTOR(3downto0);SIGNALbcd4 :STD_LOGIC_VECTOR(3downto0);SIGNALbcd3 :STD_LOGIC_VECTOR(3downto0);SIGNALbcd2 :STD_LOGIC_VECTOR(3downto0);SIGNALbcd1 :STD_LOGIC_VECTOR(3downto0);--状态机定义TYPESTATE_TYPEIS(IDLE,STROBE,DATA_LAUNCH);--状态机信号SIGNALprs_state,next_state :STATE_TYPE;--状态机定义TYPEWR_STATE_TYPEIS(wr_idle,wr_high,wr_low);--状态机信号SIGNALwr_state :WR_STATE_TYPE;SIGNALDDSCR_reg :STD_LOGIC_VECTOR(7downto0);SIGNALwrclock_reg :STD_LOGIC;SIGNALwren_reg :STD_LOGIC;SIGNALramaddress :STD_LOGIC_VECTOR(7DOWNTO0);SIGNALramdata :STD_LOGIC_VECTOR(7DOWNTO0);SIGNALfout :STD_LOGIC;--FWORD1寄存器使能SIGNALf1_en :STD_LOGIC; --FWORD2寄存器使能SIGNALf2_en :STD_LOGIC; --FWORD3寄存器使能SIGNALf3_en :STD_LOGIC; --FWORD4寄存器使能SIGNALf4_en :STD_LOGIC; --DDSCR寄存器使能SIGNALcr_en :STD_LOGIC; --DDSDATA寄存器使能SIGNALdata_en :STD_LOGIC; BEGIN --DelayedSignalsDetectionProcess --检测延迟信号 Delay_Signals_Proc: PROCESS(reset,clk) BEGIN IF(reset=RESET_ACTIVE)THEN as_delay<='1'; ds_delay<='1'; ELSIFrising_edge(clk)THEN as_delay<=as; ds_delay<=ds; ENDIF; ENDPROCESS; --StatusRegisterProcess --状态寄存器 --同步状态 State_Register_Proc:PROCESS(clk,reset) BEGIN IFreset=RESET_ACTIVETHEN prs_state<=IDLE; ELSIFrising_edge(clk)THEN prs_state<=next_state; ENDIF;ENDPROCESS; --NextStatusLogicProcess --次态逻辑 Next_Logic_Proc:PROCESS(prs_state,as,as_delay,ds,ds_delay,cs) BEGIN next_state<=prs_state; CASEprs_stateIS 空闲状态(00) WHENIDLE=> --等待as的下降沿 IFcs='0'THEN --片选,低有? IFas='0'ANDas_delay='1'THEN next_state<=STROBE; ENDIF; ENDIF; 选通状态(01) WHENSTROBE=> --等待ds的下降沿 IFcs='0'THEN IFds='0'ANDds_delay='1'THEN next_state<=DATA_LAUNCH; ELSIFds='1'THEN next_state<=STROBE; ENDIF; ELSEnext_state<=IDLE; ENDIF; 读/写状态(10) WHENDATA_LAUNCH=> --回到空闲状态 next_state<=IDLE; ENDCASE; ENDPROCESS; --wrstateProcess --wr信号状态机 Wr_Logic_Proc:PROCESS(clk,reset) BEGIN IFreset=RESET_ACTIVETHEN wren_reg<='0'; wrclock_reg<='0'; ramaddress<="00000000"; wr_state<=wr_idle; ELSIFrising_edge(clk)THEN CASEwr_stateIS 空闲状态(00) WHENwr_idle=> wren_reg<='0'; wrclock_reg<='0'; IFprs_state=DATA_LAUNCHTHEN IFdata_en='1'THEN wren_reg<='1'; ramdata<=databus; wr_state<=wr_high; ENDIF; ENDIF; 低状态(01) WHENwr_high=> --产生wr上升沿 wrclock_reg<='1'; wr_state<=wr_low; 高状态(10) WHENwr_low=> wrclock_reg<='0'; --计算RAM地址 IFramaddress="11111111"THEN ramaddress<="00000000"; ELSE ramaddress<=ramaddress+'1'; ENDIF; --回到空闲状态 wr_state<=wr_idle; ENDCASE; ENDIF; ENDPROCESS; --写双端口RAM的信号 wrclock<=wrclock_reg; wren<=wren_reg; dataout<=ramdata; addrout<=ramaddress; --ADDR_DECODEProcess --地址译码 Addr_Decode_Proc:PROCESS(reset,clk,addrbus,cs,as) BEGIN IFreset=RESET_ACTIVETHEN f1_en<='0'; f2_en<='0'; f3_en<='0'; f4_en<='0'; cr_en<='0'; data_en<='0'; --在时钟的上升沿同步 ELSIFrising_edge(clk)THEN IFcs='0'ANDas='0'THEN --根据地址,使能对应寄存器 CASEaddrbusIS WHENFWORD1_ADDR=> f1_en<='1'; f2_en<='0'; f3_en<='0'; f4_en<='0'; cr_en<='0'; data_en<='0'; WHENFWORD2_ADDR=> f1_en<='0'; f2_en<='1'; f3_en<='0'; f4_en<='0'; cr_en<='0'; data_en<='0'; WHENFWORD3_ADDR=> f1_en<='0'; f2_en<='0'; f3_en<='1'; f4_en<='0'; cr_en<='0'; data_en<='0'; WHENFWORD4_ADDR=> f1_en<='0'; f2_en<='0'; f3_en<='0'; f4_en<='1'; cr_en<='0'; data_en<='0'; WHENDDSCR_ADDR=> f1_en<='0'; f2_en<='0'; f3_en<='0'; f4_en<='0'; cr_en<='1'; data_en<='0'; WHENDATA_ADDR=> f1_en<='0'; f2_en<='0'; f3_en<='0'; f4_en<='0'; cr_en<='0'; data_en<='1'; WHENothers=> f1_en<='0'; f2_en<='0'; f3_en<='0'; f4_en<='0'; cr_en<='0'; data_en<='0'; ENDCASE; ELSE f1_en<='0'; f2_en<='0'; f3_en<='0'; f4_en<='0'; cr_en<='0'; data_en<='0'; ENDIF; ENDIF; ENDPROCESS; --registerwriteProcess --写寄存器 Reg_Write_Proc:PROCESS(clk,reset,prs_state) BEGIN --内部寄存器复位 IFreset=RESET_ACTIVETHEN --分频系数寄存器 bcd1<="0000"; bcd2<="0000"; bcd3<="0000"; bcd4<="0000"; bcd5<="0000"; bcd6<="0000"; bcd7<="0000"; bcd8<="0000"; --控制寄存器 DDSCR_reg<="00000000"; --等待时钟上升沿 ELSIFrising_edge(clk)THEN IF(prs_state=DATA_LAUNCH)THEN --FWORD1寄存器使能 IFf1_en='1'THEN bcd1<=databus(7DOWNTO4); bcd2<=databus(3DOWNTO0); ENDIF; --FWORD2寄存器使能 IFf2_en='1'THEN bcd3<=databus(7DOWNTO4); bcd4<=databus(3DOWNTO0); ENDIF; --FWORD3寄存器使能 IFf3_en='1'THEN bcd5<=databus(7DOWNTO4); bcd6<=databus(3DOWNTO0); ENDIF; --FWORD4寄存器使能 IFf4_en='1'THEN bcd7<=databus(7DOWNTO4); bcd8<=databus(3DOWNTO0); ENDIF; --DDSCR寄存器使能 IFcr_en='1'THEN DDSCR_reg<=databus; ENDIF; ENDIF; ENDIF; ENDPROCESS; ddsen<=DDSCR_reg(7); --m是相位累加器的计数步长 --000-1 001-2 --010-4011-8 --100-16101-32 --110-64111-128 WITHDDSCR_reg(2DOWNTO0)SELECT m<="00000001"WHEN"000", "00000010"WHEN"001", "00000100"WHEN"010", "00001000"WHEN"011", "00010000"WHEN"100", "00100000"WHEN"101", "01000000"WHEN"110", "10000000"WHEN"111", "00000001"WHENOTHERS; --元件例化 CLK_DIV:fre_div PORTMAP( --输入时钟 FIN =>clk, --分频系数 BCD1 =>bcd1, BCD2 =>bcd2, BCD3 =>bcd3, BCD4 =>bcd4, BCD5 =>bcd5, BCD6 =>bcd6, BCD7 =>bcd7, BCD8 =>bcd8, --分频时钟 FOUT =>fout ); --作为相位累加器的时钟 fclk<=fout;ENDrtl;程序的仿真波形如图3-3所示,首先,系统复位,想FWORD1(地址为000)写数据1。作用是设置分频器系数位100:1,可以看到下面的fclk信号输出与系统时钟clk之间的关系;然后,向DDSCR(地址为100)写数据3,查表3-4可知,设置相位累加系数m=8;最后,向数据输入寄存器DATA(地址101)连续写数据,1,2…,可以看到写使能信号wren,写时钟信号wrclock以及数据输出、地址输出信号的波形。图3-3微控制器接口模块的仿真波形比例乘法器模块比例乘法器分为两种,一种是BCD比例乘法器(CD4527,J690),另一种是二进制比例乘法器(CD4089)。BCD比例乘法器是由BCD输入数控制输出脉冲序列个数,所谓BCD码指4位二进制表示1位十进制数,对应关系如表3-6。输出脉冲序列的多少取决于一个可变的数X(BCD码或二进制码)与运算系数和输入时钟的运算关系,表示为:因而输出脉冲数总是比小或是等于,式中的是运算系数,K值在BCD比例乘法器中为10,在二进制比例乘法器中为16,n为运算级数。在并行连接方式时,对于第一级比例乘法器n为1。依次,后面几级分别为2,3,4…。这种电路具有用积木式产生很宽范围的数字频率功能,在频率系统中广泛应用,当与可逆计数器及一些控制逻辑连用时,可以实现乘法、加法、减法、开方、平方以及解代数方程和微分方程、积分等功能。表3-6BCD码与十进制数对应关系BCD码十进制数00000000110010200113010040101501106011171000810019图3-4为J690和CD4527比例乘法器的逻辑图。CD4527主要由两部分组成,即BCD计数器和比例输出控制电路组成。BCD计数器采用5—4—2—1码编码,计数器中的技术单元采用T型触发器。对计数器的逻辑结构用卡诺图进行分析,并考虑时禁止输入端INHin,可以得到每个T型触发器的控制逻辑表达式:图中INHin是时钟脉冲禁止输入端,当INHin为1时,禁止时钟激励计数器计数;为0时允许时钟激励计数器计数。SET9是置“9”端,在SET9为1时,计数器置9(1001)。ST端为选通端,在ST为0时允许脉冲输出。CS是扩展级联端,不用时为0,扩展时将前一级比例乘法器输出OUT送入下一级的扩展级联端CS,当上一级比例乘法器A的输出端送出一个脉冲给下一级比例乘法器B的扩展级联端时,这个脉冲将传至比例乘法器B的输出端,也就是说比例乘法器B的输出端OUT输出的脉冲,除了它本身的输出脉冲外,还包含了一级比例乘法器输出的脉冲序列,更进一步说,如果比例乘法器B还有下一级,即比例乘法器C的话,C通过扩展级联端与B级联,那么比例乘法器C的输出脉冲个数是A、B、C输出脉冲个数之和。“9”为计数器的译码输出,有效时输出1;INHout端是禁止输出端,也是计数器的“9”译码输出,有效时为输出0。它同时还受到禁止输入端INHin的控制,实际上,“9”端与INHin端的点位始终是相反的,可以把INHout看作是“9”的反向输出;OUT受扩展级联输入CS的控制,而NOUT端不受CS控制,即NOUT的输出不包含扩展级联端的脉冲,两者有这种区别。应该注意到,CC4527(J690)电路中的计数器是在输入时钟脉冲Fin的上升沿计,而电路的输出端OUT在输入时钟的下降沿同步输出。图3-4BCD比例乘法器CD4527下面举2个BCD比例乘法器CD4527级联时的例子,如图3-5所示。图3-52个BCD比例乘法器CD4527级联设。则第一级比例乘法器输出端OUT取得的输出脉冲数,并将此输出送入第二级比例乘法器的扩展级联端,因此在第二级比例乘法器的输出端输出的脉冲数包含了从扩展级联端输入的个脉冲,和该位自身的比例输出个脉冲两部分。后一部分的输出是由于第二级比例乘法器的禁止输入端INHin受上一级比例乘法器的禁止输出端INHout控制,因此每当输入K(K=10)个时钟脉冲时,对于第二级比例乘法器,只允许进入一个时钟脉冲,所以在输入个时钟脉冲下,比例乘法器输出个脉冲。这样,比例乘法器的输出端总共得到脉冲数位为。图3-6是8个BCD比例乘法器级联的示意图。图3-68个BCD比例乘法器级联图3-7和图3-8是仿真波形,前者设置分频比为10:1,后者为10万:1。图3-78个BCD比例乘法器级联仿真波形之一图3-88个BCD比例乘法器级联仿真波形之二相位累加器模块在本设计中,相位累加器位数为8为,输出相位码序列,作为RAM的寻址地址,由于程序比较简单,不再过多描述。描述相位累加器模块的VHDL程序--phasesum.vhdLIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;ENTITYphasesumIS PORT( --全局复位 reset :IN STD_LOGIC; --分频时钟 fclk :IN STD_LOGIC; --扫频使能 ddsen :IN STD_LOGIC; --相位累加步长 m :IN STD_LOGIC_VECTOR(7DOWNTO0); --读RAM时钟 rdclock :OUT STD_LOGIC; --读RAM使能 rden :OUT STD_LOGIC; --读RAM地址 rdaddress:OUT STD_LOGIC_VECTOR(7DOWNTO0) );ENDphasesum;ARCHITECTURErtlofphasesumIS--常数声明CONSTANTRESET_ACTIVE :STD_LOGIC:='0';--信号声明SIGNALm_reg :STD_LOGIC_VECTOR(8DOWNTO0);SIGNALrdaddress_reg :STD_LOGIC_VECTOR(8DOWNTO0);BEGIN PROCESS(reset,fclk,ddsen,m) BEGIN IFreset=RESET_ACTIVETHEN rdaddress_reg<="000000000"; --时钟下降沿改变地址 ELSIFfalling_edge(fclk)THEN IFddsen='1'THEN IFrdaddress_reg="100000000"THEN rdaddress_reg<=m_reg; ELSE rdaddress_reg<=rdaddress_reg+m_reg; ENDIF; ELSE rdaddress_reg<="000000000"; ENDIF; ENDIF; ENDPROCESS; rden<=ddsen; rdclock<=fclkWHENddsen='1'ELSE '0'; m_reg<='0'&m; rdaddress<=rdaddress_reg(7DOWNTO0);ENDrtl;双端口RAM模块LPM是参数可设置模块库(LibrarofParameterizedModules)缩写,Altear提供的可参数化宏模块和LPM函数均基于Altear器件的结构做了优化设计。在许多实际情况下,必须使用宏功能模块才能使用特定器件的硬件资源。这些宏模块可通过原理图调用或者HDL语言例化,使得基于EDA的电子系统设计效率大大提高。设计者根据自己的需要,选取参数,定制模块,十分轻松地将其加入到自己的设计中,无异于邀请优秀的EDA工程师加入自己的设计中。LPM功能丰富,每一个模块的功能、参数定义、使用方法、硬件描述语言参数设置及调用方法都可以在帮助文档中找到。Altear提供的宏功能模块包括以下几类:1.算术模块包括累加器、加法器、乘法器和LPM算术函数。2.门电路包括基本门电路,多路复用器等。3.I/O模块包括时钟数据恢复、锁相环、双数据速率、千兆位收发器、LVDS接收器和发送器。4.存储模块包括存储器、移位寄存器、得到宏模块后,可以在BlockEditor中例化,在HDL语言中例化(通过端口定义例化,或使用MegaWizardPlug—InManager对宏功能模块进行参数化并建立文件).Altear推荐使用MegaWizardPlug—InManager对宏功能模块进行例化以及建立自定义宏功能模块。此向导将提供一个供自定义和参数化宏功能模块使用的symbol,并确保正确设置所有宏功能模块的参数。利用MegaWizardPlug—InManager定制双端口RAM。步骤如下:打开MegaWizardPlug—InManager初始对话框。选择菜单Tool—>MegaWizardPlug—InManager,产生如图3-9所示界面,选中“Createanewcustommegafunctionvariation”,意思是定制新的宏功能模块,下面的选项是编辑修改一个已存在的宏功能模块。单击Next,进入图3-10所示界面。图3-9定制新的宏功能模块图3-10LPM宏功能模块设置(2)在左边栏中,选择MemoryCompiler下面的RAM:2-port(双端口RAM)。再选择VHDL方式,最后输入RAM文件存放路径和文件名,单击Next。(3)如图3-11所示对话框,选择数据线、地址线宽度,这里都是8位。在“Whichclockingmethoddoyouwanttouse?”选择“Dualclock:useseparate‘read’and‘write’”。意思是为读/写操作选择独立的时钟,而在本设计中,对RAM读/写操作有2个模块完成,读/写速率也不相同,所以选择双时钟。最后,选中“Createan‘rden’readenable”,为读操作定制独立的使能信号,单击Next,进入图3-12所示界面。图3-11数据线和地址线宽度图3-12选择锁存信号(4)对于“Whatportshouldberegistered?”下面3个选项都选中。单击Next,进入图3-13所示。图3-13为RAM添加初始化数据(5)如图3-13所示,在“Doyouwanttospecifytheinitialcontentofthememory?”栏中,选中“yes,usethisfileforthememorycontent”,并且单击按钮,选择指定路径上的.mif文件。.mif可以用文本编辑器编写,要符合其格式。(6)单击Next,进入如图3-14所示界面,至此,点击Finish按钮,定制完成。生成的文件及其含义,说明如下:ramdp.vhd是在VHDL设计中实例化的宏功能模块包装文件;ramdp.inc是宏模块包装文件中模块的AHDL包含文件;ramdp.cmp是元件声明文件;ramdp.bsf是图形符号(symbol)文件;生成的双端口RAM外部引脚如图3-15所示。图3-14定制完成图3-15ramdp的引脚示意图生成的双端口RAM元件的VHDL程序如下LIBRARYieee;USEieee.std_logic_1164.all;ENTITYramdpIS PORT ( data :INSTD_LOGIC_VECTOR(7DOWNTO0); wraddress :INSTD_LOGIC_VECTOR(7DOWNTO0); rdaddress :INSTD_LOGIC_VECTOR(7DOWNTO0); wren :INSTD_LOGIC:='1'; rden :INSTD_LOGIC:='1'; wrclock :INSTD_LOGIC; rdclock :INSTD_LOGIC; q :OUTSTD_LOGIC_VECTOR(7DOWNTO0) );ENDramdp;ARCHITECTURESYNOFramdpIS SIGNALsub_wire0 :STD_LOGIC_VECTOR(7DOWNTO0); COMPONENTlpm_ram_dp GENERIC( lpm_width :NATURAL; lpm_widthad :NATURAL; lpm_indata :STRING; lpm_wraddress_control :STRING; lpm_rdaddress_control :STRING; lpm_outdata :STRING; lpm_file :STRING; lpm_hint :STRING ); PORT( rdclock :INSTD_LOGIC; wren :INSTD_LOGIC; wrclock :INSTD_LOGIC; q :OUTSTD_LOGIC_VECTOR(7DOWNTO0); rden :INSTD_LOGIC; data :INSTD_LOGIC_VECTOR(7DOWNTO0); rdaddress :INSTD_LOGIC_VECTOR(7DOWNTO0); wraddress :INSTD_LOGIC_VECTOR(7DOWNTO0) ); ENDCOMPONENT;BEGIN q<=sub_wire0(7DOWNTO0); lpm_ram_dp_component:lpm_ram_dp GENERICMAP( LPM_WIDTH=>8, LPM_WIDTHAD=>8, LPM_INDATA=>"REGISTERED", LPM_WRADDRESS_CONTROL=>"REGISTERED", LPM_RDADDRESS_CONTROL=>"REGISTERED", LPM_OUTDATA=>"REGISTERED", LPM_FILE=>"C:/VHDLBOOK/DDS/ddsyu/ram.mif", LPM_HINT=>"USE_EAB=ON" ) PORTMAP( rdclock=>rdclock, wren=>wren, wrclock=>wrclock, rden=>rden, data=>data, rdaddress=>rdaddress, wraddress=>wraddress, q=>sub_wire0 );ENDSYN;如图3-16所示,定制好RAM后,对其仿真,以确保功能可靠,并熟悉该元件的使用方法和时序情况,同时观察数据是否被加载进去。图3-16存储器仿真波形致谢首先,感谢我的学校。大学四年,我学到了很多新的知识,同时我也改变了很多进步了很多。而这些应该归功于我的学校。

其次,感谢计算机科学与技术学院,感谢所有授过我课的老师,无论是基础课老师还是专业课老师。最后,特别感谢我的指导老师孙江峰老师。感谢他对本论文的选题、研究和成稿倾注了大量的心力。导师渊博的学识、严谨的治学态度、踏实的工作作风和求是求知的精神使我受益匪浅。在孙老师的悉心指导下,我对毕业设计的认识从一团糟到有了初步的认识到明确了任务目标,再到基本工作的组织和完成以及对工作任务的检查和整理。通过这样一个过程,使我更深一步地了解了基于FPGA的直接数字频率合成(DDS)设计的流程,基本掌握了利用QuartusII设计开发DDS的能力和技巧。作为一个本科生,由于经验的匮乏,难免有许多考虑不周全的地方,如果没有导师的督促指导,以及同学们的帮助和支持,想要完成这个设计是困难的。因此,再次感谢所有帮助过我的同学和老师。毕业在即,谨祝老师同学们身体健康,工作顺利,生活幸福。参考文献[1]孟庆海,张洲.VHDL基础及经典实例开发.西安:西安交通大学出版社,2008[2]黄智伟.FPGA系统设计与实践.北京:电子工业出版社,2007[3]李景华,杜玉远.可编程逻辑器件与EDA技术.沈阳:东北大学出版社,2000[4]姜立东.VHDL语言程序设计应用第2版.北京:北京邮电大学出版社,2004[5]张凯,林伟.VHDL实例剖析.北京:国防工业

温馨提示

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

评论

0/150

提交评论