跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Python算法

基于 FPGA 的 TDC 抖动测试系统设计与实现

一个基于 Artix-7 FPGA 的时间数字转换器抖动测试系统。系统通过 SPI 接口控制 AS6501 芯片,利用 Block RAM 存储 10000 次测量数据,并通过 UART 批量传输至上位机。核心功能包括自动测试序列、中断驱动采集、以及 Python 数据分析工具。硬件采用 XC7A35T,运行 50MHz 时钟,重点解决了 SPI 时序匹配、BRAM 资源分配及多模块协同问题。最终生成的报告包含时钟周期与 TIE 分析图表,为 TDC 性能评估提供了完整的软硬件解决方案。

道系青年发布于 2026/4/8更新于 2026/10/2589 浏览

项目概述

本项目构建了一套完整的 FPGA 系统,通过 SPI 接口实现对 AS6501 TDC 芯片的控制与数据读取。系统集成了 SPI 主控、控制逻辑、测试序列器、Block RAM 存储、UART 批量传输模块以及 Python 数据分析工具,支持从硬件配置到上位机分析的完整闭环流程。

核心流程为:上电初始化→寄存器配置与回读验证→启动测量→中断驱动连续采集(默认 10000 次)→结果暂存 Block RAM→按键触发 UART 批量上传→Python 解析并计算 Jitter。

核心特性

  • 批量测量模式:连续采集 MAX_MEASUREMENTS 次(默认 10000)后自动停止,无需人工干预。
  • Block RAM 存储:采用 Vivado Block RAM 推断,存储 48 位×10000 条测量数据,资源占用约 15-20 个 BRAM。
  • UART 批量传输:由 BTN[1] 按键触发,波特率 115200,数据包格式固定为 8 字节。
  • 电平触发中断:适配 AS6501 中断始终为低电平的模式,简化了中断处理逻辑。
  • Python Jitter 分析:上位机脚本解析 UART 数据,计算时钟周期与 TIE,生成包含 6 个子图的详细分析报告。

硬件平台

  • FPGA 芯片:XC7A35T-2FGG484I (Artix-7 系列)
  • 时钟频率:50MHz (引脚 Y18)
  • 接口定义:
    • SPI 接口 (12.5MHz)
      • SCLK: E16, MOSI: D14, MISO: E13, CS: F13
    • AS6501 信号
      • INT_N: C13 (低电平有效)
      • REFCLK: A13 (输出 10MHz)
    • UART 接口 (115200 baud, 8N1)
      • TX: G16, RX: G15
    • IO 外设
      • 4 个 LED: F19, E21, D20, C20 (共阳极,低电平点亮)
      • 4 个按键:M13, K14, K13, L13 (低电平有效)
      • 复位按键:F20 (低电平有效)
  • IO 电压:3.3V

SPI 通信参数

  • 频率:12.5MHz
  • 模式:CPOL=0, CPHA=1 (Mode 1)
  • 传输顺序:MSB 先行
  • 时序要求:CS 拉高前需预留半个 SCLK 周期时间
  • 协议格式:
    • 单字节命令:0x30 (Power ON), 0x18 (Init)
    • 写配置寄存器:[0x80 + 地址][数据]
    • 读结果寄存器:[0x60 + 地址] ← [数据]
    • 读配置寄存器:[0x40 + 地址] ← [数据]

项目结构

fpga_a7_tdc_jitter_test_solution/
├── rtl/                
│   ├── top_module.v    
│   ├── spi_master.v    
│   ├── spi_controller.v
│   ├── test_sequencer.v
│   ├── result_ram.v    
│   ├── uart_result_sender.v 
│   ├── uart_tx.v       
│   ├── uart_rx.v       
│   └── clk_divider.v   
├── sim/                
│   ├── as6501_model.v  
│   ├── tb_top_module.v 
│   └── tb_top_module.gtkw
├── constraints/        
│   └── fpga_constraints.xdc
├── scripts/            
├── plans/              
├── guides/             
├── parse_tdc_data.py   
└── README.md           
# RTL 设计文件
# 顶层模块
# SPI 主控
# SPI 控制器
# 测试序列器
# 双端口 Block RAM
# UART 发送
# UART 发送模块
# UART 接收模块
# 时钟分频器
# 仿真文件
# AS6501 行为模型
# 测试平台
# 约束文件
# 自动化脚本
# 设计规划
# 指南文档
# Python 分析工具
# 说明文档

系统架构

信号流向

控制流遵循:按键触发 → Test Sequencer → SPI Controller → SPI Master → AS6501 芯片 ← 状态反馈 ← 数据返回。

主要接口

接口信号方向说明
Test ↔ Controllerreq, rw, addr, wdata→请求控制信号
rdata, ready, valid←响应数据和状态
Controller ↔ Masterstart, rw, addr, din→SPI 事务启动
dout, busy, done←SPI 事务状态
Master ↔ AS6501SCLK, MOSI, CS→SPI 主控信号
MISO←SPI 从机数据
AS6501 → FPGAINT_N←中断信号
Test → RAMwr_en, wr_addr, wr_data→写入结果
UART Sender → TXtx_data, tx_data_valid→发送数据

模块说明

1. spi_master.v

SPI 主控模块,负责生成 12.5MHz SPI 时钟,支持 CMD_ONLY、CMD_WRITE、CMD_READ_RESULT、CMD_READ_CONFIG 四种命令类型,自动处理字节传输及忙碌状态标志。

2. spi_controller.v

封装 SPI 主控,提供简化的请求/应答接口,屏蔽底层时序细节。

3. test_sequencer.v

核心控制逻辑,包含 16 个状态。执行 Power ON、批量写配置(0-16 号寄存器)、读回验证、Init 启动、等待中断、读取结果寄存器(8-13 号)、组合 24 位数据、计数检查等流程。支持参数化 MAX_MEASUREMENTS 配置。

4. result_ram.v

双端口 Block RAM,深度 10000,宽度 48 位 {index_result[23:0], stop_result[23:0]}。使用 (* ram_style = "block" *) 属性强制推断,确保时序性能。

5. uart_result_sender.v

批量传输模块。BTN[1] 按下且测量完成后触发。将 RAM 数据按 8 字节打包(帧头 0xAA + 6 字节数据 + 帧尾 0x55),通过 UART 发送。

6. uart_tx.v / uart_rx.v

ALINX UART 收发模块,115200 baud,8N1 格式,支持握手信号。

7. top_module.v

顶层集成模块。包含 3 级中断同步器防止亚稳态,BTN[1] 下降沿检测逻辑,RAM 读写使能及 UART 发送触发条件。

8. clk_divider.v

50MHz 分频至 50kHz,用于 TDC_STOPA 信号生成。

9. as6501_model.v (仿真)

AS6501 行为模型,支持两种中断模式(正常模式与始终低电平模式),结果数据自动递增以模拟真实测量变化。

状态机设计

Test Sequencer 状态机

测试序列控制状态机负责执行完整的 AS6501 测试流程,包含以下关键状态:

  • IDLE (0):空闲,等待按键触发
  • POWER_CMD (1):发送 Power ON 命令 (0x30)
  • WRITE_CFG (3):写配置寄存器 (0-16)
  • READ_CFG (5):读配置寄存器 (0-16) 并验证
  • INIT_CMD (8):发送 Init 命令 (0x18)
  • WAIT_INT (10):等待中断信号 (低电平有效)
  • READ_RESULT (11):读取结果寄存器 8-13
  • COMBINE_RESULT (13):组合 24 位结果并写入 RAM
  • DONE (14):检查计数,未达上限则继续
  • STOPPED (15):测量完成,等待 UART 传输

各状态间依据时序与中断信号流转,确保测量流程闭环。例如,在 WAIT_INT 状态下检测到 INT_N 拉低即跳转至 READ_RESULT,而在 DONE 状态若计数未满则循环回 INIT_CMD 或 WAIT_INT,直至达到预设次数进入 STOPPED 状态等待用户操作。

总结

本系统通过 FPGA 实现了高精度的 TDC 数据采集与传输,结合 Python 后端分析,能够高效评估时钟抖动性能。设计注重资源优化与稳定性,适用于实验室环境下的 TDC 芯片特性验证。

目录

  1. 项目概述
  2. 核心特性
  3. 硬件平台
  4. SPI 通信参数
  5. 项目结构
  6. 系统架构
  7. 信号流向
  8. 主要接口
  9. 模块说明
  10. 1. spi_master.v
  11. 2. spi_controller.v
  12. 3. test_sequencer.v
  13. 4. result_ram.v
  14. 5. uartresultsender.v
  15. 6. uarttx.v / uartrx.v
  16. 7. top_module.v
  17. 8. clk_divider.v
  18. 9. as6501_model.v (仿真)
  19. 状态机设计
  20. Test Sequencer 状态机
  21. 总结

更多推荐文章

查看全部
  • 软件架构师的角色定义与核心职责
  • C++11/14/17 特性整理与 Effective Modern C++ 条款实践(一)
  • C++微服务 UserServer 设计与实现
  • Go 语言实现线性同余发生器(LCG)算法
  • 在 VS Code 中接入 DeepSeek
  • 周鸿祎:大模型时代的机会在企业级市场
  • SheetJS JavaScript 电子表格数据处理与转换方案
  • Linux 系统学习:深入剖析 Git 原理与进阶使用
  • 从数学概率到神经网络:双色球预测的算法演进史
  • 自然语言处理在客户服务领域的应用与实战
  • 企业微信外部群机器人主动推送消息实现指南
  • 物联网数据采集与可视化:使用 Python 和 MQTT 构建实时监控系统
  • Python venv 虚拟环境工具使用指南及 uv 升级教程
  • 12306 反爬虫策略:Python 网络请求优化实战
  • 移植 3D 封面画廊到 Android TV
  • GitHub Copilot 兼容 OpenAI/Anthropic API 代理服务详解
  • Seedance 2.0.3 新增 Serverless 适配器:飞书机器人低成本集成方案
  • 卷积神经网络(CNN)进阶:经典架构解析与实战开发
  • Tracecat 开源 SOAR 平台核心优势与实战指南
  • Obsidian+Claude Code打造本地AI知识库

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online