ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

FPGA驱动AD9653多通道高速ADC采集设计与调试实战

FPGA驱动AD9653多通道高速ADC采集设计与调试实战 做了这么多年FPGA数据采集项目被高速ADC折磨过无数次之后我越来越觉得“设计”和“调试”其实是同一件事——设计时没想清楚的问题迟早会在调试桌上加倍还给你。这次记录一下AD9653这颗4通道16bit 125MSPS ADC在FPGA平台上从原理图到逻辑、从空板到拿到干净频谱的全过程把其中踩过的坑、算过的参数、验证过的流程都拆开说清楚。如果你正在做多通道高速采集、软件无线电接收机或者超声类前端信号处理这篇文章应该能帮你少走不少弯路。1. 项目整体设计与方案选型思路1.1 为什么选AD9653多通道与LVDS接口的双重考量AD9653最吸引人的一点是在单颗芯片里集成了4个独立的16bit ADC通道采样率最高125MSPS。对多通道波束成形、相控阵接收或者多路射频解调这种场景来说4通道意味着能把板面积缩小将近四倍同步性也比拼凑多颗单通道ADC要容易得多。当然选它也不是只看通道数16bit量化精度在这个量级上是硬指标动态范围直接决定了后端能分辨多小的信号。另一个关键因素是输出接口。AD9653采用LVDS差分输出每通道5对数据线加上DCO和FCO全速模式下数据率不算夸张对中高端FPGA来说用普通IO就能接收不必非得动用JESD204B那种高速串行接口。JESD204B虽然线少、速率高但调试复杂度也高了不少要处理多通道对齐、确定性延迟、时钟恢复这些麻烦事。而在AD9653这种并行LVDS结构下时钟和数据的关系更直白FPGA侧用原语直接采样出问题的时候排查起来也友好。功耗方面也要算一笔账。4通道全速工作时AD9653总功耗大约在1.3W量级这个数值在系统设计时直接影响电源方案和散热设计。如果换成两颗双通道ADC功耗和面积都会成倍增加这也是我最终坚持用AD9653的一个重要原因。1.2 系统架构模拟前端到FPGA数据通路的完整链路整个采集链路的架构其实不复杂但每个环节都有讲究。信号从SMA座进来经过巴伦或差分驱动电路进入AD9653的模拟输入端芯片内部完成采样量化后通过LVDS总线送给FPGA。FPGA内部要做的事情包括LVDS接收、位对齐、通道同步、采样数据跨时钟域处理最后把数据送进后续的DSP或传输模块。时钟路径是整个系统的命脉。AD9653需要一个干净的采样时钟通常由板上有源晶振或专用时钟芯片提供时钟质量直接决定了ADC的SNR和SFDR表现。FPGA侧则利用AD9653输出的DCO作为数据接收时钟这样做的好处是数据和时钟来自同一个源天然避免了跨时钟域的数据对齐问题。我在这套系统里用的FPGA是Xilinx 7系列的Artix-7选它的原因很简单Bank电压支持LVDS25普通HP Bank就能处理AD9653的LVDS信号IO资源也足够容纳4通道加在一起的22对差分信号。如果用更低端的器件可能就得被迫考虑串行化方案平白增加不少工作量。1.3 先硬件后软件还是先软件后硬件我的总体调试策略这个项目最关键的策略决定就是坚持“先数字后模拟”的调试顺序。具体来说先把AD9653的数字输出端用芯片自带的Test Pattern模块验证通让FPGA能稳定无误地接收到芯片内部生成的斜坡码或PN序列然后再去处理真实模拟信号。这一步做好之后整个调试过程至少少走一半弯路。原因很简单真实模拟信号从SMA到ADC中间隔了巴伦、滤波、焊盘、走线任何一个环节出问题都会表现为FPGA收到的数据形态怪异。这时候你很难分清是前端模拟问题、ADC配置问题还是FPGA接收逻辑问题。而Test Pattern直接把模拟前端隔离在外只要SPI配置对、LVDS连接对、FPGA采样逻辑对数据就一定对。把不确定因素一个一个排除掉才谈得上有条不紊地调试。2. 硬件设计要点与关键参数计算2.1 电源与接地模拟域和数字域的正确处理方式AD9653的电源分成AVDD和DRVDD两者额定电压都是1.8V。麻烦的地方在于这两路电源虽然电压相同但服务的对象完全不同AVDD给内部模拟采样电路供电DRVDD给LVDS输出驱动供电。设计上我建议用两颗独立的LDO分别供电而不是直接并在一起至少也要用磁珠把两条电源路径隔开防止LVDS开关噪声灌进模拟电源。每路电源都要在靠近芯片电源引脚的地方放0.1uF和10uF的去耦电容高频去耦电容要尽量靠近引脚走线要短粗直接打到过孔再到电源平面。这里有个经验千万别小看这些电容的摆放位置同样的电容值离引脚远2毫米高频抑制效果可能就打了对折。我见过不少板子因为电容放得远ADC的SFDR差了3~4个dBc。比较麻烦的是应该采用统一接地方案还是分割模拟地和数字地。我的实践经验是在ADC这种中等速度、LVDS输出的场景下不要分割地平面。一个完整的地平面比用0欧电阻或磁珠分割出来的“模拟地岛”效果要好得多因为分割地平面会造成回流路径不连续反而引入共模噪声。模拟输入路径、采样时钟和模拟电源走线布置在芯片一侧LVDS走线布置在另一侧让回流电流各走各的路径自然就干净了。2.2 采样时钟设计相位噪声与抖动的工程估算高速ADC的采样时钟向来是重头戏AD9653虽然对时钟抖动不像射频ADC那么苛刻但也不能随便用一个普通晶振对付。时钟抖动对SNR的影响可以用一个很直观的公式估算SNR_clock -20 * log10(2 * π * f_in * t_jitter)其中f_in是模拟输入信号频率t_jitter是采样时钟的总有效抖动。拿一个实际例子来看如果输入信号是70MHz采样时钟的总抖动是0.2ps RMS那这个抖动对SNR的限制大约是SNR_clock -20 * log10(2 * π * 70e6 * 0.2e-12) ≈ 79.1dB而AD9653本身在70MHz输入时能做到75~76dBFS左右的SNR0.2ps抖动的时钟不会成为系统的瓶颈。但如果你的时钟抖动做到1ps RMS同样的输入频率下时钟限制就变成了65dB左右这时候ADC的真实性能就完全被时钟拖累了。所以设计时我会优先选用相位噪声指标明确的专用时钟芯片或有源晶振避免用FPGA内部PLL产生的时钟去直接驱动ADC采样。FPGA的PLL输出抖动在高速采集场景下通常不够看相位噪声特性也很难保证。时钟走线尽量短远离数字总线必要时用地线包络保护起来。2.3 模拟输入前端巴伦选型与阻抗匹配AD9653的模拟输入是全差分结构输入阻抗约为1kΩ并联几个皮法电容。如果信号源是单端的最常见的方式是用射频巴伦做单端转差分同时完成阻抗变换。巴伦选型时主要看两方面频率覆盖范围和幅度/相位平衡度。对于宽带采集应用我通常选1:1或1:2的传输线变压器比如Mini-Circuits的TC1-1-13MA或者Marki的balun覆盖几MHz到几百MHz平衡度也做得不错。需要注意的是巴伦次级中心抽头的直流偏置处理ADC的共模电压VCM需要连接到变压器次级中心抽头附近的高阻偏置网络但接法要非常小心位置不对会破坏高频平衡。阻抗匹配也值得细算。AD9653的输入在目标频率下呈现复数阻抗单纯按1kΩ去看会出问题。我用网络分析仪实测过100MHz时输入端口的S11并不是纯阻性而是一个带有容性分量的阻抗。匹配电路不能生搬硬套教科书最好参考ADI官方评估板的电路然后根据实际前端带宽需求微调RC元件值。如果只是做通用采集板直接在输入端并联一个合适阻值的终端电阻也能获得可接受的效果只是会损失一部分灵敏度这个取舍就看项目侧重点了。2.4 LVDS接口与PCB布线差分走线的工程规范AD9653的LVDS输出是确定性的100Ω差分信号也就是恒流源驱动模式。FPGA侧需要开启输入差分终端电阻(DIFF_TERM)把100Ω端接电阻集成在芯片内部外部就不再需要额外并联电阻了。在7系列FPGA里IBUFDS原语加上DIFF_TERM(TRUE)即可实现非常方便。PCB走线方面差分对要控制100Ω差分阻抗对内等长控制在5mil以内对与对之间也要做等长处理尤其是同一通道的5对数据线和DCO之间长度差要控制在10mil量级。为什么要这么严格因为LVDS数据已经达到数百Mbps的数据率走线不等长直接表现为DCO采样沿偏离数据眼图中心轻则偶尔出错码重则完全收不到数据。我常用的处理方式是所有LVDS走线走在同一层且保证这一层底下有连续地平面。避免跨越分割区避免换层如果实在要换层旁边必须加地过孔提供回流路径。AD9653数据总线旁边的地线包络不是必须的但如果你对布局信心不足每隔一段距离加一个地过孔总能起到屏蔽和回流的作用。2.5 数据格式与通道映射必须提前搞清楚的接口问题AD9653在全速模式下每个通道的16bit数据被分到5对LVDS差分线上并行传递。具体映射关系在数据手册里有时序图但我想强调的是通道顺序和bit顺序在FPGA代码里非常容易搞反。我现在通常会画一张表把自己通道号和LVDS引脚、FPGA管脚对应关系列清楚再标上bit映射关系调试时遇到数据不对就回到这张表逐根确认。DCO是数据时钟输出FPGA用它作为接收数据的随路时钟FCO是帧时钟用来标定一个采样周期内数据的起始位置。使用ISERDES或IDDR时FCO可以用作bitslip对齐参考这是多通道同步的抓手。如果FCO接错管脚或者FPGA侧没处理FCO多通道数据就会产生字对齐错位表现出来是数据样子“看起来合理但数值完全不对”。3. FPGA逻辑设计与时序约束实战3.1 引脚规划与Bank电压配置FPGA的引脚规划不能到布线阶段才考虑。AD9653的LVDS输出需要FPGA Bank供电为2.5V也就是LVDS25电平标准。这里有个常见的坑如果FPGA Bank电压用的是3.3V就不能直接接收LVDS信号电平不匹配会导致接收端逻辑判断出错。所以在做原理图之前就应该把AD9653输出总线所连接的Bank规划好一个Bank尽量只放ADC数据引脚不要混入其他3.3V电平信号。7系列FPGA的HP Bank支持LVDS25但同一个Bank内VCCIO电平必须统一。我把4个通道的LVDS数据和DCO/FCO都分配到相邻的两个HP Bank上这样布线时也能保证走线短且整齐。3.2 LVDS数据接收从IBUFDS到IDELAY的完整链路FPGA侧接收AD9653数据最基本的动作是把差分信号转成单端。我用IBUFDS原语实现差分转单端同时使能内部差分终端电阻。转换后的单端信号随后进入IDELAYE2做相位微调再进入IDDR或ISERDES把双沿数据转成单沿并行数据。这里为什么要加IDELAY因为PCB走线长度即使做了等长控制相对于DCO时钟数据线的传播延迟仍然存在微小偏差在高速情况下这种偏差会导致DCO边沿不在数据眼图中心。IDELAY允许以约78ps(7系列)的步进精细调节数据延迟让采样点始终落在眼图中央。调试时我会写一个简单的状态机扫描不同延迟值并统计错误码率自动找到最佳延迟位置。一个值得注意的细节是AD9653的全速模式数据率下DCO是随路时钟数据在DCO的上升沿或者下降沿有效具体要看手册时序。采集代码里用DCO上升沿采样第一组bit下降沿采样第二组bit然后拼成一个完整的字。如果这里采样沿选反了数据并不会完全失效而是变成一组错位或翻转的数据这在调试时很容易误判为ADC配置错误。3.3 多通道同步与跨时钟域处理四通道数据在FPGA内部必须做到严格同步否则后续做通道间运算比如波束合成结果就是错的。AD9653已经保证了芯片内部四通道的同步采样但数据从LVDS进入FPGA后由于各通道走线和布局差异到达时间可能有偏差。因此FPGA内部要为每个通道都建立独立的小FIFO用FCO做对齐脉冲把所有通道的数据统一到一个公共时钟域后再输出。我在这里踩过的一个坑是只同步了第一个通道其他通道数据相差一个DCO周期。因为FCO对齐逻辑没写对或者bitslip顺序不对导致通道间有一个固定的采样周期偏移。这种问题用正弦波单音测试时很难发现直到做波形互相关才露馅。后来我在调试工具里加了一个“通道对齐误差检测”功能输入同一路信号给四个通道计算通道间相位差立刻就能看到偏移量。数据进入FPGA后还需要做跨时钟域处理。AD9653的DCO域和处理域时钟通常是系统时钟不是同源的直接用处理时钟去采DCO域的数据会出亚稳态问题。稳妥的做法是先把DCO域数据用FIFO过渡FPGA处理逻辑通过异步FIFO读取。异步FIFO的深度不用很大32深度足够但读写时钟域的约束一定要做完整否则综合工具无法保证跨时钟域的时序可靠性。3.4 时序约束与眼图中心扫描方法时序约束是高速接口调试中最容易被忽视但最要命的环节。AD9653的DCO和数据是随路关系也就是说DCO作为时钟数据相对它有一个建立保持时间窗口。在FPGA中必须把这个关系明确告诉综合工具不然工具不知道数据到达时间的窗口布线结果可能让采样点处在数据的边沿附近。我通常在XDC里写这样的约束create_clock -name adc_dco -period 8.000 [get_pins {adc_dco_ibufg/O}] set_input_delay -clock adc_dco -min 1.200 [get_nets {adc_data[0]}] set_input_delay -clock adc_dco -max 3.200 [get_nets {adc_data[0]}] set_input_delay -clock adc_dco -min 1.200 [get_nets {adc_data[1]}] set_input_delay -clock adc_dco -max 3.200 [get_nets {adc_data[1]}] # ... 类推上面的min/max值不是拍脑袋写的而是根据AD9653手册中DCO与Data的时序参数、PCB走线延迟估算后算出来的。调试时我还会配合ILA和VIO在FPGA内部对IDELAY值做实时调整扫描0到31个tap每个tap固定一段时间统计错误码。把扫描结果画成曲线中间一段错码率极低的区域就是眼图开口选那个区域的中心值作为最终IDELAY配置。这个方法尤其好用。比起单板用示波器量物理眼图芯片内部的“虚拟眼图扫描”能直接反映FPGA采样边界两者可以互为印证。我后来在新板验证时都是先做这个扫描再决定要不要调整PCB走线省了不少返工时间。4. 调试过程与问题排查实录4.1 上电实测第一步从电压到SPI通信板子焊接完成之后我不会急着连FPGA逻辑而是先做最基础的上电检查。万用表量各路电源对地阻抗排除短路然后上电量测AVDD、DRVDD是否都在1.8V附近VCM输出是否正常采样时钟是否有输出且频率准确。这些物理层面的检查通过之后才能进入FPGA调试环节。接下来第一步是SPI通信验证。AD9653的SPI接口是标准的三线或四线模式先用FPGA模拟SPI主机读写寄存器。我会先读芯片ID寄存器确认能读到预期的器件编号这样至少证明SPI时序、引脚连接和器件供电都没问题。如果读不到ID优先检查SDIO方向配置、片选信号时序、时钟极性相位用示波器对比FPGA发出的和芯片返回的波形。SPI调通之后先别急着采集真实信号。我会把AD9653配置成Test Pattern模式让芯片自己输出斜坡码。斜坡码的好处是每个采样值都不同只要FPGA接收到一点错误就能立刻从波形上发现。FPGA端用ILA抓数据看到从0到65535线性递增的斜坡说明数字链路已经基本打通。4.2 Test Pattern验证为什么这是整个调试里最关键的一步Test Pattern验证的优先级怎么强调都不为过。我见过太多人跳过这一步直接接信号源结果数据波形千奇百怪最后查了两天才发现是LVDS数据位映射反了。而Test Pattern能在十分钟内把所有数字层面的问题暴露出来。我第一次调AD9653时Test Pattern显示出来的数据是乱的不是单调递增的斜坡。一开始以为SPI没配置成功反复读寄存器发现配置没问题。后来对照手册里的数据映射表排查才发现是PCB上LVDS引脚的位顺序和原理图不一致我代码里按顺序接收实际上芯片输出的是打乱后的数据。修正映射表之后斜坡码立刻恢复正常。这个经历让我养成了一个习惯所有涉及并行接口的项目先做一张引脚映射表调试时随时对照。Test Pattern另一个用法是验证DCO采样沿和IDELAY设置。斜坡码的相邻数值变化有规律如果IDELAY值选得不合适采样点落在数据翻转点上会随机采到上一个或下一个数值。我通过ILA观察斜坡码是否从某个点开始出现偶发跳变就能判断延迟配置是否偏边界。4.3 真实信号调试用FPGA内部FFT验证动态指标Test Pattern验证通过后就可以把信号源接到模拟输入端了。我用信号发生器输出一个高纯度的单音正弦波频率选在节点比较合适的位置比如10MHz或50MHz幅度控制在ADC满量程的-1dBFS左右避免过载削波也不要太小淹没在噪声里。FPGA里我写了一个轻量的FFT模块或者直接把原始采样数据通过串口和串口调试助手传回上位机用Matlab或Python做FFT分析。观察频谱中主频的高度、谐波分量和噪底对比AD9653手册的典型SFDR和SNR指标就能评估系统真实性能。如果SFDR比手册差很多优先检查模拟前端、采样时钟质量和电源去耦。有一次调试SFDR比预期差了5个dBc频谱上出现了明显的二次谐波。我先是怀疑巴伦平衡度不够换了同型号的另一只巴伦没改善又怀疑输入功率偏高衰减了3dB依然如此。最后发现是ADC差分输入端的一个共模电容焊错位置改变了高频平衡。焊下来重新贴到正确位置后二次谐波立刻降了差不多4dBc。模拟前端的每一个元件位置都可能影响高频性能这在原理图阶段就要仔细规划布局。4.4 实际踩过的四个坑与排查思路第一个坑是数据“看起来正常但差一个符号位”。我在用正弦波测试时发现波形形态完全对但正半周和负半周不对称。排查了一圈最后发现SPI里配置的是二进制补码输出但FPGA端误按偏移二进制去解读。这个问题再一次说明Test Pattern阶段只验证了数字链路未必能验证数据格式解释真实信号测试阶段还是要逐项核对配置。第二个坑是多通道之间数据错位了一个采样周期。现象是四个通道接同一信号源波形幅度相位完全一致但FFT结果显示各通道主频相位有固定差。查看FCO对齐逻辑发现FCO没有拉到所有通道只对齐了其中一个通道的bitslip。修正为公共FCO触发所有通道重新对齐后相位差消失。第三个坑是低温环境下偶发错码。常温调试一直正常一到低温箱测试就随机跳码。用逻辑分析仪抓了很长时间才定位到是高电平LVDS信号在低温下沿变缓采样点靠近边沿。通过加大IDELAY延迟值和调整PCB走线减少过长残桩解决。第四个坑是信号源本身的问题。有次测SFDR无论怎么优化都差几个dB后来换了一台更高性能的信号源指标立刻达标。这提醒我先确认测试设备不会限制被测系统否则会白费力气去优化设计中的“不存在的缺陷”。5. 常见问题速查表与独家避坑清单5.1 高速ADC调试现象与解决路径速查表我把自己在AD9653项目以及之前几个高速ADC项目中遇到的问题汇总成了一个速查表每次调试新板都先对照一遍省去很多重复排查时间。现象可能原因解决路径SPI读不到芯片ID供电异常、SPI时序错误、引脚接错先量电压再用示波器抓SPI波形对比手册时序Test Pattern数据乱序LVDS位映射错误、DCO采样沿选反对照手册数据映射表修正位序尝试翻转采样沿Test Pattern出现随机跳变IDELAY延迟位于眼图边缘扫描IDELAY值选错误码率最低的中心区域正弦波波形正确但FFT谐波大模拟前端不平衡、电源去耦不足检查巴伦和共模电容位置加强电源去耦多通道相位不一致FCO对齐逻辑不完整用公共FCO触发所有通道bitslip重新对齐低温下偶发错码信号沿变缓、延迟余量不足加IDELAY延迟优化PCB走线减少残桩高频输入SFDR骤降输入匹配变化、时钟抖动大重新匹配输入网络换低抖动时钟源数据全部为0或满量程模拟输入未接入、参考电压异常检查VCM输出确认输入信号和巴伦连接5.2 调试工具与方法论串口调试助手、ILA和示波器的配合使用调试高速ADC离不开得力的工具。FPGA内部的ILA是抓数字信号的主力波形细节、通道对齐、错误码都能一目了然。但ILA的存储深度有限长时间统计错误率不方便这时我会把数据通过UART发送到PC端用串口调试助手接收并保存到本地文件再做长时间稳定性分析和FFT。这个方法虽然传输带宽有限但架不住4通道125Mbps数据量太大适合只抽取少量数据进行统计和验证的场景。示波器的用途在调试早期和后期各有不同。早期主要是确认LVDS波形是否正常、有无严重过冲和振铃后期主要是测试采样时钟质量和模拟输入信号纯度。逻辑分析仪在排查多通道并行数据错位问题时非常高效直接抓所有LVDS线的对齐关系一眼就能看出FCO与数据的相位是否正常。还有一个容易忽略的工具是FPGA自带的在线逻辑调试功能。VIO可以实时修改SPI寄存器配置不用反复编译工程对调试ADC配置字段非常方便。我在调试时经常先通过VIO把Test Pattern打开确认链路正常后再切回正常采集模式整个过程不用重新生成比特流。5.3 设计阶段就该做好的五件事很多问题在调试阶段出现根子都在设计阶段。我的经验是下面几件事在画板之前想清楚能节省大量调试时间。第一预留足够的测试点。所有电源节点、采样时钟输出、模拟输入、LVDS总线的关键网络都要留测试点尺寸不用大方便示波器探针接触即可。没有测试点出问题时只能在焊盘上探既危险又容易短路。第二电源域之间要有明确的滤波策略。模拟电源和数字电源即使来自同一路输入也要通过磁珠或LC滤波分开。更重要的是板子上电时序要满足AD9653手册的要求DVDDIO不能在AVDD之前上电这点可以通过电源管理芯片的使能顺序实现。第三LVDS走线等长不是只保证对内等长还要保证所有数据线相对于DCO的延迟差足够小。我通常要求同一通道内所有LVDS数据线和DCO的走线长度差控制在10mil以内并且布线完成后用仿真工具检查一次时序余量。第四FPGA代码里一定要做Test Pattern的软件开关。通过VIO或拨码开关可以随时切换正常数据和测试码调试时不用重新编译工程。我见过很多团队为了节省逻辑资源省略这个功能结果每次排查都要改代码重新综合效率非常低。第五原理图评审时要仔细核对数据手册上的每个引脚定义尤其是哪些引脚有内部上拉下拉、哪些引脚需要外部处理。AD9653的SPI和模式引脚如果处理不当芯片可能工作在非预期模式上电后数据输出完全不是你想要的。5.4 后续扩展方向多片同步与升级到JESD204BAD9653这套系统稳定之后扩展方向主要是两个。一个是多片级联同步。多颗AD9653共同采集时需要保证所有芯片的采样时钟同源且相位对齐可以通过级联SYNC信号实现。每片AD9653内部都有自己的分频器主芯片输出SYNC信号给从芯片把所有ADC的采样时刻对齐到同一个时钟沿。另一个方向是预见下一代平台的升级。如果未来系统采样率需要提升到250MSPS甚至更高继续用并行LVDS接口就会遇到IO数量和数据对齐的瓶颈。目前新出的高速ADC大多采用JESD204B接口它以更少的物理走线承载更高的数据率同时天然支持确定性延迟和多设备同步。建议在FPGA选型时就为JESD204B预留高速收发器资源这样后续升级不用换FPGA平台。我这次用的Artix-7没有丰富的GTP资源所以如果真到了升级阶段估计得换到Kintex-7或者Zynq UltraScale平台了。我在这次AD9653项目里体会最深的一点是高速采集系统的调试拼的不是某一次灵光一现而是把每个环节都变成可观察、可验证的模块。从电源到时钟从SPI到LVDS从Test Pattern到真实信号每一步都留下抓手出问题时才能快速定位到底是模拟、数字还是逻辑层的问题。最后再说一个小技巧信号源输入ADC之前一定先用功率计确认实际功率别只看信号发生器面板上的读数——线缆和巴伦的插损在几百MHz可能高得超出你的直觉。
返回列表