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

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

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