基于FPGA的通信信号源设计

一、系统概述

基于FPGA(现场可编程门阵列) 实现一款多调制方式通信信号源,支持AM(调幅)、FM(调频)、ASK(幅移键控)、FSK(频移键控)、PSK(相移键控) 五种调制方式,具备频率/幅度/相位可调、调制参数动态配置、实时显示功能。系统采用DDS(直接数字频率合成)技术生成高精度基带信号,通过12位DAC输出模拟信号,结合Verilog HDL硬件描述语言实现全数字化控制,适用于通信实验教学、射频模块测试、电子设计竞赛等场景。

二、系统架构与硬件设计

1. 系统架构

graph TD A[50MHz晶振] -->|时钟| B[FPGA主控 Verilog] B -->|DDS控制| C[DDS模块 相位累加器+LUT] C -->|基带信号| D[调制模块 AM/FM/ASK/FSK/PSK] D -->|调制后信号| E[DAC接口模块 AD9708] E -->|模拟输出| F[示波器/频谱仪] G[按键/串口] -->|控制命令| H[控制模块 参数配置] H -->|参数| C[频率/相位控制] H -->|参数| D[调制参数 指数/速率] I[显示模块 数码管/LCD] -->|状态显示| H J[电源 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=\frac{fclk}{2^N}=\frac{50MHz}{2^{32}}≈0.0116Hz\)
  • 波形LUT:存储1024点正弦波数据(12位精度),通过相位累加器高位寻址,生成连续正弦波。

(2)调制模块电路

  • AM调制:基带信号(正弦波)与调制信号(低频正弦/方波)相乘,通过乘法器实现;
  • FSK调制:根据输入数据(0/1)切换DDS的两个频率控制字(\(f_0/f_1\));
  • 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_wordmod_typemod_param
top 顶层模块,连接各子模块 时钟、复位、外设接口

3. 关键代码实现

(1)DDS核心模块(dds_core.v

功能:通过相位累加器与波形LUT生成高精度正弦波,频率由freq_word控制。

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的两个频率控制字,实现频移键控。

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频率控制字、调制参数。

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/contentcns/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)、低杂散、易扩展特点,可满足通信实验与测试需求。

posted @ 2026-03-31 16:49  anpijj  阅读(10)  评论(0)    收藏  举报