ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

AD9694高速ADC的JESD204B链路调试实战:从时钟计算到排障

AD9694高速ADC的JESD204B链路调试实战:从时钟计算到排障 最近连续几个项目都在和AD9694打交道顺带还帮客户远程排查过几块板卡。这块四通道14位500MSPS的高速ADC论性能在同类产品里确实很能打特别是配上JESD204B接口以后数据搬移压力小了很多。不过也正因为JESD204B调试起来的难度和普通并行ADC完全不在一个量级——并行ADC拿逻辑分析仪一抓就能看数据JESD204B要是链路没建立起来你连个波形都看不见。这几天正好把手头调试AD9694的完整思路整理出来给在FPGA上做高速采集的工程师做个参考。这篇文章更适合手里已经有AD9694硬件、正在为链路调不通而头疼的人也适合刚接手同事留下“坏板子”准备接手救火的兄弟。我会按实际调试的顺序来写从硬件上电前的自查到SPI寄存器配置再到JESD204B链路建立的三阶段以及最后数据异常时的分层排查方法。每一节都会给出我在现场实际用过的判断依据和操作习惯争取让看完的人能直接照着排。1. 上电前就该确认的硬件细节比代码更早的坑1.1 时钟树方案不是“配出来”的是“算出来”的很多人拿到板卡第一件事就是打开Vivado或者Quartus写逻辑但我建议先把时钟树算一遍。AD9694的JESD204B接口对线速率lane rate有硬性上限手册上写的是最高大约4.9Gbps。这个数字直接决定了你的采样率能不能开满。线速率的简化计算公式大概是LineRate (FS × M × N × 10 / 8) / L其中FS是采样率M是转换通道数N是ADC分辨率位数L是使用的lane数量。注意10/8是8B/10B编码带来的开销。举个例子如果你用AD9694四通道全开、每通道独占一个lane也就是M4、L4、N14那么当采样率FS250MHz时LineRate 250e6 × 4 × 14 × (10/8) / 4 4.375Gbps这个值落在4.9Gbps以内是安全的。但如果把采样率提到500MHz同样的配置下就要8.75Gbps直接超了上限链路上绝对跑不起来。有人把寄存器翻来覆去改链路就是死活过不去最后才发现是硬件方案本身就定了死路。这时候只有两条路要么降采样率要么用芯片内部的DDC数字下变频抽取降数据率。所以拿到硬件先别急着写代码先看原理图上的采样时钟源能提供多大频率算清楚当前配置下的线速率是否在芯片和FPGA高速收发器的能力范围内。这个计算花不了两分钟却能在后面省下几个通宵。1.2 电源上电时序和纹波链路误码的隐形推手AD9694有多组电源轨模拟、数字、IO分开供电常见的电压值在1.1V、1.8V、2.5V这几档。调试时不要只看电压对不对还要看三件事上电时序、纹波、电源地与模拟地的分割。上电时序这方面手册里通常有明确规定比如模拟电源要先于数字电源稳定IO电源可以后上。如果你的板卡是用FPGA的GPIO控制LDO的使能脚来时序那就要检查FPGA配置里的上电顺序别让LDO在上电瞬间出现电压倒灌。我遇到过一块板子是DVDD和AVDD1从同一个LDO输出上电瞬间模拟电源先起来结果ADC内部LDO烧了整个芯片摸上去发烫这种属于硬件损伤代码再怎么写都没用。纹波这块就更隐蔽了。JESD204B误码有一个很常见但容易忽视的来源就是电源瞬态跌落板子上某个大电流器件突然开启ADC的模拟电源瞬间掉个几十毫伏高速收发器的CDR就可能滑码表现出来就是间歇性CRC错误或者偶尔的误码。排查这类问题时不要一上来就怀疑FPGA代码先把各路电源纹波用示波器抓一遍AC耦合关闭20MHz带宽限制看高频噪声幅度。正常来说开关电源纹波一般要控制在几十毫伏以内如果看到上百毫伏的尖峰先处理电源再调链路。1.3 复位引脚和SPI电平域最简单的检查项AD9694的RESETB引脚是低有效复位上电后要保证这个脚有一个干净的低电平脉冲然后再释放。有些板子为了省一根线把复位脚直接接到FPGA的普通GPIO上。FPGA如果配置成开漏输出外部又没加上拉电阻复位释放时电平可能是浮空状态芯片会随机进入不正常的工作模式后续SPI怎么配都不对。SPI电平域同样值得检查。AD9694的SPI接口电平由VDDIO电压决定常见有1.8V和3.3V两种配置。FPGA那边对应的BANK电压必须和VDDIO匹配否则SPI回读数据会乱码。一个实际经验如果SPI读Chip ID读出来的值在跳变一会儿对一会儿错先量FPGA银行电压和AD9694的VDDIO是不是一致别急着怀疑代码。2. SPI配置阶段能回读才算真的写进去2.1 上电后的软复位和等待时间上电后不要急着配寄存器。ADC内部有上电复位逻辑但有时候会因为电源爬坡太慢或者其他原因没有完全复位干净。我的习惯是上电后先对SPI复位寄存器写一次软复位命令然后等足够长的时间我一般等100微秒以上再读一次Chip ID确认芯片已经回到默认状态。这样做的原因是芯片内部的状态机在复位释放后需要一段时间恢复如果复位后立刻开始写寄存器某些内部模块可能还没准备就绪导致配置丢失。如果你跳过这一步后面配置完寄存器发现链路不通回头排查时很难判断是配置写错了还是初始状态就乱了。软复位之后读ID确认返回值正常再进入正式配置流程这个习惯能帮你把“配置前状态”这个变量固定住。2.2 关键寄存器分块时钟、通道、JESD参数各司其职AD9694的SPI寄存器Map虽然多但调试时可以分成几个功能块来对照检查。第一块是时钟分配。这部分主要配置采样时钟的分频关系、内部PLL的工作模式。配置完之后需要检查PLL锁定状态位如果PLL没有锁定后面JESD链路无论怎么配都起不来。PLL锁定寄存器要回读确认不要写完就当它锁定了。第二块是通道配置。每个通道可以独立配置成正常工作模式、PRBS测试模式、斜坡测试模式等。调试初期我建议先把所有通道配置成斜坡测试输出这样链路通了以后马上能验证数据映射是否正确。后面要测误码时再切到PRBS模式。第三块是JESD204B接口配置。这里包括L值、M值、F值、S值等参数以及Subclass模式0还是1、ILAS使能等。这些参数直接决定了FPGA侧IP核的配置两边设置不一致时链路会建立失败或者建立成功但数据解析完全错位。需要特别提醒的是每一块配置完都要回读验证。AD9694的寄存器有些是只读的有些位是保留的写入值必须和手册一致。如果写入一个保留位导致芯片行为异常回读比对时能立刻发现而不是等到链路起不来再来回翻手册。2.3 回读校验SPI调不通时先降速我调试任何带SPI接口的ADC都有一条铁律写完关键配置立即回读并比对。写进去的数据和读出来的数据不一致最常见的原因是SPI时钟太快导致时序裕量不够。调试初期把SCLK降到1MHz甚至更低确认SPI通路本身没问题之后再逐步把频率提上去。第二个常见原因是SPI的工作模式没配对。AD9694默认是四线SPI还是三线取决于硬件引脚配置SDIO方向切换的时序如果不对回读时就会读到垃圾数据。我遇到过一整个晚上都在纠结寄存器写不进最后发现是控制SDIO方向的那个GPIO在FPGA里初始化和芯片默认模式不一致。还有一个容易被忽略的问题SPI字节顺序。有些寄存器地址是多字节的高位在前还是低位在前取决于芯片手册定义。如果你按高地址在前的方式写芯片却按低地址在前解析很多配置会落到错误的寄存器里。这个只能通过回读来发现也是我坚持回读比对的原因。3. JESD204B链路建立三阶段CGS、ILAS和数据3.1 CGS阶段先看到K28.5再说AD9694配置完成之后FPGA侧的JESD204B IP开始尝试接收。链路建立的第一阶段叫代码组同步CGSADC会持续发送K28.5字符FPGA高速收发器需要检测到这个逗号序列并完成字节对齐。这个阶段在Xilinx FPGA上主要看GT/GTH的rxbyteisaligned信号能不能拉起来。如果这个信号一直无效说明CDR没有锁定到正确的线速率或者字节边界一直找不到。多数情况下问题出在物理层线速率配置错了、参考时钟refclk没给对、差分极性接反了。极性接反这个比较隐蔽因为如果收发器支持极性翻转你还能看到K字符但数据内容会错位。检查方法是先看rxcommadet是否检测到了逗号如果检测到了但字节对齐上不去试试在IP核里把RX极性翻转一下。调试时我习惯先把线速率逐步降低比如从4.375G降到2.5G看CGS能不能过。如果降速后能过说明链路物理层基本正常问题多半在配置参数或者信号完整性上。如果降速后还是过不去优先检查refclk有没有真正送到GT/GTH的专用时钟引脚上。3.2 ILAS阶段逐字节核对别放过任何一位CGS通过后链路进入ILAS阶段。ILAS多帧序列里携带了发送端ADC配置的实际参数包括版本号、L值、M值、F值、S值、N值、N值等。这些参数会在ILAS中以固定的字节排列顺序发出来。这一步的排查方法是用FPGA的逻辑分析仪ILA抓下rx_tdata把ILAS阶段的字节逐一对上手册里的ILAS字段定义。重点核对几个关键字段是否和你在AD9694里配的参数一致同时也和FPGA侧JESD204B IP核GUI里填的参数一致。三方一致时链路才能保证按预期工作。这里我踩过最深的一个坑是N和N的理解。AD9694是14位ADC但JESD204B传输时可能用16位格式N16多余的bit是填充位或者控制位。如果FPGA侧按14位去切数据而ADC配置成16位格式ILAS里看起来参数“差不多”实际数据解析会全部错位。这种问题在ILAS阶段就能发现前提是你愿意花时间逐字节比对而不是看到链路起来了就直接采集数据。3.3 数据阶段用PRBS和斜坡测试把问题隔离干净ILAS通过后链路进入正常数据传输阶段。这时候如果你的通道配置成PRBS模式FPGA端会持续收到一串伪随机码。在FPGA里写一个简单的PRBS校验器持续统计错误bit数量如果长时间运行错误数为0说明物理链路和协议链路都干净。如果PRBS测试有误码先看误码率是高还是低。高频次连续误码优先怀疑线速率配置、refclk质量、电源纹波偶尔一两比特错误优先怀疑信号完整性、地弹、连接器接触甚至温度漂移。这个阶段需要耐心最好连续跑一两个小时观察误码趋势。PRBS通过后把ADC通道切成斜坡测试模式。此时数据应该是一个固定步进递增的序列。FPGA端检查数据是否严格递增能顺便发现字节序、位序、通道映射错误。比如MSB和LSB颠倒、两个lane的数据接反、某个通道的采样值被切成了另一个通道拼接的数据等等。这些映射问题在PRBS测试下不一定能暴露但斜坡测试一眼就能看出来。4. SYSREF、确定性延迟和多片同步你需要了解的进阶细节4.1 SYSREF时序Subclass 1模式的关键如果你的系统要求每次上电采集到的数据相位完全一致也就是要求确定性延迟那AD9694必须工作在Subclass 1模式此时SYSREF信号是必需的。SYSREF必须和采样时钟同源否则即使频率一样相位上没有对齐关系每次上电的延迟都会不一样。SYSREF的脉冲宽度很关键。它需要满足芯片内部采样窗口的要求通常是至少跨越一个帧周期或多帧周期。如果SYSREF脉冲太窄芯片内部的捕获逻辑可能采不到或者采到的位置不稳定导致链路虽然能建立但延迟不确定。检查SYSREF时用示波器看它的沿和采样时钟沿之间的相对位置确认满足手册里的建立保持时间要求。我调试时遇到过一种很典型的情况SYSREF的来源是板上一个独立时钟缓冲器而不是从采样时钟路径分出来的结果SYSREF频率完全正确但每次上电后链路延迟都在跳无法复现。后来把SYSREF改为从和采样时钟同源的时钟芯片输出问题立刻消失。多点同步的板卡SYSREF的PCB走线长度、注入点位置都会影响最终延迟一致性这些都值得留意。4.2 QBD校准多片同步容易被忽略的最后一环QBDQuad Boundary Delay校准是AD9694调试中很容易被跳过的一步。即使SYSREF过来了芯片内部跨lane的缓冲器如果没对齐到正确的边界不同lane的数据可能相差几个采样时钟周期。对单芯片单代数据来说这个误差不一定能看出问题但对多片同步或者要求严格采样时间对齐的系统来说这个误差是致命的。QBD校准要严格按照手册流程走配置SYSREF捕捉窗口、发送SYSREF、读取芯片内部校准结果、把计算出的偏置值写回寄存器。整个流程看起来繁琐但其实就是几个寄存器的读写操作。调试时建议用一个专门的函数实现把每一步的中间状态都打印出来这样哪一步没走通能立刻定位。实测下来很多板卡做多片同步时JESD链路本身都通了但各路数据的时间戳对不齐查来查去最后发现就是QBD校准值没有写。这个坑藏得很深因为链路层面是完全正常的数据也在正确流动只是时间对齐有问题。4.3 单板调试时怎么简化SYSREF如果你的板卡就是单芯片也不做多板同步可以暂时用Subclass 0模式把链路先跑起来这时候不需要SYSREF也能正常工作。这个“简化模式”能帮你先去掉一个变量把电源、SPI、JESD本身调干净。等主链路完全稳定了再切到Subclass 1模式把SYSREF加回来单独验证确定性延迟。这样做的目的是降低调试复杂度。JESD204B链路本身已经够多变量了如果一开始就要同时保证SYSREF时序排查问题时往往分不清是SYSREF的问题还是链路配置的问题。先把链路跑通再逐步加入同步要求每步只引入一个新变量定位问题会容易得多。5. 数据异常后的分层排查先把问题归位再动手5.1 按现象归类再决定从哪里查数据异常的表现形式五花八门但背后的原因往往集中在几个层面上。我一般按照下面的对应关系来入手排查。现场现象最可能问题层面优先检查内容SPI完全无响应电平域/硬件连接VDDIO与FPGA银行电压匹配、SCLK时序、SDIO方向SPI能写但回读乱码SPI电气层SCLK速率、走线长度、参考地回路CGS一直过不去物理层/时钟层线速率计算、refclk是否到位、极性配置、电源纹波CGS过但ILAS不对协议层配置AD9694寄存器与FPGA IP参数、ILAS字段逐字节比对链路建立但数据跳变信号完整性/同步电源瞬态跌落、SYSREF时序、QBD校准值、连接器接触数据稳定但数值错乱数据映射层斜坡测试检查位序、字节序、lane映射、N/N宽位差这张表的价值在于先把问题限定到某个层面。很多人一上来就改FPGA逻辑改半天发现其实问题是电源纹波引起的误码浪费时间还越改越乱。5.2 DDC模式下的数据宽度变化使用AD9694内置DDC功能时输出数据的有效位宽和格式会发生变化。DDC做抽取滤波后每个通道的数据可能不再是14位而是16位甚至更宽。ILAS里的N值和N值会相应变化FPGA侧解析时如果不按新的位宽去切数据就会错位。我在实际调试中见过一个典型例子DDC开启后数据看起来“像模像样”但每隔固定字节就会出现一个跳变点逻辑上像是拼接错误。最后发现是FPGA端还在按14位切数据而DDC输出的有效位已经变成了16位切分边界全乱了。所以只要用了DDC一定要回看ILAS里实际的N/N值以ILAS上报的参数为准来配置FPGA侧的解析逻辑。5.3 坚持做调试记录表每次只改一个变量最后分享一个习惯调试JESD204B这类复杂链路时一定做个简单的调试记录表。每做一次修改记录三件事修改前现象、修改了什么、修改后结果。不需要花哨的工具Excel甚至一张纸都行。这样做的好处很明显。JESD204B涉及的变量太多了电源、时钟、SPI寄存器、FPGA IP参数、SYSREF时序、QBD校准任何一个变化都可能影响链路状态。如果不记录你改了A又改B链路忽然通了但你不确定到底是哪个改动生效的下次再出问题还是一脸懵。而每次只改一个变量配合记录表基本能把复位原因稳定定位到具体某一步。以我实际调过的板卡来看按照“硬件自查→时钟计算→SPI回读→JESD链路三阶段→SYSREF/QBD→分层排障”这个顺序走绝大多数问题都能在几小时内定位到根因。相反一上来就怀疑FPGA逻辑、四处乱改参数往往会把问题搞得更复杂。AD9694本身是个可靠的芯片链路不通大概率是周边环境的问题而不是芯片本身的问题。调试时把注意力分配在物理层和配置层比在逻辑里反复绕圈要有效得多。
返回列表