LMK04828 + 4片AD9208的JESD204B多芯片同步,这个话题一看就是高速数据采集板卡开发中绕不开的硬骨头。前两年我帮客户调一块8通道同步采集板,用的正是这套方案,板子画出来只是第一步,真正让4片ADC的采样点对齐到同一条时间线上、让FPGA能稳定收到4路JESD204B数据流,前前后后花了将近三周。中间踩过SYSREF时序的坑,也见识过同步状态机卡死在ILAS阶段的诡异现象,今天把这些实战经验梳理出来,希望能让正在做类似项目的人少走几段弯路。
这套方案解决的核心问题非常明确:在需要多通道高精度同步采集的场景下(比如相控阵雷达、多通道信号分析、医学成像、粒子物理实验),4片AD9208每个都是双通道14位3GSPS的ADC,加起来8个模拟输入通道。如果各通道的采样时刻有几十皮秒的偏差,相位一致性、通道间延迟校准这些后续工作根本无从谈起。JESD204B协议虽然设计上支持multi-device synchronization,但真正让它跑起来并保持确定性延迟,需要从时钟树架构、SYSREF发布策略、FPGA IP配置到状态机调度做一整套系统性设计。
正文部分我会按照我实际执行的顺序来讲:先解释JESD204B同步机制的底层逻辑和为什么选LMK04828作为时钟方案,再给出一份可以直接照着配的LMK04828寄存器清单和FPGA侧关键代码示例,然后讲调试过程中最常见的几类问题和对应排查手段。全程会结合具体的寄存器配置、时序参数和实际踩坑记录,尽量让这篇文章变成一个可执行的工程参考。
1. 同步需求拆解:一次搞懂JESD204B的“确定性延迟”到底在同步什么
1.1 用生活类比理解JESD204B的同步机制
JESD204B同步这事,很多第一次接触的人会以为它和网络协议里的“时间同步”是一个思路,其实差别很大。网络同步关心的是各节点的时间戳是否一致,而JESD204B的multi-chip同步,核心是让多个ADC的采样时刻对齐在纳秒甚至皮秒级别,同时让这4片ADC采到的数据经过各自独立的串行链路送到FPGA后,FPGA内部的4条数据通路能对齐到同一帧边界上。
打个比方,就像4个摄影师同时按快门拍同一个画面,想要4张照片内容完全一致,首先要保证“同一时刻按下快门”,这是采样时刻对齐;其次,4台相机拍完照片后,把文件传回编辑的传输路径不一致,有的走光纤快的通道,有的走无线慢的通道,最后编辑收到4张照片的时间点不同,还要等所有照片到齐并按时间戳重新排列,这是数据对齐。JESD204B的同步机制,本质上就是把这两件事一起解决。
协议层面对应的分别是SYSREF信号(负责对齐各个器件的本地多帧时钟LMFC)和ILAS阶段(Initial Lane Alignment Sequence,负责对齐各Lane传输的数据边界)。两者缺一不可。
1.2 为什么必须用SYSREF而不是简单的复位脉冲
在JESD204B的子类1(Subclass 1)同步方案中,SYSREF被定义为确定性延迟的关键信号。AD9208和LMK04828都支持子类1模式,这也是高速ADC同步最主流的选择。
SYSREF的作用,是在所有ADC和FPGA中同时建立一个基准时刻,用来对齐各自的本地多帧时钟LMFC。只有LMFC对齐了,各条串行Lane上的帧边界才能对齐,数据从ADC采出来到FPGA恢复出来之间的延迟才是确定性的。
实际项目里最容易犯的错误,是试图用普通GPIO拉一个脉冲当SYSREF用,或者随便给一个和Device Clock不同源的信号。这两种做法都会导致一个问题——SYSREF和Device Clock之间的相位关系不确定,器件上电后LMFC相对采样时刻的相位就有离散性,导致每次上电测量同一信号的相位都不同。这类问题在调试示波器上看数据眼图是完全正常的,但一测通道间相位就发现差了几百皮秒甚至几个纳秒,而且每次重启结果还不一样,这就是典型的确定性延迟没建立起来。
1.3 LMK04828在同步方案里的角色定位
LMK04828是TI的JESD204B专用时钟芯片,它在整个方案里做了三件事:产生所有ADC和FPGA需要的Device Clock采样时钟;产生与Device Clock严格同源、相位关系严格可控的SYSREF信号;提供时钟分配和抖动净化能力,保证高采样率下的时钟质量。
选它而不是用FPGA内部时钟管理单元直接出时钟,核心原因是抖动指标和确定性。AD9208在3GSPS采样率下对采样时钟的孔径抖动非常敏感,FPGA内部时钟资源在这种场景下往往达不到足够低的随机抖动,同时FMC载板到ADC板卡的走线也需要一颗专门的时钟驱动器来保证阻抗匹配和时序对齐。LMK04828集成了双PLL架构,外接一个低频参考即可输出多路低抖动时钟,并且内置了SYSREF的延迟调节功能,这是实现确定性延迟的核心工具。
1.4 多芯片同步的终极目标:所有Lane的延迟一致性
同步调试结束时,我们要验证的目标是:任意一片AD9208的任意一个通道,在同一时刻采集的信号,经过FPGA内部恢复时钟采样后,出现在同一帧的同一位置。衡量标准是任何两片ADC之间的通道间延迟差(lane-to-lane skew)稳定在可接受范围内,对于3GSPS采样率来说,一般要求能做到几十皮秒级别的确定性。
这套验证通常是用同一个正弦信号同时灌入8个通道,在FPGA内部对恢复出的数据做互相关分析,算出各通道的相位差。如果SYSREF设计和布线合理,芯片配置正确,同时满足各PCB走线等长要求,那么8个通道的相位差应该是一致的、可预测的,具体数值取决于板级延迟,但只要固定不变就可以通过校准消除。
2. 时钟树架构与LMK04828的寄存器配置实战
2.1 整棵时钟树的连接关系
4片AD9208的同步采集板,时钟树拓扑讲清楚其实不复杂,核心就是“一源多路”:一颗LMK04828同时供应所有需要时钟的器件,保证同源性。
具体的连接方式是:
- LMK04828的参考输入接板载高稳晶振或者外部参考(比如10MHz恒温晶振)
- LMK04828通过内部PLL2的VCO分频产生所有需要的Device Clock(采样时钟),送给4片AD9208的CLK输入和FPGA的参考时钟输入
- LMK04828另外一路输出产生SYSREF信号,通过低偏斜的时钟缓冲器扇出后,分别接到4片AD9208的SYSREF引脚和FPGA的SYSREF引脚
- FPGA内部用JESD204B IP核接收4路高速串行数据,IP核恢复出的并行数据再进入用户逻辑
这里有个容易被忽视的细节:4片AD9208的Device Clock和SYSREF走线必须做等长处理。PCB设计时,LMK04828每一路输出到ADC的时钟走线,建议长度误差控制在10mil以内。为什么这么严格?因为SYSREF的建立保持时间窗口只有几百皮秒,走线长度差异过大直接导致SYSREF相对Device Clock的相位偏移,打破了确定性延迟的前提。
2.2 LMK04828的两种PLL配置思路
LMK04828有个双PLL架构,PLL1和PLL2,用途完全不同。
- PLL1:负责将外部参考时钟和内部VCO相锁定,让输出时钟频率与参考时钟精确成比例关系。它决定了输出频率的绝对准确度。
- PLL2:和内部VCO配合,产生高质量的高频时钟,同时它的环路带宽决定了时钟的随机抖动性能。
在高速ADC时钟场景,通常建议使用“PLL1+PLL2级联”模式:外部10MHz参考经过PLL1净化后作为PLL2的参考,PLL2锁定在高频(比如2.94912GHz,作为JESD204B的位时钟频率),然后分频出各种需要的Device Clock和SYSREF频率。
实际配置时用TI官方的TICS Pro软件(LMK04828的配置工具)可以省很多事。但我建议不要把TICS Pro生成的寄存器表直接丢给裸机工程师就结束了,要重点检查几个关键项:
2.3 SYSREF的产生模式与延迟调节
TICS Pro里SYSREF这块的配置,直接决定同步能不能成功。主要关注三个参数:
SYSREF模式:连续模式(Continuous)和脉冲模式(Pulsed)。多芯片同步场景必须选脉冲模式,一次产生单脉冲或者可编程数量的脉冲。连续模式在子类1系统里没什么用处,而且会让SYSREF的不断翻转干扰Device Clock质量。
SYSREF分频比:SYSREF频率必须是LMFC频率的整数分频,且要和AD9208和FPGA IP配置的LMFC频率完全对应起来。这个对应关系对不上,后面ILAS阶段永远过不去。
SYSREF延迟调节:LMK04828内部有数字延迟线和模拟延迟线,可以在TICS Pro里微调SYSREF相对Device Clock的相位,单位可以做到几十皮秒级别。这是实际调试SYSREF建立保持时间的最有效工具。
2.4 一份可直接参考的寄存器配置参数(以3GSPS采样率为例)
下面是实际项目中用过的一组关键配置参数(具体频率需要根据你的板卡参考时钟和ADC配置调整):
| 功能项 | 参数值 / 模式 | 说明 |
|---|---|---|
| 参考时钟 | 10 MHz | 接高稳晶振,用于PLL1参考 |
| PLL1工作模式 | 锁定检测模式正常 | 提供净化后的参考给PLL2 |
| PLL2 VCO频率 | 2949.12 MHz(示例) | 具体取值和Device Clock及JESD204B线速率强相关 |
| Device Clock输出频率 | 245.76 MHz(示例) | 进入AD9208的CLK,也是采样时钟频率 |
| JESD204B线速率(每Lane) | 9.8304 Gbps(示例) | 由ADC采样率和转换器分辨率决定 |
| SYSREF模式 | 脉冲模式,单脉冲 | 输出一次性SYSREF脉冲 |
| SYSREF频率 | 7.68 MHz(示例) | 与LMFC频率对齐,是Device Clock的1/32 |
这里频率数值只是一个示例组合,实际工程中AD9208的最配置要由其采样率和每通道转换器的分辨率共同决定。AD9208是双通道14位ADC,如果每个通道采样率是3GSPS,那JESD204B输出需要的高速Lane数量和线速率按比例上升。我用示例值是想强调一个思路:所有频率的设定必须按“Device Clock——LMFC——SYSREF”这条链路严格推导,任何一个环节对不上,同步都无法建立。
2.5 寄存器写入的工程顺序和验证方法
LMK04828配置写入有个讲究的启动顺序:
- 上电后先把芯片复位
- 通过SPI依次写入所有寄存器配置,建议使用TICS Pro导出的寄存器表,这个表通常已经按地址排好序
- 确认PLL1和PLL2的锁定状态(读取寄存器status bit)
- 如果SYSREF需要动态触发,配置为“单次脉冲”模式。注意:SYSREF的触发时机必须和FPGA的复位时序配合好,否则会出现FPGA还没准备好接收时SYSREF已经发出的情况,导致后续找不到对齐沿
推荐的工程做法:FPGA上电后,先初始化JESD204B IP核并释放复位,再通过SPI对LMK04828发送一个读请求或触发脉冲让SYSREF在FPGA已经完全就绪的时刻到达。不要一上电就自动发SYSREF,这一步能帮你省掉大量排查时间。
3. FPGA侧的JESD204B IP核配置与同步状态机设计
3.1 FPGA IP核的主要配置项解析
FPGA端用的是JESD204B IP核(不同厂商名称不同,Xilinx的叫JESD204 PHY和JESD204 RX IP,Intel的叫JESD204B IP Core,但核心逻辑相同)。配置界面里决定同步成败的关键项有这些:
线速率和参考时钟:IP核的线速率必须和LMK04828提供的Device Clock保持一致。这里容易出问题的是,有些IP核的参考时钟频率是线速率的几分之一,配置时要把参考时钟频率和线速率这两个参数对清楚。
LMFC偏移(LMFC Offset):LMFC偏移就是给每个接收通道人为设定一个延迟窗口补偿。比如4片ADC中有一片因为PCB走线或引脚延迟天生比其他片晚一些,通过调整这个参数可以补偿差异。实际调试中先保证链路能和SYSREF对齐再调偏移,不要一开始就试图用偏移补偿未知偏差。
F和K参数:F表示每帧每个Lane传输的字节数,K表示每多帧包含的帧数。这两个参数决定了ILAS阶段的对齐结构,需要和AD9208侧配置完全一致。AD9208有专门的JESD204B参数设定寄存器,配置时必须确保两边F、K、L(Lane数量)、M(转换器数量)一一匹配。
3.2 同步状态机:从复位到数据稳定输出
FPGA内部JESD204B IP核的同步过程实际上是由状态机控制的,理解它的状态转换对调试很有帮助:
第一个状态是reset,IP核上电后处于复位态,此时不能接收任何SYSREF。
第二个状态是等待SYSREF,IP核释放复位后,开始等待有效SYSREF信号。SYSREF到达后,IP核记录下来作为LMFC对齐的基准。
第三个状态是码型同步阶段(CGS),此时ADC会发送连续的逻辑0,FPGA恢复出码型后表示链路基本通讯正常。
第四个状态是ILAS阶段,ADC发送一组特殊序列(包括逗号字符、配置参数等),FPGA从中提取出链路参数,并完成多Lane和多Device的对齐。如果多个Lane中有一个没收到ILAS,整个状态机会卡死在这里。
最后一个状态是正常数据阶段,所有Lane对齐完成,IP核开始输出有效数据。
我知道不少人会直接在IP核的输出端口上做逻辑判断来确认同步,但更好的做法是同时监视IP核的状态指示信号。Xilinx IP核有rx_sync_status、rx_status、sysref_align等输出,通过这些信号能精确定位到是SYSREF没收到,还是CGS没完成,还是ILAS对齐失败。
3.3 FPGA配置的关键代码实践
LMK04828的SPI配置逻辑和FPGA复位释放逻辑,实际工程中是这样做的(这里给出一个简洁的示例框架):
// JESD204B IP核复位释放模块 module jesd204b_reset_ctrl ( input wire clk, input wire rst_n, output reg ip_reset, // 连接到JESD204B IP的复位 output reg trigger_sysref, // 用于触发LMK04828产生SYSREF input wire ip_rx_sync_status // IP核同步状态指示 ); // 状态机:等待FPGA主复位释放 -> 释放IP复位 -> 触发SYSREF -> 等待同步完成 localparam IDLE = 3'd0; localparam RELEASE_IP = 3'd1; // 等待IP核解锁 localparam SEND_SYS = 3'd2; // 发送SYSREF触发脉冲 localparam WAIT_SYNC = 3'd3; // 等待rx_sync_status拉高 localparam DONE = 3'd4; reg [2:0] state; always @(posedge clk or negedge rst_n) begin if (!rst_n) begin state <= IDLE; ip_reset <= 1'b1; trigger_sysref <= 1'b0; end else begin case (state) IDLE: begin ip_reset <= 1'b1; // 保持复位状态 state <= RELEASE_IP; end RELEASE_IP: begin ip_reset <= 1'b0; // 释放IP复位 // 等IP核初始化完成后触发SYSREF state <= SEND_SYS; end SEND_SYS: begin trigger_sysref <= 1'b1; // 给LMK04828一个触发脉冲 state <= WAIT_SYNC; end WAIT_SYNC: begin trigger_sysref <= 1'b0; // 拉低触发信号 if (ip_rx_sync_status) state <= DONE; end DONE: state <= DONE; endcase end end endmodule和常规做法不一样的一点是,我建议不要在FPGA上电后立刻自动触发SYSREF。量产板卡和调试板卡的电源上电时序有差异,如果FPGA的JESD204B IP还没从复位中释放就被SYSREF打断了,后续链路会一直处于一个半同步状态,这时只能整板断电重启。加一个延时或是主机软件控制指令,虽然看起是很小的细节,实际帮助很大。
3.4 SPI配置LMK04828的时序要点
给LMK04828写寄存器时,SPI时序也要小心。LMK04828的SPI有读写位和多位地址,数据帧格式是:一个起始位+WRITE/READ位+15位地址+8位数据。用FPGA的SPI主模块配置时要注意:
注意时序上限:LMK04828的SCLK最大频率有限制,不要用FPGA里高速时钟直接分频出来就往芯片上怼,频率过高会导致配置写入错误、时好时坏。
回读验证:配置完成后把关键寄存器回读一遍,和期望值比对。曾经遇到过一次SPI线序搞错的问题,看起来写成功了,回读时才发现数据没进去,导致耗了一天才定位到问题。
锁定状态确认:所有寄存器写完后,通过SPI读取PLL1和PLL2的锁定指示位。这里要说明,PLL锁定后LMK04828不会立刻输出稳定时钟,还需要等待一个稳定时间,建议在写逻辑里加至少几毫秒的延时再进入下一步。
4. 同步调试实战:四类高频问题与排查思路
4.1 SYSREF时序违规:建立保持时间不满足
这是多芯片同步最容易出问题的地方,症状是:SYSREF发出去了,但FPGA和ADC之间就是无法建立正确的LMFC对齐关系;逻辑分析仪上能看到JESD204B IP核的sysref_align信号一直没拉高。
出现这个问题的原因是SYSREF相对Device Clock的相位不满足ADC的建立保持时间要求。ADC对SYSREF和Device Clock之间时序有明确要求,不同芯片需要的建立保持窗口不同,一般都在百皮秒级别。
排查思路是先用示波器同时抓取Device Clock和SYSREF,测量它们到达ADC引脚时的相位关系。如果发现SYSREF上升沿落到了Device Clock的建立保持窗口内,就用LMK04828内置的延迟调节功能把SYSREF逐步平移,直到满足要求。这个过程要慢,一次移一步,观察FPGA端状态有没有变化。
4.2 多片ADC之间的SYSREF到达时间不一致
另一个高频问题是:单看每一片ADC,SYSREF时序都正常,但4片之间没有对齐。这种情况一般是PCB走线不等长造成的。
解决办法是在LMK04828输出端用独立的SYSREF延迟调节,比如LMK04828有多组SYSREF输出通道是独立可控的,可以对到达晚的那一路做提前补偿。但这不是根治手段,真正稳的方案还是回到PCB设计阶段,把SYSREF和Device Clock的走线全部做等长约束,Si仿真或时延测量结果要到皮秒级别才能放心。
工程上还建议在FPGA内部对4路恢复出的数据流分别加独立的FIFO延迟补偿。即使模拟前端做到完全等长,FPGA内部不同收发器通道的延迟天然有些微差异,用FIFO做精细的通道间校准是最后一层兜底。
4.3 ILAS阶段卡死:链路无法建立完整的对齐序列
IF LAS卡死是最让人头疼的,症状是IP核状态机一直停留在等待ILAS状态,rx_sync_status信号翻转但不稳定。
排查这类问题要系统性逐项排除:
- 先确认AD9208的JESD204B参数配置是否和FPGA一致。AD9208里的F、K、L参数和FPGA IP核里设置的不匹配是首要怀疑对象。
- 确认LMK04828提供的Device Clock频率是否与FPGA IP核的线速率匹配。多芯片系统里这是一个常见错误:ADC配置为7.3728Gbps线速率,但FPGA IP核被配置成9.8304Gbps,两边速率差导致恢复时钟完全对不上码型。
- 检查物理链路的信号质量。Vias过多、连接器阻抗不连续、背板走线过长,都会让串行数据眼图闭合,导致恢复出码型失败。
在Xilinx平台里可以用Eye Scan功能直接看几路Lane的眼图,这是个很实用的调试手段。眼图张不开就先去处理信号完整性问题,再去纠结同步逻辑。
4.4 上电顺序和复位时序不一致导致的偶发同步失败
最后一种问题最为玄学:在实验室环境下调试一切正常,但把系统恢复到冷启动状态后首次同步成功率不高,需要多次硬复位才能成功一次。
这类问题的根源是上电顺序不稳定。高速数据采集系统里,ADC、FPGA、时钟芯片各自的电源轨都要满足上电时序要求,如果LMK04828的电源比FPGA晚到,或者ADC的电源和时钟信号之间没有完成上电时序控制,会产生不可预测的初始条件。
工程建议是把时钟芯片和ADC的供电用专门的电源时序控制器控制,确保先供时钟、再供FPGA、最后供ADC,每次上电顺序确定。FPGA的复位释放时机和LMK04828的SYSREF触发信号也要按固定时序操作,不要依赖“上电等一会儿就自动跑起来”的自然流程。
5. 补充:Intel FPGA平台下的对策与调试效率提升
5.1 Xilinx和Intel平台实现方式的异同
有读者问过Intel FPGA平台是不是做多芯片JESD204B同步更复杂,这个其实要看项目熟悉度。Intel平台有官方应用笔记XAPP523(早期对应Altera的JESD204B方案,后来更新为各系列IP手册),专门讲多器件同步的配置和限制,思路和Xilinx是一致的。
差异主要在IP核的接口命名和复位管理时序。Intel的JESD204B IP核有专门的多通道同步使能接口,复位释放也要求更严格的状态序列,从复位到等待SYSREF之间需要手动插入一段时钟稳定周期。如果照着Xilinx的时序习惯直接套到Intel平台,你会发现SYSREF有时候能抓到有时候抓不到——本质是对两个平台复位release的时序规范要求不同。
工程建议是:确定平台后,第一时间去读该平台最新版的JESD204B IP用户手册,并把“Reset and Initialization Sequence”那一章反复看三遍,这是所有后续调试工作的基础。
5.2 合理运用厂商参考设计但保持批判性
做这类多芯片高速同步项目,参考设计一定不能放过,利用厂商参考设计和评估板能省下大量返工时间。TI的LMK04828有配套的TICS Pro和评估板,ADI的AD9208也有对应的评估套件,这些资料的价值在于:寄存器初始值可以快速推导、PCB layout可以参考走线策略。
但参考设计不能盲抄。评估板上用的电源方案、去耦电容、参考时钟源和你实际板卡不可能完全一致,直接抄配置可能导致时钟抖动指标差异明显。我习惯的做法是:用评估板的配置跑通第一版,然后换上自己板卡的时钟源、检查所有和参考源相关的寄存器、再针对性重新做一遍SYSREF时序验证。
5.3 调试工具的准备
调试这类项目,工具准备挺重要的:高带宽示波器(至少10GHz以上)、低抖动信号源、逻辑分析仪(支持JESD204B协议解码的型号)、Vivado或Quartus里的调试核都建议提前准备到位。
有一个高频使用的组合:用一个正弦校准信号同时灌入8个ADC通道,再用FPGA内部集成的ILA(集成逻辑分析仪)抓取4路恢复出来的数据,做互相关测相位。这个测试流程要写成自动化脚本或Tcl命令,每次修改参数后重新跑一遍,比手动抓波形分析效率高很多。
5.4 一个容易忽略但很重要的片间对齐验证方法
同步调试到最后,建议做一个长期稳定性测试:把系统连续运行24小时,每隔一段时间采样一段数据分析通道间相位差,如果相位差一直稳定在初始校准值附近,说明同步方案真正可靠。
曾经遇到过一次很隐蔽的缺陷:系统运行约2小时后通道间相位慢慢漂移了,后来定位到是LMK04828所在电源轨的散热问题,温度变化引起参考时钟频率微调,进而影响采样相位。这类问题属于温度稳定性,不在常规同步调试范围内,很容易被忽略,但量产前的可靠性测试阶段一定会暴露出来。
做个阶段性收尾。做4片AD9208的JESD204B同步,说到底是在同一个目标下处理三件互相咬合的工作:一个好的时钟树设计提供同源的Device Clock和可调延迟的SYSREF;一份两侧参数完全对齐的JESD204B配置确保协议层语义一致;一个稳健的复位同步状态机保证每次上电都能进入同样的确定性状态。我实际调试中最大的体会是,这个系统几乎没有孤立的问题——当你发现同步失败时,往往同时有多个环节都处在“差一点就对了”的状态,所以排查要按时钟链路和JTAG链路两条主线系统性分组推进,而不是一条路走到黑。
最后分享一个实测下来很有用的小技巧:每次修改LMK04828配置或FPGA代码后,都做一次完整的冷启动同步测试(断掉所有电源,等几秒,重新上电),并且把测试结果记录到一张表里。这样不仅能快速排除时序依赖导致的偶发问题,等后面做多板卡一致性验证时,这张表会是你最有说服力的数据积累。