直接數(shù)字頻率合成器(Direct Digital Synthesizer,DDS),是一種頻率合成技術(shù),具有相對(duì)帶寬大、頻率轉(zhuǎn)換速度快、相位分辨率高、連續(xù)性好等優(yōu)點(diǎn),在數(shù)字信號(hào)處理中常用于調(diào)制信號(hào)的生成,模塊設(shè)計(jì)較為簡單,頻率、相位容易控制,多用于無線通信領(lǐng)域。
DDS發(fā)生器的組成原理精髓在于對(duì)“模板”信號(hào)在單個(gè)周期內(nèi)的采樣,在系統(tǒng)工作頻率一定的情況下,輸出信號(hào)頻率和周期內(nèi)的取樣點(diǎn)數(shù)有著直接的關(guān)系,舉個(gè)栗子,假設(shè)基波信號(hào) U(t)=sin(2pift+θ )=sin( 2pit ) ,* 在0~2Π內(nèi)
等分周期,在相同的系統(tǒng)時(shí)鐘下采用不同的抽樣點(diǎn)數(shù)進(jìn)行抽樣,如下圖所示:
以*Π/4 *為步進(jìn)在單個(gè)周期內(nèi)抽樣
以*Π/8 *為步進(jìn)在單個(gè)周期內(nèi)抽樣
可以很明顯看出,相同系統(tǒng)時(shí)鐘下使用不同的抽樣點(diǎn)數(shù),可以得到不同的輸出頻率;基本組成架構(gòu)如下,系統(tǒng)時(shí)鐘驅(qū)動(dòng)頻率控制字(抽樣間隔)逐次累加生成存儲(chǔ)著基波數(shù)據(jù)ROM的對(duì)應(yīng)抽樣地址,相位控制字主要用來決定基波的起始相位;
在FPGA中開辟一塊Block RAM用于存儲(chǔ)對(duì)應(yīng)的“模板”信號(hào),也就是要輸周期信號(hào)的一個(gè)完整周期,輸出數(shù)據(jù)位數(shù)決定采樣波形存儲(chǔ)ROM的寬度,數(shù)據(jù)深度與采樣精度有關(guān),累加器用于按頻率控制字步長控制等間隔采樣精度,相位寄存器用于鎖定波形發(fā)生起始的位置,生成的周期數(shù)列作為ROM表的驅(qū)動(dòng)地址,完成對(duì)"模板"信號(hào)不同頻率的抽樣;
模塊設(shè)計(jì)前需要先準(zhǔn)備ROM初始化文件“ .coe ”,生成方式可以使用工具或者MATLAB,下面是個(gè)人使用的一個(gè)基于MATLAB的coe文件生成代碼;
clc;clear;close all;
width = 10;
depth = 2048;
t = linspace(0,2*pi,depth);
sin_val = sin(t);
% %cos_val = cos(t);
plot(t,sin_val,'--');
sin_val = fix(sin_val*(2^width-1)/2 + 0.5); %四舍五入
% %cos_val = fix(cos_val*(2^width-1)/2 + 0.5);
sin_val(find(sin_val< 0))=sin_val(find(sin_val< 0)) + 2^width; %求補(bǔ)碼
addr = [0:depth - 1];
file = fopen('sin1024.coe','wt');
fprintf(file,'MEMORY_INITIALIZATION_RADIX=10;n);
fprintf(file,'MEMORY_INITIALIZATION_VECTOR=n');
for i=1:depth
fprintf(file,'%04X : %04X;n',addr(i), sin_val(i));
end
fprintf(file,'END;n');
fclose(file);
模塊設(shè)計(jì)為便于修改添加部分參數(shù)定義,在有不同位寬需求時(shí)可以只修改參數(shù)和ROM模塊IP即可實(shí)現(xiàn);頻率計(jì)算公式不在推到,直接給出:
其中K為頻率控制字,N為相位累加器位寬,f0為模塊輸出頻率,fC為系統(tǒng)時(shí)鐘頻率;舉個(gè)例子,設(shè)系統(tǒng)時(shí)鐘為50Mhz,相位寬度10Bit,要輸出1Mhz的信號(hào),則K=(2^101)/50; *設(shè)計(jì)代碼如下,使用時(shí)只需添加ROM模塊的IP,然后就可以例化工程使用:
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: nhike
// Engineer: chenyivi
//
// Create Date: 2019/11/03 19:25:35
// Design Name:DDS_ROM_IP
// Module Name: DDS_ROM
// Project Name: DDS_ROM_IP
// Target Devices: zynq7010
// Tool Versions:1.0
// Description: WaveFrom
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module DDS_ROM(
clk, //系統(tǒng)時(shí)鐘
rst_n, //系統(tǒng)復(fù)位
Freword, //頻率控制參數(shù)
Phaword, //初始相位控制參數(shù)
WaveDataOut //輸出信號(hào)
);
parameter FrequencyBitWidth = 32;
parameter PhaseBitWidth =10;
parameter DataOutBitWidth= 10;
input clk;
input rst_n;
input [FrequencyBitWidth-1:0] Freword;
input [PhaseBitWidth-1:0] Phaword;
output [DataOutBitWidth-1:0] WaveDataOut;
reg [FrequencyBitWidth-1:0] Freword_temp;
reg [PhaseBitWidth-1:0] Phaword_temp;
wire [PhaseBitWidth-1:0] WaveAddData;
always@(posedge clk or negedge rst_n)begin //data latch.
if(!rst_n)begin
Freword_temp <= 32'b0;
Phaword_temp <= 10'b0;
end
else begin
Freword_temp <= Freword;
Phaword_temp <= Phaword;
end
end
reg [FrequencyBitWidth-1:0] cnt;
always @(posedge clk or negedge rst_n)begin //Sampling control.
if(!rst_n)
cnt <= 0;
else
cnt <= cnt + Freword_temp;
end
assign WaveAddData = cnt[FrequencyBitWidth-1:FrequencyBitWidth-(DataOutBitWidth + 1)] + Phaword_temp; //Data precision interception
WaveRom WaveRomBase (
.clka(clk),
.addra(WaveAddData),
.douta(WaveDataOut)
);
endmodule
下面是仿真結(jié)果和RTL:
以上實(shí)現(xiàn)均在Vivado中驗(yàn)證,Quartus使用方法與上述一致;
-
合成器
+關(guān)注
關(guān)注
0文章
280瀏覽量
26134 -
頻率合成器
+關(guān)注
關(guān)注
5文章
293瀏覽量
32704 -
無線通信
+關(guān)注
關(guān)注
58文章
4706瀏覽量
144849 -
Verilog
+關(guān)注
關(guān)注
28文章
1365瀏覽量
111791 -
DDS
+關(guān)注
關(guān)注
22文章
671瀏覽量
154014
發(fā)布評(píng)論請(qǐng)先 登錄
Verilog實(shí)現(xiàn)DDS正弦波發(fā)生器

使用DDS生成三個(gè)信號(hào)并在Vivado中實(shí)現(xiàn)低通濾波器

用Verilog通過DDS合成正弦波信號(hào)
急急急?。?!各位大神幫幫忙!怎么用Verilog控制DDS芯片AD9852
請(qǐng)問怎么用Verilog寫一個(gè)DDS產(chǎn)生Chirp線性調(diào)頻信號(hào)
基于DDS實(shí)現(xiàn)信號(hào)的頻譜分析
使用AD9739A生成信號(hào),用FPGA的DDS生成信號(hào),為什么諧波特別明顯?
基于FPGA的DDS調(diào)頻信號(hào)的研究與實(shí)現(xiàn)
基于FPGA的DDS信號(hào)源設(shè)計(jì)與實(shí)現(xiàn)
DDS在羅盤測(cè)試信號(hào)產(chǎn)生模塊中的應(yīng)用
DDS多波信號(hào)發(fā)生器的實(shí)現(xiàn)
基于Verilog實(shí)現(xiàn)的DDS任意波形發(fā)生器

評(píng)論