
名称DDS FSK 正弦波发生器 Verilog Quartus软件Quartus语言Verilog功能介绍本工程实现了一个基于 DDS 的 FSK 调制正弦波发生器使用 Verilog 编写并在 Quartus 工程环境下完成编译。设计通过输入 FSK_data 控制输出不同频率的 8 位正弦波可用于学习 DDS 频率合成、相位累加器、ROM 查表输出以及 FSK 数字调制的基本实现方法。 顶层模块 DDS_top 接收 50MHz 时钟和 FSK 调制控制信号输出 8 位 sin_wave 数字正弦波数据。系统内部根据 FSK_data 选择不同频率控制字驱动频率控制模块产生 ROM 地址再从正弦 ROM 中读取对应幅值实现频率随调制信号切换的正弦波输出。 工程包含 Quartus 项目文件、Verilog 源码、正弦 ROM 初始化数据和 ModelSim 仿真相关文件适合用于 FPGA 数字信号处理课程设计、DDS 原理实验、FSK 调制演示以及相关二次开发。运行环境开发软件Quartus。 硬件描述语言Verilog。 仿真环境ModelSim 相关仿真文件已配置包含 DDS_top_run_msim_rtl_verilog.do、仿真工作库文件和仿真转录记录。 工程对象DDS_top.qpf / DDS_top.qsf Quartus 工程包含可编译输出文件和 .sof 配置文件。设计思路本设计采用 DDS 直接数字频率合成思路实现 FSK 调制输出。系统以 50MHz 时钟作为基准通过频率控制字 FTW 控制相位累加器的地址步进速度再由正弦 ROM 按地址读取 8 位幅值数据输出从而得到对应频率的数字正弦波。 FSK_data 作为调制控制信号用于在两组频率控制字之间切换。当 FSK_data 为高电平时FTW 取 1000当 FSK_data 为低电平时FTW 取 500。根据代码中的计算关系 f50M*FTW/2^16两种控制字分别对应约 762939Hz 和 381469Hz 的正弦输出实现二频移键控的基本调制效果。 正弦波数据由 8 位、65536 深度的 ROM 查表产生相位累加器输出 16 位 ROM 地址。这样的结构便于理解 DDS 的核心工作流程也方便后续扩展为更多频点、可配置频率控制字或其他调制方式。模块结构工程主要由 DDS_top、Frequency_ctrl 和 sin_ROM 等模块组成。 DDS_top顶层模块连接时钟、FSK_data 调制输入、频率控制字选择、相位累加器和正弦 ROM 输出。 Frequency_ctrl频率控制/相位累加器模块根据输入频率控制字产生 16 位 ROM 地址控制正弦表读取速度。 sin_ROM正弦查找表 ROM使用 sin_8x65536.mif 初始化数据按地址输出 8 位正弦波幅值。 辅助生成模块包括 sin_ROM_decode、sin_ROM_mux、sin_ROM_altsyncram 等与 Quartus ROM 存储结构相关。演示视频配套演示视频展示了 DDS FSK 正弦波输出效果可用于直观查看工程运行现象和输出波形变化过程。演示视频请关注公众号后获取对应资料查看。仿真图/仿真说明/设计文档图片设计文档内容覆盖工程文件、程序文件、ROM、程序编译、RTL 图、Testbench、仿真图、整体仿真图、频率累加器模块仿真图和 DDS 模块仿真图。仿真部分可用于查看顶层 DDS 输出、频率累加器地址变化以及不同 FSK_data 控制下的输出频率切换过程。部分代码以下展示顶层模块DDS_top的部分代码完整代码可关注下方公众号卡片获取。module DDS_top( input clk_50M,//时钟频率50MHz input FSK_data,//FSK调制信号控制输出不同频率的正弦波 output [7:0] sin_wave//输出sin波形 ); //波形 ROM 地址位数 n16 wire [15:0] addra; wire [15:0] FTW;//频率控制字,值越大输出频率越大 assign FTW(FSK_data1)?16d1000:16d500;//1000对应762939Hz500对应381469Hz //对应输出频率f50M*FTW/2^16 //sin波ROM sin_ROM i_sin_ROM ( .clock(clk_50M), // input wire clka .address(addra), // input wire [15 : 0] addra .q(sin_wave) // output wire [7 : 0] douta ); //相位累加器 Frequency_ctrl i_Frequency_ctrl( . clk_50M(clk_50M), . frequency(FTW),//频率控制字,值越大输出频率越大 . addra(addra)//输出地址 ); endmodule代码获取下方公众号“FPGA代码设计学习资料”