注意:由于采用了1/4周期存儲,要求整個(gè)周期的數(shù)值是中心對稱的,半個(gè)周期的數(shù)值是軸對稱的。這就意味著采樣點(diǎn)中不應(yīng)該有0值得存在。
Matlab仿真——ROM表存儲數(shù)據(jù)
%% ROM產(chǎn)生 (無符號數(shù))
ROM_N=2^10; %ROM表深度
DATA_L=14; %ROM位寬
t=1:ROM_N;
y=(2^DATA_L-1)*(sin(2*pi*(t-0.5)/ROM_N/4));%-0.5保證對稱性
ROM_DATA=round(y);
Matlab仿真——DDS程序(請?jiān)徫覜]有用case……)
%% 正弦波dds產(chǎn)生
F_CLK=10*10^6; %時(shí)鐘頻率10M
PINC_IN_L=32; %增量長度
DDS_CLK=10*10^3; %dds輸出頻率10k
PHASE_IN=0; %初始相位
pinc=round(DDS_CLK*2^PINC_IN_L/F_CLK); %相位增量
SIM_L=4000; %仿真長度
phase=PHASE_IN+pinc*(0:SIM_L-1);
addr=mod((floor(phase/2^PINC_IN_L*ROM_N)),ROM_N*4);
flag=floor(addr/ROM_N);
dds_out=1:SIM_L;
for i=1:SIM_L
if(flag(i)==0)
dds_out(i)=ROM_DATA(addr(i)+1);
else if(flag(i)==1)
dds_out(i)=ROM_DATA(2047-addr(i)+1);
else if(flag(i)==2)
dds_out(i)=-ROM_DATA(addr(i)-2048+1);
else
dds_out(i)=-ROM_DATA(4095-addr(i)+1);
end
end
end
end
plot(dds_out);
3.DDS的解釋
Xilinx的DDS核的User Guide中隊(duì)DDS做了很詳細(xì)的說明,本節(jié)不再重復(fù)此內(nèi)容,本節(jié)將敘述一種全新的DDS理解方式。這種理解方式解決了頻率控制字長于ROM表深度時(shí)DDS的理解上的問題。
連續(xù)還是離散?
連續(xù)還是離散,在于我們用什么眼光去看待。如下圖所示,我們可以理解藍(lán)色的圖是離散的,而紅色的線是連續(xù)的。然而,對于我們要獲取的信息而言,這兩幅圖是完全沒有區(qū)別的。抽樣定理中有理想抽樣和平頂抽樣(采樣保持電路)之分,然而在頻域效果上,是并沒有很大區(qū)別的。
ROM表存儲的是連續(xù)的數(shù)值
按照上面的理論,可以認(rèn)為ROM表中存儲的是正弦信號的平頂采樣結(jié)果。如下圖所示(一個(gè)全周期的ROM表,對稱性滿足1/4周期存儲的要求)
上圖的頻譜在信號與系統(tǒng)中有提及,上述波形的形成方式可以認(rèn)為是在乘以周期為T的沖擊函數(shù),之后卷積一個(gè)寬度為T的窗函數(shù)。對應(yīng)可以求得其頻域。(具體可參考平頂抽樣)
頻率控制字
頻率控制字控制對上述的階梯函數(shù)的采樣,如果這樣理解的話,就沒有所謂的相位截取取ROM表的值的疑惑了。頻譜圖能夠清晰的表現(xiàn)這一過程,然而由于blog表達(dá)不便,此處不做詳細(xì)說明。
此處能夠解釋DDS產(chǎn)生的雜散。
4.Verilog實(shí)現(xiàn)
老師教導(dǎo)我們,Verilog和Matlab代碼應(yīng)該是完全一致的,也就是說程序的思路,命名是一樣的。但是下面的程序沒有做到一致性……
`timescale 1ns / 1ps
module DDS_10k(
input clk_10M,
input rst,
output[13:0] D_SIN,
output[13:0] D_COS
);
parameter pinc=32‘d4294967; //10k
reg[31:0] addr_temp=32’d0;
reg[9:0] addra,addrb;
reg mark_a,mark_b;
always@(posedge(clk_10M)) //復(fù)位
begin
if(rst==0)
addr_temp《=32‘d0;
else
addr_temp《=addr_temp+pinc;
end
always@(posedge(clk_10M)) //1/4周期控制
begin
case(addr_temp[31:30])
2’b00:
begin
addra《=addr_temp[29:20];
mark_a《=0;
addrb《=~addr_temp[29:20];
mark_b《=0;
end
2‘b01:
begin
addra《=~addr_temp[29:20];
mark_a《=0;
addrb《=addr_temp[29:20];
mark_b《=1;
end
2’b10:
begin
addra《=addr_temp[29:20];
mark_a《=1;
addrb《=~addr_temp[29:20];
mark_b《=1;
end
2‘b11:
begin
addra《=~addr_temp[29:20];
mark_a《=1;
addrb《=addr_temp[29:20];
mark_b《=0;
end
endcase
end
//ROM表讀取
ROM_SIN_1k18 rom_dds (
.clka(clk_10M), // input clka
.addra(addra), // input [9 : 0] addra
.douta(D_SIN[12:0]), // output [12 : 0] douta
.clkb(clk_10M), // input clkb
.addrb(addrb), // input [9 : 0] addrb
.doutb(D_COS[12:0]) // output [12 : 0] doutb
);
reg sin_mark_temp;
reg cos_mark_temp;
assign D_SIN[13]=sin_mark_temp;
assign D_COS[13]=cos_mark_temp;
//此處ROM沒有添加register,因此輸出和地址有一個(gè)周期的延時(shí),故Mark也要有一周期延時(shí)
always@(posedge(clk_10M))
begin
sin_mark_temp《=mark_a;
cos_mark_temp《=mark_b;
end
-
ROM
+關(guān)注
關(guān)注
4文章
578瀏覽量
86976 -
DDS
+關(guān)注
關(guān)注
22文章
671瀏覽量
153988
發(fā)布評論請先 登錄
新型DDS器件產(chǎn)生正弦波信號和各種調(diào)制信號的設(shè)計(jì)

DDS正弦信號發(fā)生器
用Verilog通過DDS合成正弦波信號
基于FPGA的三相正弦DDS電路的設(shè)計(jì)與實(shí)現(xiàn)
請問有能直接產(chǎn)生特殊波形信號的DDS芯片嗎?
基于DDS原理和FPGA技術(shù)的基本信號發(fā)生器設(shè)計(jì)
淺析DDS信號發(fā)生器
高精度DDFS信號源FPGA實(shí)現(xiàn)
非正弦周期信號的分解與合成

非正弦周期信號電路的穩(wěn)態(tài)計(jì)算

基于FPGA的DDS基本信號發(fā)生器的設(shè)計(jì)

評論