BPSK 调制 DDS 信号发生器 Verilog Quartus
名称:BPSK 调制 DDS 信号发生器 Verilog Quartus
软件:Quartus
语言:Verilog
开发板/平台:Cyclone IV FPGA开发板
功能介绍
本设计实现了一个面向 FPGA 的 BPSK 调制 DDS 信号发生器。系统以 50MHz 时钟为工作时钟,通过频率控制字驱动相位/地址累加逻辑,从 ROM 中读取正弦波与余弦波采样数据,并根据输入数字比特流在两路载波相位之间切换,从而形成 BPSK 调制后的波形数据。 输入端提供 8bit 调制数据接口,设计中将并行输入数据转换为串行调制信号,用该串行数据选择正弦 ROM 或余弦 ROM 输出。频率控制按键经过消抖处理后参与频率档位控制,便于在硬件调试时调整输出波形频率。 输出端面向 TLV5618 DAC,顶层给出 DAC_CS_N、DAC_DIN、DAC_SCLK 三个串行控制信号,可将调制后的数字波形送往外部 DAC 进行模拟波形输出。整体适合用于 DDS 原理、BPSK 数字调制、FPGA 与 DAC 接口控制等课程设计或实验项目。运行环境
开发语言:Verilog 开发软件:Quartus 目标平台:Cyclone IV FPGA 开发板 顶层模块:DDS_top 主要外设接口:TLV5618 DAC 串行接口设计思路
系统采用 DDS 查表法生成载波波形。频率控制模块根据频率控制字产生 ROM 地址,地址值按时钟节拍累加,地址变化速度决定波形读取速度,因此频率控制字越大,输出波形频率越高。正弦波 ROM 按地址输出 8bit 波形采样值,余弦波通过地址偏移方式实现,与正弦载波形成相位差。 BPSK 调制部分以数字比特流作为相位选择信号。当串行数据为一种逻辑状态时输出正弦采样值,另一种逻辑状态时输出余弦采样值,由此实现基于相位切换的二进制相移键控调制。输入的 8bit 数据通过 data_read 模块按一定节奏串行输出,便于观察调制数据对载波相位的影响。 按键输入先经过 key_jitter 模块消抖,避免机械按键抖动导致频率控制误触发。调制后的 wave 数据送入 DAC_test 模块,由该模块完成 TLV5618 所需的片选、串行数据和串行时钟控制,使 FPGA 内部生成的调制波形能够通过 DAC 输出到外部电路。模块结构
顶层模块 DDS_top 负责连接各功能模块,主要包括: key_jitter:频率控制按键消抖,输出稳定的按键下降沿信号。 fre_sel:根据消抖后的按键信号切换频率控制字。 Frequency_ctrl:根据 50MHz 时钟、复位信号和频率控制字生成 ROM 读取地址。 ROM64:用于输出正弦波采样数据,同时通过地址偏移读取余弦波采样数据。 data_read:将 8bit 输入调制数据转换为串行数据流。 DAC_test:将调制后的波形数据转换为 TLV5618 DAC 所需的串行控制时序。 工程中还包含 sin_ROM、fangbo_ROM、sanjiao_ROM 等 ROM 相关模块和 MIF 波形数据文件,可作为不同波形查表实现的参考。开发板验证
工程包含 Cyclone IV FPGA 开发板相关的 Quartus 工程文件与管脚约束文件,顶层信号已按照开发板与 TLV5618 DAC 接口进行约束分配。输出文件中包含已生成的 SOF 配置文件,可用于在对应 Cyclone IV FPGA 开发板环境下进行下载验证。部分代码
以下展示顶层模块 DDS_top 的部分代码,完整源码请下载压缩包查看。
module DDS_top(
input clk_50M,
input rst_n,//复位
input freq_key_in,//frequency控制按键
input [7:0] data_in,//调制信号,8bit
output DAC_CS_N, //TLV5618的CS_N接口
output DAC_DIN, //TLV5618的DIN接口
output DAC_SCLK //TLV5618的SCLK接口
);
wire [5:0] addra;
wire [5:0] addra_cos;
assign addra_cos=addra+32;
//wire [7:0] douta_fangbo;
wire [7:0] douta_sin;
wire [7:0] douta_cos;
wire [7:0] frequency;//频率控制字,控制输出波形频率,值越大,频率越大
wire [15:0] wave;//BPSK调制后波形
wire freq_key;
wire data_o;
//按键消抖
key_jitter i_key_jitter(
. clkin(clk_50M),
. key_in(freq_key_in),//输入
. key_negedge(freq_key)//消抖后按键下降沿
);
//频率控制
fre_sel i_fre_sel(
. clk(clk_50M),
. key(freq_key),
. frequency(frequency)///频率控制字,控制输出波形频率,值越大,频率越大
);
////方波ROM
//fangbo_ROM i_fangbo_ROM (
// .clock(clk_50M), // input wire clka
// .address(addra), // input wire [9 : 0] addra
// .q(douta_fangbo) // output wire [7 : 0] douta
// );
//sin波ROM
ROM64 i_sin_ROM (
.clock(clk_50M), // input wire clka
.address(addra), // input wire [9 : 0] addra
.q(douta_sin) // output wire [7 : 0] douta
);
//
//ROM64 ROM64_inst (
// .address ( address_sig ),
// .clock ( clock_sig ),
// .q ( q_sig )
// );
ROM64 i_cos_ROM (
.clock(clk_50M), // input wire clka
.address(addra_cos), // input wire [9 : 0] addra
.q(douta_cos) // output wire [7 : 0] douta
);
//频率累加器
Frequency_ctrl i_Frequency_ctrl(
. clk_50M(clk_50M),
. rst_n(rst_n),
. frequency(frequency),//频率控制字
. addra(addra)//输出地址
);
//调试信号输出
//输入的数字比特流通过外面的8个开关循环8bit,按不低于10K的速率串行发这个数据.
data_read i_data_read(
. clk_50M(clk_50M),
. rst_n(rst_n),//复位
. data_in(data_in),//调制信号,8bit
. data_o(data_o)//串行输出信号
);
assign wave=data_o?douta_sin:douta_cos;
DAC_test i_DAC_test(
.Clk(clk_50M), //模块时钟50M
.Rst_n(key1_in), //模块复位
.DAC_DATA(wave),
.DAC_CS_N(DAC_CS_N), //TLV5618的CS_N接口
.DAC_DIN(DAC_DIN), //TLV5618的DIN接口
.DAC_SCLK(DAC_SCLK) //TLV5618的SCLK接口
);
endmodule
代码文件(付费下载)
📥
付费后此处显示完整工程压缩包下载链接。
1、代码文件需要付费后才可见。
2、支付问题请联系微信公众号客服。
3、优质Verilog/VHDL代码资源,所见即所得。
Verilog/VHDL资源下载 » BPSK 调制 DDS 信号发生器 Verilog Quartus
2、支付问题请联系微信公众号客服。
3、优质Verilog/VHDL代码资源,所见即所得。
Verilog/VHDL资源下载 » BPSK 调制 DDS 信号发生器 Verilog Quartus