
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周期1nsSYSREF的建立时间要求是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采样率1GSPS12位分辨率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做初步验证因为低频对时序偏差不敏感容易调通。调通后再换高频信号做精细调整。这样可以把问题分离开先解决链路建立和数据对齐的问题再解决时序精度的问题。