四川信息職業(yè)技術學院 許 斌
基于Verilog的DDS設計及仿真
四川信息職業(yè)技術學院許斌
介紹了直接數字頻率合成器的組成及工作原理。采用了Verilog語言在Xilinx公司的XC3S400系列器件上實現該系統,并通過ISE和Matlab軟件對設計進行聯合仿真,驗證設計的正確性。模塊中的相位累加器使該系統具有較高的頻率分辨率,可實現快速頻率切換,有廣泛的應用價值。
數字頻率合成器;Verilog;ISE;Matlab
直接數字頻率合成器(Digital Direct Synthesizer,DDS)是以數字信號處理理論為基礎,從信號的幅度相位關系出發(fā)進行頻率合成的。與傳統的頻率合成器相比,DDS具有極高的分辨率,快速的頻率轉換時間,很寬的相對帶寬、任意波形的輸出能力等優(yōu)點。本文研究的是正、余弦波,方波以及三角波輸出的DDS技術,這類直接數字合成技術最具價值,應用也最為廣泛。
DDS主要由相位累加器、函數表ROM存儲器、D/A轉換器及低通濾波器組成,其基本原理如圖1所示。
圖1 直接數字頻率合成器原理框圖
波形的信號幅值以數據表的形式存儲在ROM存儲器中。相位累加器在時鐘的作用下以頻率控制字為步進進行相位累加,累加結果依次作為ROM存儲器的地址,取出相應的幅值數據送D/A轉換器,以產生階梯波形,階梯波形經低通濾波器濾波后得到相應的正弦波形。
若累加器的寬度為N位,查詢表ROM的輸出位數為M,則2N就相當于Trad;N位中的最低有效位相當于,即最小的相位增量;對應的相位為;完成一個周期的正弦波輸出需要個參考時鐘周期,所以一個參考時鐘周期Tc內輸出頻率的周期為:。
輸出頻率與查詢表ROM的輸出位數M無關。在一定的時鐘頻率fc下,相位增量決定了合成信號的頻率,故被稱為頻率控制字,習慣上用K表示。因此合成信號的頻率為:。
當時鐘頻率fc固定時,改變頻率控制字,可以改變合成信號的頻率f0;當K=1時,輸出頻率最低即:。
系統設計采用美國Xilinx公司的xc4vsx35實現頻率為4M的四路波形分別為:正、余弦,方波以及三角波波形,時鐘為100M。
2.1系統Verilog 源程序
輸入的控制字為32bit(經計算為171798690),輸出20bit四路信號分別為:正、余弦,方波以及三角波波形,以及reset,cein,wein控制輸入的信號。
module DDS(datain,wein,clkin,cein,reset,cosin,sin,rect,trip);
input [31:0] datain; //頻率控制字
input wein;
input clkin;
input cein;
input reset;
output [19:0] cosein; //余弦輸出
output [19:0] sin; //正弦輸出
output [19:0] trip; //三角波輸出
output [19:0] rect; //方波輸出
reg[31:0] ADD_A;
reg[31:0] ADD_B;
reg[19:0] cose_DR;
reg[19:0] sine_DR;
reg[19:0] rect_DR;
reg[19:0] trip_DR;
wire[9:0] ROM_A;
wire[19:0] cose_D;
wire[19:0] sine_D;
wire[19:0] rect_D;
wire[19:0] trip_D;
assign cose=cose_DR;
assign sine=sine_DR;
assign trip=trip_DR;
assign rect=rect_DR;
assign ROM_A=ADD_B[31:22];
…………
rom_cose cose1( .addr(ROM_A),
.clk(clk),.dout(cose_D));
rom_sine sine1(.addr(ROM_A),
.clk(clk),.dout(sine_D));
rom_rectt rect1(.addr(ROM_A),
.clk(clk),.dout(rect_D));
rom_tripp trip1(.addr(ROM_A),
.clk(clk),.dout(trip_D));
endmodule
2.2ROM定制
在編譯源程序前,必須首先完成存放波形數據ROM的定制。利用MATLAB計算出波形幅度的浮點值,并量化16比特的定點波形數值。產生波形采樣點數據的matlab程序如下:
x=linspace(0,2*pi,1024);
y1=cos(x); y2=sin(x);
y1=(y1+1)*32678; y2=(y2+1)*32678; %cose,sine wave
fid=fopen(‘c:/cos_coe.txt’,’wt’);
fprintf(fid,’%16.0f, ’,y1);
fclose(fid);
fid=fopen(‘c:/sin_coe.txt’,’wt’);
fprintf(fid,’%16.0f, ’,y2);
fclose(fid);
x=linspace(-3,3,1024);
y3=tripuls(x,3);
y3=32678*y3; %trip wave
fid=fopen(‘c:/tri.txt’,’wt’);
fprintf(fid,’%16.0f, ’,y3);
fclose(fid);
x4=linspace(-5,5,1024);
y4=rectpuls(x,5);
y4=32678*y4; %rect wave
fid=fopen(‘c:/rect.txt’,’wt’);
fprintf(fid,’%16.0f, ’,y4);
fclose(fid);
圖2 時序仿真圖
圖3 Matlab波形仿真圖
圖4 DDS模塊的RTL級結構圖
將產生的波形數據導入到ISE中調出的單端口ROM的IP核里。
2.3ISE與Matlab聯合仿真
在將設計文件加進行綜合之前必須對設計進行全面充分的仿真。Xilinx公司提供的ISE軟件除了具有強大的編譯綜合功能外,還提供一定的時序仿真功能。
編寫的測試程序如下:
module test_dds;
reg [31:0] data;
reg we;
reg clk;
reg ce;
reg reset;
wire [19:0] cose;
wire [19:0] sine;
wire [19:0] rect;
wire [19:0] trip;
DDS uut (.data(data), .we(we), .clk(clk),
.ce(ce), .reset(reset), .cose(cose),
.sine(sine), .rect(rect), .trip(trip) );
initial begin
data = 0; we = 0; clk = 0; ce = 0; reset = 1;
#10
data=171798690; we=1; ce=1; reset=0;
end
always #50 clk=~clk;
endmodule由測試程序得到時序仿真圖如圖2所示。將時序仿真的波形數值導入Matlab中,進行波形仿真驗證,得到如圖3所示波形。
經過綜合后,得到如圖4的結構圖。
根據仿真波形可以看到,DDS系統的輸出波形平滑,滿足一般系統的要求。DDS 已廣泛應用于接收機本振、信號發(fā)生器、通信系統、雷達系統。未來的DDS不僅應用于傳統上需要使用信號源的領域,而且必將開拓許多新的應用領域。同時利用ISE與Matlab聯合仿真,在開發(fā)FPGA過程中對增強電子設計自動化功能、提高FPGA設計效率具有普遍意義。
[1]朱正偉.EDA技術及應用[M].北京:清華大學出版社,2005.
[2]張春榮等.DDS/PLL快速調頻頻率合成器研究[J].西部電子,1993(4):35-39.
[3]唐穎等.直接數字頻率合成器的FPGA實現[A].2005年全國單片機與嵌入式系統學術交流會論文集[C].深圳,2005.
[4][美]帕爾尼卡,夏雨聞 譯.VerilogHDL數字設計與綜合[M].北京:電子工業(yè)出版社,2004.
[5]湯家華等.基于FPGA設計的采用DDS技術的任波形發(fā)生器[J].電子測量技術,2007,30(4):129-131.
許斌(1982—),男,陜西西安人,碩士,工程師,研究方向:通信技術。