智慧信号显示器
基于国产安路 FPGA 的 DAC 信号发生器设计与实现
项目概述
本项目设计并实现了一款智慧信号显示器,集数字存储示波器与信号发生器于一体。系统以国产安路(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 服务器模式,上位机通过局域网连接后即可发送控制命令:
机械外壳
| 模块 | 参数 | 指标 |
|---|---|---|
| DAC(信号发生器) | 芯片型号 | DAC904,14 位单通道 |
| 更新率 | 165 Msps | |
| 输出波形 | 正弦波、方波、三角波 | |
| 频率范围 | 1KHz ~ 60MHz | |
| ADC(示波器) | 芯片型号 | AD9248,14 位双通道 |
| 采样率 | 最高 50 MS/s | |
| 输入范围 | ±5V (10Vpp),50Ω | |
| 交互 | 控制方式 | 按键 + 语音 + WiFi 上位机 |
| 显示 | VGA 接口波形与参数显示 |
成果展示
落地成果
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,示波器部分)