DDS-FSK 正弦波发生器 Verilog Quartus

名称:DDS-FSK 正弦波发生器 Verilog Quartus

软件:Quartus

语言:Verilog

功能介绍

该工程实现基于 DDS 的 FSK 正弦波发生器,使用 Verilog 编写并由 Quartus 工程组织。输入 FSK_data 控制输出频率在两种状态间切换,输出 sin_wave 为 10 位正弦波采样数据,适合用于学习 DDS 相位累加、ROM 查表与 FSK 调制的基本实现流程。 工程以 50 MHz 时钟作为输入,通过 PLL 生成 200 MHz 工作时钟;相位累加器根据频率控制字产生查表地址,正弦波 ROM 输出对应采样值。顶层当前将 FSK_data 对应的频率控制字设为 14 和 6,代码注释标注其演示频率为 11 MHz 和 5 MHz。

运行环境

硬件描述语言:Verilog;开发软件:Quartus。工程包含 Quartus 项目文件、PLL 配置、正弦波 ROM 及其初始化数据文件。

设计思路

设计采用直接数字频率合成(DDS)产生正弦波,并通过频移键控(FSK)信号切换频率控制字。顶层输入为 50 MHz 时钟和 FSK_data,输出为 10 位正弦波采样数据。PLL 将输入时钟倍频至 200 MHz,为相位累加和波形查表提供工作时钟。 Frequency_ctrl 根据频率控制字累加相位,并输出 8 位 ROM 地址;sin_ROM 按地址读取正弦波采样值。FSK_data 为高电平时频率控制字取 14,低电平时取 6,因此两种状态对应不同的输出频率。设计注释给出的当前演示配置为 11 MHz 与 5 MHz,频率关系为 f=200M×FTW/2^8。

模块结构

顶层模块 DDS_top 负责连接时钟、调制控制、频率控制和正弦波输出。pll_clk 产生 200 MHz 工作时钟;Frequency_ctrl 按 FTW 更新 8 位查表地址;sin_ROM 根据地址输出 10 位正弦波数据。

演示视频

演示视频展示 DDS-FSK 正弦波输出效果,可观察调制信号切换时输出频率的变化。

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

设计文档包含工程文件、程序编译、RTL 图、Testbench 与仿真图相关内容。

DDS-FSK 正弦波发生器 Verilog Quartus 设计文档图片 image1.png

DDS-FSK 正弦波发生器 Verilog Quartus 设计文档图片 image2.png

DDS-FSK 正弦波发生器 Verilog Quartus 设计文档图片 image3.png

DDS-FSK 正弦波发生器 Verilog Quartus 设计文档图片 image4.png

DDS-FSK 正弦波发生器 Verilog Quartus 设计文档图片 image5.png

DDS-FSK 正弦波发生器 Verilog Quartus 设计文档图片 image6.png

DDS-FSK 正弦波发生器 Verilog Quartus 设计文档图片 image7.png

DDS-FSK 正弦波发生器 Verilog Quartus 设计文档图片 image8.png

DDS-FSK 正弦波发生器 Verilog Quartus 设计文档图片 image9.png

部分代码

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

module DDS_top(
    input clk_50M,//时钟频率50MHz
	 input FSK_data,//FSK调制信号,控制输出不同频率的正弦波--1Hz
    output [9:0] sin_wave//输出sin波形,有符号10位
    );
	 
wire clk_200MHz;
//波形 ROM 地址位数 n=8
wire [7:0] addra;
wire [7:0] FTW;//频率控制字,值越大,输出频率越大
//对应输出频率f=200M*FTW/2^8
//f1=11MHz ---14
//f2=9MHz  ---12
//assign FTW=(FSK_data==1)?8'd14:8'd12;//调制11MHz & 9MHz

//为便于方便观看波形频率差异,改成11MHz和5MHz
assign FTW=(FSK_data==1)?8'd14:8'd6;//调制11MHz & 5MHz

//PLL频率倍频到200MHz
pll_clk i_pll_clk (
	.inclk0(clk_50M),
	.c0(clk_200MHz)
	);

//sin波ROM
sin_ROM i_sin_ROM (
  .clock(clk_200MHz),    // input wire clka
  .address(addra),  // input wire [7 : 0] addra
  .q(sin_wave)  // output wire [9 : 0] douta
);

//相位累加器
Frequency_ctrl i_Frequency_ctrl(
. clk_in(clk_200MHz),
. frequency(FTW),//频率控制字,值越大,输出频率越大
. addra(addra)//输出地址
    );

	 
	 
endmodule

代码文件(付费下载)

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

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

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