FPGA 进阶 40:接口协议调试案例——典型故障与定位路径
本文是
fpga/进阶层第 44 篇。调试方法论见调试方法论和 ILA/VIO 调试;这篇是接口专题案例集,每个案例给"看什么信号、正常值是什么、不符合往哪查"。
通用定位方法

纪律:别猜,抓实际波形对照规范逐字段对;先写最小回环/最小帧让链路自证;观测点就放在接口边界(ILA 抓 valid/ready/data)。
二、案例集
案例 1:AXI 总线死锁(主机一直等)
| 现象 | 查点 |
|---|---|
| awvalid 高、无进展 | W 通道没发(wvalid/wlast 漏);AW 和 W 必须都发才成交 |
| 写后等不到 bresp | bready 没拉高,从机发不出 bvalid,outstanding 占满全卡死 |
| 读无数据 | rready 漏接;ar 通道没发全(arlen/arsize 缺省错) |
| 偶发卡死 | 复位不完整(aresetn 时序)、aclk 接错域、Lite/Full 混接 |
ILA 同时抓五通道 valid/ready,找"valid 高但 ready 永不回"的那对,顺接收方查。
案例 2:UART 乱码/无输出
- 时钟实际频率 ≠ 代码假设(MMCM 配错整体偏差);
- 波特率分频误差:分频=clk/baud,误差**<2%**;
- TX/RX 接反、电平(TTL vs RS232、3.3V vs 1.8V)、共地;
- 数据位/停止位/校验位不一致。 → 先 FPGA 自发自收回环自证 FPGA 侧,再查线和对端。
案例 3:SPI/I2C 读不回数据
- SPI:CPOL/CPHA 模式与从设备不符(采样边沿错)、片选极性/保持时间、位序 MSB/LSB;
- I2C:地址(7 位地址与读写位别搞混,如 0x50 vs 0xA0)、SCL/SDA 上拉缺失、时钟拉伸;
- 共因:上电后没等从设备就绪、读时序比写多一拍。
案例 4:DDR MIG 校准不过
init_calib_complete不拉高:查 sys_clk/ref_clk 频率与 IP 配置一致(常 200M)、复位;- IP 器件参数(类型/容量/位宽)与实际芯片严格一致;
- MIG 生成的 XDC 整体采用,别手改字节组/Vref;
- 读 mmcm_locked 和校准状态码定位阶段;
- 校准过后:app_cmd 地址按 IP 行列映射、app_rdy 握手。
案例 5:LVDS/源同步全错或偶发误码
- 全错:bitslip 字对齐没滑到字边界、IDELAYCTRL 参考钟(200M)缺失/未约束导致 delay 无效、随路钟 BUFIO/BUFR 接法;
- 偶发:采样点在窗口边缘——扫 IDELAY 做眼图扫描取窗口中心并留裕量;差分端接/等长(SI 篇);接收后用异步 FIFO 进系统域。
案例 6:RGMII 千兆不通
- TX/RX 延迟模式(IDELAY/内部延迟)需与 PHY 配置匹配;
- RGMII 时钟与数据相位(内部/外部 90°);
- PHY 需经 MDIO 配置(速率/双工/自协商),复位时序;
- 千兆网 MAC 源 MAC/IP、帧格式(以太网篇)。
三、调试工具箱对照
| 手段 | 用途 |
|---|---|
| ILA 抓接口信号 | valid/ready/数据/状态,见 ILA 篇 |
| 回环(TX→RX) | 隔离 FPGA 与对端 |
| 最小帧/寄存器读写 | 让链路最小自证 |
| VIO 手动驱动 | 控制复位/启动/参数 |
| 状态寄存器读出 | IP 内部状态/错误计数(MIG/以太网/PCIe 都有) |
| 协议规范 checklist | 逐字段对照,不靠记忆 |
常见坑对照
| 坑 | 正确做法 |
|---|---|
| 不改代码直接猜原因 | 抓波形、分层二分 |
| AXI 漏接 ready | 五通道全接、ILA 看握手 |
| 波特率拍脑袋 | 算误差 <2%,回环先验证 |
| MIG 管脚手改 | 整体采用生成 XDC |
| bitslip/delay 不做训练 | 眼图扫描定窗口中心 |
| PHY 不配置就发包 | MDIO 初始化+查链路状态 |
相关与延伸
方法:调试方法论、ILA/VIO;各接口专篇:AXI4、UART/SPI/I2C、DDR、LVDS、RGMII。 系统级清单:bring-up 清单。
一句话总结
接口调试按四层走:物理层(时钟/电平/管脚)→链路层(bit 流/校准完成)→协议层(valid/ready 握手)→数据层(内容/边界),每层用回环和最小帧自证、ILA 抓实际波形对照规范逐字段核对。高频坑:AXI 死锁九成是"某通道 valid 高而 ready 永不回"(漏接 rready/bready、AW 发了 W 没发);UART 乱码先查时钟和波特率误差(<2%)再查线序电平,回环自测隔离;SPI/I2C 查 CPOL/CPHA、地址含 R/W 位、上拉;MIG 校准不过查参考钟频率、IP 与实际器件一致、生成 XDC 别手改、看 init_calib_complete 和状态码;LVDS 全错查 bitslip/IDELAYCTRL,偶发误码查采样窗口(眼图扫描取中心);RGMII 查延迟模式和 MDIO 配置。核心心法:别猜,让链路自己说话。