---
title: 基于FPGA的简易示波器（逻辑分析仪）设计与实现指南
url: "https://www.fpgalearn.com/31380.html"
kind: article
id: 31380
excerpt: 本指南旨在引导你完成一个完整的、可上板验证的简易数字示波器（逻辑分析仪）FPGA项目。项目核心是利用FPGA的高速ADC接口采集模拟信号，通过触发、存储与显示控…
published_at: 2026-04-11
author: 二牛学FPGA
tags: fpga, 示波器, 逻辑分析仪
word_count: 3182
source: "https://www.fpgalearn.com"
---

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

> 标签：fpga、示波器、逻辑分析仪
> 本指南旨在引导你完成一个完整的、可上板验证的简易数字示波器（逻辑分析仪）FPGA项目。项目核心是利用FPGA的高速ADC接口采集模拟信号，通过触发、存储与显示控…

> 本指南旨在引导你完成一个完整的、可上板验证的简易数字示波器（逻辑分析仪）FPGA项目。项目核心是利用FPGA的高速ADC接口采集模拟信号，通过触发、存储与显示控…

本指南旨在引导你完成一个完整的、可上板验证的简易数字示波器（逻辑分析仪）FPGA项目。项目核心是利用FPGA的高速ADC接口采集模拟信号，通过触发、存储与显示控制逻辑，最终在VGA显示器上实时显示波形。本设计强调工程实践，从快速上手开始，逐步深入模块设计、时序约束与调试，最终实现一个功能完整、性能可测的示波器原型。
## 快速上手 (Quick Start)
遵循以下步骤，快速搭建环境并验证基础功能。
1. **环境准备**：安装Vivado 2020.1（或指定版本），准备一块带高速ADC（如AD9288）和VGA接口的FPGA开发板（如Basys3需外接ADC模块）。
1. **获取工程**：从资源库下载或根据本文档创建工程，包含顶层文件（top_oscilloscope.sv）、约束文件（oscilloscope.xdc）和测试激励。
1. **配置工程**：在Vivado中创建新工程，选择正确的器件型号（如xc7a35ticsg324-1L），添加所有源文件和约束文件。
1. **综合与实现**：运行“Generate Bitstream”，检查综合报告是否有严重警告（如未约束时钟）。
1. **连接硬件**：将开发板通过JTAG连接至PC，使用信号源为ADC输入一个1kHz、1Vpp的正弦波。
1. **下载与验证**：在Vivado Hardware Manager中编程FPGA。观察VGA显示器，应能看到稳定的正弦波形。调节板载按键（如触发模式、时基缩放），波形应相应变化。
1. **基础测量**：使用设计中的光标测量功能，在屏幕上读取波形的峰峰值电压和周期，与信号源设定值对比。
1. **触发测试**：将触发模式改为“上升沿”，调节触发电平，观察波形是否能在设定电压点稳定触发。
## 前置条件与环境
| 项目 | 推荐值/说明 | 替代方案/注意事项 |
| --- | --- | --- |
| **FPGA开发板** | 需具备至少1路高速ADC（≥20MSPS，如AD9288）和VGA输出接口。示例：Digilent Nexys Video。 | Basys3/Arty等板卡需搭配PMOD ADC模块（如Pmod AD2），性能受限。 |
| **EDA工具** | Xilinx Vivado 2020.1 | Vivado 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
