1. 多ADC同步到底难在哪:从JESD204B的链路特性说起
多片ADC同步采集这件事,刚接触的时候觉得不就是让几片芯片同时采样吗,真上手才发现坑远比想象的多。尤其在JESD204B协议下,采样时刻的对齐只是第一步,真正让人头疼的是数据从ADC内部经过串行化、SerDes通道、到达FPGA或ASIC接收端之后,怎么保证每一片ADC的每一个采样点都落在同一个时间基准上。这不是调一个寄存器就能搞定的事,它涉及时钟树的拓扑设计、SYSREF信号的捕获时序、链路层确定性延迟的建立,以及接收端多通道数据的对齐重组。
JESD204B是JEDEC定义的高速串行接口标准,用来替代传统ADC的并行LVDS输出。它的核心优势是用少量高速差分对替代几十根并行数据线,大幅简化PCB布线,同时支持更高的采样率和通道密度。但代价是链路建立过程更复杂,多片ADC之间的同步需要额外的机制来保证。这个标准分三个子类:子类0不支持确定性延迟,子类1用SYSREF信号实现确定性延迟,子类2用SYNC信号实现。多ADC同步场景下,基本都选子类1,因为只有它能在多器件之间建立确定的、可重复的延迟关系。
为什么确定性延迟这么关键?打个比方,假设你有4片ADC,每片采样率1GSPS,你希望它们构成一个4GSPS的交错采样系统,或者构成一个8通道的相控阵接收前端。如果每片ADC的数据到达接收端的时间不确定,那你就不知道第1片ADC的第100个采样点和第2片ADC的第100个采样点在时间上差了多少。这个差值哪怕只有几个采样周期,在波束合成或者频谱分析时都会导致严重的相位误差。确定性延迟的意思就是:从ADC模拟输入到数字输出经过的时钟周期数是固定的、可重复的,每次上电、每次链路重建立之后这个值都一样。
多ADC同步的难点可以拆成三个层面。第一个层面是时钟对齐,也就是保证所有ADC的采样时钟同源、同相,SYSREF信号满足建立保持时间要求。第二个层面是链路对齐,也就是所有JESD204B链路的确定性延迟一致,所有通道的弹性缓冲器读写指针关系确定。第三个层面是数据对齐,也就是在接收端把多个ADC的数据按照正确的采样时刻排列好,去掉无效的填充数据,形成统一的数据流。这三个层面任何一个出问题,最终数据都会错位。
适合读这篇内容的人,应该是对JESD204B有一定了解、正在做多通道采集系统设计的硬件工程师或FPGA工程师。如果你刚开始接触JESD204B,建议先把单链路调通,理解SYSREF、SYNC、弹性缓冲这些基本概念,再来看多ADC同步的问题。如果你已经在调多片同步但数据总是对不齐,那这篇内容里的排查思路和实操细节应该能帮到你。
2. 时钟对齐:SYSREF和采样时钟的时序约束怎么算
2.1 时钟树拓扑的选择与取舍
多ADC同步的第一步是把时钟树搭对。常见的方案有三种:第一种是用一颗时钟芯片同时输出所有ADC的采样时钟和SYSREF,第二种是用一颗主时钟芯片输出参考时钟给多颗从时钟芯片,再由从时钟芯片分别给每片ADC提供时钟,第三种是用FPGA内部的MMCM或PLL生成时钟再分发。这三种方案的成本、抖动性能和同步精度差异很大。
第一种方案同步性能最好,因为所有时钟都来自同一颗芯片的内部同一个VCO,通道间的偏斜可以做到皮秒级。但缺点是时钟芯片的输出通道数有限,通常最多支持4到8路输出,而且布线拓扑要求严格等长。第二种方案适合ADC数量多的情况,但需要从时钟芯片支持零延迟模式或者外部同步功能,否则不同从芯片之间的相位关系不确定。第三种方案最省钱,但FPGA内部PLL的抖动性能通常不如专用时钟芯片,而且FPGA的时钟输出通道偏斜较大,不太适合对同步精度要求高的场景。
我个人的经验是,如果ADC数量在4片以内,优先选第一种方案,用一颗高性能时钟芯片搞定所有时钟。如果超过4片,考虑用第二种方案,但一定要选支持JESD204B同步的时钟芯片,它们通常有专门的SYSREF生成和相位对齐功能。第三种方案只适合对同步精度要求不高的场合,比如采样率低于100MSPS、通道间相位误差允许在纳秒级的情况。
时钟树设计还有一个容易忽略的点:SYSREF和采样时钟的走线要等长。SYSREF是低频信号,很多人觉得它不需要等长,但实际上SYSREF的边沿位置决定了ADC内部时钟分频器的复位时刻,如果SYSREF到达不同ADC的时间不一致,那不同ADC的内部分频器复位时刻就不同,确定性延迟就建立不起来。一般要求SYSREF走线和采样时钟走线的长度差控制在5mm以内,对应大约30ps的偏斜。
2.2 SYSREF的时序窗口计算
SYSREF和采样时钟之间的时序关系是时钟对齐的核心。JESD204B标准要求SYSREF在采样时钟的上升沿附近满足建立保持时间,具体参数要看ADC的数据手册。以典型的ADC为例,假设采样时钟频率为1GHz,周期1ns,SYSREF的建立时间要求是200ps,保持时间要求是200ps,那SYSREF的有效窗口就是采样时钟上升沿前后各200ps,总共400ps的窗口。
这个窗口看起来挺宽,但实际调试时你会发现很难同时满足所有ADC的要求。原因有两个:一是时钟芯片输出的SYSREF和采样时钟之间的偏斜会随温度变化,二是PCB走线的偏斜和连接器的阻抗不连续会导致信号边沿变缓,等效的建立保持时间变差。我实测过,在室温下调好的时序,到了85度可能就失效了。
解决办法是在时钟芯片内部调整SYSREF的延迟。大多数支持JESD204B的时钟芯片都有SYSREF延迟调整功能,步进精度通常在10ps到50ps之间。调试时可以用示波器同时抓采样时钟和SYSREF,观察SYSREF边沿是否落在采样时钟上升沿的窗口内。如果没有示波器,也可以用ADC内部的SYSREF捕获状态寄存器来判断,大多数ADC都有SYSREF捕获成功或失败的标志位。
注意:SYSREF是周期性信号还是单脉冲信号,取决于ADC的配置。有些ADC要求SYSREF是单脉冲,有些要求是周期性信号。如果配错了,链路可能能建立但确定性延迟不确定。建议先查数据手册确认。
2.3 采样时钟的抖动要求
多ADC同步对采样时钟的抖动要求比单ADC更高。原因很简单:如果采样时钟有抖动,每个ADC的采样时刻都会随机偏移,虽然确定性延迟保证了平均延迟一致,但瞬时采样时刻的偏差会导致通道间的相位噪声恶化。对于相控阵或者波束合成应用,通道间相位噪声直接决定了波束指向精度和旁瓣电平。
采样时钟的抖动要求可以用一个简单公式估算:如果系统要求通道间相位误差小于1度,在1GHz输入信号下,对应的时序误差是1/(360*1e9)秒,大约2.8ps。这个2.8ps是总抖动预算,包括时钟芯片的抖动、PCB走线的偏斜、ADC内部采样保持电路的孔径抖动。通常时钟芯片的抖动要控制在100fs以内,PCB偏斜控制在1ps以内,剩下的留给ADC内部。
选时钟芯片时,不要只看数据手册标称的抖动值,要看它在你的具体频率下的抖动。有些芯片在100MHz时抖动很好,到了1GHz就恶化了。另外要注意抖动指标是RMS还是峰峰值,RMS抖动要乘以一个系数(通常6到14,取决于误码率要求)才能换算成峰峰值。
3. 链路对齐:确定性延迟的建立与弹性缓冲的配置
3.1 确定性延迟的建立过程
确定性延迟的建立是JESD204B子类1的核心机制。整个过程可以分成几个阶段:代码组同步、初始通道对齐、用户数据阶段。代码组同步阶段,接收端发送SYNC请求,发送端发送K28.5字符,接收端检测到足够数量的K28.5后释放SYNC。初始通道对齐阶段,发送端发送ILA序列,接收端用ILA序列对齐所有通道的帧边界。用户数据阶段,发送端开始发送实际数据,接收端用弹性缓冲器吸收时钟域差异。
确定性延迟的关键在于:从SYSREF有效到ILA序列结束,这段时间的时钟周期数是固定的。接收端通过测量这个周期数,就能知道每个通道的延迟是多少,然后在弹性缓冲器里做相应的延迟补偿。如果所有通道的延迟测量值一致,那多通道数据就是对齐的。如果不一致,就需要调整发送端或接收端的延迟参数。
实际调试时,确定性延迟建立失败的典型表现是:链路能建立,数据能收到,但每次上电后通道间的延迟关系不一样。这说明SYSREF的捕获时刻不确定,或者弹性缓冲器的读写指针关系不确定。排查方法是读ADC的延迟测量寄存器和FPGA的弹性缓冲状态寄存器,看每次上电后的值是否一致。
3.2 弹性缓冲器的深度选择
弹性缓冲器的作用是吸收发送端和接收端之间的时钟域差异。JESD204B的发送端和接收端通常使用不同的时钟源,虽然频率相同,但相位关系不确定。弹性缓冲器通过读写指针的差值来补偿这个相位差。缓冲器深度选得太小,可能不够吸收相位差;选得太大,延迟增加,而且可能引入不必要的抖动。
缓冲器深度的选择取决于两个因素:一是发送端和接收端时钟的频率精度,二是SYSREF的周期。如果发送端和接收端用的是同一颗时钟芯片输出的时钟,那频率完全一致,缓冲器深度可以很小,通常4到8个帧周期就够了。如果用的是不同的时钟源,频率可能有ppm级的差异,缓冲器深度要足够大,保证在SYSREF周期内不会溢出或读空。
我一般建议缓冲器深度设为SYSREF周期的1.5到2倍。比如SYSREF周期是1ms,采样率1GSPS,帧周期是1us,那缓冲器深度设为1500到2000个帧周期。这样即使时钟有±100ppm的偏差,在1ms内累积的相位差也只有100ns,远小于缓冲器深度对应的延迟。
提示:弹性缓冲器的读写指针关系可以通过FPGA的JESD204B IP核状态寄存器读取。如果读指针追上写指针或者写指针超过读指针一圈,说明缓冲器深度不够或者时钟偏差太大。
3.3 多链路之间的延迟匹配
多片ADC同步时,每片ADC对应一条或多条JESD204B链路。每条链路的确定性延迟可能不同,因为不同ADC的SYSREF捕获时刻可能有差异,不同链路的走线长度也可能不同。接收端需要测量每条链路的延迟,然后以最大的延迟为基准,给其他链路增加延迟补偿。
延迟补偿的实现方式有两种:一种是在发送端调整,通过配置ADC的延迟参数来增加延迟;另一种是在接收端调整,通过配置FPGA的弹性缓冲器读写指针来增加延迟。发送端调整的精度通常更高,因为ADC内部的延迟调整步进可以做到一个采样周期甚至更小。接收端调整的精度受限于帧周期,通常是一个帧周期。
实际操作中,我倾向于在接收端做粗调,在发送端做细调。先用接收端的弹性缓冲器把各链路的延迟差调到小于一个帧周期,再用发送端的延迟参数把残余的延迟差调到零。这样既能保证精度,又能避免发送端延迟参数过大导致链路不稳定。
4. 数据对齐:接收端多通道数据的重组与验证
4.1 多通道数据重组的实现
数据对齐是最后一步,也是最能体现调试功力的一步。接收端从多条JESD204B链路收到数据后,需要按照正确的采样时刻排列成统一的数据流。如果前面两步做得好,这一步其实很简单:每条链路的数据已经是确定性延迟的,只需要按照链路编号和采样时刻拼接就行。但如果前面两步有残余误差,这一步就需要做额外的对齐。
多通道数据重组的常见做法是在FPGA内部用一个多通道FIFO或者一个共享的RAM。每条链路的数据先写入各自的FIFO,然后一个对齐状态机从各个FIFO读取数据,按照采样时刻排列后写入共享RAM。对齐状态机的触发信号通常来自SYSREF或者一个全局的同步脉冲。
实现时要注意FIFO的深度和读写时钟域。如果各链路的时钟是同源的,可以用同一个时钟读写,FIFO深度可以很浅。如果时钟不同源,需要做跨时钟域处理,FIFO深度要足够大,而且要用异步FIFO。另外要注意FIFO的空满标志,避免读空或写满导致数据错位。
4.2 数据对齐的验证方法
数据对齐做完了,怎么验证对不对?最直接的方法是用一个已知信号输入所有ADC,然后看接收端的数据是否一致。比如输入一个正弦波,看各通道的采样值是否相同。如果通道间有固定的相位差,说明延迟没对齐;如果相位差随机变化,说明确定性延迟没建立。
更严格的验证方法是用一个脉冲信号。脉冲信号的边沿很陡,如果通道间有采样时刻偏差,脉冲在数据上会表现为不同的采样值。比如脉冲宽度是1ns,采样率是1GSPS,那脉冲只出现在一个采样点上。如果通道对齐,所有通道的脉冲都出现在同一个采样点索引上。如果不对齐,脉冲会出现在不同的索引上。
还有一种方法是做FFT分析。输入一个单音信号,看各通道的FFT结果。如果通道对齐,各通道的频谱应该完全重合。如果不对齐,通道间会有相位差,FFT的相位谱会不同。对于多通道系统,还可以看通道间的相关性,对齐好的通道相关性应该接近1。
注意:验证时要用相干采样,也就是输入信号频率和采样率要满足相干条件,否则FFT会有频谱泄漏,影响判断。相干条件是一个采样周期内的信号周期数是整数。
4.3 常见的数据对齐问题与排查
数据对齐最常见的问题是通道间有固定的采样点偏移。比如通道1的数据比通道2早一个采样点。这种问题通常是因为某条链路的确定性延迟比其他链路少了一个帧周期。排查方法是读各链路的延迟测量寄存器,看差值是否等于一个帧周期。如果是,在接收端给延迟小的链路增加一个帧周期的缓冲延迟。
另一个常见问题是通道间有随机的采样点偏移。这种问题通常是SYSREF捕获不稳定导致的。排查方法是读ADC的SYSREF捕获状态寄存器,看是否有捕获失败或捕获窗口告警。如果有,调整SYSREF的延迟或改善SYSREF的信号质量。
还有一种问题是数据对齐在常温下正常,高温下失效。这通常是时序余量不够导致的。SYSREF的建立保持时间、弹性缓冲器的读写余量、FIFO的空满余量都会随温度变化。解决办法是增加时序余量,比如增大弹性缓冲器深度、调整SYSREF延迟、降低采样率。
5. 实操过程:从零搭建一个4片ADC同步采集系统
5.1 硬件设计与时钟树搭建
假设我们要搭建一个4片ADC同步采集系统,每片ADC采样率1GSPS,12位分辨率,JESD204B子类1接口,每片ADC有2条lane,总共8条lane连接到FPGA。时钟方案选一颗支持JESD204B的时钟芯片,输出4路采样时钟和1路SYSREF。
硬件设计要点:采样时钟走线要等长,长度差控制在2mm以内;SYSREF走线也要等长,长度差控制在5mm以内;采样时钟和SYSREF要走同一层,参考同一地平面,避免阻抗不连续;JESD204B的差分对要走100欧姆差分阻抗,长度差控制在1mm以内;FPGA的参考时钟要单独走线,避免和采样时钟串扰。
电源设计也要注意。ADC的模拟电源和数字电源要分开,用磁珠或电感隔离。时钟芯片的电源要特别干净,最好用LDO供电,避免开关电源的纹波影响抖动性能。FPGA的JESD204B收发器电源也要干净,否则会影响误码率。
5.2 FPGA接收端配置
FPGA端用JESD204B IP核接收数据。配置步骤:先设置IP核的lane数、帧周期、每帧的采样数等参数,要和ADC的配置匹配;然后设置弹性缓冲器的深度,建议设为SYSREF周期的1.5倍;再设置SYSREF的捕获模式,通常选单脉冲或周期性,取决于ADC的配置;最后设置多通道对齐模式,使能跨链路的延迟补偿。
配置完成后,先做链路建立测试。用FPGA的ILA或者逻辑分析仪抓JESD204B的SYNC信号和SYSREF信号,看链路是否能正常建立。如果链路建立失败,检查时钟频率、SYSREF时序、lane极性等。链路建立成功后,读延迟测量寄存器,看各链路的延迟值是否一致。
5.3 同步性能测试与调优
链路建立后,做同步性能测试。输入一个1GHz的单音信号,用信号源功分到4片ADC的模拟输入。采集数据后做FFT,看各通道的频谱是否重合。如果重合,说明同步成功。如果不重合,看相位差是否固定。固定相位差说明延迟没对齐,随机相位差说明确定性延迟没建立。
调优步骤:先调SYSREF延迟,用示波器观察SYSREF和采样时钟的时序关系,确保SYSREF边沿落在采样时钟上升沿的窗口内;再调弹性缓冲器深度,确保读写指针有足够的余量;最后调发送端延迟参数,把各链路的延迟差调到零。调优后要做温度测试,从-40度到85度,看同步性能是否稳定。
6. 常见问题速查与避坑经验
6.1 链路建立失败排查表
| 现象 | 可能原因 | 排查方法 |
|---|---|---|
| SYNC一直不释放 | 时钟频率不对 | 测采样时钟频率是否等于ADC配置值 |
| SYNC释放但无数据 | lane极性反了 | 交换差分对的P/N或者配置lane极性反转 |
| 数据有误码 | 均衡器配置不对 | 调整FPGA收发器的均衡器参数 |
| 链路时好时坏 | SYSREF时序余量不够 | 调整SYSREF延迟,增加时序余量 |
| 多链路延迟不一致 | SYSREF到达时间不同 | 检查SYSREF走线等长,调整各链路延迟 |
6.2 数据对齐失败排查表
| 现象 | 可能原因 | 排查方法 |
|---|---|---|
| 通道间固定偏移 | 弹性缓冲器深度不一致 | 读各链路缓冲器状态,统一深度 |
| 通道间随机偏移 | SYSREF捕获不稳定 | 读SYSREF捕获状态,调整延迟 |
| 高温下偏移 | 时序余量不足 | 增加缓冲器深度,降低采样率 |
| 数据周期性错位 | 帧边界对齐错误 | 检查ILA序列,重新建立链路 |
| 通道间相位噪声大 | 采样时钟抖动大 | 换低抖动时钟芯片,改善电源 |
6.3 独家避坑经验
第一个坑:SYSREF的走线不要和采样时钟走同一对差分线。有些人为了省事,把SYSREF和采样时钟做成一对差分信号,结果SYSREF的边沿被采样时钟调制,导致捕获不稳定。SYSREF一定要单独走线,最好走内层,两边包地。
第二个坑:弹性缓冲器的深度不要设得太大。设得太大虽然能吸收更大的时钟偏差,但会增加延迟,而且可能引入不必要的抖动。我一般设成SYSREF周期的1.5倍,实测下来很稳。
第三个坑:调试时不要只看FPGA的链路状态寄存器,要用示波器看实际信号。链路状态寄存器说链路建立了,不代表时序余量够。我遇到过链路状态正常但高温下误码率飙升的情况,后来用示波器看眼图才发现时序余量只有几十皮秒。
第四个坑:多片ADC的SYSREF最好用同一颗时钟芯片输出。如果用不同的时钟芯片,即使参考时钟同源,SYSREF的相位关系也可能不确定。我试过用两颗时钟芯片分别给两片ADC提供SYSREF,结果每次上电后通道间的延迟关系都不一样。
第五个坑:PCB布局时,JESD204B的差分对要远离时钟线和电源线。JESD204B的速率很高,通常在10Gbps以上,很容易受到干扰。我一般要求差分对和其他信号线的间距至少3倍线宽,和电源线的间距至少5倍线宽。
6.4 工具与仪表推荐
调试JESD204B多ADC同步,必备的工具包括:高带宽示波器(至少16GHz带宽,用于看JESD204B眼图)、相位噪声分析仪(用于测采样时钟抖动)、信号源(用于产生测试信号)、频谱分析仪(用于看FFT结果)。如果预算有限,至少要有示波器和信号源,其他可以用FPGA内部的ILA和FFT IP核替代。
FPGA厂商的JESD204B IP核通常自带调试功能,比如Xilinx的JESD204B IP核有链路状态寄存器和误码率统计,Intel的JESD204B IP核有眼图扫描功能。这些功能可以大大简化调试过程,建议充分利用。
7. 多ADC同步的扩展应用与进阶方向
多ADC同步不只是把几片ADC的数据对齐,它还有很多扩展应用。比如时间交织采样,用多片ADC交替采样,等效提高采样率。时间交织对同步精度的要求更高,通道间的采样时刻偏差要控制在几十飞秒以内,否则会引入杂散。实现时间交织需要在时钟树里做精确的相位调整,通常用时钟芯片的相位延迟功能。
另一个扩展应用是相控阵接收前端。多片ADC同步采集后,在数字域做波束合成。波束合成的精度取决于通道间的相位一致性,而相位一致性又取决于采样时刻的对齐精度。对于窄带信号,采样时刻偏差可以用数字相位补偿来校正;对于宽带信号,采样时刻偏差会导致波束偏斜,必须从时钟对齐入手解决。
进阶方向还包括多板同步。如果ADC数量超过单板的容量,需要多块板卡级联。多板同步的难点是板间时钟和SYSREF的分配。通常用一颗主时钟芯片输出参考时钟和SYSREF到各从板,从板用零延迟缓冲器恢复时钟和SYSREF。板间走线要等长,连接器要选低偏斜的。我做过一个8板级联的系统,板间偏斜控制在10ps以内,同步性能满足相控阵的要求。
最后再分享一个小技巧:调试多ADC同步时,先用一个低频信号(比如10MHz)做初步验证,因为低频对时序偏差不敏感,容易调通。调通后再换高频信号做精细调整。这样可以把问题分离开,先解决链路建立和数据对齐的问题,再解决时序精度的问题。