3. JESD204B 时钟体系:SYSREF、Device Clock、确定性延迟

讲 JESD204B,我最怕新人一上来就盯着数据线折腾。其实,时钟才是这套接口的灵魂。没有干净的时钟,后面全是白费功夫。

这一章我们好好聊聊时钟体系里的三个关键角色:Device Clock、SYSREF,以及它们共同实现的确定性延迟。搞懂了这些,你才算真正入了JESD204B的门。

3.1 Device Clock:整个链路的“心跳”

Device Clock,有时候也叫位时钟或采样时钟。说白了,就是给JESD204B链路提供基本节拍的信号。它决定了串行数据线上每个bit的宽度。

我个人习惯把Device Clock比作乐队的指挥棒——所有的数据收发、状态机跳转都得跟着它的节奏来。

3.1.1 频率关系

Device Clock的频率不是随便定的。它和几个关键参数绑定在一起:

  • 数据转换速率(f_sample):ADC的采样率
  • 每帧采样数(F)
  • 每多帧帧数(K)
  • 通道数(L)和分辨率(N')

一个常用的估算公式是:

Device Clock = f_sample × (F × 10 × L) / (L × 8)   // 简化后的近似关系
// 或者更直观点:
// Lane速率 = (f_sample × N' × 10/8) / L
// Device Clock通常取 Lane速率 的1/40 或 1/20 等整数分频

你想想看,为什么是10/8?因为8b/10b编码引入了20%的开销。我记得有个项目,开发者直接用采样时钟连到FPGA的GTX参考时钟上,结果速率死活对不上。一查才发现,他只算了采样率,完全没考虑编码开销。

特别注意: Device Clock的抖动(Jitter)直接决定了整个链路的误码率。我曾经见过一个设计,链路偶尔断连,排查了一周都没头绪。最后用频谱仪一测,Device Clock上有个低于200kHz的电源纹波,相位噪声指标完全超标。换了一个低抖动晶振,问题立刻消失。

3.1.2 实现示例

在FPGA里,我们通常用Dedicated的时钟输入引脚接收Device Clock。要是ADC那边输出的是可编程时钟,我会先在FPGA里用MMCM或PLL把它整理一下,再分发给内部逻辑。

// Verilog示例:Device Clock分频生成帧时钟
wire device_clk;   // 假设已从IBUFGDS输入
wire lmfc_clk;     // 本地多帧时钟
reg [5:0] div_cnt;

always @(posedge device_clk) begin
   if (!reset_n)
       div_cnt <= 0;
   else if (div_cnt == K*F-1)
       div_cnt <= 0;
   else
       div_cnt <= div_cnt + 1;
end

// 在计数到特定值时产生lmfc的边沿(这里只是示意)
assign lmfc_clk = (div_cnt == 0) ? 1'b1 : 1'b0;

嗯,这段代码只是个概念。实际中不建议用计数器做门控时钟,最好用全局时钟缓冲。

3.2 SYSREF:校准时间参考点

SYSREF信号,很多人叫它参考脉冲或者同步信号。它的任务很明确:把发送端(ADC)和接收端(FPGA)的帧边界对齐。

为什么需要它?因为Device Clock虽然频率一致,但相位关系是随机的。上电瞬间,ADC内部的状态机跑到了哪个frame,FPGA一无所知。SYSREF就是那个“对表”的动作。

3.2.1 与LMFC的关系

JESD204B定义了一个本地多帧时钟(LMFC, Local Multi-Frame Clock)。每个设备都有自己的LMFC,而SYSREF用来同步所有设备的LMFC边界。

我常跟团队里的小伙伴说:Device Clock是秒针,LMFC是分针,SYSREF就是你把分针拨到整点的那只手。

  • 上升沿对齐:SYSREF的有效沿(通常为上升沿)必须落在Device Clock的某个特定窗口内。
  • 周期性发送:协议支持单次、多次或周期性的SYSREF脉冲。我个人偏爱单次或有限次发送,避免后续误触发。
  • 建立/保持时间:SYSREF相对于Device Clock的建立时间(t_su)和保持时间(t_h)必须满足。这是很多硬件设计容易忽略的地方。
关键事实: 确定性延迟的基础就是LMFC的严格同步。只要SYSREF在每一个设备上都正确捕获,各设备的LMFC相位就确定了。

3.2.2 采样时机与避坑

在FPGA里采样SYSREF,我通常的做法是:用Device Clock的边沿去采样SYSREF,同时利用IDELAY或ISERDES的bitslip功能做一些精细调整。

我曾经在一个项目中遇到特别诡异的现象:链路的延迟有时候稳定,有时候跳变几比特。仔细检查了SYSREF的物理走线,发现高电平脉宽只有半个Device Clock周期。这就导致采样时机正好落在亚稳态窗口里。加大SYSREF的脉宽到至少一个完整周期后,一切恢复正常。

小窍门: SYSREF信号在PCB上尽量短,且远离大电流走线。我推荐在器件端加RC滤波(比如100pF+10Ω),但注意不要影响边沿速率。

3.3 确定性延迟:为什么能“确定”?

确定性延迟(Deterministic Latency),是JESD204B区别于传统LVDS接口的最大卖点。每次上电或链路重新初始化,数据从ADC采样到FPGA接收的时间都能完全一致。

听起来很神奇吧?其实原理不复杂。

3.3.1 延迟的组成

整个链路的延迟可以划分为以下几个部分:

延迟环节 说明 是否确定
ADC采样延迟 从模拟输入到数字采样输出的固定延迟 是(器件内部固定)
JESD传输延迟 串行化、线缆/PCB走线、FPGA解串 不定(受工艺/温度影响)
弹性缓冲延迟 FPGA内部的FIFO调整,用于对齐LMFC 可控制
解码与对齐延迟 ILAS解析、数据重组等 固定周期

说白了,JESD204B把“不确定的部分”通过弹性缓冲吸掉了,剩下一个固定的整数个多帧周期。

3.3.2 实现确定性延迟的两个步骤

  1. 步骤一:SYSREF对齐

    确保ADC和FPGA都正确捕获到SYSREF脉冲,各自的LMFC相位一致。这一步正确,整数倍的延迟就定了。

  2. 步骤二:弹性缓冲释放

    FPGA内部的接收缓冲以LMFC为参考点释放数据。无论数据传输路径的物理延迟如何变化,只要没超出缓冲深度,数据都会被“延时释放”到同一个LMFC边界。

常见陷阱: 弹性缓冲的大小是有限的。如果链路延迟变化太大(比如温度漂移导致线缆延迟改变),缓冲可能会溢出或读空。设计时要留有足够裕量,我一般选择缓冲深度能容纳至少8个多帧周期。

3.4 时钟体系整体结构

为了让你更直观地理解这三者之间的关系,我画了一张示意图。它展示了从ADC到FPGA的时钟分发路径,以及SYSREF如何用于对齐。

JESD204B时钟体系结构图 ADC 发送端 Device Clock 源 (晶振/时钟发生器) SYSREF 脉冲发生 ADC 内核 & LMFC (数据采样的起点) FPGA 接收端 Device Clock 输入&BUFG SYSREF 捕获 & 对齐 弹性缓冲 & 帧对齐 (吸收抖动,确定延迟) 应用逻辑 Device Clock 分发 SYSREF 脉冲 用于对齐 驱动 SYSREF 同步后,ADC与FPGA的LMFC对齐 → 确定性延迟基础建立

3.5 调试要点总结

最后,我把调试时钟体系时最容易出问题的几个点列出来,算是一个避坑清单吧。

  • 测量三要素:示波器一定要看Device Clock的上升沿和SYSREF上升沿之间的关系。确保满足数据手册的t_su/t_h。我习惯用示波器的余辉模式看几十秒,确认没有漂移。
  • 先看频率,后看相位:频率不对,相位对齐就是空中楼阁。用频谱仪确认频率偏差在±100ppm以内。
  • 检查SYSREF的脉宽:这是新手最容易翻车的地方。务必让SYSREF的高电平时长至少等于一个完整的Device Clock周期,最好接近1.5个周期。
  • 避免跨时钟域采样:如果SYSREF来自于另一个时钟域,必须用两级同步器处理。我曾经在仿真里看过一个因为亚稳态导致链路无法建立的成功案例,那之后我的代码里就规规矩矩用同步器了。
  • 备用的SYSREF探测点:在PCB设计时,预留一个SYSREF的测试点,方便调试时用示波器探头勾住。别问我为什么要留,等板子贴出来发现SYSREF被过孔埋在四层板内层,你就懂了。
个人经验: 拿到一块新的JESD204B子卡,我第一步就是烧录一个测试程序,只做一件事——在FPGA内部靠Device Clock的时钟域捕获SYSREF,然后把捕获到的状态通过一个GPIO输出。整个过程不需要数据链路启动,只用Scope看这个GPIO有没有正常的周期脉冲,就能判断时钟域的基本信号质量。