当前位置:首页>排行榜>zynq 高速AD9680时钟怎么选:采样抖动、相位噪声和系统SNR的关系

zynq 高速AD9680时钟怎么选:采样抖动、相位噪声和系统SNR的关系

  • 更新时间 2026-09-22 08:36:33
zynq 高速AD9680时钟怎么选:采样抖动、相位噪声和系统SNR的关系

高速ADC时钟怎么选:采样抖动、相位噪声和系统SNR的关系

调高速ADC时,时钟频率对了,只能说明“能采样”;时钟质量够不够,才决定采样结果能不能用。很多人第一次接AD9680这类高速ADC,会先盯着JESD204B的Link状态,或者先把波形画出来。结果是链路能跑,低频波形也还行,一换高频输入,SNR突然掉很多,频谱里还出现一串杂散。

这篇文章用一个公开器件做例子:AD9680双通道高速ADC,通过JESD204B接到Zynq FPGA,再经过FIFO、AXI-Stream、DMA和PetaLinux。重点不在某块具体板卡,而是给出一套新手可以照着执行的顺序:先算时钟抖动预算,再确认参考时钟、采样时钟和SYSREF,最后按“时钟—JESD—数据通路—软件”的层次定位问题。

文中的寄存器地址、JESD参数和命令都是示意。AD9680的采样率、DDC配置、Lane数和JESD参数要以手里的型号、数据手册、SPI读回值和FPGA工程配置为准,不要直接复制别人的数值。

一、先把时钟分成三类

一套Zynq高速采集系统里,常见的时钟至少有三类:

  1. ADC采样时钟:决定模拟信号在哪些时刻被采样,抖动会直接转化成幅度误差。
  2. JESD器件时钟和FPGA接收时钟:负责串行链路、字节对齐和解包,频率关系必须和JESD参数匹配。
  3. SYSREF:在Subclass 1系统中用于对齐LMFC,影响多器件或多通道的确定性延迟。

它们可能来自同一颗时钟芯片,但用途不同。不能因为频率一样,就把它们当成同一根时钟。还要把SYNCINB、复位和锁定状态一起画进系统时序图。

AD9680到Zynq的时钟与数据通路

我建议新手先画一张这样的链路图,把每根时钟标上频率、来源、去向和测量点。后面调试时,每一个状态都能对应到图上的一段,而不是面对“没有数据”四个字发愁。

二、采样抖动为什么会降低SNR

采样时钟有时间误差时,ADC并不是在理想时刻取样。对输入正弦波来说,时间误差越大、输入频率越高,瞬时电压误差越大。常用的抖动限制估算式是:

SNR_jitter ≈ −20 × log10(2π × f_in × σ_t)

这里f_in是输入正弦频率,σ_t是采样时钟的总RMS抖动,单位是秒。σ_t要包含时钟源、抖动清理PLL、分配芯片、板级电源和输入端的综合影响,不能只拿某颗芯片宣传页上的单项数值。

举个简单的数量级例子:输入频率500 MHz,时钟总RMS抖动100 fs,也就是1×10^-13秒,那么:

2π × 500 MHz × 100 fs ≈ 3.14×10^-4

对应的抖动限制SNR约为70 dB。把输入频率换成1 GHz,其他条件不变,SNR会再下降约6 dB。这个结论很直观:同一套时钟,低频测试很好看,不代表高频输入下仍然够用。

采样时钟抖动对SNR的影响

这个公式用于预算,不是最终测试结果。真实系统还会受到ADC本底噪声、量化噪声、前端放大器噪声、失真、电源杂散和数字串扰的影响。实测SINAD低于理论抖动上限是正常的;如果实测值远低于预算,才需要继续定位是哪一段出了问题。

三、时钟芯片怎么选,不要只看“相位噪声最低”

选择时钟方案时,我会把下面几件事放在同一张表里:

检查项
要回答的问题
输入参考
参考源频率、幅度、抖动是多少?是否需要外部清洁时钟?
输出频率
能否同时生成ADC采样时钟、JESD器件时钟和SYSREF?
抖动积分带宽
数据手册的RMS抖动是从多少Hz积分到多少Hz?
输出格式
LVDS、CML、LVCMOS还是差分时钟?与ADC和FPGA引脚是否匹配?
SYSREF
是连续、脉冲还是门控模式?ADC和FPGA看到的SYSREF关系是否可控?
电源
电源噪声、地弹和时钟输出摆幅是否满足要求?
调试能力
能否通过SPI读回锁定、分频和输出状态?

相位噪声曲线不能脱离积分带宽看。一个方案在10 kHz偏移处很好,不代表从10 Hz到奈奎斯特相关范围内的积分抖动也很好。比较两个时钟芯片时,先确认测试条件和积分范围一致,再换算到系统输入频率下的SNR预算。

新手容易忽略电源。时钟芯片的模拟电源、数字电源和输出级电源如果共用一条噪声很大的DC/DC,示波器上看到的时钟频率可能完全正确,但ADC频谱里会出现和开关频率相关的杂散。时钟选型和电源、布局、回流路径要一起评估。

四、用AD9680和Zynq把系统参数串起来

AD9680是双通道、14位高速ADC,官方资料中列出了多个采样率版本,并支持基于JESD204B的高速串行输出。其Subclass 1输出可按器件配置使用一、二或四条Lane,多器件同步使用SYSREF和SYNCINB。这里用“1 GSPS、双通道、M=2、N=14、N'=16、L=4”作为教学配置,不代表所有板卡的默认配置。

JESD204B使用8b/10b编码时,可以先用近似公式估算Lane速率:

Lane rate ≈ M × N' × Fs × 10/8 ÷ L

代入上面的教学参数:2 × 16 × 1 GSPS × 10/8 ÷ 4 ≈ 10 Gbps/Lane。这个数字接近高速收发器的工作区间,因此参考时钟、GT PLL、Lane布局、串行差分连接和JESD IP参数必须一起核对。

调试时不要只抄一张参数表。至少要把下面几份信息放在同一个目录:

  • ADC SPI配置脚本和关键寄存器读回值;
  • 时钟芯片配置文件、参考频率和SYSREF模式;
  • JESD IP中的L、M、F、S、N、N'、K、Subclass和scrambling设置;
  • GT参考时钟频率、Lane映射、极性和复位顺序;
  • PL侧解包格式、AXI-Stream数据宽度和DMA长度。

任何一项只在脑子里记,都容易出现“每一段看起来都合理,合起来却不对”的情况。

五、AD9680 + Zynq调试,我会按七个关卡走

关卡1:先确认时钟真的到芯片引脚

不要先看Linux。用示波器或合适的时钟测量设备检查:ADC采样时钟、器件时钟、SYSREF、SYNCINB以及FPGA GT参考时钟。重点看频率、差分摆幅、占空比、边沿、终端和上电时序。

如果时钟芯片有锁定状态,先通过SPI读回;如果没有锁定,后面的JESD状态没有意义。测量时要注意探头负载和差分测量方式,不能用一根普通单端探头随便夹在高速差分线上就下结论。

关卡2:确认ADC SPI配置可读回

先读芯片ID、采样率相关配置、JESD参数和测试码开关。写入寄存器后立即读回,确认读回值与期望一致。把“SPI写成功”与“ADC已经按该配置输出”分开看,必要时再读状态寄存器。

如果SPI读回都不稳定,先查电源、复位、芯片选择、时钟和SPI电平,不要跳到JESD。SPI配置错一个分频或一个Lane选择位,后面可能表现成完全不同的故障。

关卡3:判断是CGS、ILAS还是Data阶段失败

JESD链路建立不是一个单一的“Link Up”。调试时要把状态拆开:

  • CGS阶段:接收端能否识别码组;
  • ILAS阶段:Lane参数和多帧边界是否匹配;
  • Data阶段:进入正常样本传输后,8b/10b错误、帧错、Lane错和溢出是否增加。

如果CGS都过不了,优先查GT参考时钟、Lane极性、串行速率、复位和物理连接。如果CGS能过、ILAS失败,优先核对L/M/F/S/N/N'、K、Subclass和scrambling。如果Data阶段才出错,继续查字节对齐、解包、FIFO和AXI通路。

AD9680 JESD204B链路分阶段调试

关卡4:使用ADC测试码,先排除模拟输入

新手最容易犯的错误是直接接信号源,然后看一张波形图。正确顺序应该是先打开ADC支持的测试码型,再从JESD解包后的第一个检查点开始比对。

可以按项目实际支持情况选择固定码、交替码、递增码或PRBS。每一种测试码都要写清:码型由ADC生成还是FPGA生成,样本位宽是多少,补码还是偏移二进制,通道如何交织。

推荐设置四个观察点:

  1. JESD IP输出;
  2. 样本解包和通道重排之后;
  3. 跨时钟FIFO或DSP入口;
  4. DMA写入DDR之前。

第一个观察点已经错了,就不要先查Linux。第一个观察点正确、DMA前错误,才轮到查AXI-Stream、FIFO和数据宽度。

关卡5:检查SYSREF与确定性延迟

Subclass 1系统需要用SYSREF对齐LMFC。每次冷启动、软件重启、PL重新加载后,都应该记录链路进入Data阶段的时间、帧边界、通道间延迟和对齐计数。

如果每次启动样点整体偏移几拍,或者多通道相位偶尔变化,优先查SYSREF模式、SYSREF到达关系、LMFC状态和复位顺序。不要用软件在收到数据后“丢掉几个点”来掩盖不确定性,那会让系统看起来能用,却失去确定性。

关卡6:把JESD数据接到Zynq PL的可观测点

在Zynq FPGA里,建议至少保留以下状态:Lane错误计数、JESD状态、样本计数器、FIFO最大水位、AXI帧计数、DMA完成数和最近一次错误原因。用ILA抓取JESD解包后的数据、valid、帧边界和通道号,触发条件可以设为测试码不匹配或样本计数跳变。

不要只保留一个data_valid。没有样本计数和帧边界,出错后很难区分丢样、重复、通道交换还是字节顺序错误。

关卡7:最后才进入PetaLinux和上位机

Linux侧主要验证三件事:设备树描述是否与当前硬件一致,DMA缓冲区是否正确同步,软件读到的样本是否和PL观察点一致。

如果PL里递增码连续、DMA前也连续,而Linux读出来断号,优先查DMA长度、Cache维护、缓冲区复用和软件读取顺序。若Linux样本连续但频谱不对,再回头检查有符号解释、位宽扩展、通道交织和采样率参数。

六、几个典型故障,怎样快速缩小范围

现象
第一判断
优先检查
CGS失败
物理层或GT时钟问题
GT参考时钟、Lane极性、串行速率、复位
CGS通过、ILAS失败
JESD参数不一致
L/M/F/S/N/N'、K、Subclass、scrambling
Link Up但测试码错
解包或映射问题
Lane顺序、字节序、通道交织、补码格式
测试码对、真实波形差
模拟或时钟质量问题
采样时钟抖动、前端带宽、电源杂散、输入幅度
PL数据对、Linux数据错
DMA或Cache问题
AXI握手、DMA长度、缓冲区同步、软件索引
每次启动相位不同
SYSREF/复位顺序问题
SYSREF模式、LMFC对齐、时钟锁定后再释放复位

遇到问题时,先把故障归到其中一类,再做实验。比如测试码正确而真实信号SNR差,就不要继续改Lane映射;Link状态都没到Data阶段,也不要先调FFT脚本。

七、给新手的一套最小可行调试流程

如果你第一次接触AD9680和JESD204B,可以按下面顺序做,不要一上来就追求“全功能”:

第一天只完成时钟芯片配置、ADC SPI读写和锁定状态读取。示波器确认采样时钟、器件时钟和SYSREF的存在。

第二天只让JESD链路进入CGS、ILAS和Data,先不接复杂DSP和DMA。把每个Lane的状态寄存器和错误计数读出来。

第三天打开ADC测试码,在PL里用ILA抓解包数据。先确认一个通道、一个Lane或最简单的参数组合,再扩展到完整配置。

第四天加入FIFO和AXI-Stream,插入递增码检查握手和帧边界。确认TVALID && TREADY时样本计数才递增,背压时数据和TLAST保持稳定。

第五天才接DMA、DDR和PetaLinux。软件保存原始帧、状态快照和版本信息,不要只保留一张波形图。

最后再关闭测试码,接入真实模拟信号。先低频、小幅度,再逐步提高输入频率和幅度,最后做SNR、SINAD、SFDR和长时间运行测试。

八、时钟和JESD调试记录应该留下什么

每次实验建议建立一个目录,至少包含:

  • 时钟芯片配置文件和SPI读回日志;
  • ADC配置文件、芯片状态和测试码设置;
  • JESD IP参数、Lane映射、复位顺序;
  • 采样时钟和SYSREF的测量结果;
  • CGS/ILAS/Data状态、Lane错误计数;
  • ILA抓取的原始数据和触发条件;
  • DMA状态、FIFO水位、原始帧和软件版本;
  • 输入频率、幅度、采样率、FFT长度和窗函数。

这样下次问题复现时,能回答“哪一级第一次变错”,而不是重新从上电开始猜。

九、资料与边界说明

AD9680的具体采样率、JESD Lane配置和寄存器含义,请以Analog Devices官方数据手册和产品页面为准;Zynq侧JESD IP、GT和AXI接口,请以AMD对应器件和IP版本的Product Guide为准。不同器件代际、IP版本和板卡连接方式会改变参数,本文的计算和调试顺序可以复用,但示例数值不能直接当成你的工程配置。

参考资料:

[1] Analog Devices AD9680产品页面:https://www.analog.com/en/products/ad9680.html

[2] Analog Devices AD9680数据手册:https://www.analog.com/media/en/technical-documentation/data-sheets/ad9680.pdf

[3] AMD/Xilinx JESD204 LogiCORE IP Product Guide PG066:https://docs.amd.com/api/khub/documents/Wn04cLAzcB0OxyKFkQHEPA/content

[4] AMD/Xilinx JESD204 PHY Product Guide PG198:https://docs.amd.com/api/khub/documents/etuT__6UQn8fERCEfC_LjA/content

本文使用公开器件资料和通用架构说明,不包含客户名称、私有寄存器表、未公开板卡参数或专有工程代码。

高速ADC调试最怕一开始就把所有层混在一起。先把时钟质量算清楚,再确认JESD每个阶段,接着用测试码定位数据通路,最后才看Linux和频谱。按这个顺序做,问题通常不会消失,但会从“整套系统都不对”变成一个可以验证的具体故障。

欢迎关注公众号 FPGA coder
持续分享可复现的 FPGA 项目拆解、验证方法与硬件调试经验

随机文章