基于FPGA的简易示波器(逻辑分析仪)设计与实现指南

二牛学FPGA
文章2026-04-11
116

本指南旨在引导你完成一个完整的、可上板验证的简易数字示波器(逻辑分析仪)FPGA项目。项目核心是利用FPGA的高速ADC接口采集模拟信号,通过触发、存储与显示控制逻辑,最终在VGA显示器上实时显示波形。本设计强调工程实践,从快速上手开始,逐步深入模块设计、时序约束与调试,最终实现一个功能完整、性能可测的示波器原型。

快速上手 (Quick Start)

遵循以下步骤,快速搭建环境并验证基础功能。

  1. 环境准备:安装Vivado 2020.1(或指定版本),准备一块带高速ADC(如AD9288)和VGA接口的FPGA开发板(如Basys3需外接ADC模块)。
  2. 获取工程:从资源库下载或根据本文档创建工程,包含顶层文件(top_oscilloscope.sv)、约束文件(oscilloscope.xdc)和测试激励。
  3. 配置工程:在Vivado中创建新工程,选择正确的器件型号(如xc7a35ticsg324-1L),添加所有源文件和约束文件。
  4. 综合与实现:运行“Generate Bitstream”,检查综合报告是否有严重警告(如未约束时钟)。
  5. 连接硬件:将开发板通过JTAG连接至PC,使用信号源为ADC输入一个1kHz、1Vpp的正弦波。
  6. 下载与验证:在Vivado Hardware Manager中编程FPGA。观察VGA显示器,应能看到稳定的正弦波形。调节板载按键(如触发模式、时基缩放),波形应相应变化。
  7. 基础测量:使用设计中的光标测量功能,在屏幕上读取波形的峰峰值电压和周期,与信号源设定值对比。
  8. 触发测试:将触发模式改为“上升沿”,调节触发电平,观察波形是否能在设定电压点稳定触发。

前置条件与环境

项目推荐值/说明替代方案/注意事项
FPGA开发板需具备至少1路高速ADC(≥20MSPS,如AD9288)和VGA输出接口。示例:Digilent Nexys Video。Basys3/Arty等板卡需搭配PMOD ADC模块(如Pmod AD2),性能受限。
EDA工具Xilinx Vivado 2020.1Vivado 2018.3及以上版本均可,需注意IP核兼容性。
ADC芯片型号ADI AD9288(双通道,100MSPS,8位)若使用其他ADC(如AD9226),需修改接口时序和约束。
时钟资源板载100MHz系统时钟,用于产生ADC采样时钟(如40MHz)和VGA像素时钟(如25MHz)。需通过MMCM/PLL生成所需时钟,并做好时钟域约束。
输入信号源函数发生器/示波器校准源,输出范围在ADC量程内(通常0-1V或±0.5V)。若无信号源,可使用FPGA内部DDS IP产生测试信号,但无法验证前端模拟通路。
约束文件 (.xdc)必须包含:系统时钟、ADC数据/时钟引脚、VGA引脚、按键/拨码开关引脚。引脚分配必须与原理图完全一致,时钟约束需指定频率和不确定性。
显示设备支持640×480@60Hz的VGA显示器也可通过HDMI接口显示,但需增加HDMI编码模块。
仿真工具Vivado Simulator (XSim)可选用ModelSim/QuestaSim,需配置仿真库。

目标与验收标准

完成本项目后,你将得到一个具备以下基本功能的FPGA示波器原型,可通过以下标准进行验收:

功能验收

  • 实时采集并显示单通道模拟输入波形。
  • 支持自动、常规(上升沿/下降沿触发)、单次三种触发模式,触发电平可调。
  • 支持时基缩放(水平缩放,如1us/div ~ 10ms/div)和垂直灵敏度调节(如20mV/div ~ 1V/div)。
  • 在屏幕上显示网格、触发点标记、电压/时间光标及测量读数(峰峰值、频率)。
  • 通过按键/拨码开关进行交互控制。

性能验收

  • 最大实时采样率:达到ADC标称最大采样率的80%以上(例如,使用AD9288时,采样率≥80MSPS)。
  • 模拟带宽:≥ 10MHz(-3dB)。
  • 垂直分辨率:8位(由ADC决定)。
  • 存储深度:≥ 1024点/通道。
  • 显示刷新率:≥ 30帧/秒,确保视觉连续性。

工程验收

  • 综合后无严重时序违例(建立时间/保持时间违例)。
  • 上板后功能稳定,无显示闪烁、触发错乱等异常。
  • 资源利用率报告(LUT、FF、BRAM)在目标器件容量70%以下,留有裕量。

实施步骤

阶段一:工程结构与顶层设计

创建清晰的模块层次,顶层模块负责时钟生成、模块例化和全局复位同步。其接口设计是连接外部物理世界与内部逻辑的桥梁。

// 顶层模块接口示例 (SystemVerilog)
module top_oscilloscope (
    input  wire        sys_clk_100m, // 100MHz系统时钟
    input  wire        rst_n,        // 低电平复位按键(需同步消抖)
    // ADC接口 (以AD9288为例)
    input  wire [7:0]  adc_data,     // ADC数据总线
    input  wire        adc_otr,      // 超量程指示
    output wire        adc_clk,      // ADC采样时钟 (由FPGA产生)
    // VGA接口
    output wire [3:0]  vga_red, vga_green, vga_blue,
    output wire        vga_hsync, vga_vsync,
    // 用户控制接口
    input  wire [3:0]  btn,          // 按键:触发模式、时基+/-
    input  wire [7:0]  sw            // 拨码:触发电平、垂直灵敏度
);
    // 内部信号声明...
    // 1. 时钟管理模块例化 (MMCM)
    // 2. 复位同步逻辑
    // 3. 核心示波器模块例化
    // 4. VGA控制器模块例化
endmodule

常见问题与排查

  • 问题1:复位信号异步毛刺导致系统不稳定。

    原因与排查:按键输入的复位信号是异步的,且存在机械抖动。必须对其进行同步化和消抖处理。检查代码中是否使用了两级同步寄存器将信号同步到系统时钟域,并添加了计数器(如持续20ms高电平才有效)进行消抖。

  • 问题2:MMCM输出时钟锁不稳或无输出。

    原因与排查:MMCM的输入时钟约束不正确,或复位信号释放过早。首先检查.xdc文件中是否对输入的100MHz时钟进行了正确的周期约束(如`create_clock -period 10.000 [get_ports sys_clk_100m]`)。其次,在顶层逻辑中,应监测MMCM的Locked信号,仅当其变为高电平后,才释放对系统其他模块的复位。

阶段二:关键模块设计

1. ADC接口与采集控制模块

此模块是数据采集链的起点,负责产生ADC采样时钟,接收数据,并根据触发条件将数据写入采集存储器(通常使用双端口BRAM)。其核心是一个管理采集流程(空闲、预触发、触发后捕获、存储满)的状态机。设计关键在于精确的触发判断和与ADC时钟同步的写地址控制。

// 采集控制状态机关键片段
typedef enum logic [1:0] {IDLE, PRE_TRIG, CAPTURE, FULL} state_t;
state_t curr_state, next_state;

// 触发判断逻辑:比较当前采样值与前一拍值
logic [7:0] adc_data_dly1;
always_ff @(posedge adc_clk) adc_data_dly1

分类
技术分享
标签
fpga示波器逻辑分析仪
浏览 116
分享:

相关推荐

同频道 · 相近分类

暂无相关推荐

作者

二牛学FPGA查看主页

同分类阅读

文章

延伸阅读与实操

  • 文章 + 课程联动深度文章常对应体系课章节,可一键选课。
  • 学习产出可参考笔记与作业案例在学习产出广场持续更新。

探索全站