返回首页

智慧信号显示器

基于国产安路 FPGA 的 DAC 信号发生器设计与实现

安路 FPGA Verilog DDS DAC904 VGA WiFi
智慧信号显示器
智慧信号显示器实物图 · 集示波器与信号发生器于一体

项目概述

本项目设计并实现了一款智慧信号显示器,集数字存储示波器与信号发生器于一体。系统以国产安路(Anlogic)EG4S20BG256 FPGA 为核心处理单元,通过高速 ADC(AD9248)完成信号采集与示波显示,通过高精度 DAC(DAC904)实现多种波形的信号生成,并支持语音控制与 WiFi 上位机远程操控。

我在项目中主要负责 DAC 信号发生器部分的开发,包括 DDS 波形生成、频率/幅度/相位控制、UART 语音解析、WiFi 模块驱动,以及 VGA 显示器的字符 Mif 生成等模块的设计与实现。

系统架构

系统架构

智能信号显示器模块化结构:控制模块 + 信号发生器模块 + 示波器模块

我的工作板块

一、DAC 算法设计(DDS 信号发生器)

DDS(Direct Digital Synthesis,直接数字频率合成)是信号发生器的核心技术。通过 64 位相位累加器 + 4096 点 ROM 查表,实现 1KHz~60MHz 的高精度频率输出。

Verilog - 64位相位累加器 (ROM_Addr_Add)
module ROM_Addr_Add(
    input           Clk_I,       // 180MHz DDS 时钟
    input           Rst_N_I,
    input  [63:0]   Fre_W_I,     // 频率控制字
    output [11:0]   Addr_O       // 查表地址(取高12位)
);

reg [63:0] Add;

always @(posedge Clk_I) begin
    if (!Rst_N_I)
        Add <= 64'd0;
    else
        Add <= Add + Fre_W_I;    // 每个时钟周期累加一次
end

// 取高 12 位作为 ROM 地址,对应 4096 个采样点
assign Addr_O = Add[63:52];

endmodule

三种波形生成策略

正弦波 ROM 查表 4096 点
三角波 线性计算 无需 ROM
方波 阈值判断 最简单
Verilog - 正弦波 ROM 查表 (安路 IP 核)
EG_LOGIC_BRAM #(
    .DATA_WIDTH_A(14),
    .ADDR_WIDTH_A(12),
    .DATA_DEPTH_A(4096),
    .MODE("SP"),
    .IMPLEMENT("9K"),
    .INIT_FILE("../mif/SineWaveData.mif")   // MATLAB 生成的正弦数据
) inst (
    .addra(addra),
    .doa(doa),
    .clka(clka),
    .wea(1'b0),     // 只读
    // ...
);
Verilog - 三角波线性计算
// Rom_Addr[11] = 0:上升沿(0→满幅)
// Rom_Addr[11] = 1:下降沿(满幅→0)
assign wave_Triangular = Rom_Addr[11]
    ? {11'd2047 - Rom_Addr[10:0], 3'b000}   // 下降
    : {Rom_Addr[10:0], 3'b000};              // 上升
Verilog - 方波阈值判断
assign wave_Square = Rom_Addr[11]
    ? 14'b11_1111_1111_1111   // 满幅
    : 14'b00_0000_0000_0000;  // 零

频率控制与多档位加速

频率控制模块采用多档位加速策略——频率越高步进越大,兼顾低频精细调节和高频快速切换:

频率范围 步进 调节体验
< 10KHz 1KHz 精细
10KHz ~ 100KHz 10KHz 适中
100KHz ~ 1MHz 100KHz 较快
1MHz ~ 60MHz 1MHz 快速
Verilog - 频率控制字多档位加速 (Fre_ControlWord)
module Fre_ControlWord (
    input           Clk_I,
    input           Rst_N_I,
    input           Key_Fre_I,
    input  [3:0]    voice_i,
    output [63:0]   Fre_W_O
);

reg [63:0] Fre;

// 按键消抖
Key_Delay u_Key_Delay(.Clk_I(Clk_I), .Key_I(Key_Fre_I), .Key_O(Key_Out));

// 语音控制与按键控制取或
assign Sum_Ctrl = ~(Voice_Switch ^ Key_Out);

always @(posedge Sum_Ctrl or negedge Rst_N_I) begin
    if (!Rst_N_I)
        Fre <= 64'd102481911520608;             // 默认 1KHz
    else begin
        if      (Fre < 64'd1024819115206080)     // < 10KHz
            Fre <= Fre + 64'd102481911520608;    // 步进 1KHz
        else if (Fre < 64'd10248191152060800)    // < 100KHz
            Fre <= Fre + 64'd1024819115206080;   // 步进 10KHz
        else if (Fre < 64'd102481911520608000)   // < 1MHz
            Fre <= Fre + 64'd10248191152060800;  // 步进 100KHz
        else if (Fre < 64'd6148914691236517205)  // < 60MHz
            Fre <= Fre + 64'd102481911520608000; // 步进 1MHz
        else
            Fre <= 64'd102481911520608;          // 溢出回绕
    end
end

assign Fre_W_O = Fre;
endmodule

幅度缩放与相位偏移

波形选择模块负责在三种波形间切换,并实现幅度的 10 档缩放。以 8192(14 位中值)为零点,正负半周分别缩放:

Verilog - 幅度缩放核心逻辑
// 幅度缩放:以 8192 (14位中值) 为零点,正负半周分别缩放
always @(posedge Clk_I or negedge Rst_N_I) begin
    case (Sel)
        2'd1: Dac_Data_Reg_i <= Wave_Sine_I;
        2'd2: Dac_Data_Reg_i <= wave_Triangular_I;
        2'd3: Dac_Data_Reg_i <= wave_Square_I;
    endcase

    if (Dac_Data_Reg_i > AMP_ZERO)
        Dac_Data_Reg <= (Dac_Data_Reg_i - AMP_ZERO) * Scale / 10 + AMP_ZERO;
    else
        Dac_Data_Reg <= AMP_ZERO - (AMP_ZERO - Dac_Data_Reg_i) * Scale / 10;
end

二、VGA 显示器字符 Mif 生成

负责 VGA 显示驱动中的字符字模数据生成,将 ASCII 字符转换为点阵数据存储在 Mif 文件中,用于在 VGA 显示器上显示波形参数、频率、幅度等信息。

控制接口设计

语音控制(UART 接收)

天问语音模块通过 UART 发送识别结果,FPGA 端用状态机解析串口数据,将接收到的字节映射为 4 位控制码:

Verilog - UART 语音解析控制码映射
// 控制码映射
always @(posedge clk or negedge rst_n) begin
    if (state == S_DATA)
        case (rx_data)
            8'd1: ctrl <= 4'd1;   // 增大频率
            8'd2: ctrl <= 4'd2;   // 改变波形
            8'd3: ctrl <= 4'd3;   // 增大振幅
            8'd4: ctrl <= 4'd4;   // 减小振幅
            8'd5: ctrl <= 4'd5;   // 正向相移
            8'd6: ctrl <= 4'd6;   // 负向相移
            8'd7: ctrl <= 4'd7;   // WiFi 重置
            default: ctrl <= 4'd0;
        endcase
    else
        ctrl <= 4'd0;   // 脉冲输出,非锁存
end

WiFi 远程控制

WiFi 模块上电后通过 FPGA 发送 AT 指令初始化为 TCP 服务器模式,上位机通过局域网连接后即可发送控制命令:

QT上位机无线控制
QT上位机无线控制界面

机械外壳

3D建模示意图
3D建模示意图
模块 参数 指标
DAC(信号发生器) 芯片型号 DAC904,14 位单通道
更新率 165 Msps
输出波形 正弦波、方波、三角波
频率范围 1KHz ~ 60MHz
ADC(示波器) 芯片型号 AD9248,14 位双通道
采样率 最高 50 MS/s
输入范围 ±5V (10Vpp),50Ω
交互 控制方式 按键 + 语音 + WiFi 上位机
显示 VGA 接口波形与参数显示

成果展示

机械成果
机械成果展示
电路成果
电路成果展示
QT上位机代码
QT上位机代码成果截图
参赛证明
全国大学生FPGA创新设计赛道参赛证明

落地成果

60MHz 最大输出频率
14bit DAC 分辨率
3 波形输出
10 幅度可调
语音控制 天问语音识别

开发环境

  • IDE: 安路 TangDynasty (TD) v6.2
  • FPGA: 安路 EG4S20BG256(20K LUT,国产)
  • 语言: Verilog HDL
  • IP 核: EG_PHY_PLL(时钟)、EG_LOGIC_BRAM(ROM)、FIFO(缓存)
  • DAC: TI DAC904 (14-bit, 165Msps)
  • ADC: AD9248 (14-bit, 65Msps,示波器部分)