一、DDS原理
最近在复习至芯培训课程的DDS部分,DDS的核心主要包括频率发生器、相位累加器和波形存储器三部分。波形存储器的作用是存储不同相位对应地址的波形值,相位累加器根据不同的相位产生对应的地址,用于选择不同的波形值,频率发生器根据输入频率产生频率控制字,其大小决定了相位累加器地址累加的速度,不同的累加速度决定了输出不同的频率大小。
二、本工程的相关说明
实现的功能如下:输入有四个按键,分别对应波形选择、幅度调节、频率加和频率减;输出有蜂鸣器、6个动态数码管和输出波形d_wave。当四个按键有任意一个按下时,蜂鸣器响,数码管显示波形、幅度和频率对应的值,d_dds模块输出对应波形。
1、顶层设计
顶层dds模块包括以下几个部分:按键处理模块(key_ctrl)、脉冲处理模块(flag_ctrl)、信号发生器核心部分(d_dds)、蜂鸣器模块(beep)和6个动态数码管显示模块。顶层RTL视图如下。
dds顶层代码如下:
module dds(
input wire clk,
input wire rst_n,
input wire key_sel,
input wire key_amp,
input wire key_fadd,
input wire key_fsub,
output wire beep,
output wire [9:0] d_wave,
output wire [2:0] sel,
output wire [7:0] seg
);
wire flag_s;
wire flag_a;
wire flag_fa;
wire flag_fs;
wire [1:0] wave_sel;
wire [1:0] wave_a;
wire [19:0] wave_freq;
key_ctrl key_ctrl_inst(
.clk (clk ),
.rst_n (rst_n ),
.key_sel (key_sel ),
.key_amp (key_amp ),
.key_fadd (key_fadd),
.key_fsub (key_fsub),
.flag_s (flag_s ),
.flag_a (flag_a ),
.flag_fa (flag_fa ),
.flag_fs (flag_fs )
);
flag_ctrl flag_ctrl_inst(
.clk (clk ),
.rst_n (rst_n ),
.flag_s (flag_s ),
.flag_a (flag_a ),
.flag_fa (flag_fa ),
.flag_fs (flag_fs ),
.wave_sel (wave_sel ),
.wave_a (wave_a ),
.wave_freq (wave_freq )
);
d_dds d_dds_inst(
.clk (clk ),
.rst_n (rst_n ),
.wave_sel (wave_sel ),
.wave_a (wave_a ),
.wave_freq (wave_freq ),
.d_wave (d_wave )
);
beep beep_inst(
.clk (clk ),
.rst_n (rst_n ),
.flag_s (flag_s ),
.flag_a (flag_a ),
.flag_fa (flag_fa ),
.flag_fs (flag_fs ),
.beep (beep )
);
show_data show_data_inst(
.clk (clk ),
.rst_n (rst_n ),
.wave_sel (wave_sel ),
.wave_a (wave_a ),
.wave_freq (wave_freq ),
.sel (sel ),
.seg (seg )
);
endmodule
2、各模块相关说明
(1)按键处理模块(key_ctrl)
按键处理包括两个步骤,消抖和边缘检测,需要注意的点是需要对每一个按键进行这两步操作,生成对应的四个脉冲信号:波形选择、幅度调节、频率加和减。顶层代码如下:
module key_ctrl(
input wire clk,
input wire rst_n,
input wire key_sel,
input wire key_amp,
input wire key_fadd,
input wire key_fsub,
output wire flag_s,
output wire flag_a,
output wire flag_fa,
output wire flag_fs
);
wire key_wave1;
wire key_wave2;
wire key_wave3;
wire key_wave4