3. 时钟系统设计:采样时钟抖动对SNR的影响

时钟,是数据采集系统的心脏。说句实话,很多刚入行的工程师把精力都花在ADC选型、前端模拟电路设计上,结果系统做出来,信噪比就是上不去。我见过不止一次,折腾了半天,最后发现是时钟抖动在作怪。

这一章,我们就来聊聊时钟抖动怎么影响SNR,怎么用好LMK04828这个时钟芯片,以及怎么在FPGA内部生成多路同步时钟。

3.1 采样时钟抖动与SNR的关系

先问一个问题:为什么时钟抖动会降低SNR?

你想想看,ADC采样是在时钟的上升沿“拍一张照片”。如果时钟沿的位置不稳定,每次采样的时间点就会前后偏移。对于高频信号来说,时间上的微小偏移,对应到电压上就是明显的误差。

这个误差,本质上就是噪声。

公式很简单,但很直观:

SNR (dB) = 20 * log10( 1 / (2 * π * fin * tj) )

其中:

  • fin:输入信号频率
  • tj:时钟抖动(RMS值,单位秒)

举个例子:假设输入信号是100MHz,时钟抖动是1ps RMS。算下来SNR大约只有64dB。如果你想把SNR做到70dB以上,抖动必须控制在0.5ps以内。

关键结论:输入频率越高,时钟抖动对SNR的影响越严重。高频采集系统,时钟是第一道坎。

我在项目中遇到过一件事:一块板子,采样率250MSPS,输入信号70MHz,实测SNR比理论值低了6dB。查来查去,最后发现是时钟路径上用了普通的LVDS缓冲器,引入了额外抖动。换成专用的时钟分配芯片后,问题立刻解决。

3.2 时钟芯片LMK04828的配置

LMK04828是TI的一款高性能时钟芯片。它集成了PLL和VCO,可以输出多路低抖动时钟。我个人习惯用它来做ADC采样时钟和FPGA参考时钟的源头。

它的核心架构是这样的:

外部参考时钟 → PLL1 → 环路滤波器 → PLL2 → VCO → 分频器 → 多路输出

双PLL结构的好处是:PLL1负责滤除参考时钟的抖动,PLL2负责产生高频低噪声的VCO信号。说白了,就是两级净化。

3.2.1 关键配置参数

参数 说明 我的建议值
PLL1 鉴相频率 参考时钟输入后的分频 10MHz ~ 50MHz
PLL2 鉴相频率 VCO反馈分频后的频率 100MHz ~ 200MHz
VCO频率 内部振荡器频率 2.9GHz ~ 3.3GHz
环路带宽 PLL的滤波带宽 100kHz ~ 500kHz

避坑指南:我曾经把PLL2的环路带宽设得太宽(1MHz以上),结果VCO的相位噪声没有被充分抑制,采样时钟的抖动反而变大了。后来我习惯把环路带宽控制在200kHz左右,效果比较稳定。

3.2.2 配置流程(以TICS Pro软件为例)

TI官方提供了TICS Pro软件,可以图形化配置LMK04828。步骤大致如下:

  1. 选择参考时钟频率(比如100MHz)
  2. 设置PLL1分频比,使鉴相频率在10~50MHz
  3. 设置PLL2分频比,使VCO锁定在3GHz左右
  4. 配置输出分频器,得到需要的时钟频率(比如250MHz给ADC)
  5. 生成寄存器配置文件,通过SPI写入芯片

嗯,这里要注意:SPI写入时,一定要先写PLL1的寄存器,再写PLL2的。顺序错了,芯片可能无法锁定。

3.3 FPGA内部PLL生成多路同步时钟

有了LMK04828提供的干净参考时钟,接下来就要在FPGA内部生成多路同步时钟了。FPGA的PLL(比如Xilinx的MMCM或Altera的PLL)可以完成这个任务。

为什么不在外部直接生成所有时钟?因为FPGA内部逻辑需要与采样时钟保持确定的相位关系。用内部PLL,可以精确控制时钟的相位和延迟。

3.3.1 多路同步时钟的设计要点

  • 同源:所有时钟必须来自同一个PLL的输出
  • 相位对齐:使用PLL的相位调整功能,使各路时钟的上升沿对齐
  • 频率关系:尽量使用整数倍分频,避免小数分频引入的抖动

举个例子:ADC采样时钟是250MHz,FPGA内部需要125MHz和62.5MHz的时钟。我会这样配置:

// 以Xilinx MMCM为例
// 输入时钟: 250MHz (来自LMK04828)
// 输出时钟:
//   CLK0: 250MHz (相位0°) → ADC采样时钟
//   CLK1: 125MHz (相位0°) → FPGA主逻辑时钟
//   CLK2: 62.5MHz (相位0°) → 低速控制逻辑时钟

MMCM #(
  .CLKIN1_PERIOD(4.0),      // 250MHz输入
  .CLKOUT0_DIVIDE(1),       // 250MHz
  .CLKOUT1_DIVIDE(2),       // 125MHz
  .CLKOUT2_DIVIDE(4),       // 62.5MHz
  .CLKOUT0_PHASE(0.0),
  .CLKOUT1_PHASE(0.0),
  .CLKOUT2_PHASE(0.0)
) mmcm_inst (
  .CLKIN1(clk_250m),
  .CLKOUT0(adc_clk),
  .CLKOUT1(logic_clk),
  .CLKOUT2(ctrl_clk)
);

注意:FPGA内部PLL的输出抖动一般在几百飞秒到几皮秒之间。如果ADC要求抖动小于0.5ps,建议直接用LMK04828的输出作为ADC采样时钟,FPGA内部PLL只用于逻辑时钟。

3.4 时钟系统的整体架构

下面这张图展示了完整的时钟系统结构:

时钟系统整体架构 外部参考时钟 100MHz LMK04828 双PLL时钟芯片 抖动 < 0.2ps ADC 250MHz采样 FPGA 参考时钟输入 FPGA内部PLL MMCM/PLL 125MHz 逻辑时钟 62.5MHz 控制时钟 时钟路径:外部参考 → LMK04828(低抖动)→ ADC + FPGA FPGA内部PLL生成多路同步时钟,与ADC采样时钟同源 关键:ADC采样时钟抖动必须 < 0.5ps,否则SNR会显著下降

3.5 实际调试中的注意事项

最后,分享几个我在调试时钟系统时踩过的坑:

  • 电源噪声:时钟芯片的供电一定要用LDO,开关电源的纹波会直接调制到时钟上。我曾经用开关电源给LMK04828供电,结果抖动多了0.3ps。
  • PCB走线:时钟信号要走微带线或带状线,阻抗控制50Ω。差分时钟(LVDS)要等长走线,误差控制在5mil以内。
  • 终端匹配:时钟输出端一定要加AC耦合电容和终端电阻。不匹配的话,反射会导致时钟沿变差,等效于增加了抖动。
  • 相位对齐验证:用示波器看多路时钟的上升沿是否对齐。如果不对齐,调整FPGA PLL的相位偏移值,直到对齐为止。

总结一下:时钟系统设计,说白了就是控制抖动。从外部参考到LMK04828,再到FPGA内部PLL,每一级都要精打细算。抖动控制好了,SNR自然就上去了。

嗯,这一章的内容就到这里。时钟系统是高速数据采集的基石,打好这个基础,后面的联调才会顺利。

可可精品资料库