一、系统概述
基于FPGA(现场可编程门阵列) 实现一款多调制方式通信信号源,支持AM(调幅)、FM(调频)、ASK(幅移键控)、FSK(频移键控)、PSK(相移键控) 五种调制方式,具备频率/幅度/相位可调、调制参数动态配置、实时显示功能。系统采用DDS(直接数字频率合成)技术生成高精度基带信号,通过12位DAC输出模拟信号,结合Verilog HDL硬件描述语言实现全数字化控制,适用于通信实验教学、射频模块测试、电子设计竞赛等场景。
二、系统架构与硬件设计
1. 系统架构
时钟
DDS控制
基带信号
调制后信号
模拟输出
控制命令
参数
参数
状态显示
供电
50MHz晶振
FPGA主控 Verilog
频率/相位控制
调制参数 指数/速率
DAC接口模块 AD9708
示波器/频谱仪
按键/串口
控制模块 参数配置
显示模块 数码管/LCD
电源 5V
B,C,D,E,H,I
2. 核心硬件选型
| 模块 | 型号/参数 | 功能 |
|---|---|---|
| FPGA主控 | Altera Cyclone IV EP4CE115F29C7 | 逻辑控制、DDS生成、调制逻辑、接口驱动 |
| DAC转换器 | AD9708(12位,125MSPS) | 数字信号→模拟信号(输出0-5V) |
| 时钟源 | 50MHz有源晶振 | 系统时钟(DDS参考时钟) |
| 输入 | 4×4矩阵键盘+UART串口 | 配置频率、幅度、调制方式、参数 |
| 显示 | 4位共阳数码管+16×2 LCD | 显示当前频率、调制方式、参数 |
| 电源 | 5V/2A适配器+AMS1117-3.3V | 系统供电(FPGA/外设3.3V,DAC 5V) |
3. 关键电路设计
(1)DDS核心电路
- 相位累加器 :32位宽(高16位用于LUT寻址,低16位用于频率控制),频率分辨率 Δf=fclk2N=50MHz232≈0.0116HzΔf=\frac{fclk}{2^N}=\frac{50MHz}{2^{32}}≈0.0116HzΔf=2Nfclk=23250MHz≈0.0116Hz;
- 波形LUT:存储1024点正弦波数据(12位精度),通过相位累加器高位寻址,生成连续正弦波。
(2)调制模块电路
- AM调制:基带信号(正弦波)与调制信号(低频正弦/方波)相乘,通过乘法器实现;
- FSK调制 :根据输入数据(0/1)切换DDS的两个频率控制字(f0/f1f_0/f_1f0/f1);
- PSK调制:通过控制DDS的相位偏移(0°/180°)实现二进制相移键控。
(3)DAC接口电路
- AD9708连接:FPGA的12位数据总线(D0-D11)接DAC数据输入,时钟(CLK)接50MHz,控制信号(WR)由FPGA生成,确保数据同步。
三、软件设计(Verilog HDL实现)
1. 开发环境
- 工具:Quartus Prime 18.1(综合、布局布线)、ModelSim(仿真)、SignalTap II(在线调试)
- 语言:Verilog HDL(模块化设计,支持参数化)
- 核心算法:DDS相位累加、调制逻辑(乘法/切换/相位控制)
2. 核心模块划分
| 模块 | 功能 | 关键信号 |
|---|---|---|
dds_core |
生成基带正弦波(相位累加+波形LUT) | clk(50MHz)、freq_word(32位频率控制字)、sin_out(12位正弦波) |
modulator |
实现AM/FM/ASK/FSK/PSK调制 | mod_type(调制方式)、mod_param(调制参数)、mod_out(调制后信号) |
dac_interface |
DAC数据接口(12位并行输出+写控制) | mod_out(输入)、dac_data(12位)、dac_wr(写使能) |
control_unit |
处理用户输入(按键/串口),配置参数 | key_in(按键)、uart_rx(串口)、freq_word(输出)、mod_param(输出) |
display |
数码管/LCD显示当前状态 | freq_word、mod_type、mod_param |
top |
顶层模块,连接各子模块 | 时钟、复位、外设接口 |
3. 关键代码实现
(1)DDS核心模块(dds_core.v)
功能 :通过相位累加器与波形LUT生成高精度正弦波,频率由freq_word控制。
v
module dds_core(
input clk, // 50MHz时钟
input rst_n, // 复位(低有效)
input [31:0] freq_word, // 频率控制字(f_out = (freq_word × f_clk)/2^32)
output reg [11:0] sin_out // 12位正弦波输出(0-4095对应0-2π)
);
// 相位累加器(32位)
reg [31:0] phase_acc;
// 正弦波LUT(1024点,12位精度,存储在FPGA片内ROM)
reg [11:0] sin_lut [0:1023];
initial begin
// 初始化LUT(生成0-2π正弦波,12位量化)
for (int i=0; i<1024; i=i+1) begin
sin_lut[i] = 2047 + 2047 * $sin(2 * 3.1415926 * i / 1024); // 0-4095
end
end
// 相位累加与LUT寻址
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
phase_acc <= 32'd0;
sin_out <= 12'd0;
end else begin
phase_acc <= phase_acc + freq_word; // 相位累加
sin_out <= sin_lut[phase_acc[31:22]]; // 高10位寻址LUT(1024点)
end
end
endmodule
(2)FSK调制模块(fsk_mod.v,以FSK为例)
功能:根据输入数据(0/1)切换DDS的两个频率控制字,实现频移键控。
v
module fsk_mod(
input clk, // 50MHz时钟
input rst_n, // 复位
input [31:0] f0_word, // 数据0对应频率控制字
input [31:0] f1_word, // 数据1对应频率控制字
input [7:0] data_in, // 输入数据(0/1)
input data_valid, // 数据有效标志
output reg [11:0] mod_out // 调制后信号
);
// 实例化两个DDS(分别对应f0/f1)
wire [11:0] sin0, sin1;
dds_core u_dds0(.clk(clk), .rst_n(rst_n), .freq_word(f0_word), .sin_out(sin0));
dds_core u_dds1(.clk(clk), .rst_n(rst_n), .freq_word(f1_word), .sin_out(sin1));
// 数据切换逻辑
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
mod_out <= 12'd0;
end else if (data_valid) begin
if (data_in[0] == 1'b0) begin
mod_out <= sin0; // 数据0→f0
end else begin
mod_out <= sin1; // 数据1→f1
end
end
end
endmodule
(3)控制模块(control_unit.v,参数配置)
功能:通过按键或串口接收用户命令,更新DDS频率控制字、调制参数。
v
module control_unit(
input clk, // 50MHz时钟
input rst_n, // 复位
input [3:0] key_in, // 按键输入(频率+/−、调制方式切换、参数调整)
input uart_rx, // 串口接收
output reg [31:0] freq_word, // 输出给DDS的频率控制字
output reg [31:0] f0_word, // FSK的f0控制字
output reg [31:0] f1_word, // FSK的f1控制字
output reg [7:0] mod_type // 调制方式(0:AM,1:FM,2:ASK,3:FSK,4:PSK)
);
// 频率控制字计算:f_out = (freq_word × 50MHz)/2^32 → freq_word = (f_out × 2^32)/50MHz
// 例:f_out=1MHz → freq_word = (1e6 × 4294967296)/5e7 ≈ 85899
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
freq_word <= 32'd85899; // 默认1MHz
f0_word <= 32'd85899; // FSK默认f0=1MHz
f1_word <= 32'd171798; // FSK默认f1=2MHz(2×85899)
mod_type <= 3'd0; // 默认AM调制
end else if (key_in[0]) begin // 频率+
freq_word <= freq_word + 32'd8589; // 步进0.1MHz
end else if (key_in[1]) begin // 频率−
freq_word <= freq_word - 32'd8589;
end else if (key_in[2]) begin // 切换调制方式
mod_type <= (mod_type == 4'd4) ? 4'd0 : mod_type + 1'd1;
end
end
endmodule
参考代码 基于FPGA的通信信号源设计 www.youwenfan.com/contentcss/161148.html
四、系统测试与优化
1. 功能测试
| 测试项 | 方法 | 预期结果 |
|---|---|---|
| DDS输出频率 | 用示波器测量DAC输出,设置1MHz/2MHz | 输出频率误差<0.1% |
| FSK调制 | 输入1010数据,设置f0=1MHz、f1=2MHz | 频谱显示1MHz与2MHz交替出现 |
| AM调制 | 设置载波1MHz,调制信号10kHz,调制指数0.5 | 示波器显示调幅波,调制度50% |
| 串口控制 | 发送指令"FREQ=2M, MOD=FSK" | 系统切换至2MHz FSK模式,显示更新 |
2. 优化方向
- 杂散抑制:增加DDS的LUT点数(如4096点),采用窗函数(如汉宁窗)平滑波形,降低旁瓣;
- 调制精度:用CORDIC算法替代LUT生成正弦波,减少资源占用并提高精度;
- 多调制扩展:增加QAM(正交幅度调制)、MSK(最小频移键控)等复杂调制;
- 低功耗:空闲时关闭DDS相位累加器,降低FPGA时钟频率(如10MHz)。
五、总结
基于FPGA实现了多调制方式通信信号源,通过DDS技术生成高精度基带信号,结合Verilog HDL实现AM/FM/ASK/FSK/PSK调制,支持参数动态配置与远程控制。系统具备高频率分辨率(0.0116Hz)、低杂散、易扩展特点,可满足通信实验与测试需求。