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参考时钟上,结果速率死活对不上。一查才发现,他只算了采样率,完全没考虑编码开销。
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)必须满足。这是很多硬件设计容易忽略的地方。
3.2.2 采样时机与避坑
在FPGA里采样SYSREF,我通常的做法是:用Device Clock的边沿去采样SYSREF,同时利用IDELAY或ISERDES的bitslip功能做一些精细调整。
我曾经在一个项目中遇到特别诡异的现象:链路的延迟有时候稳定,有时候跳变几比特。仔细检查了SYSREF的物理走线,发现高电平脉宽只有半个Device Clock周期。这就导致采样时机正好落在亚稳态窗口里。加大SYSREF的脉宽到至少一个完整周期后,一切恢复正常。
3.3 确定性延迟:为什么能“确定”?
确定性延迟(Deterministic Latency),是JESD204B区别于传统LVDS接口的最大卖点。每次上电或链路重新初始化,数据从ADC采样到FPGA接收的时间都能完全一致。
听起来很神奇吧?其实原理不复杂。
3.3.1 延迟的组成
整个链路的延迟可以划分为以下几个部分:
| 延迟环节 | 说明 | 是否确定 |
|---|---|---|
| ADC采样延迟 | 从模拟输入到数字采样输出的固定延迟 | 是(器件内部固定) |
| JESD传输延迟 | 串行化、线缆/PCB走线、FPGA解串 | 不定(受工艺/温度影响) |
| 弹性缓冲延迟 | FPGA内部的FIFO调整,用于对齐LMFC | 可控制 |
| 解码与对齐延迟 | ILAS解析、数据重组等 | 固定周期 |
说白了,JESD204B把“不确定的部分”通过弹性缓冲吸掉了,剩下一个固定的整数个多帧周期。
3.3.2 实现确定性延迟的两个步骤
- 步骤一:SYSREF对齐
确保ADC和FPGA都正确捕获到SYSREF脉冲,各自的LMFC相位一致。这一步正确,整数倍的延迟就定了。
- 步骤二:弹性缓冲释放
FPGA内部的接收缓冲以LMFC为参考点释放数据。无论数据传输路径的物理延迟如何变化,只要没超出缓冲深度,数据都会被“延时释放”到同一个LMFC边界。
3.4 时钟体系整体结构
为了让你更直观地理解这三者之间的关系,我画了一张示意图。它展示了从ADC到FPGA的时钟分发路径,以及SYSREF如何用于对齐。
3.5 调试要点总结
最后,我把调试时钟体系时最容易出问题的几个点列出来,算是一个避坑清单吧。
- 测量三要素:示波器一定要看Device Clock的上升沿和SYSREF上升沿之间的关系。确保满足数据手册的t_su/t_h。我习惯用示波器的余辉模式看几十秒,确认没有漂移。
- 先看频率,后看相位:频率不对,相位对齐就是空中楼阁。用频谱仪确认频率偏差在±100ppm以内。
- 检查SYSREF的脉宽:这是新手最容易翻车的地方。务必让SYSREF的高电平时长至少等于一个完整的Device Clock周期,最好接近1.5个周期。
- 避免跨时钟域采样:如果SYSREF来自于另一个时钟域,必须用两级同步器处理。我曾经在仿真里看过一个因为亚稳态导致链路无法建立的成功案例,那之后我的代码里就规规矩矩用同步器了。
- 备用的SYSREF探测点:在PCB设计时,预留一个SYSREF的测试点,方便调试时用示波器探头勾住。别问我为什么要留,等板子贴出来发现SYSREF被过孔埋在四层板内层,你就懂了。