☰
4片AD9208多通道同步采集:JESD204B确定性延迟设计与调试
2026/9/28 3:26:17 网站建设 项目流程

做多通道高速采集的朋友应该都有体会:单片AD9208跑通JESD204B接口,其实并不难,Xilinx的IP核配好、GT收发器一连,数据流很快就出来了。但把4片AD9208往板上一放,要求8个通道严格同时采样,重启之后第一次采样的时刻也必须固定,这时候真正头疼的问题才开始浮现。我之前就为这事折腾了两周,最后发现瓶颈几乎全在时钟域:LMK04828的SYSREF怎么给、设备时钟怎么分配、FPGA侧的JESD204B配置怎么配合,每一步都咬着JESD204B规范里的“确定性延迟”。这篇文章把我最终跑通的完整方案、计算过程和踩坑经历整理出来,重点覆盖LMK04828的时钟树设计、AD9208的JESD204B参数配置、FPGA侧4个IP核的同步逻辑,以及调试中定位问题的思路。适合正在做多通道数据采集、相控阵接收前端、高速示波器类项目的硬件和FPGA工程师参考。

1. 为什么多片AD9208同步,难在"确定性延迟"

1.1 从单链路跑通到8通道对齐,问题出在哪

单链路的情况下,JESD204B的链路只要能建立,数据一直往外吐,看起来一切正常。但多片同步的要求完全不同:不仅要“同时开始转换”,还要保证从ADC采样到FPGA收到数据的整个时延是固定且可重复的。

换句话说,每次上电复位之后,第一个采样点到达FPGA的时刻必须完全相同。如果做不到,就算四片ADC的采样时钟来自同一个源,重启后每片数据还是会差出几个采样周期,甚至差出几个多帧周期。你会在ILA里看到四路数据的样本序号对不齐,或者同样都在输出,但互相之间的相位关系每次上电都在变。这就是JESD204B规范里说的确定性延迟问题。

实际项目中,多片同步的难点可以拆成三个层面:第一,每片ADC的采样时钟必须同源,并且相位关系确定;第二,JESD204B链路必须处于Subclass 1模式下,通过SYSREF对齐本地多帧时钟LMFC;第三,FPGA内部每个JESD204B核的链路层必须能感知并保持这种对齐关系,不能各自为政。

1.2 JESD204B Subclass 1和SYSREF的作用

JESD204B定义了三种Subclass,其中Subclass 1是专为多器件同步设计的。它的核心思想是利用SYSREF信号对所有发送器(ADC)和接收器(FPGA)的本地多帧时钟(LMFC)进行对表,使每个器件内部的LMFC边沿在同一个时间点对齐,进而保证确定性延迟。

SYSREF本质上是一个窄脉冲或低频时钟,它的上升沿必须落座在LMFC的有效窗口内。器件在SYSREF的上升沿采样LMFC,然后据此调整本地的帧/多帧计数器,让所有器件的LMFC都从同一个计数点开始工作。之后,JESD204B链路中的ILAS(Initial Lane Alignment Sequence)再完成lane之间的对齐,最终实现整个链路的确定性传输。

这里有一个容易被忽视的点:SYSREF和LMFC之间的时序关系非常苛刻。AD9208的数据手册会给出SYSREF相对LMFC的建立时间、保持时间窗口,如果你在PCB上让不同ADC的SYSREF走线长度差太多,或者SYSREF在LMK04828里的延时设置不对,就会出现“链路偶尔能同步,但多上电几次就会失步”的诡异现象。

1.3 本项目的整体时钟树与参数概览

本文以4片AD9208、每片双通道工作、共8通道、采样率1.25GSPS为例。LMK04828负责给4片AD9208提供设备时钟和SYSREF,同时给FPGA提供GT参考时钟和SYSREF。整体JESD204B链路参数如下表,后续的计算都基于这套配置。

参数数值说明
ADC型号AD9208 × 4每片双通道
采样率 f_s1.25 GSPS每通道
M2每片2个转换器
L8每片8条lane
F4每帧每lane 4字节
K32每多帧32帧
N / N'14 / 16数据位宽14,编码位宽16
线速率6.25 Gbps每lane物理线速率
LMFC4.8828125 MHz本地多帧时钟

这套配置的核心是让LMK04828产生的SYSREF频率等于LMFC,也就是约4.88MHz。所有器件(4片ADC + FPGA)的LMFC参考都从同一个SYSREF边沿开始计数,这样多片同步就在底层具备了可行性。

2. LMK04828时钟树设计:从参考源到SYSREF的完整链路

2.1 输出通道分配:谁给时钟,谁给同步

LMK04828作为集成了双锁相环的时钟芯片,在JESD204B系统里的角色是“时间基准分配器”。它不仅要产生干净的设备时钟,还要产生与设备时钟相位关系确定的SYSREF。合理规划它的12路输出,是系统设计的第一步。

以本文的配置为例,输出分配可以这样规划:

LMK04828输出频率去向用途
DCLKout01.25 GHzAD9208_0设备时钟(采样时钟)
DCLKout11.25 GHzAD9208_1设备时钟
DCLKout21.25 GHzAD9208_2设备时钟
DCLKout31.25 GHzAD9208_3设备时钟
SDCLKout04.88 MHzAD9208_0SYSREF
SDCLKout14.88 MHzAD9208_1SYSREF
SDCLKout24.88 MHzAD9208_2SYSREF
SDCLKout34.88 MHzAD9208_3SYSREF
DCLKout8156.25 MHzFPGA MGTREFCLKGT参考时钟
SDCLKout44.88 MHzFPGASYSREF

需要特别注意的是,设备时钟和SYSREF是一一配对的。LMK04828内部可以精确控制DCLKout和SDCLKout之间的相位关系,这是普通时钟芯片做不到的。1.25GHz设备时钟用于AD9208采样,SYSREF用于触发所有AD9208的LMFC对齐。156.25MHz参考时钟刚好是6.25Gbps线速率除以40,FPGA高速收发器内部PLL可以很方便地从这个参考时钟获得线速率时钟。

2.2 用TICS Pro生成寄存器表的配置顺序

LMK04828的寄存器数量不少,手工去写非常容易出错。工程上正确做法是用TI官方的TICS Pro软件,把时钟树需求填进去,让它自动生成寄存器表和配置文件。这套配置流程里,有几个关键步骤的顺序不能乱。

第一步,在TICS Pro里选择LMK04828芯片型号,建议选B版本,相比早期版本在很多指标上有优化。第二步,配置PLL1的参考输入。这里以100MHz TCXO作为参考源,PLL1负责对参考时钟进行净化和倍频,输出给PLL2作为参考。第三步,配置PLL2。LMK04828内置VCO,通过合理设置倍频和分频系数,让VCO工作在最优频点,再分频得到1.25GHz的设备时钟。第四步,配置SYSREF。SYSREF可以选择连续模式或脉冲模式,多片同步场景下建议使用连续的SYSREF,或者由外部SYNC引脚触发一次性脉冲。

配置完成后,TICS Pro会生成一个完整的寄存器表。实际项目中,我习惯将这个寄存器表固化成数组放在FPGA的只读存储中,上电后由FPGA通过SPI接口写入LMK04828,同时用逻辑分析仪或回读方式校验写入结果。不要在Linux启动或应用程序运行后再动态配置时钟芯片,那样会引入不可控的上电时序问题。

2.3 SYSREF延时补偿与PCB走线约束

LMK04828的寄存器里有一项非常重要的配置:SYSREF的数字延时和模拟延时。这个延时的作用,是微调SYSREF边沿相对设备时钟的位置,从而补偿PCB走线带来的时间差。

工程上,我建议先在PCB布局阶段就尽量保证以下几点:所有AD9208的SYSREF走线等长;SYSREF差分对内等长;SYSREF走线远离设备时钟和其他高速数字信号,必要时加屏蔽地孔。FR4板材上信号传播速度大约6ps/mm,如果两片ADC的SYSREF走线长度差10mm,时间差就有60ps左右。这个数值在低频系统里可以忽略,但在JESD204B Subclass 1的时序预算里,已经足以造成偶发失步。

即便如此,PCB上的残差仍然存在。所以LMK04828上的SYSREF延时补偿是最后一道调节手段。具体调节方法:先用示波器双通道观察一片ADC设备时钟的上升沿和SYSREF上升沿的相位关系,再对比另一片ADC的相同信号,通过修改LMK04828对应SDCLKout的延时寄存器,把两片ADC的SYSREF边沿尽量对齐。这个过程往往需要反复迭代几次,但一旦调好,接下来很长时间都不用再动。

3. AD9208侧配置:JESD204B参数与SYSREF时序预算

3.1 线速率、帧频和LMFC的计算

在配置AD9208之前,最好先自己把线速率、帧频和LMFC算一遍。这套计算不仅决定了JESD204B参数寄存器填什么,也决定了FPGA侧GT参考时钟怎么选。

线速率的计算公式是:

线速率 = M × N' × f_s / L × 10 / 8

代入本文参数:M=2,N'=16,f_s=1.25GHz,L=8。先算有效数据率:2×16×1.25G/8=5Gbps。因为JESD204B链路采用8b/10b编码,物理线速率还要乘以10/8,得到6.25Gbps。这个速率对Xilinx 7系列GTH和UltraScale系列GTY都是很轻松的范围,眼图裕量充足。

接下来算帧频。每条lane每帧传F=4字节,每条lane的有效数据率是5Gbps,也就是625MB/s。用625MB/s除以4字节,得到帧频156.25MHz。然后K=32,LMFC就等于156.25MHz除以32,得到4.8828125MHz。这个LMFC频率就是SYSREF应该提供的频率,也是ADC内部本地多帧时钟的基准。

这套参数之间是互相咬合的,任何一个改动都会连锁影响。实际项目中,我通常先定采样率和片数,再根据FPGA的GT资源选择合适的L和F,最后反推线速率和LMFC,确保每个数值都在器件规格范围内。

3.2 SPI配置的关键设置项

AD9208的SPI寄存器是按功能模块组织的,JESD204B相关参数主要分布在链路配置寄存器区域。配置时重点检查以下几类设置。

第一类是链路基本参数。L=8,F=4,K=32,M=2,N'=16,Subclass选1。这几项必须和FPGA侧JESD204B IP核完全一致,任何一项不匹配,ILAS阶段就会卡住。第二类是SYSREF模式。启用SYSREF检测,并设置SYSREF边沿类型,通常是上升沿有效。第三类是测试模式。调试阶段强烈建议先启用JESD204B测试图形模式,让ADC输出递增斜坡或者固定图案,这样可以快速判断链路同步是否成功,而不用先处理真实采样数据的正确性。

配置顺序上,我建议先做一次软复位,然后按地址从低到高写入所有配置,写完后再配置JESD204B链路复位并重新初始化。不要在ADC转换过程中随意改写JESD204B相关寄存器,否则链路状态机会进入不可预期状态。如果回读寄存器发现某个参数没写进去,优先检查SPI时序和片选信号的电平配合,AD9208的SPI对时序要求比较严格,尤其是最后的保持时间。

3.3 SYSREF建立保持窗口分析

AD9208数据手册里会给SYSREF相对LMFC的建立时间和保持时间要求。这里有一个工程上最容易踩的坑:SYSREF并不是只要有边沿就能被正确采样,它必须落在LMFC的有效窗口内。

在我的项目里,我是这样分析时序预算的。LMK04828输出的设备时钟1.25GHz,周期800ps。SYSREF频率4.88MHz,周期约204.8ns。SYSREF信号的边沿经过PCB走线到达AD9208,AD9208内部用LMFC采样SYSREF。如果SYSREF的边沿刚好落在LMFC窗口边界附近,温度变化、电压波动都会导致采样结果不稳定,体现为偶发的同步失败。

解决思路有两层。第一层是走线等长,保证4片ADC收到的SYSREF边沿时间差尽量小。第二层是利用LMK04828的SYSREF延时调整,把SYSREF边沿放到窗口正中间。具体怎么判断是否在正中间?可以反复上下电复位,看每次同步是否都能稳定建立。如果连续几十次复位都能成功,说明SYSREF位置余量足够;如果偶尔失败,就要微调延时,每次调一个档位再测试。

4. FPGA侧:JESD204B IP核、SYNC合并与链路验证

4.1 4个IP核实例怎么配

在Xilinx Vivado环境中,JESD204B IP核是一个实例对应一条完整链路。4片AD9208需要例化4个JESD204B IP核实例,每个实例对应一片ADC的8条lane。

IP核配置界面里的核心参数,需要和ADC侧完全对应。物理层选择GT收发器,线速率填6.25Gbps,参考时钟选156.25MHz。链路层参数L=8、F=4、K=32、N'=16,Subclass选1。这里有个容易忽略的地方:IP核内部的编码方式要选8b/10b,数据位宽要和F、L匹配。如果你在IP核配置界面里看到的数据位宽是自动计算出来的,那就对了。

参考时钟的连接也要注意。LMK04828输出的156.25MHz差分时钟,需要接到FPGA的高速收发器参考时钟引脚,比如GT Bank的REFCLK引脚。在约束文件里,要显式指定这个引脚位置。如果参考时钟接错Bank或者接到普通IO上,GT完全无法工作。

4.2 同步请求的合并逻辑与端口连接(附代码)

JESD204B协议里,接收器(FPGA)通过SYNC信号通知发送器(ADC)进入ILAS同步流程。SYNC是低有效信号。当FPGA准备好接收数据时,保持SYNC为高;当FPGA需要重新同步时,拉低SYNC。

问题在于,4个JESD204B IP核实例各自输出自己的同步请求信号,但4片ADC的SYNC输入必须同时收到相同的请求。如果只把其中一片ADC的SYNC拉低,其他ADC不会进入ILAS,整个系统就会卡住。所以需要做一个同步请求合并逻辑。

Xilinx JESD204B IP核的rx_sync输出是高有效同步请求。我的合并逻辑非常简单:

wire rx_sync_0, rx_sync_1, rx_sync_2, rx_sync_3; // 任何一个IP核请求同步,都触发所有ADC的SYNC wire sync_request = rx_sync_0 | rx_sync_1 | rx_sync_2 | rx_sync_3; // JESD204B的SYNC为低有效 wire sync_n = ~sync_request; assign adc0_syncb = sync_n; assign adc1_syncb = sync_n; assign adc2_syncb = sync_n; assign adc3_syncb = sync_n;

这段逻辑的意义在于,只要有一片ADC的链路状态异常,FPGA就会同时要求所有ADC重新进入ILAS,保证四片ADC始终处于相同的同步状态。实际调试中,我曾经因为只连了一片ADC的SYNC信号,导致另外三片链路完全正常却不输出数据,查了很久才定位到问题。SYNC分配看似简单,但优先级在所有接线里算最高的。

4.3 复位顺序与上电流程

多片同步系统对上电顺序极其敏感,这在文档里往往写得不明显,但在实际项目中是绝对的经验值。我的经验是采用如下的上电复位流程。

第一步,先给LMK04828供电,由FPGA写入寄存器配置,等待LMK04828的LOCK引脚变高。这个等待时间一般需要几毫秒到几十毫秒,取决于寄存器配置和外部参考的稳定性。第二步,确认LMK04828输出稳定后,再释放AD9208的硬件复位引脚,让ADC开始初始化。第三步,FPGA侧释放JESD204B IP核的复位,GT收发器开始锁定参考时钟,同时向ADC发出SYNC请求。第四步,等待ILAS完成,检查链路状态寄存器中的同步状态位。

这里最关键的是第一步和第三步之间的等待。如果FPGA在LMK04828还没有锁定的情况下就释放JESD204B复位,GT参考时钟可能处于异常频率,之后即使时钟稳定了,链路也可能进入错误状态。可以在FPGA逻辑里做一个简单的状态机:等LMK04828的LOCK信号拉高,再延时若干毫秒,最后才释放JESD204B复位。

5. 实际调试中的三个坑与完整排查链路

5.1 坑一:LMK04828始终不锁定

现象:上电后LMK04828的LOCK引脚一直是低电平,设备时钟输出和SYSREF输出都没有波形。查了电源和参考输入,表面看起来都正常。

排查链路是这样的。第一步,用示波器看OSCin引脚的参考时钟波形,频率和幅度是否符合规格。我遇到的问题就是TCXO的输出幅度不够,LMK04828对参考输入幅度有最低要求,幅度不够时PLL1根本锁不住。第二步,回读LMK04828的寄存器,确认FPGA通过SPI写入的值真的写进去了。SPI时序问题经常导致寄存器写入一半,芯片工作状态完全错乱。第三步,逐级检查PLL1和PLL2的锁定状态寄存器,看是这两级中的哪一级没有锁定。

最终发现原因在SPI通信的时序上。我原来的SPI控制器在时钟低电平期间切换数据,但LMK04828要求数据在时钟上升沿稳定,导致部分寄存器写入了随机值。修正SPI相位之后,LMK04828正常锁定。这个坑的经验是:碰到时钟芯片不工作,先回读寄存器,别急着怀疑芯片本身损坏。

5.2 坑二:SYSREF对齐不稳定,偶发失步

现象:系统刚上电时一切正常,数据也能采到,但运行一段时间甚至只是上下电几十次,就会偶发出现四片ADC数据错位。看链路状态寄存器,有时候ILAS一直不完成,有时候虽然显示完成但数据排列不正确。

排查的第一步,是判断问题出在时钟域还是数据域。我先关了真实数据,让AD9208输出JESD204B测试图形,比如递增斜坡。然后上电复位几十次,用ILA抓取四路数据,发现错位时各路数据的起始编号不一致,说明是SYSREF对齐出了问题。

第二步,用示波器看LMK04828输出的4路SYSREF边沿,发现其中一路比另外三路晚了约100ps。原因是PCB走线长度没有完全等长,虽然布局时已经做了等长约束,但绕线的实际长度还是差了约1.7cm。

第三步,通过修改LMK04828里对应这一路SDCLKout的延时寄存器,把这路SYSREF的边沿提前,补回走线造成的差值。反复调整后,连续上下电上百次再也没有出现失步。这个坑的教训是:PCB等长设计只能保证大部分对齐,最终微调必须靠LMK04828的延时功能,这也是器件设计时预留这个功能的用意所在。

5.3 坑三:GT参考时钟对不上,CDR锁不住

现象:JESD204B IP核的GT收发器一直无法锁定,Vivado中看到的链路状态停在CDR复位阶段,rx_sync持续拉高,ILAS始终无法完成。

排查时先怀疑链路参数配置,反复比对ADC和IP核的参数,确认完全一致后问题依旧。然后用IBERT测试工程单独验证GT收发器,发现GT能正常收发随机数据,说明高速收发器本身没问题。

最后检查参考时钟频率,发现LMK04828输出的156.25MHz参考时钟误配成了150MHz。LMK04828配置工具里有一个分频比填错,导致FPGA GT的参考时钟偏了。GT的CDR对参考时钟频率非常敏感,偏离其工作范围就无法锁定。修正LMK04828的寄存器配置后,GT立即锁定,JESD204B链路正常建立。

这个坑提醒我:每次改完LMK04828配置,都必须在FPGA侧用频率计或Vivado里的时钟监测功能确认参考时钟的实际频率,不能只看软件里的配置值。

5.4 多片对齐的最终验证方法

系统调通之后,如何证明4片AD9208的数据确实对齐?我的最终验证方法分三步。

第一步,让ADC输出JESD204B递增斜坡测试图形。四片ADC的斜坡起始值应该相同,且每一路数据的递增规律一致。用ILA同时抓取四个IP核的rx_tdata,检查同一时刻的数据是否所有通道都是同一个数值。如果通道间数值差了一个固定的偏移量,说明链路都工作了,但存在帧/多帧级别的错位。

第二步,验证确定性延迟。反复上下电复位数十次,每次复位后检查四路数据的起始对齐点是否完全一致。只要有一次不一致,就说明SYSREF或者LMFC对齐还有问题,需要继续微调。

第三步,切回真实采样数据。给所有ADC输入端加上同一个正弦信号,用FPGA内部逻辑把8通道数据交叉显示,确认正弦波相位在通道间完全相同。这一步是最终验收标准,也是客户能直观看到的效果。

调试中还有一个实用技巧:在JESD204B IP核的用户逻辑里,加一个简单的one-shot标志寄存器。当LMFC边沿到来时,记录当前采集的第一个样本序号,并写入状态寄存器。这样即便不实时用ILA抓波形,也能通过读寄存器快速判断链路是否在复位后保持了对齐。

写在最后

经验这个东西,写在博客里几行就带过了,实际调的时候每一步都可能卡你好几天。我在这个项目里最有体感的一条,是SYSREF时序余量不能被“看起来能同步”骗过去。偶尔同步成功不代表设计稳定,尤其多片系统,一定要做反复上下电的老化测试。另一个建议是,所有配置参数,无论是LMK04828还是AD9208,都尽量做成FPGA可回读、可在线修改的形式,方便调试时在寄存器级别做微调。如果你正在做类似的多片AD9208同步系统,不妨从本文的参数表起步,先把单板单通道跑通,再逐步扩展到4片。等四片对齐那一刻看到数据完美同步,之前的折腾也算值了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询