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



