一.DDS是什么?
DDS(Direct Digital Synthesis):是一种信号产生器。
二.DDS公式原理及结构图
2.1频率控制字控制输出频率的原理
DDS主要通过频率控制字(FWORD)和相位控制字(PWORD)来对信号的频率和相位进行改变。输出频率的公式为,其中B是FWORD,Fclk为系统时钟。公式这么写的原理推导如下:
2.2相位控制字控制输出相位的原理
由DDS结构图可知频率控制字对频率进行改变后,将其和相位控制字进行了相加,然后通过相位控制字的值改变输出波形相位。原理如下:
三.代码部分及其详细解释
module DDS(
clk,
reset,
Fword,
Pword,
data
);
input clk;
input reset;
input [31:0]Fword;//取32位是因为想让频率范围调整范围变大,对应2的32次方。
input [11:0]Pword;//采样点是4096个,所以需要0-4095位,4095就需要12位。
output [13:0]data;//输出是14位,因为数模转换模块是14位的。
reg [31:0]Fword_r;
reg [11:0]Pword_r;
reg [31:0]Freg_acc;
reg [11:0]Rom_addr;
ROM ROM(
.clka(clk),
.addra(Rom_addr),
.douta(data)
);
//频率控制字的寄存器
always@(posedge clk or posedge reset)
if(!reset)
Fword_r<=0;
else
Fword_r<=Fword;
//相位控制字的寄存器
always@(posedge clk or posedge reset)
if(!reset)
Pword_r<=0;
else
Pword_r<=Pword;
//相位累加寄存器
always@(posedge clk or posedge reset)
if(!reset)
Freg_acc<=0;
else
Freg_acc<=Freg_acc+Fword_r;
//波形地址获取
always@(posedge clk or posedge reset)
if(!reset)
Rom_addr<=0;
else
Rom_addr<=Freg_acc[31:20]+Pword_r;
endmodule
代码中的Rom_addr<=Freg_acc[31:20]+Pword_r;中Freg_acc[31:20]取前12位的原因如下:
四.疑惑与问题
小梅哥在testbench验证输出频率是否正确时使用的公式是(其中的2^N是指采样点数)小梅哥视频使用的正弦信号采样点是4096(2^12),但是在计算时确把2^N带入2^32次方,这是为什么?
解答: