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。步骤大致如下:
- 选择参考时钟频率(比如100MHz)
- 设置PLL1分频比,使鉴相频率在10~50MHz
- 设置PLL2分频比,使VCO锁定在3GHz左右
- 配置输出分频器,得到需要的时钟频率(比如250MHz给ADC)
- 生成寄存器配置文件,通过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 时钟系统的整体架构
下面这张图展示了完整的时钟系统结构:
3.5 实际调试中的注意事项
最后,分享几个我在调试时钟系统时踩过的坑:
- 电源噪声:时钟芯片的供电一定要用LDO,开关电源的纹波会直接调制到时钟上。我曾经用开关电源给LMK04828供电,结果抖动多了0.3ps。
- PCB走线:时钟信号要走微带线或带状线,阻抗控制50Ω。差分时钟(LVDS)要等长走线,误差控制在5mil以内。
- 终端匹配:时钟输出端一定要加AC耦合电容和终端电阻。不匹配的话,反射会导致时钟沿变差,等效于增加了抖动。
- 相位对齐验证:用示波器看多路时钟的上升沿是否对齐。如果不对齐,调整FPGA PLL的相位偏移值,直到对齐为止。
总结一下:时钟系统设计,说白了就是控制抖动。从外部参考到LMK04828,再到FPGA内部PLL,每一级都要精打细算。抖动控制好了,SNR自然就上去了。
嗯,这一章的内容就到这里。时钟系统是高速数据采集的基石,打好这个基础,后面的联调才会顺利。