摘 要:基于直接數(shù)字合成器(DDS)技術(shù)設(shè)計(jì)的任意波形發(fā)生器中,ROM查找表是DDS模塊的一個(gè)重要環(huán)節(jié),主要用于存儲(chǔ)系統(tǒng)的波形數(shù)據(jù)。介紹使用C語言、Matlab和DSP Builder三種方法生成正弦波、三角波、鋸齒波和方波的查找表初始化波形數(shù)據(jù),并對(duì)每一種方法的程序設(shè)計(jì)、參數(shù)設(shè)置以及波形仿真都作了詳細(xì)說明,所有波形數(shù)據(jù)均在GW48-SOPC開發(fā)系統(tǒng)中測(cè)試通過。
關(guān)鍵詞:直接數(shù)字合成器;查找表;任意波形發(fā)生器;DSP Builder
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:B
文章編號(hào):1004-373X(2008)11-172-02
Design of Arbitrary Waveform Generator ROM LUT
XU Danyang,ZHANG Xiaohong,WANG Yong
(Electronic Information Engineering College,Henan University of Science and Technology,Luoyang,471003,China)
Abstract:In the arbitrary waveform generator based on DDS,ROM LUT is an important element of the DDS module,which is used to store waveform data of the system.In the paper,using three methods,including C language,Matlab and DSP Builder,producing the arbitrary waveform initialization data of the sine wave,the triangular wave,the saw-tooth wave and the square-wave.Programming,parameter setting and waveform simulation are described to every method detailedly.All waveform data are verified by GW48-SOPC development system.
Keywords:DDS;LUT;arbitrary waveform generator;DSP Builder
1 引 言
目前,利用FPGA設(shè)計(jì)任意波形發(fā)生器是經(jīng)常采用的一種方法,其核心是直接數(shù)字頻率合成器(DDS)。DDS系統(tǒng)一般包括系統(tǒng)時(shí)鐘、頻率預(yù)置與調(diào)節(jié)電路(頻率累加器)、相位累加器、ROM 查找表,輸出的數(shù)據(jù)通過外接的D/A轉(zhuǎn)換器和濾波器完成波形輸出。此系統(tǒng)中,ROM中波形數(shù)據(jù)的設(shè)計(jì)是完成任意波形的關(guān)鍵環(huán)節(jié)。構(gòu)成ROM中初始化波形數(shù)據(jù)文件的格式有兩種:Memory Initialization File(.mif)格式和Hexadecimal(Intel-Format)File(.hex)格式,實(shí)際應(yīng)用中使用其中一種格式的文件即可。本文以圖1所示DDS系統(tǒng)為例,采用三種方法生成正弦波、三角波、矩形波和鋸齒波的ROM查找表。
圖1 直接數(shù)字頻率合成器系統(tǒng)
圖1所示系統(tǒng)參數(shù):系統(tǒng)時(shí)鐘(FCLK)為166.67 MHz(由FPGA時(shí)鐘50 MHz晶振通過PLL 3分頻10倍頻得到);頻率累加器位寬(N)為24位;相位累加器位寬為10位;ROM表數(shù)據(jù)位寬為8位;ROM表地址為10位。硬件選用GW48-SOPC開發(fā)系統(tǒng),其目標(biāo)芯片為Altera公司Cyclone系列EP1C6Q240C8。
2 利用C語言生成MIF文件
產(chǎn)生正弦波數(shù)據(jù)的C程序:
#include\"stdio.h\"
#include\"math.h\"
#define N 1024
void main()
{
FILE *fp;
double y;
int n;
if((fp=fopen(\"sindata.mif\",\"w\"))==NULL)
{printf(\"cannot open this file\\\\");
exit(0);
}
fprintf(fp,\"WIDTH=10;\\\\");
fprintf(fp,\"DEPTH=1024;\\\\");
fprintf(fp,\"ADDRESSRADIX=DEC;\\\\");
fprintf(fp,\"DATARADIX=DEC;\\\\");
fprintf(fp,\"CONTENT BEGIN\\\\");
for(n=0;n<=N-1;n++)
{y=127.5+127.5*sin(n*3.1415926535/128);
if(fmod(n,10)==0)
{fprintf(fp,\"\\\\");}
fprintf(fp,\"%4d:%4.0f;\",n,y);
}
fprintf(fp,\"\\\END;\");
fclose(fp);
}
在TC環(huán)境下運(yùn)行,在Output文件夾下生成SIN101~1文件,運(yùn)行此文件得到SINDATA.mif文件。文件內(nèi)容如下:
WIDTH=10;
DEPTH=1024;
ADDRESSRADIX=DEC;
DATARADIX=DEC;
CONTENT BEGIN
0:128;1:131;2:134;3:137;4:140;5:143;6:146;7:149;8:152;9:155;10:158;11:162;12:165;13:167;14:170;15:173;16:176;17:179;18:182;19:185;
…(略去數(shù)據(jù))
1020:115;1021:118;1022:121;1023:124;
END;
3 用Matlab生成.mif數(shù)據(jù)文件
利用Matlab可以生成.mif文件,但此文件不能直接在定制ROM中使用,可以把Matlab計(jì)算出來的數(shù)據(jù)粘貼到QuartusⅡ中生成.mif文件,以三角波為例說明。
圖2 Matlab中三角波波形
Matlab生成三角波數(shù)據(jù)的程序:
clear
clc
Fs=1023;%只要1 024個(gè)值
t=0:0.2/Fs:0.2;
x1=round((sawtooth(2*pi*5*t,0.5)+1)/2*255)′;%三角波歸一化
plot(t,x1),axis([0,0.2,0,255])
len=length(x1)%len=1 024
fid= fopen(′d:\\\\deltarom.mif′,′w′);%為幅度值的存儲(chǔ)準(zhǔn)備一個(gè)文件
fprintf(fid,′MEMORYINITIALIZATIONRADIX=16;\\\′);
fprintf(fid,′MEMORYINITIALIZATIONVECTOR=\\\′);
for i = 1:len%len=1 024
fprintf(fid,′%x,\\\′,x1(i));%循環(huán)將值寫入文件中
end
fclose(fid);
打開Matlab的Workspace中參量X1, 復(fù)制里面生成的1 024個(gè)數(shù)據(jù)。在QuartusⅡ中打開ROM數(shù)據(jù)文件編輯窗,即File\\\\New\\\\Other files\\\\Memory Initialization File,根據(jù)DDS設(shè)計(jì)要求,設(shè)置ROM的數(shù)據(jù)數(shù)Number為1 024,數(shù)據(jù)寬Word size取8位,把Matlab中的波形數(shù)據(jù)粘貼入.mif數(shù)據(jù)表格,保存此數(shù)據(jù)文件即可。若希望生成其他波形數(shù)據(jù),只需修改程序中“x1=round((sawtooth(2*pi*5*t,0.5)+1)/2*255)′”語句即可。
4 利用DSP Builder生成波形數(shù)據(jù)文件
利用DSP Builder生成.mif和.hex格式的波形數(shù)據(jù)文件是最簡(jiǎn)便的方法。在Matlab的Simulink環(huán)境中,用圖形方式調(diào)用DSP Builder和Simulink庫中的圖形模塊完成設(shè)計(jì)和仿真,如圖3所示。若仿真正確, DSP Builder可直接生成.hex和.mif文件,在其數(shù)據(jù)文件目錄中可以找到。只需設(shè)置圖3中LUT模塊參數(shù),就可以改變輸出波形類型、幅值和數(shù)據(jù)文件(.hex或.mif) 大小。
圖3 利用DSP Builder設(shè)計(jì)信號(hào)發(fā)生器
根據(jù)前述設(shè)計(jì)要求,在LUT參數(shù)選項(xiàng)中,Bus Type:Unsigned Integer;Out:8;LUT Address Wide:10;Matlab Array:127*sawtooth([0:2*pi/(2^10):2*pi],1)+128(鋸齒波公式,使用了歸一算法,保證波形幅值在0~255之間,便于進(jìn)行D/A轉(zhuǎn)換)。仿真結(jié)果如圖4所示。修改Matlab Array中的式子,即可生成正弦波(圖5)、方波(圖6)、三角波。
圖4 鋸齒波仿真波形
圖5 正弦波仿真波形
圖6 方波仿真波形
正弦波:127*sin( [0:2*pi/(2^10):2*pi] )+128
方波:127*square([0:2*pi/(2^10):2*pi],50)+128
三角波:127*sawtooth([0:2*pi/(2^10):2*pi],0.5)+128
從仿真圖中可以看到,輸出波形在0~255之間,符合8位D/A轉(zhuǎn)換器DAC0832輸入要求。
5 結(jié) 語
生成.hex或.mif文件后,就可以定制ROM元件,很多資料中都有詳細(xì)介紹,這里不再詳述。本文介紹的三種方法所生成的波形數(shù)據(jù)均已在GW48-SOPC開發(fā)系統(tǒng)上通過驗(yàn)證,但推薦采用DSP Builder生成數(shù)據(jù)文件的方法,因該方法不但參數(shù)設(shè)置簡(jiǎn)便,而且易于進(jìn)行仿真驗(yàn)證。總之,不論采用哪種方法生成ROM查找表,都要參照系統(tǒng)芯片類型和D/A轉(zhuǎn)換器等硬件資源條件完成設(shè)計(jì)。
參 考 文 獻(xiàn)
[1]鄭亞民,董曉舟.可編程邏輯器件開發(fā)軟件QuartusⅡ\\[M\\].北京:國(guó)防工業(yè)出版社,2006.
[2]潘松,黃繼業(yè),曾毓.SOPC技術(shù)實(shí)用教程\\[M\\].北京:清華大學(xué)出版社,2005.
[3]任勇峰,莊新敏.VHDL與硬件實(shí)現(xiàn)速成\\[M\\].北京:國(guó)防工業(yè)出版社,2005.
[4]求是科技.Matlab 7.0從入門到精通\\[M\\].北京:人民郵電出版社,2006.
[5]余勇,鄭小林.基于FPGA的DDS正弦信號(hào)發(fā)生器的設(shè)計(jì)和實(shí)現(xiàn)\\[M\\].電子器件,2005,28(3):595-599.
作者簡(jiǎn)介 徐丹旸 女,1977年出生,湖南長(zhǎng)沙市人,講師(碩士)。研究方向?yàn)殡娮覧DA。
注:本文中所涉及到的圖表、注解、公式等內(nèi)容請(qǐng)以PDF格式閱讀原文。