DDS 波形发生器 Verilog Quartus

名称:DDS 波形发生器 Verilog Quartus

软件:Quartus

语言:Verilog

开发板/平台:Cyclone IV FPGA开发板

功能介绍

本设计实现一个基于 FPGA 的 DDS 波形发生器,可生成正弦波、方波和三角波,并通过 DA 接口输出 8 位波形数据及采样时钟。用户可通过板上按键切换波形、调整频率档位,并调节方波占空比。 工程同时提供 800×480 RGB LCD 显示控制,将波形类型、频率和占空比等运行参数呈现在屏幕上。按键输入经过滤波处理后送入波形控制逻辑,显示内容与波形发生参数联动,便于在硬件运行时查看当前设置。

运行环境

硬件描述语言:Verilog。开发软件:Quartus。工程面向 Cyclone IV FPGA 开发板,包含管脚分配与时序约束文件。

设计思路

设计以 DDS 相位累加为核心,通过按键输入调整波形类型、输出频率档位和方波占空比。按键滤波模块将机械按键输入转换为稳定的单次脉冲,波形控制模块据此更新选择状态与相位步进参数;波形发生模块结合相位步进和查找表生成正弦波数据,同时支持方波、三角波输出,并将数字采样值送至 DA 数据接口。 显示部分将当前波形、频率档位及占空比等状态整理为 LCD 文本,并由 RGB LCD 时序模块输出屏幕控制信号和像素数据。顶层模块负责连接按键处理、波形控制、DDS 数据生成与液晶显示各部分,使操作状态和输出信号由同一套参数驱动。工程还包含仿真测试平台,可用于观察顶层及波形控制、波形生成等模块的行为。

模块结构

顶层模块为 `dds_ktz_top`,负责连接按键、波形控制、DDS 输出、LED 状态及 LCD 接口。`key_filter` 完成按键滤波;`wave_ctrl` 管理波形选择、频率档位、占空比和相位步进;`wave_gen` 生成波形采样数据,`sine_lut` 提供正弦波查找表。显示链路由 `display_formatter`、`lcd_text_display` 和 `rgb_lcd_800x480` 组成,分别负责状态文本整理、字符绘制和 LCD 时序输出。

开发板验证

工程提供了 Cyclone IV FPGA 开发板的管脚分配,并配有开发板与上板照片,可用于参考 DDS 信号输出及 LCD 显示的硬件连接和验证。

DDS 波形发生器 Verilog Quartus 开发板验证图片 正点原子开拓者开发板.jpg

DDS 波形发生器 Verilog Quartus 开发板验证图片 上板图.jpg

演示视频

演示视频展示了 DDS 波形发生器的运行效果及开发板操作过程。

仿真图/仿真说明/设计文档图片

工程文档包含 RTL 结构、管脚分配、程序编译及仿真相关内容,并提供整体仿真、波形产生模块和波形控制模块的仿真图。

DDS 波形发生器 Verilog Quartus 设计文档图片 image1.png

DDS 波形发生器 Verilog Quartus 设计文档图片 image2.png

DDS 波形发生器 Verilog Quartus 设计文档图片 image3.png

DDS 波形发生器 Verilog Quartus 设计文档图片 image4.png

DDS 波形发生器 Verilog Quartus 设计文档图片 image5.png

DDS 波形发生器 Verilog Quartus 设计文档图片 image6.png

DDS 波形发生器 Verilog Quartus 设计文档图片 image7.png

DDS 波形发生器 Verilog Quartus 设计文档图片 image8.png

DDS 波形发生器 Verilog Quartus 设计文档图片 image9.png

部分代码

以下展示顶层模块 dds_ktz_top 的部分代码,完整源码请下载压缩包查看。

module dds_ktz_top #(
    parameter integer KEY_CNT_MAX = 20'd999_999
)(
    input  wire        sys_clk,
    input  wire        sys_rst_n,
    input  wire [3:0]  key,
    input  wire        touch_key,
    output wire [3:0]  led,
    output wire        da_clk,
    output wire [7:0]  da_data,
    output wire        lcd_de,
    output wire        lcd_hs,
    output wire        lcd_vs,
    output wire        lcd_clk,
    output wire        lcd_bl,
    output wire        lcd_rst,
    output wire [15:0] lcd_rgb
);

localparam [1:0] WAVE_SIN = 2'd0;
localparam [1:0] WAVE_SQR = 2'd1;
localparam [1:0] WAVE_TRI = 2'd2;

wire       key_wave_pulse;
wire       key_freq_up_pulse;
wire       key_freq_down_pulse;
wire       key_duty_up_pulse;
wire       key_duty_down_pulse;

wire [1:0]  wave_sel;
wire [3:0]  freq_index;
wire [6:0]  duty_percent;
wire [23:0] phase_step;
wire [31:0] freq_hz_unused;
wire [127:0] line1;
wire [127:0] line2;
wire [127:0] line3;

reg [25:0] led_cnt;
reg [3:0]  led_r;

key_filter #(
    .CNT_MAX(KEY_CNT_MAX)
) u_key_wave (
    .clk      (sys_clk),
    .rst_n    (sys_rst_n),
    .key_n    (key[0]),
    .key_pulse(key_wave_pulse),
    .key_state()
);

key_filter #(
    .CNT_MAX(KEY_CNT_MAX)
) u_key_freq_up (
    .clk      (sys_clk),
    .rst_n    (sys_rst_n),
    .key_n    (key[1]),
    .key_pulse(key_freq_up_pulse),
    .key_state()
);

key_filter #(
    .CNT_MAX(KEY_CNT_MAX)
) u_key_freq_down (
    .clk      (sys_clk),
    .rst_n    (sys_rst_n),
    .key_n    (key[2]),
    .key_pulse(key_freq_down_pulse),
    .key_state()
);

key_filter #(
    .CNT_MAX(KEY_CNT_MAX)
) u_key_duty_up (
    .clk      (sys_clk),
    .rst_n    (sys_rst_n),
    .key_n    (key[3]),
    .key_pulse(key_duty_up_pulse),
    .key_state()
);

key_filter #(
    .CNT_MAX(KEY_CNT_MAX)
) u_touch_key_duty_down (
    .clk      (sys_clk),
    .rst_n    (sys_rst_n),
    .key_n    (touch_key),
    .key_pulse(key_duty_down_pulse),
    .key_state()
);

wave_ctrl u_wave_ctrl(
    .clk               (sys_clk),
    .rst_n             (sys_rst_n),
    .key_wave_pulse    (key_wave_pulse),
    .key_freq_up_pulse (key_freq_up_pulse),
    .key_freq_down_pulse(key_freq_down_pulse),
    .key_duty_up_pulse (key_duty_up_pulse),
    .key_duty_down_pulse(key_duty_down_pulse),
    .wave_sel          (wave_sel),
    .freq_index        (freq_index),
    .duty_percent      (duty_percent),
    .phase_step        (phase_step),
    .freq_hz           (freq_hz_unused)
);

wave_gen u_wave_gen(
    .clk         (sys_clk),
    .rst_n       (sys_rst_n),
    .wave_sel    (wave_sel),
    .phase_step  (phase_step),
    .duty_percent(duty_percent),
    .da_clk      (da_clk),
    .da_data     (da_data)
);

display_formatter u_display_formatter(
    .wave_sel    (wave_sel),
    .freq_index  (freq_index),
    .duty_percent(duty_percent),
// ... 以下代码略,完整源码请下载压缩包查看

代码文件(付费下载)

📥 付费后此处显示完整工程压缩包下载链接。
1、代码文件需要付费后才可见。
2、支付问题请联系微信公众号客服。
3、优质Verilog/VHDL代码资源,所见即所得。
Verilog/VHDL资源下载 » DDS 波形发生器 Verilog Quartus

注册为本站会员,充值100得150,详情咨询客服

目前为止共有 *** 位优秀的会员加入! 立刻加入会员