摘 要:詳細闡述利用QuartusⅡ實現DDS(直接數字頻率合成器)模塊的方法和步驟。首先分析DDS的設計原理,并對其進行系統建模,利用Verilog HDL實現設計并在開發環境下進行功能仿真,選用現場可編程器件FPGA作為目標器件,得到可以重構的IP核,其可以很方便地實現復雜的調頻、調相和調幅功能。利用該方法實現的DDS模塊具有更廣泛的實際意義和更良好的實用性。
關鍵詞:直接數字頻率合成器;現場可編程門陣列;Verilog HDL;Quartus Ⅱ;IP核
中圖分類號:TN77文獻標識碼:B
文章編號:1004373X(2008)2001503
Design and Simulation of DDS Based on Verilog HDL
LI Chunjian,JI Wangxi,LIU Dalun
(National Institute of Metrology,Beijing,100013,China)
Abstract:The method and steps of realization of DDS(Direct Digital Synthesizer)on Quartus II is described in detail.This paper analyzes the principle of DDS,builds up a system model,realizes DDS module based on Verilog HDL and simulates it.The IP nucleus of DDS which is built can be reframed.It is very easy to achieve frequency modulation,phase modulation and amplitude modulation with the DDS module.It has more comprehensive and nice practicality.
Keywords:direct digital synthesizer;FPGA;Verilog HDL;Quartus II;IP nucleus
直接數字頻率合成技術(Direct Digital Synthesize,DDS)是繼直接頻率合成技術和鎖相式頻率合成技術之后的第三代頻率合成技術[1]。它采用全數字技術,并從相位角度出發進行頻率合成。隨著微電子技術和數字集成電路的飛速發展,以及電子工程領域的實際需要,DDS日益顯露出優于傳統頻率合成技術的一些性能,高分辨率、極短的頻率切換時間、相位噪聲低、便于集成等,逐步成為現代頻率合成技術中的佼佼者。
目前,DDS的設計大多是應用HDL(Hardware Description Language)對其進行邏輯描述。整個設計可以很容易地實現參數改變和設計移植,給設計者帶來很大的方便。Verilog HDL就是其中一種標準化的硬件描述語言,它不僅可以進行功能描述,還可以對仿真測試矢量進行設計。Altera公司開發的QuartusⅡ設計軟件,提供了Verilog HDL的設計界面以及編譯平臺,并且該公司還集成了可供程序下載的FPGA器件CYCLONE Ⅱ系列芯片,這樣大大縮短了DDS的設計周期。
1 DDS的設計原理
DDS的原理圖如圖1所示。DDS實現頻率合成主要是通過查表的方式進行的[2]。
正弦查詢表是一個只讀存儲器(ROM),以相位為地址,存有1個或多個按0o~360o相位劃分幅值的正弦波幅度信息。相位累加器對頻率控制字進行累加運算,若需要還可以加入相位控制字,得到的結果作為正弦波查詢表的地址。正弦查詢表的輸出為數字化正弦幅度值,通過D/A轉換器轉化為近似正弦波的階梯波,再通過低通濾波器濾除高頻成分和噪聲最終得到一個純正度很高的正弦波。

1.1 建模
如圖2所示正弦波y=sin(2πx),若以f量化的量化頻率對其幅度值進行量化,一個周期可以得到M=f量化個幅度值。將這些幅度值按順序存入到ROM。相位累加器在參考時鐘的驅動下,每來1個脈沖,輸出就會增加1個步長相位增量X,輸出數據作為地址送入ROM中,讀出對應的幅度值形成相應的波形。
1.2 參數設定
DDS輸出信號頻率:
fo=fc×X/2N
其中,X為頻率累加器設定值;N為相位累加器位數;fc為參考時鐘頻率。
例如,假定基準時鐘為200 MHz,累加器的位數為32,頻率控制字X為:
0x08000000H,即為227,則:
fo=200×227/232=6.25 MHz
再設定頻率控制字X為0x80000000H,即為231,則:
fo=200×231/232=100 MHz
可見,理論上通過設定DDS相位累加器位數N、頻率控制字X和基準時鐘fc的值,就可以得到任一頻率的輸出[3]。
頻率分辨率為:fres=fc/2N,由參考時鐘和累加器的位數決定,當參考時鐘的頻率越高,相位累加器的位數越高,所得到的頻率分辨率就越高。
1.3 方案的選擇
在利用FPGA制作DDS時,相位累加器是決定DDS性能的一個關鍵部分[3]。一方面可以利用進位鏈來實現快速、高效的電路結構,同時長的進位鏈會減少其他邏輯的布線資源,限制整個系統速度的提高;另一方面可以利用流水線技術提高工作頻率,但系統頻率轉換速度會相對降低。在選擇累加器實現方案時需要綜合考慮。
正弦波查詢表ROM也是制作的重點。在FPGA中ROM 表的尺寸隨著地址位數或數據位數的增加呈指數遞增,如何在滿足性能的前提下節省資源開銷。一方面通過相位累加器的輸出截斷方式,例如從32位的相位累加器結果中提取高16位作為ROM的查詢地址,由此而產生的誤差會對頻譜純度有影響,但是對波形的精度的影響是可以忽略的;另一方面可以根據信號周期對稱性來壓縮ROM的尺寸,這時系統硬件設計復雜度會有所增加。因此,需要選取合適的參數和ROM壓縮技術,在滿足系統性能的前提下使得系統盡量優化。
2 Verilog HDL實現DDS模塊
2.1 相位累加器
module acc(aclr,clock,dataa,datab,result);
inputaclr,clock;//輸入輸出端口說明
input[31:0] dataa,datab;
output[31:0] result;
reg[31:0] result;
reg[31:0] A;
always@(posedge clock or posedge aclr)//功能實現
begin
if (aclr)
result=0;
else
begin
A=dataa+A;
result=A+datab;
end
end
endmodule
上述為相位累加器的Verilog HDL功能實現,其中數據寬度為32位。同時利用Quartus Ⅱ進行波形仿真見圖3。對應的模塊符號見圖4。

2.2 ROM正弦查詢表
根據DDS的原理,將正弦波形的量化數據存儲于波形查詢表ROM中,即可完成正弦波發生的功能[4]。Altera公司提供了LPM ROM(ROM兆函數),這里只需借助Matlab生成.mif文件,并加載到LPM ROM中即可得到所需的正弦查詢表ROM。
在Matlab中,運行下面的語句可以得到儲存正弦波數字幅度值的.mif文件。例如產生214×12 b的正弦波0~2π幅度值,語句如下:
>>x=0:1:16383;
>>y=round(1000*sin(2*pi*x/16383))+1000;
>>a=[x;y];
>>fid=fopen(′rom.mif′,′w′);
>>fprintf(fid,′%d:%d;\\\′,a);
>>fclose(fid);
由此而生成的rom.mif文件內容是正弦波0~2π數字幅度值,但是格式不符合.mif文件的格式,需要對其進行修改。.mif文件的格式如下:
WIDTH=12;
DEPTH=16384;
ADDRESS_RADIX=DEC;
DATA_RADIX=DEC;
CONTENT BEGIN
…7646:1208;…
END
這樣通過例化LPM ROM得到了正弦波查詢表ROM的模塊,地址寬度為14位,輸出數據為12位。模塊符號見圖5。
2.3 DDS頂層模塊的實現
module dds(clear,clk200,freq,phase,A,sinout);
input clear,clk200;
input [31:0] freq,phase;
output [31:0] A;
output [11:0] sinout;
reg [31:0] A;
wire[13:0] address;//內部信號的定義
assign address=A[31:18];
acc u0(.clock(clk200),.aclr(clear),.dataa(freq),
.datab(phase),.result(A));//相位累加器模塊的例化
sinromu1(.clock(clk200),.address(address),.q(sinout));
//正弦查詢表模塊例化
endmodule

上述代碼為DDS模塊的Verilog HDL頂層文件。對應的模塊圖見圖6。

若需要利用NIOS Ⅱ對其進行控制,需要并將DDS模塊加載到NIOS Ⅱ的系統中。例如,通過NIOS Ⅱ為DDS模塊的頻率控制字freq和相位控制字phase置數。此時DDS的代碼應改為:
module dds(clear,clk200,idata,iwr,iclk,addr,A,sinout);
input clear,clk200,iclk,iwr,addr;
input [31:0] idata;
output [31:0] A;
output [11:0] sinout;
reg [31:0] freq,phase,A;
wire[13:0] address;
always@(posedge iclk)
begin
if(iwr)
case(addr)
1'b0:freq=idata;
1'b1:phase=idata;
endcase
end
assign address=A[31:18];
acc u0(.clock(clk200),.aclr(clear),.dataa(freq),
.datab(phase),.result(A));
sinromu1(.clock(clk200),.address(address),.q(sinout));
endmodule
模塊的輸入端口添加了寫信號iwr、地址信號addr和與NIOS Ⅱ同步的時鐘信號iclk,這樣是為了將DDS模塊連接到Avalon總線上,利用總線和NIOS Ⅱ進行通信。
加載到NIOS Ⅱ系統之前,需要將該模塊進行仿真和調試。仿真結果如圖7所示。

至此DDS的數字部分已經完成。
對于整個模塊的驅動時鐘,若時鐘源器件的頻率不符合實際需要,需要再設計一個倍(分)頻器將其倍頻或是分頻。例如現有時鐘源為50MHz,可以使用FPGA中的PLL(鎖相環)實現4倍頻得到200 MHz。
參考文獻
[1]羅韓君,林亞風,吳伶錫.一種基于DDS技術的新型激光測距系統的設計[J].現代電子技術,2005,28(17 ):42-44.
[2]鐘蔚杰,蔣壘,劉耀應.基于VHDL編程的DDS設計\\.艦船電子對抗,2007,30(2):102-105.
[3]周俊峰,陳濤.基于FPGA的直接數字頻率合成器的設計和實現\\.電子技術應用,2002,28(8):34-36.
[4]李威.FPGA/DDS的諧波信號發生器的研究與設計\\.南京:河海大學,2007.
[5]夏雨聞.Verilog數字系統設計教程\\.北京:北京航空航天大學出版社,2003.
[6]\\帕爾尼卡.Verilog HDL數字設計與綜合\\.夏雨聞,譯.北京:電子工業出版社,2004.
[7]湯家華,王道德.基于FPGA設計的采用DDS 技術的任意波形發生器\\.電子測量技術,2007,30(4):129-131.
[8]張春榮,張厥盛.DDS/PLL快速調頻頻率合成器研究[J].西部電子,1993(4):35-39.
[9]彭澄廉,周博,邱衛東,等.挑戰SoC[M].北京:清華大學出版社,2004.
[10]周立功.SoPC嵌入式系統基礎教程[M].北京:北京航空航天大學出版社,2005.
[11]\\坂俊昭.鎖相環(PLL)電路設計與應用\\.何希才,譯.北京:科學出版社,2006.
[12]唐穎,阮越.直接數字頻率合成器的FPGA實現\\.2005年全國單片機與嵌入式系統學術交流會論文集\\.深圳,2005.
作者簡介 李春劍 女,1983年出生,中國計量科學研究院在讀研究生。