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è)計(jì)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教程如下
點(diǎn)擊IP catalog
選擇block memory,然后雙擊
將show disabled ports 選項(xiàng)勾選掉
輸入ROM名,我這里為了演示重新配置一個(gè)方波ROM,命名為square_rom
這里選擇single ports ROM
按如上圖所示勾選參數(shù),port width是數(shù)據(jù)寬度,我們根據(jù)代碼要求設(shè)置為10位,port width是數(shù)據(jù)深度,即有多少個(gè)這樣的數(shù)據(jù),我打開生成的square.coe文件可以清楚的看到一共有4096這樣的數(shù)據(jù)。always enable是ROM一直處于工作狀態(tài),不需要使能信號(hào)。
這里是加載.coe文件,勾選load init file 然后點(diǎn)擊browse將剛才生成的square.coe文件加載到ROM中,最后點(diǎn)擊OK。
選擇generate生成IP核
打開如圖所示文件,
將生成的IP核實(shí)例化,即可
最后編寫測(cè)試文件進(jìn)行測(cè)試
最后右鍵點(diǎn)擊da_data選擇wave style選擇analog,將會(huì)看到模擬波形,但是有時(shí)候還是需要設(shè)置一下模擬波形的顯示,同樣右鍵點(diǎn)擊da_data選擇wave style選擇analog setting,選擇如下圖所示參數(shù)。
最后便大功告成,即可得打方波的波形圖
大家還可以按照這種方法將其他兩種波形都做出來。
-
DDS
+關(guān)注
關(guān)注
21文章
636瀏覽量
152962 -
Vivado
+關(guān)注
關(guān)注
19文章
815瀏覽量
66916
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
IP core調(diào)用DDS
使用Vivado調(diào)用ROM IP核
vivado的IP core怎么用
vivado有哪幾種常用IP核?如何去調(diào)用它們
Xilinx Vivado的使用詳細(xì)介紹(3):使用IP核
![Xilinx <b class='flag-5'>Vivado</b>的使用詳細(xì)介紹(3):使用<b class='flag-5'>IP</b>核](https://file1.elecfans.com//web2/M00/A6/A7/wKgZomUMP2qAHVOOAAAQM0TLw18295.png)
了解Vivado中IP核的原理與應(yīng)用
vivado調(diào)用IP核詳細(xì)介紹
調(diào)用Vivado IP核的方法
Vivado中PLL開發(fā)調(diào)用IP的方法
Vivado 如何調(diào)用ROM IP核
![<b class='flag-5'>Vivado</b> 如何<b class='flag-5'>調(diào)用</b><b class='flag-5'>ROM</b> <b class='flag-5'>IP</b>核](https://file.elecfans.com/web1/M00/C7/DB/o4YBAF9t90SAFlSsAAAPlNPhc7U539.png)
解析Vivado如何調(diào)用DDS的IP進(jìn)行仿真
![解析<b class='flag-5'>Vivado</b>如何<b class='flag-5'>調(diào)用</b><b class='flag-5'>DDS</b>的<b class='flag-5'>IP</b>進(jìn)行仿真](https://file.elecfans.com/web1/M00/ED/32/pIYBAGCHzFiAVnkqAAAlQnKfi4w064.png)
FPGA應(yīng)用之vivado三種常用IP核的調(diào)用
Xilinx Vivado DDS IP使用方法
![Xilinx <b class='flag-5'>Vivado</b> <b class='flag-5'>DDS</b> <b class='flag-5'>IP</b>使用方法](https://file1.elecfans.com/web2/M00/8D/94/wKgZomS97fWAWk2vAAJAMU9WiXY264.jpg)
評(píng)論