日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > 消費電子 > 消費電子
[導(dǎo)讀]DDS直接數(shù)字式頻率合成器(Direct Digital Synthesizer)下面是使用MATLAB生成正弦波、三角波、方波的代碼,直接使用即可。t=0:2*pi/2^12:2*piy=0.5*sin(t)+0.5;r=ceil(y*(2^

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ù)。

 

 

最后便大功告成,即可得打方波的波形圖

 

 

大家還可以按照這種方法將其他兩種波形都做出來。

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除( 郵箱:macysun@21ic.com )。
換一批
延伸閱讀
關(guān)閉