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

FPGA 调试:PCIe XDMA 无法 Link Up 的 LTSSM 定位与解决

记录了 FPGA 开发中 PCIe XDMA 驱动无法扫描到设备的问题。通过检查时钟、复位、Lane 约束及降速测试,最终利用 LTSSM 状态机监控定位故障。发现物理层就绪但 Lane 顺序检测卡住,排查硬件电路发现主机 TX 端缺少电容导致 AC 耦合失效。更换为电容后链路恢复正常。

DevStack发布于 2026/4/6更新于 2026/9/990 浏览
FPGA 调试:PCIe XDMA 无法 Link Up 的 LTSSM 定位与解决

问题现象

与驱动联调:驱动无法扫描到 Xilinx 的 PCIe 设备

通过 ila 抓取 pcie_link_up 信号:发现 link up 一直为低

问题分析

出现这种情况,在 FPGA 中搭建测试环境,使用 XDMA+BRAM 的形式,减少其它模块的影响,框架如下:

文章配图

1 检查 PCIe 的时钟

时钟,必须使用原理图上的 GT Ref 差分时钟,通过 IBUFDSGTE 转为单端时钟

文章配图

文章配图

文章配图

2 检查 PCIe 复位

复位:PCIe 复位信号有要求--上电后,PCIE_RESTN 信号需在电源稳定后延迟一段时间再释放,通常是 100ms 以上

而这 100ms 的时间,系统主要做以下的事情:

  • 电源稳定时间
  • 参考时钟稳定时间
  • PCIe IP 核的复位和初始化时间
  • 链路训练时间

// 典型的 100ms 时间分配: 0-10ms : 电源稳定 (Power Stable) 10-20ms : 参考时钟稳定 (Refclk Stable) 20-30ms : 复位释放和 PLL 锁定 (Reset Release & PLL Lock) 30-50ms : 物理层初始化 (PHY Initialization) 50-70ms : 链路训练 (Link Training) 70-100ms : 设备配置 (Device Configuration)

为了避免这个问题,建议在程序中添加这么一段复位控制,但是有的时候你不添加也没有关系,因为有的时候硬件的复位时序可以满足这个 100ms 的要求,但是保险起见还是加上

文章配图

3 LANE 检查

检查你的 LANE 约束,一般 XDMA IP 核生成的时候会自带一个约束文件,约束每个 LANE 的对外接口,但我们也可以自己约束,保证端口与原理图匹配即可。

文章配图

文章配图

这些确认无误,还是无法 link up 的,先将 PCIe 降速为 1.0 X1,看看情况

4 PCIe 降速

文章配图

如果还是不行,那我们需要检测 pcie 的相关的几个状态。

5 具体问题定位(PCIe LTSSM 状态)

这里我们需要查看 PCIe 的 LTSSM 状态机,那什么是 LTSSM 状态机呢?

是一种常用于 PCI Express(PCIe)接口的状态机,它可以控制 PCIe 总线的传输流程。LTSSM 由多个状态组成,每个状态都代表了不同的总线传输阶段。

一般大家会找不到,按照如下的方式

5.1 给 LTSSM 信号添加 debug

首先:勾选配置界面的 Use Class Code Lookup Assistant 这个选项

文章配图

此时还是无法在端口显示出 LTSSM 信号,不要着急,按照你的流程生成 IP 核,执行完 Run Syn 操作,然后点击 Set up debug

文章配图

在这里搜索 LTSSM 的小写,就能找到 ltssm_state 的信号,将其添加到 debug 里面正常的综合实现就可以了。

文章配图

5.2 LTSSM 状态说明

LTSSM 状态机根据厂商不同会有微小的差异,我们使用的是瑞芯微的,我的状态卡在了 08 即 Lane 顺序检测。意味着是 lane 的问题。

文章配图

那我们通过这个方式监控的除了 LTSSM 信号以外,还有几个关键信号

5.3 其余关键信号说明

phy_rdy_n:物理层就绪,一种存在性检查,0:表示物理层就绪 1:表示异常

时钟是否存在? 复位序列是否正常? PLL 是否正常锁定? 电源是否 power good

cfg_cuurent_speed_o:协商的速率,PCIE1.0/2.0/3.0 分别对应 1/2/3

link_width:协商的宽度

6 故障点说明及解决

我的故障就是:

phy_rdy_n 为 0,说明物理层就绪,时钟和复位是正常的

LTSSM 卡在了 0x08,且 Link_width 为 0,说明是 LANE 的异常导致的。

文章配图

重新检查电路,发现主机的 TX 端,没有放置电容,而使用的是电阻,导致的 AC 耦合问题,将电阻更换为电容,链路问题解决

文章配图

可以看到 Link up 拉起,驱动可以正常检测到 PCIe 设备。

目录

  1. 问题现象
  2. 问题分析
  3. 1 检查 PCIe 的时钟
  4. 2 检查 PCIe 复位
  5. 3 LANE 检查
  6. 4 PCIe 降速
  7. 5 具体问题定位(PCIe LTSSM 状态)
  8. 5.1 给 LTSSM 信号添加 debug
  9. 5.2 LTSSM 状态说明
  10. 5.3 其余关键信号说明
  11. 6 故障点说明及解决

更多推荐文章

查看全部
  • ZeroClaw 本地 AI 管理面板:Gateway + LM Studio + Reflex
  • 利用 AI 快速开发 Microsoft Visual C++ 应用
  • Stable Diffusion WebUI 核心功能与参数调优指南
  • Flutter 三方库 dart_mcp 实现鸿蒙端 AI Agent 通信协议
  • 手机端运行 Stable Diffusion 的开源方案与使用指南
  • QClaw 本地化 AI 个人助手平台完全指南
  • 基于 LangChain 搭建本地知识库系统
  • Linux 入门:系统概览与常用目录命令详解
  • Stable Diffusion InstantID 实现 AI 写真生成
  • DeerFlow 2.0 开源:基于 LangGraph 的超级智能体编排框架
  • 开源无审查大型语言模型技术概览
  • Vue 3 前端调试与开发指南
  • Apache 2.2 部署 ASP.NET 3.5 实战配置指南
  • 本地运行 LLM 的 AI 助手 Jan 部署与使用指南
  • AI 绘画参数调优指南:DeepFloyd IF 模型实战
  • Stable Diffusion WebUI 使用指南与核心功能解析
  • 飞书 OpenClaw 机器人 HTTP 401 认证失败排查指南
  • Python 斐波那契数列 5 种实现方法与性能分析
  • MCP 与 Skill 驱动的前端 JS 逆向自动化实践
  • LeetCode 88:合并两个有序数组(C 语言双指针详解)

相关免费在线工具

  • Base64 字符串编码/解码

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

  • Base64 文件转换器

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

  • Markdown转HTML

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

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • JSON美化和格式化

    将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online