DDS直接數(shù)字式頻率合成器(Direct Digital Synthesizer)
下面是使用MATLAB生成正弦波、三角波、方波的代碼,直接使用即可。
t=0:2*pi/2^12:2*pi
y=0.5*sin(t)+0.5;
r=ceil(y*(2^8-1)); %將小數(shù)轉(zhuǎn)換為整數(shù),ceil是向上取整。
fid = fopen(‘sin.coe’,‘w’); %寫到sin.coe文件,用來初始化sin_rom
fprintf(fid,‘MEMORY_INITIALIZATION_RADIX=10;\n’);
fprintf(fid,‘MEMORY_INITIALIZATION_VECTOR=\n’);
for i = 1:1:2^12
fprintf(fid,‘%d’,r(i));
if i==2^12
fprintf(fid,‘;’);
else
fprintf(fid,‘,’);
end
if i%15==0
fprintf(fid,‘\n’);
end
end
fclose(fid);
t=1:1:2^12;
y=(t《=2047);
r=ceil(y*(2^8-1));
fid = fopen(‘square.coe’,‘w’); %寫到square.coe,用來初始化rom_square
fprintf(fid,‘MEMORY_INITIALIZATION_RADIX=10;\n’);
fprintf(fid,‘MEMORY_INITIALIZATION_VECTOR=\n’);
for i = 1:1:2^12
fprintf(fid,‘%d’,r(i));
if i==2^12
fprintf(fid,‘;’);
else
fprintf(fid,‘,’);
end
if i%15==0
fprintf(fid,‘\n’);
end
end
fclose(fid);
t=1:1:2^12;
y=[0.5:0.5/1024:1-0.5/1024, 1-0.5/1024:-0.5/1024:0, 0.5/1024:0.5/1024:0.5];
r=ceil(y*(2^8-1));
fid = fopen(‘triangular.coe’,‘w’); %寫到triangular.coe,初始化三角波rom
fprintf(fid,‘MEMORY_INITIALIZATION_RADIX=10;\n’);
fprintf(fid,‘MEMORY_INITIALIZATION_VECTOR=\n’);
for i = 1:1:2^12
fprintf(fid,‘%d’,r(i));
if i==2^12
fprintf(fid,‘;’);
else
fprintf(fid,‘,’);
end
if i%15==0
fprintf(fid,‘\n’);
end
end
fclose(fid);
設(shè)計DDS的核心就是調(diào)用IP ROM,vivado調(diào)用ROM的方法和ISE相類似,都是加載.coe文件,我這里特地做筆記,以防忘記。
這是DDS的原理圖,DDS并沒有像它的名字一樣說的那么玄乎,它的核心便是控制頻率的fword字輸入,和相位字pword輸入,最后調(diào)用IP核查找表即可,代碼也十分簡單,下面給出DDS design代碼。
module DDS(
input mclk,
input rst_n,
input [31:0]fword,//frequency control
input [11:0]pword,//phase control
output [9:0]da_data
);
reg [31:0]r_fword;
reg [11:0]r_pword;
reg [31:0]fcnt;
wire [11:0]addr_rom;
//同步寄存器
always @(posedge mclk)
begin
r_fword 《= fword;
r_pword 《= pword;
end
always @(posedge mclk or negedge rst_n)
begin
if(!rst_n)
fcnt 《= 32‘d0;
else
fcnt 《= fcnt + r_fword;
end
assign addr_rom = fcnt[31:20] + r_pword;
//custom sin_rom
sin_rom sin_rom (
.clka(mclk), // input wire clka
.addra(addr_rom), // input wire [11 : 0] addra
.douta(da_data) // output wire [9 : 0] douta
);
endmodule
DDS_design
使用vivado調(diào)用IP核ROM教程如下
點擊IP catalog
選擇block memory,然后雙擊
將show disabled ports 選項勾選掉
輸入ROM名,我這里為了演示重新配置一個方波ROM,命名為square_rom
這里選擇single ports ROM
按如上圖所示勾選參數(shù),port width是數(shù)據(jù)寬度,我們根據(jù)代碼要求設(shè)置為10位,port width是數(shù)據(jù)深度,即有多少個這樣的數(shù)據(jù),我打開生成的square.coe文件可以清楚的看到一共有4096這樣的數(shù)據(jù)。always enable是ROM一直處于工作狀態(tài),不需要使能信號。
這里是加載.coe文件,勾選load init file 然后點擊browse將剛才生成的square.coe文件加載到ROM中,最后點擊OK。
選擇generate生成IP核
打開如圖所示文件,
將生成的IP核實例化,即可
最后編寫測試文件進行測試
最后右鍵點擊da_data選擇wave style選擇analog,將會看到模擬波形,但是有時候還是需要設(shè)置一下模擬波形的顯示,同樣右鍵點擊da_data選擇wave style選擇analog setting,選擇如下圖所示參數(shù)。
最后便大功告成,即可得打方波的波形圖
大家還可以按照這種方法將其他兩種波形都做出來。
-
DDS
+關(guān)注
關(guān)注
21文章
633瀏覽量
152631 -
Vivado
+關(guān)注
關(guān)注
19文章
812瀏覽量
66472
發(fā)布評論請先 登錄
相關(guān)推薦
評論