小梅哥-DDS原理和代码详解

一.DDS是什么?

DDS(Direct Digital Synthesis):是一种信号产生器。

二.DDS公式原理及结构图

2.1频率控制字控制输出频率的原理

DDS主要通过频率控制字(FWORD)和相位控制字(PWORD)来对信号的频率和相位进行改变。输出频率的公式为F_{out}=\frac{F_{clk}}{2^{N}}*B,其中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验证输出频率是否正确时使用的公式是F_{out}=\frac{F_{clk}}{2^{N}}*B(其中的2^N是指采样点数)小梅哥视频使用的正弦信号采样点是4096(2^12),但是在计算时确把2^N带入2^32次方,这是为什么?

解答:

 

 

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只准备起飞的小菜鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值