流水线ADC设计:级间增益、冗余位校准、MDAC结构详解

流水线ADC,说白了就是「分段处理」的思路。把高精度转换拆成几个低精度的级,每一级只负责粗量化,然后通过数字校准把误差补回来。我刚开始接触这个架构时,总觉得它太复杂——又是级间增益,又是冗余位,又是MDAC。但后来发现,只要你把核心逻辑理清楚,这东西其实挺优雅的。

一、流水线ADC的基本架构

先看整体结构。一个典型的流水线ADC由N级组成,每级包含:

  • 一个低精度子ADC(通常1.5位或2.5位)
  • 一个MDAC(乘法数模转换器)
  • 一个采样保持电路(SHA,有时可省略)

信号流是这样的:输入信号先被采样,然后进入第一级。子ADC做粗量化,得到数字码。同时MDAC把输入信号减去子DAC的输出,再乘以一个增益系数(通常是2的幂),残差放大后送给下一级。最后所有数字码通过延迟对齐,组合成最终输出。

核心思想:每一级只处理「上一级没搞定的那部分误差」,逐级细化,最终达到高精度。

我做过一个12位100MS/s的流水线ADC,用了9级1.5位结构。刚开始仿真时总差那么1~2个LSB,后来发现是级间增益没校准好。嗯,这里要重点讲。

二、级间增益——为什么是2?

级间增益,就是MDAC中残差放大的倍数。为什么通常是2?

你想想看,如果子ADC是1.5位,它的量化范围是±Vref/2。输入信号范围是±Vref。那么残差范围就是±Vref/2。为了把残差「撑满」到下一级的输入范围±Vref,需要放大2倍。这样下一级才能充分利用它的量化范围。

但实际设计中,增益不一定是精确的2。原因有两个:

  1. 电容失配:MDAC中的采样电容和反馈电容比值决定了增益。工艺偏差会导致比值偏离2。
  2. 运放有限增益:运放的开环增益不够大,也会让实际增益小于理想值。

我遇到过最头疼的情况:电容失配导致增益误差0.5%,结果ADC的INL直接飙到3LSB。后来加了数字校准才压下来。

实战建议:级间增益的精度要求取决于你的目标位数。12位ADC,增益误差需要控制在0.1%以内。16位的话,得做到0.01%。这时候就别指望纯模拟匹配了,数字校准是必须的。

三、冗余位校准——给误差留点余地

冗余位校准,是流水线ADC的「救命稻草」。为什么需要它?

子ADC的比较器有失调电压。如果失调太大,子ADC的判决边界会偏移,导致残差超出下一级的输入范围。一旦残差「出界」,下一级就饱和了,信息丢失,再也补不回来。

冗余位的思路很简单:让子ADC的量化范围比输入范围小一点,留出「冗余区间」。这样即使比较器有失调,残差也不会出界。

以1.5位结构为例:

  • 理想情况下,子ADC的判决点在 -Vref/4 和 +Vref/4
  • 实际比较器失调可能达到 ±Vref/8
  • 如果采用1.5位结构,冗余区间是 ±Vref/2,足够容纳失调

我曾经做过一个项目,比较器失调实测达到30mV(Vref=1V),按传统1位结构早就崩了。但用了1.5位冗余,ADC照样跑出11.5位ENOB。这就是冗余的魅力。

注意:冗余位不是万能的。它只能补偿子ADC的误差,不能补偿MDAC的增益误差和运放非线性。那些需要另外的校准手段。

四、MDAC结构详解——核心中的核心

MDAC是流水线ADC的心脏。它同时完成三个任务:采样、减法、放大。常见的MDAC结构有两种:

1. 开关电容MDAC(最常用)

结构很简单:一个运放,一组采样电容,一组反馈电容,还有一堆开关。工作分两相:

  • 采样相(Φ1):输入信号被采样到所有电容上。同时反馈电容被复位。
  • 放大相(Φ2):根据子ADC的数字码,选择性地将电容连接到参考电压或地。运放把电荷重新分配,输出残差。

增益由电容比值决定:Gain = Cs / Cf。如果Cs=2Cf,增益就是2。

// 以1.5位MDAC为例,电容配置逻辑
// 子ADC输出码:00, 01, 10 分别对应 -Vref, 0, +Vref
case (sub_adc_code)
    2'b00: Vdac = -Vref;  // 连接 -Vref
    2'b01: Vdac = 0;      // 连接地
    2'b10: Vdac = +Vref;  // 连接 +Vref
endcase

// 残差输出:Vout = 2 * (Vin - Vdac)
// 实际实现通过电荷重分配完成

我设计MDAC时最关注三个指标:

  1. 运放带宽:决定了建立速度。12位100MS/s,运放GBW至少需要500MHz。
  2. 运放摆率:大信号建立时,摆率不够会导致建立误差。
  3. 电容匹配:决定了增益精度。用单位电容阵列加dummy电容,匹配可以做到0.1%。

2. 共享运放MDAC(省面积方案)

相邻两级共用同一个运放,交替工作。面积省一半,但时序复杂,噪声也大。我一般不推荐新手用这个结构,调试起来太痛苦。

五、核心逻辑流程图

下面这张图展示了流水线ADC从输入到输出的完整信号流,以及级间增益、冗余位、MDAC三者的关系。

流水线ADC核心逻辑流程图 模拟输入 Vin 第1级 子ADC + MDAC 增益=2, 1.5位冗余 第2级 子ADC + MDAC 增益=2, 1.5位冗余 第N级 最后一级 Flash ADC 数字延迟对齐 每级数字码按流水线时钟对齐 数字校准 冗余位校准 + 增益校准 数字输出 Dout 关键参数 • 级间增益:2x • 冗余位:1.5位 • MDAC:开关电容

六、实战中的避坑指南

做流水线ADC,有几个坑我踩过,分享给你:

坑1:运放建立时间不够

我曾经设计一个12位100MS/s的ADC,运放GBW算下来够,但实际仿真发现建立误差有0.5LSB。后来查出来是寄生电容太大,导致有效负载增加。解决办法:在版图阶段就做好寄生提取,运放设计留20%余量。

坑2:电容失配导致增益非线性

MDAC的增益由电容比值决定。如果采样电容和反馈电容的匹配不好,增益会随输入信号变化,产生非线性。我试过用单位电容阵列加dummy,匹配做到0.1%以内。如果还不够,就得加后台数字校准。

坑3:时钟馈通和电荷注入

开关电容MDAC中,MOS开关的时钟馈通和电荷注入会引入误差。解决办法:用互补开关(CMOS传输门),或者加dummy管。我习惯在关键路径上用自举开关,虽然面积大点,但线性度好很多。

七、总结一下

流水线ADC的设计,说白了就是三个核心:级间增益决定了残差的放大倍数,冗余位给了误差一个缓冲区间,MDAC是物理实现的关键模块。三者缺一不可。

我个人的经验是:先搞清楚每个模块的误差预算,再动手设计。比如12位ADC,总误差要小于0.5LSB,那么子ADC的失调、MDAC的增益误差、运放的建立误差,各分多少?把这些算清楚,设计才有方向。

最后说一句:仿真通过不代表流片成功。一定要做蒙特卡洛分析,看看工艺角和失配对性能的影响。我吃过这个亏,希望你别重蹈覆辙。


公众号:蓝海资料掘金营,微信deep3321