直接数字频率合成器DDS的设计DDS的基本原理DDS技术是一种把一系列数字量形式的信号通过DAC转换成模拟量形式的信号的合成技术,它是将输出波形的一个完整的周期、幅度值都顺序地存放在波形存储器中,通过控制相位增量产生频率、相位可控制的波形。DDS电路一般包括基准时钟、相位增量寄存器、相位累加器、波形存储器、D/A转换器和低通滤波器(LPF)等模块,如图1所示。相位增量寄存器寄存频率控制数据,相位累加器完成相位累加的功能,波形存储器存储波形数据的单周期幅值数据,D/A转换器将数字量形式的波形幅值数据转化为所要求合成频率的模拟量形式信号,低通滤波器滤除谐波分量。整个系统在统一的时钟下工作,从而保证所合成信号的精确。每来一个时钟脉冲,相位增量寄存器频率控制数据与累加寄存器的累加相位数据相加,把相加后的结果送至累加寄存器的数据输出端。这样,相位累加器在参考时钟的作用下,进行线性相位累加,当相位累加器累加满量时就会产生一次溢出,完成一个周期性的动作,这个周期就是DDS合成信号的一个频率周期,累加器的溢出频率就是DDS输出的信号频率。相位累加器输出的数据的高位地址作为波形存储器的地址,从而进行相位到幅值的转换,即可在给定的时间上确定输出的波形幅值。相位增量寄存器(PIR)地址寄存器相位累加器波形存储器时钟FclkCPUDDS发生器D/A转换器滤波器OUT波形数据传送图1DDS原理图波形存储器产生的所需波形的幅值的数字数据通过D/A转换器转换成模拟信号,经过低通滤波器滤除不需要的分量以便输出频谱纯净的所需信号。信号发生器的输出频率fo可表示为:NsfMfMf2..0(1)式中sf为系统时钟,f为系统分辨率,N为相位累加器位数,M为相位累加器的增量。参数确定及误差分析首先确定系统的分辨率f,最高频率maxf,及最高频率maxf下的最少采样点数minN根据需要产生的最高频率maxf以及该频率下的最少采样点数minN,由公式minmax.Nffs(2)确定系统时钟sf的下限值。同时又要满足分辨率计算公式ffNs2(3)综合考虑决定sf的值。选定了sf的值后,则由公式(9.3)可得N2=ffs,据此可确定相位累加器位数N。然后由最高输出频率Mffo(4)推出M=S2,得出相位增量寄存器为S位。确定波形存储器的地址位数W,本系统中决定寄存Z2个数据值,因此RAM地址为Z位。误差分析:·失真度:除受D/A转换器本身的噪声影响外,还与离散点数N和D/A字长有着密切关系。设q为均匀量化间隔,则其近似数学关系为00221001)/sin(/61NNqTHD(5)式中N为一周中输出的点数,D为量化字长,)(12Dq。·相位舍位引起的误差:在DDS中,由于相位累加寄存器的位数N大于RAM的寻址位数W,使得相位寄存器的输出寻址RAM时,其N-W个位须舍去,不可避免会产生误差,该误差是DDS输出杂散的主要原因。总的信噪比是NWdBSNR4420.46244.0lg10)((6)·相位量化误差:由于波形是经过一系列有限的离散采样点转化而来,因此势必存在相位量化误差,通过增加采样点可减小此误差。实现器件的选择一般选用FPGA/CPLD器件作为DDS的实现器件,对于D/A转换器的选择,首先要考虑到D/A转换器的转换速率。要实现所需的频率,D/A的转换速度要大于minmax.Nf,然后根据D/A转换器字长所带来的误差,决定D/A的位数。由此选择D/A转换器的型号。DDS的FPGA实现设计本设计要求DDS实现的性能指标为:分辨率0.01Hz,最高输出频率5MHz。根据上面所列公式可以算出:时钟频率为85.9MHz;累加器位数N=33;相位增量寄存器为29位。如图2所示,DDS系统包括相位增量寄存器、相位累加器、地址寄存器、波形存储器、时钟倍频器及地址发生部分等几个模块。内部所有模块均用Verilog语言编写,其顶层设计用原理图的方式进行模块间的连接。相位增量寄存器(PIR)29bit输入缓冲时钟倍频相位累加器33bit地址寄存器波形存储器(双口RAM)输出缓冲输出图2DDS内部组成模块图1)相位增量寄存器图3相位增量分段寄存器相位增量分段寄存器的端口如图3所示。根据前面的计算可知,相位增量寄存器需要29位。相位增量寄存器的断口包括复位端RES,数据输入PSI(28:0),数据输出PSO(32:0)。RES高电平有效,复位后,PSO输出为0。PSO输出高4位总为0。其Verilog程序如下:modulePIR(PSI,PSO,RES);input[28:0]PSI;output[32:0]PSO;inputRES;reg[32:0]PSO;always@(PSI)beginif(RES)beginPSO=0;endelsebeginPSO={4'b0000,PSI};endendendmodule图4相位增量分段寄存器仿真图图4是相位增量分段寄存器仿真图,从图中可以看出,当RES为低电平,PSO跟随PSI变化。2)相位累加器和地址寄存器因为累加器需要33位,如果用一般的加法器来实现累加,那么会有非常大的进位延迟,当要求输出频率较高时,满足不了要求,因此累加部分采用流水线结构,将33位加法分为3级流水线结构,每级为11位加法,这样做可以大大减少进位延迟,满足高频率输出时的要求。图5是流水线结构加法器端口图。图5流水线结构加法器流水线加法器输入为时钟CLK、复位端RES、33位加法数据输入ina(32:0)和inb(32:0)输出为数据输出sum(32:0),进位输出cout.。实际应用时,将输出sum(32:0)与出入inb(32:0)接到一起,从而构成流水线结构的累加器。图6地址寄存器地址寄存器由时钟端ADCLK,33位输入端ADAI(32:0),8位输出端ADAO(7:0)组成,作用是寄存累加器计算出的值并将累加得出的结果的高8位作为波形存储器的地址送出。图7累加器和地址寄存器连接图其中ina(32:0)与相位增量缓冲寄存器的输出端PSO(32:0)连接。相位累加器在参考时钟的作用下,进行线性相位累加,当相位累加器累加满量时就会产生一次溢出,完成一个周期性的动作,这个周期就是DDS合成信号的一个频率周期,累加器的溢出频率就是DDS输出的信号频率。流水线加法器程序modulepipe(cout,sum,ina,inb,clk,res);output[32:0]sum;outputcout;input[32:0]ina,inb;inputclk,res;reg[32:0]tempa,tempb,sum;regfirstco,secondco,cout;reg[10:0]firsts;reg[10:0]seconda,secondb;reg[21:0]firsta,firstb,seconds;always@(posedgeclk)beginif(res)begintempa=0;tempb=0;endelsebegintempa=ina;tempb=inb;endendalways@(posedgeclk)beginif(res)beginfirstco=0;firsts=0;firsta=0;firstb=0;endelsebegin{firstco,firsts}=tempa[10:0]+tempb[10:0];firsta=tempa[32:11];firstb=tempb[32:11];endendalways@(posedgeclk)beginif(res)beginseconda=0;seconds=0;secondb=0;secondco=0;endelsebegin{secondco,seconds[21:11]}=firsta[10:0]+firstb[10:0]+firstco;seconds[10:0]=firsts;seconda=firsta[21:11];secondb=firstb[21:11];endendalways@(posedgeclk)beginif(res)sum=0;elsebegin{cout,sum}={seconda[10:0]+secondb[10:0]+secondco,seconds};endendendmodule地址寄存器程序moduleADR(ADAI,ADAO,ADCLK);input[32:0]ADAI;output[7:0]ADAO;inputADCLK;reg[7:0]ADAO;always@(posedgeADCLK)beginADAO=ADAI[32:25];endendmodule图8流水线结构加法器仿真图3)波形存储器波形存储器实际上就是一个双口RAM,波形存储器存储的是所生成波形一周期采样256点的数据值,通过地址的改变,所输出的值就会变化,因为,地址不一定是连续变化的,所以所输出的值也不是连续的,在同样的时钟周期下,地址间隔的变化也就造成了生成波形的频率的变化。地址值每溢出一次,便完成了一个周期的输出。当改变波形存储器中波形数据时,也就改变了输出波形。图9双口RAM模块双口RAM的设计采用IP核生成,端口分别为:第一口地址总线addra(7:0),输出数据总线douta(7:0),时钟clka,第二口地址总线addrb(7:0),输入数据总线dinb(7:0),时钟clkb,写使能web。地址总线addra(7:0)与地址寄存器的输出ADAO(7:0)连接,输出数据总线douta(7:0)连接输出缓冲通过FPGA的I/O口输出,作为D/A转换器的输入。当改变波形数据时,通过第二口地址总线addrb(7:0)和输入数据总线dinb(7:0)将波形数据输入到RAM中去。4)地址发生器图10地址发生器地址发生器的作用是,接收状态机所发出的时钟信号,每来一个脉冲值加一,然后作为双口RAM输入端口的地址送到双口RAM的addrb(7:0),作为RAM的输入地址。地址发生器程序moduleADDRMAKER(RES,ADDRD,ADDRCLK);output[7:0]ADDRD;inputADDRCLK,RES;reg[7:0]ADDRD;always@(negedgeADDRCLK)beginif(RES)ADDRD=0;elseADDRD=ADDRD+1;endendmodule5)元件例化各模块程序编写完后,经过单元测试没有问题后,要将各模块连接起来,这里通过将各模块例化,在电路图中将各模块直接连接起来。如图11所示,点击CreateSchematicSymbol就可将程序例化为元件,新建原理图,在元件库里可以找到例化后的元件,将之拖出连接即可。图11元件例化操作图图12系统总体组成原理图上图是将各模块连接以后的原理图,用户可通过所需自定义与外部的接口。6)数字系统仿真为了检测系统是否按照理论设计生成精确的数字波形,预先在RAM中存入256个数值,检测系统输出周期是否满足期望值。系统时钟真实周期为85.9MHz的倒数——11.6ns,令仿真时钟周期为12ns,频率控制字为16进制1DCD6500,即十进制的500000000,则理论输出频率应为MHz5500000000.01.0=Hzfo前面已经说过,地址溢出的周期即位生成数字波的周期。在图9.21、图9.22中,oud(7:0)即地址寄存器的输出,它输出值的溢出周期即可反映波形周期,从而可以比较是否与理论值吻合,图9.21中当oud(7:0)=0x04时,Time(ns)为3108ns,图9.22中oud(7:0)=0x01时,Time(ns)为3122ns,因而溢出周期为3312-3108=204ns,理论周期应为5MHz的倒数——200ns。图135MHZ时系统仿真图图145MHZ时系统仿真图令频率控制字为16进制0BEBC200,即十进制的200000000,则理论输出频率应为MHz2200000000.01.0=Hzfo在图9.23中,当oud(7:0