1. JESD204B协议概述与链路训练基础
JESD204B,说白了,就是一套告诉你的ADC或DAC怎么跟FPGA或者SoC“说话”的规矩。它的核心目标只有一个:用更少的物理走线,传更高速率的数据。
你想想看,传统的并行LVDS接口,数据位宽一大(比如16位),走线数量就惊人。不仅PCB Layout头疼,信号完整性问题也一堆。JESD204B厉害在哪?串行化。它把并行数据打包,通过高速串行通道(SerDes)来传输。一根线就能搞定过去十几根线的活。我在一个16通道、14位ADC的项目里,就是用JESD204B接口,只用了8对差分线就解决了,要是用并行LVDS,板子估计要再大一圈。
1.1 JESD204B的核心思想:从并行到串行
理解了这个核心思想,我们来看它的基本结构。一个典型的JESD204B链路包含发送端(TX,通常是ADC/DAC)和接收端(RX,通常是FPGA)。它们之间通过高速串行通道连接。
这里有几个关键概念你必须得搞明白:
- Lane(通道):一条物理的高速串行链路。你可以把它想象成一条高速公路。
- Frame(帧):数据传输的基本单元。一个帧包含多个字节。
- Multiframe(多帧):由多个帧组成。这是JESD204B协议中一个非常重要的同步单位。
- Device Clock(设备时钟):整个系统的基准时钟,所有时序都基于它。
- SYSREF(系统参考信号):一个用于确定系统帧和多帧边界的确定性延迟信号。这是JESD204B相比之前版本最大的亮点。
JESD204B的复杂性在于,发送端和接收端必须在时间上达成精确一致。如何做到?这就需要我们今天的主角——链路训练。
1.2 链路训练:一次完整的“握手”
链路训练,官方术语叫Link Establishment。它不是一个瞬间的动作,而是一个分阶段的过程。一次成功的训练,是后续所有数据正确传输的前提。
一次失败的训练,可能的原因太多了。我曾经遇到过一个案子,板子回来后,JESD204B链路死活连不上。我花了整整三天,从代码查到时钟,从时钟查到电源,最后发现是SYSREF信号的走线阻抗不对,导致信号反射,破坏了确定性延迟。所以,理解链路训练的每个阶段,是排查问题的基本功。
整个过程分为三个主要阶段:
阶段一:代码组同步(CGS,Code Group Synchronization)
这是最开始的一步。发送端会持续发送一个特殊的同步字符——/K28.5/。接收端则在自己的时钟域里寻找这个字符。一旦找到,它就知道链路的电气连接是OK的,并且能识别出基本的码型了。
- 发送端做什么? 不断发送/K28.5/。
- 接收端做什么? 搜索/K28.5/。一旦连续确认到4个(不同规范可能要求数量不同,但4个是常见的)正确的/K28.5/字符,就拉高SYNC~信号(或者通过其他方式告知发送端),表示CGS完成。
- 常见失败点: 接收端永远找不到/K28.5/。这通常意味着物理层有问题,比如速率不对、时钟没锁住、SerDes的PLL没锁定。
阶段二:初始通道对齐序列(ILA,Initial Lane Alignment Sequence)
CGS成功后,发送端就不再发送无聊的/K28.5/了,而是开始发送一个带有丰富信息的序列——ILA。这个序列包含了链路配置参数,比如每个帧的字节数、每条通道的帧数、使用的校验模式等等。接收端通过解析ILA,可以知道发送端是怎么配置的,并据此调整自己的接收逻辑。
- 发送端做什么? 发送ILA序列。ILA由4个多帧组成,每个多帧的起始是特定的字符,比如/R/(多帧起始)和/A/(通道对齐字符)。
- 接收端做什么? 接收并解析ILA。它会提取出所有配置参数,并与自身期望的配置进行比较。同时,它也会利用/A/字符来进行跨通道的“对齐”。
- 常见失败点: 配置不匹配。接收端期望一个配置(比如帧时钟和采样率的比例关系),但发送端发来的ILA显示是另一个配置。或者,多通道之间因为PCB走线长度差异,导致/A/字符到达的时间不一致,无法对齐。
我个人认为,ILA阶段是整个训练中最“烧脑”的阶段,因为它涉及了协议层的很多细节。
阶段三:用户数据阶段
ILA成功后,链路就进入正常的数据传输模式了。发送端开始传输真正的采样数据,接收端则持续接收并恢复出数据。此时,链路训练已经完成,但错误检测并没有停止。
- 发送端做什么? 传输用户数据,并在数据流中插入一些控制字符和校验信息(如CRC校验)。
- 接收端做什么? 持续接收数据,并进行CRC校验。如果发现校验错误,它会通过SYNC~信号或报告错误状态。
- 常见失败点: 运行时错误。数据跑到一段时间后出错,或者偶尔出错。这跟CGS和ILA阶段的问题不太一样,通常与环境噪声、电源纹波、SerDes的长期抖动稳定性有关。
// 注意:以下是简化概念性伪码,并非实际可运行代码
// 模拟链路训练过程
if (cgs_success) {
// CGS成功,发送ILA
send_ila(config_info);
if (rx_parses_ila_successfully && lane_alignment_success) {
// ILA成功,进入用户数据模式
send_user_data();
while (link_is_active) {
calculate_crc_and_send();
}
} else {
// ILA失败,重新进行CGS或者上报错误
report_error("ILA Failed");
}
} else {
// CGS失败
report_error("CGS Failed: Check PHY");
}
好了,我们用一张图来总结一下这三个阶段的关系:
1.3 链路训练失败的常见根因分类
经验告诉我,训练失败的原因虽然千奇百怪,但大体上可以归类到几个桶里。了解这些,能让你定位问题时有章可循。
| 失败阶段 | 常见根因 | 排查方向 |
|---|---|---|
| CGS | 物理层 | 参考时钟频率/抖动、SerDes PLL锁定、眼图闭合、信号完整性差 |
| ILA | 协议/配置/对齐 | 发送端与接收端配置不匹配(参数集)、SYSREF延迟设置错误、跨通道走线误差过大 |
| 数据阶段 | 运行环境/稳定性 | 电源纹波过大、温度引起的时钟漂移、误码率(BER)过高、CRC校验失败 |
别一上来就去翻协议栈的寄存器。我建议的逻辑是:先看物理层,后看协议层。用示波器看看高速线的眼图是否清晰?用频谱仪看看时钟的相噪如何?这些硬件指标不过关,软件层面再怎么折腾也是白费力气。
好了,这一章我们厘清了JESD204B为什么而生,以及链路训练的三板斧——CGS、ILA、用户数据阶段。记住这张图,记住这三个阶段,遇到问题时先对号入座。这就是排查的起点。