第一次學,查詢了很多CSDN網頁,也問了組里的技術專家,得到了很多指導。把我的個人學習筆記在這里保存記錄分享,如果有問題歡迎大家批評指正。也歡迎大家點贊評論收藏,一起進步!
1 DDS IP核的配置
創(chuàng)建工程,在IP核配置頁面選擇DDS compiler 6.0。對IP核進行配置。
如圖所示配置參數。
Configuration(配置)頁面,Configuration Options 有三個選項,分別是相位產生器和SIN COS查找表、單獨的相位產生器、單獨的sin/cos,一般選擇第一個,利用IP核生成一個頻率相位可調的正余弦發(fā)生器。
將System Clock系統(tǒng)時鐘設置為250MHz,Number of Channels通道數設為1,Parameter Selection(參數選擇)主要分為Hardware Parameter 和 System Parameter兩種。
在System Parameter模式下,配置頁面需要配置系統(tǒng)參數設置。共有Spurious Free Dynamic Range(SFDR)、Frequency Resolution(頻率分辨率)、Noise Shaping(需不需要整形噪聲選擇自動模式就行)三項。其中SFDR與輸出數據位寬相關,見手冊表格。
Hardware Parameter模式下,Noise Shaping噪聲整形選項一般選擇None。Phase width指的是輸出的相位寬度信息,output width 指的是輸出的數據位寬;相位位寬選擇32位,數據位寬采用16位。
Implementation頁面,Phase Increment Programmability與Phase Offset Programmability,相位增量(即頻率控制字)和相位偏移量(即相位控制字)控制模式選擇,一般選擇可編程模式,該模式下在valid有效時可對相位增量和相位偏移量進行配置;Output sin、cos、sin&cos根據需要選擇即可。如圖所示:
在Summary中檢查配置無誤:
2 單路正弦信號的產生
事實上,任何周期信號都可以分解為一系列正弦或余弦信號之和,正弦信號是關于相位的一個周期函數。相位和幅值的一一對應關系就好比存儲器中地址和存儲內容的關系,如果把一個周期內每個相位對應的幅度值存入存儲器當中,那么對于任意頻率的正弦信號,在任意時刻,只要已知相位Φ(t),也就知道地址,就可通過查表得到s(t)。
相位累加器在每個時鐘脈沖輸入時,把頻率控制字累加一次,相位累加器的輸出數據就是信號的相位,用輸出的數據作為波形存儲器(ROM)的相位取樣地址,這樣就可以把存取在波形存儲器內的波形抽樣值經查找表查處,完成相位到幅值的轉換。頻率控制字相當于Φ(t)中的2πfc,相位控制字相當于Φ(t)中的θ0。
由于相位累加器字長的限制,相位累加器累加到一定值后,其輸出將會溢出,這樣波形存儲器的地址就會循環(huán)一次,即意味著輸出波形循環(huán)一周。故改變頻率控制字即相位增量,就可以改變相位累加器的溢出時間,在時鐘頻率不變的條件下就可以改變輸出頻率。改變查表尋址的時鐘頻率,同樣也可以改變輸出波形的頻率。
為了獲得較高的頻率分辨率,則只有增加相位累加器的字長N。
這部分參考了部分CSDN內容。
原文鏈接:https://blog.csdn.net/u014586651/article/details/88830115
相位累加器的字長為N,就將一個完整周期的正弦波的相位均勻分割為個離散相位。如果想將頻率提高到2倍 = 點數變?yōu)?/span>1/2(隔一個點輸出一個波形)。事實上,DDS滿足:
其中,fout是輸出頻率,fclk是系統(tǒng)工作時鐘的頻率,FTW是頻率控制字,N是相位累加器的位數。對于一個IP核生成一路信號,其滿足:
其中,fout為輸出頻率,fclk為輸入ip的時鐘。Δθ為相位增量(頻率控制字),Bθ(n)為頻率精度位數、輸出相位數據的寬度(Phase Width),計算公式滿足:
其中Δf為頻率精度,對應IP核中Frequncy Resolution。
相位控制字滿足:
其中θ為相位偏移量,N為相位累加器的位數。
在IP Symbol中檢查IP核的端口,對IP核進行配置和例化。
代碼如下所示:
module simu(
);
reg clk;
reg [63:0]pinc_sin;
reg en_pinc;
initial begin
pinc_sin={32'd715827883,32'h0fffffff};
en_pinc=1; //必須為1才有效
clk=0;
end
always #2 clk=~clk;
wire [15:0]dout_dds;
wire data_tvalid;
dds_compiler_0 name(
.aclk(clk),
.s_axis_config_tvalid(en_pinc),//控制字有效信號,為1時控制字才有用。
.s_axis_config_tdata(pinc_sin),
.m_axis_data_tvalid(data_tvalid),
.m_axis_data_tdata(dout_dds));
endmodule
其中,pinc_sin采用位拼接的方式配置頻率控制字和相位控制字,本實驗初相偏差π/3,根據相位控制字計算公式,poff=(π/3)*2^32/2π= 32'd715827883,頻率控制字選擇32'h0fffffff,仿真可以輸出正弦波形。
3 多相DDS
在第二節(jié)中已經實現了輸出250MHz的正弦波形,現在將使用多相處理,用四路250MHz的正弦波形構建一個1GHz的正弦波形。
基本原理如上圖所示,在一個上升沿內并行產生四個相位,再進行相應的相幅轉換。圖中1-4分別代表四路信號。由圖可知,對于一路信號而言,其頻率控制字FTW’=4FTW,每一路信號之間有一個FTW的相位差。
配置四個與第二節(jié)完全相同的DDS核:
simu代碼如下所示:
module simu(
? );
? reg clk;
? reg [63:0]pinc_sin_0;
? reg [63:0]pinc_sin_1;
? reg [63:0]pinc_sin_2;
? reg [63:0]pinc_sin_3;
? reg en_pinc_0;
? reg en_pinc_1;
? reg en_pinc_2;
? reg en_pinc_3;
? reg [15:0]q0;
? //存儲波形數據輸出為csv文件
? integer file_0;
? integer file_1;
? integer file_2;
? integer file_3;
????
? initial begin
? //對四個dds賦值,每個間隔dds相差FTW。頻率控制字FTW'=4FTW
? pinc_sin_0={32'd715827883,32'h03fffffc};??
? //h0fffffff=d268435455;h00ffffff=16777215;h03fffffc=d67108860
? pinc_sin_1={32'd732605098,32'h03fffffc};
? pinc_sin_2={32'd749382313,32'h03fffffc};
? pinc_sin_3={32'd766159528,32'h03fffffc};
? en_pinc_0=16'd1;
? en_pinc_1=16'd1;
? en_pinc_2=16'd1;
? en_pinc_3=16'd1; //必須為1才有效
? clk=16'd0;
? q0=16'd0;
? file_0=$fopen("E:/study2022/dds2/data_0.csv","w");
? file_1=$fopen("E:/study2022/dds2/data_1.csv","w");
? file_2=$fopen("E:/study2022/dds2/data_2.csv","w");
? file_3=$fopen("E:/study2022/dds2/data_3.csv","w");
? end
? always #2 clk=~clk;
? wire [15:0]dout_dds_0;
? wire [15:0]dout_dds_1;
? wire [15:0]dout_dds_2;
? wire [15:0]dout_dds_3;
? wire data_tvalid_0;
? wire data_tvalid_1;
? wire data_tvalid_2;
? wire data_tvalid_3;
?? always @(posedge clk)begin
??? if(q0 < 16'd4000)begin
??????? $fwrite(file_0,"%h\n",dout_dds_0);
??????? $fwrite(file_1,"%h\n",dout_dds_1);
??????? $fwrite(file_2,"%h\n",dout_dds_2);
??????? $fwrite(file_3,"%h\n",dout_dds_3);
??????? q0 <= q0 + 16'd1;
??? end
??? else begin
??????? q0 <= q0;
??????? $fclose(file_0);
??????? $fclose(file_1);
??????? $fclose(file_2);
??????? $fclose(file_3);
??? end
? end
dds_compiler_0 name0(
??? .aclk(clk),
??? .s_axis_config_tvalid(en_pinc_0),???? //相位控制字有效信號,同。
??? .s_axis_config_tdata(pinc_sin_0),
??? .m_axis_data_tvalid(data_tvalid_0),
??? .m_axis_data_tdata(dout_dds_0));
dds_compiler_1 name1(
??? .aclk(clk),
??? .s_axis_config_tvalid(en_pinc_1),???? //相位控制字有效信號,同。
??? .s_axis_config_tdata(pinc_sin_1),
??? .m_axis_data_tvalid(data_tvalid_1),
??? .m_axis_data_tdata(dout_dds_1));
dds_compiler_2 name2(
??? .aclk(clk),
??? .s_axis_config_tvalid(en_pinc_2),???? //相位控制字有效信號,同。
??? .s_axis_config_tdata(pinc_sin_2),
??? .m_axis_data_tvalid(data_tvalid_2),
??? .m_axis_data_tdata(dout_dds_2));
???
dds_compiler_3 name3(
??? .aclk(clk),
??? .s_axis_config_tvalid(en_pinc_3),???? //相位控制字有效信號,同。
??? .s_axis_config_tdata(pinc_sin_3),
??? .m_axis_data_tvalid(data_tvalid_3),
??? .m_axis_data_tdata(dout_dds_3));??
Endmodule
代碼中對頻率控制字、相位控制字進行了相關配置,并將輸出的四路信號的相關點的數據存為csv文件。
實驗波形圖如圖所示:
計算驗證一下,FTW’=4TFW=67108860,fclk=250*10^6,N=32。
理論上的fout=FTW’*fclk/2^N=67108860*250*10^6/2^32=3.9062*10^6Hz。
觀察波形圖,輸出信號周期為500ns-244ns=256ns,fout=1/256ns=3.9062*10^6Hz,相吻合,頻率控制字設置無誤。
相位初相能觀察到π/3的初相,不同信號之間能觀察到一個FTW的相差,頻率控制字設置無誤。
將保存的信號csv文件導入Matlab,對其進行交叉拼接處理,并繪制拼好后的正弦數組的頻譜圖。
相關Matlab代碼如下所示:
%讀取波形數值
%num_0 = xlsread('E:/study2022/dds/data_0.xlsx',1,'B1:B511')
%num_1 = xlsread('E:/study2022/dds/data_1.xlsx',1,'B1:B511')
%num_2 = xlsread('E:/study2022/dds/data_2.xlsx',1,'B1:B511')
%num_3 = xlsread('E:/study2022/dds/data_3.xlsx',1,'B1:B511')
%16進制轉化為10進制數
data_0=hex2dec(data0)
data_1=hex2dec(data1)
data_2=hex2dec(data2)
data_3=hex2dec(data3)
%交叉合并(拼接)
merge=[data_0'
????? data_1'
????? data_2'
????? data_3'];
merge=reshape(merge,[],1); %[]=length(data_0)+length(data_1)+length(data_2)+length(data_3)
%把矩陣merge轉化為csv文件
csvwrite('E:/study2022/dds2/merge.csv',merge);
%畫圖
for i=1:15960
??? if merge(i)>32768
??????? merge(i)=merge(i)-65536;? %將
??? else
??? i=i+1;
??? end
end
plot(merge)
%對畫出的圖像做FFT觀察頻譜
ff=20*log10(abs(fft(merge(1:15960))));
%ff2=abs(fft(merge(1:15960)));
plot(ff)
%plot(ff2)
其中,讀取波形數值部分可以用MATLAB自帶的導入工具:
繪圖結果如下圖所示:
?
N個采樣點經過FFT變換后得到N個點的以復數形式記錄的FFT結果。
假設采樣頻率為Fs,采樣點數為N。那么FFT運算的結果就是N個復數(或N個點),每一個復數就對應著一個頻率值以及該頻率信號的幅值和相位。
第一個點對應的頻率為0Hz(即直流分量),最后一個點N的下一個點對應采樣頻率Fs。其中任意一個采樣點n所代表的信號頻率:Fn=(n-1)*Fs/N。文章來源:http://www.zghlxwxcb.cn/news/detail-785964.html
對實驗數據進行驗證,理論上輸出頻率為fout=3.9062MHz,根據圖可觀察后計算,真實輸出頻率fout=10^6*63/16000=3.9375MHz,考慮到繪圖誤差,數據在可控范圍內,整體實驗成功。文章來源地址http://www.zghlxwxcb.cn/news/detail-785964.html
到了這里,關于Vivado DDS IP核使用、仿真、多相處理和相關計算驗證的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!