DDS信号发生器原理与vivado仿真
1. DDS简介
DDS信号发生器采用直接数字频率合成(Direct Digital Synthesis,简称DDS)技术,把信号发生器的频率稳定度、准确度提高到与基准频率相同的水平,并且可以在很宽的频率范围内进行精细的频率调节。采用这种方法设计的信号源可工作于调制状态,可对输出电平进行调节,也可输出各种波形。
2. 原理
DDS信号产生的理论基础是“奈奎斯特采样定理”。在定理中可知当抽样频率大于等于模拟信号最高频率两倍时,就可以从离散序列无失真的信号中恢复出原始模拟信号。DDS信号发生原理是对模拟信号进行抽样。当一个抽样过程已经发生且抽样值已经量化完成,从量化数值重建原始模拟信号。基本的DDS结构主要由相位累加器、波形量化数据存储器、D/A转换器组成。其中相位累加器和波形量化数据存储器称为数控振荡器,是DDS结构中的数字部分。DDS基本结构原理如下图所示。
图中,相位累加器是由N位加法器与N位累加寄存器构成,它是DDS模块中一个极其重要的部分。在参考频率时钟的驱动下,DDS模块开始工作;当每来一个参考时钟时,累加器就把频率控制字FW与寄存器输出的值进行累加,将相加后的结果再输入到寄存器中,而累加寄存器就将在上一个参考时钟作用时产生的数据通过反馈的方式输送到累加器中。这样,在时钟的作用下,就可以不停的对频率控制字进行累加。此时,用相位累加器输出的数据作为地址在波形存储器中通过查找地址所对应的幅值表,就可以完成其从相位到幅值之间的转化。在DDS模块中,输出频率的公式为:
由上式可以看出,在参考信号与累加器的位数给定时,信号最终的输出频率主要由频率控制字决定。故当频率控制字变化时,输出频率也跟着变化,从而可以实现调频的基本功能。
3. DDS代码
module DDS(
input clk,
input rst_n,
input [31:0]fword,
input [10:0]pword,
output [11:0]DA
);
reg [31:0] r_fword;
reg [11:0] r_pword;
reg [31:0] cnt;
wire [11:0] rom_addr;
always@(posedge clk or negedge rst_n)begin
if(!rst_n) begin
r_fword <= 0;
r_pword <= 0;
end
else begin
r_fword <= fword;
r_pword <= pword;
end
end
always@(posedge clk or negedge rst_n)
if(!rst_n)
cnt <= 32'd0;
else
cnt <= cnt +r_fword;
assign rom_addr = cnt[31:20] + r_pword;
blk_mem_gen_0 blk_mem_gen_1 (
.clka(clk), // input wire clka
.addra(rom_addr), // input wire [11 : 0] addra
.douta(DA) // output wire [11 : 0] douta
);
endmodule
其中blk_mem_gen_0例化模块为在vivado中调用的 “rom” IP核,设置如下两图所示。
ROM的初始化coe文件可以由波形数据生成器或者matlab产生,保存至工程目录下,并在ROM中将初始化文件选择为生成的coe文件。
4. 测试文件
`timescale 1ns/1ns
module DDS_tb;
reg clk;
reg rst_n;
reg [31:0] fword;
reg [10:0] pword;
wire [11:0] DA;
DDS DDS0 (
.clk (clk),
.rst_n (rst_n),
.fword (fword),
.pword (pword),
.DA (DA)
);
initial clk = 1;
always #5 clk = ~clk;
initial begin
rst_n = 0;
fword = 42955;
pword = 256;
#201;
rst_n = 1;
end
endmodule
5. 仿真结果
在vivado中点击 Run Simulation——Run Behavioral Simulation,选中DA,设置为模拟信号,如下图所示。
点击上方运行
测试文件中,输入时钟设置为100M,频率控制字为42955,相位控制字为256,由上面的输出频率计算公式计算频率为=42955x100000000/2^32=1000.12Hz,周期为1ms,对波形进行测量,得到周期约为1ms,如下图所示。
6. 总结
由仿真结果可知,与预期效果一致,证明模块正确无误。有兴趣的读者可以将上面部分再加上DAC模块和低通滤波模块,就可以得到DDS信号发生器。