10位100MS/s SAR ADC完整工程:奈奎斯特频有效位设计与验证

📅 发布时间:2026/10/20 9:53:35
10位100MS/s SAR ADC完整工程:奈奎斯特频有效位设计与验证
做模拟混合信号的人都知道SAR ADC有个经典的悖论原理图看起来特别简单真要把一个10位100MS/s的完整电路做出来把建模代码、仿真测试代码、电路文件全部跑通再在奈奎斯特频率下把有效位做实就是另一回事了。我最近刚收尾了一个这样的完整工程交付物里除了schematic级别的电路文件还包含行为级建模代码和全套仿真测试bench。标题里那句奈奎斯特频有效位是这个项目最要命的地方很多ADC在低频正弦输入下ENOB能到9.5位以上输入频率一旦逼近50MHz性能立马掉回8位甚至更低。这篇就把完整的架构选择、模块设计、建模验证、测试链路和文件组织拆开讲一遍给正在做SAR ADC完整交付的朋友做个参考。1. 10位100M这条规格的工程分量1.1 这个参数档位为什么值得做一套完整工程先聊聊这个规格选得准不准。SAR ADC整个家族覆盖了从几MS/s到几百MS/s的采样率但真正让设计师觉得不添麻烦的甜点区其实就是8到10位、几十到一百多MS/s这一段。原因很直接。往上走12位以上、200MS/s的SAR对电容阵列匹配、比较器噪声、参考驱动的要求会急剧上升通常需要后台校准和复杂的开关策略往下走8位以下、几十MS/s的性能流水线或闪存架构也能轻松实现SAR的优势反而不明显。10位100M正好站在用SAR做完全合理、用其他架构又有点浪费的临界点上。这个区间大量出现在射频中频采样、高速工业模拟前端、消费电子传感器读出场景。从电路约束看10位意味整个系统要保证约60dB的SNDR。一个理想10位ADC满幅输入时SNR只有61.96dB设计上至少要留出62dB以上的SNDR目标否则ENOB连9.5位都到不了。100MS/s意味每次转换只有10ns其中采样阶段约5ns逐次逼近从MSB到LSB要跑完10次比较、DAC建立、比较器复位。每一项误差预算都紧巴巴的单独调某一个模块看不出问题必须放在完整环路里一起看。而且完整电路这三个字比单点技术Demo有价值得多。单测一个比较器或者一个CDAC看不出接口问题真正把采样前端、比较器、SAR逻辑、参考网络和测试代码串起来之后所有衔接处的坑才会冒出来。这就是为什么我建议刚接触SAR的朋友别只看单点模块文章要把目标设成完整交付物。1.2 奈奎斯特频率下有效位为什么是分水岭标题里的奈奎斯特频有效位不是说把信号源掰到50MHz附近随便测测就完了。它是衡量ADC在最严苛输入条件下的动态性能指标。ENOB的算法很简单ENOB (SNDR - 1.76) / 6.02。SNDR是信号与噪声加失真之比也就是说有效位反映的是整个转换链路把所有误差加起来之后还剩下多少比特的分辨率。10位ADC在低频输入下做到9.3、9.5位不稀奇难的是在接近50MHz的输入频率下还能保住一样的有效位。高频输入为什么这么伤性能核心有三条。第一采样网络带宽有限输入信号频率升高后采样电容在一个很短窗口里充不到满幅产生和信号幅度相关的建立误差本质就是失真。第二时钟抖动直接影响采样的精确时刻而抖动对SNR的伤害随输入频率线性恶化抖动引入的SNR上限约等于1/(2π f_in σ_t)输入频率翻一倍抖动罚掉6dB。第三比较器在高速翻转时的kickback回踢、DAC建立时间不足、逻辑复位不干净这些在低频测试里都被掩盖了高频下全部现形。我这次测试条件选在49.9MHz附近目标定为奈奎斯特频点ENOB大于等于9.0位低频做到9.5位以上。这个余量不是拍脑袋定的是因为后仿真和实测通常会比前仿再掉0.3到0.6位必须提前预留。1.3 三个交付物在项目里的实际分工标题提到的仿真测试代码、建模代码、电路文件对应了三个不同的设计阶段。建模代码是我最先动手的。在电路原理图一个管子还没画之前先用行为级模型把算法、误差预算、失配分布算清楚。这一步跑得越扎实后面电路越不容易大改。电路文件是核心交付包括采样开关、CDAC、比较器、SAR逻辑的schematic或者netlist级描述。仿真测试代码则是验证手段包含激励配置、FFT指标计算、DNL/INL统计脚本。三者不是孤立的。建模代码确定的误差预算直接决定电路里电容取多大、比较器噪声做到多少电路文件跑完之后生成的波形要送进测试代码去做指标计算而测试脚本暴露出的性能短板又反过来驱动建模参数更新。这样形成闭环之后整个设计过程才谈得上可控。2. 核心电路模块拆解每一步都在和误差赛跑2.1 采样前端栅压自举和足够的带宽10位100M的采样前端第一个绕不开的点是开关线性度。如果用普通CMOS传输门直接采样MOS管的导通电阻会随输入电压变化Ron的调制直接变成采样值里的谐波。这个非线性低频时可能只有一点点但输入频率一大信号摆率上来了采样误差跟着放大。所以10位以上的设计基本都会用栅压自举开关把采样管的栅源电压Vgs钳在固定值让导通电阻和输入无关。实现方式的标准流程是采样阶段先给一个电容充电到电源电压VDDA然后把电容一端接到输入另一端接到采样管栅极让Vgs稳定在VDDA。听起来不复杂但版图和寄生控制很影响实际效果栅端节点的寄生电容会直接吃掉充电电荷导致自举电压在摆率高的时候掉压。这个项目里我在自举电容两端专门做了版图寄生的前后仿对比低频ENOB看起来没差别奈奎斯特频点能差出0.7位。另一个被低估的是采样带宽。10位精度对应0.1%的建立误差需要约6.9个时间常数τ。100MS/s单端采样窗口按5ns算平均一个τ只有0.72ns换算成-3dB带宽大约是1/(2π×0.72ns)≈220MHz。这还没考虑输入源阻抗、版图走线电感和片上ESD寄生。所以采样网络带宽余量一定要大必要时候前级加一个buffer否则高频输入时顶板永远建立不到理想值测出来的谐波失真会非常难看。2.2 CDAC单位电容、分段结构和开关策略SAR ADC的核心精度几乎全压在DAC电容阵列上。10位全差分设计里我用了常见的分段CDAC高6位在主阵列低4位通过衰减电容耦合到主阵列这样比纯二进制阵列省一半以上面积。单位电容取值是第一个权衡点。从热噪声角度采样电容越大kT/C噪声越小从面积和功率角度电容越小越好从匹配角度又有最小单位电容的可制造性约束。核算下来单端总采样电容取到1pF级别时kt/C噪声折合到比较器输入大约是几十μV rms对10位分辨率来说是可以接受的。实际单位电容我落在几十fF的MOM电容寄生和匹配都比较稳妥。开关策略我推荐用切换能耗低且对共模扰动小的方案。早期我试过常规的自顶向下切换每次比较都涉及大电容阵列在不同参考电位之间倒换共模跳变和参考毛刺都很明显。后来换成了VCM-based方式比较器正负输入端的公共电压变化很小参考缓冲的压力轻了不少。代价是逻辑控制比常规方式复杂但这部分交给数字逻辑设计正好是SAR ADC的强项。还有一个容易忽视的地方是衰减电容本身。分段阵列里衰减电容的精度直接影响整体DNL而且它一般不是整数倍单位电容版图上实现需要并联好几个单位电容来逼近寄生会导致比例偏移。我的做法是预先在行为级模型里把衰减电容比例作为变量扫了一遍找到满足INL要求的误差窗口再回去约束版图寄生。2.3 比较器噪声、失调和回踢三件事SAR里比较器的角色不像流水线里的那样精细它只需要判断两个输入谁大谁小但每一拍都在工作而且影响的是整条链路的精度。动态锁存比较器是主流选择时钟到来时输入对放大差分信号正反馈锁存结构迅速再生出逻辑电平。三个关键问题按优先级排噪声、失调、kickback。噪声方面比较器的热噪声会被当作随机误差叠加到量化过程里。10位设计里通常要把比较器输入等效噪声压到远低于1 LSB的几分之一。我习惯先在行为模型里把噪声和DAC各项误差拉通看总噪声预算怎么分再反推比较器输入对尺寸和电流。这个顺序比直接拍脑袋定尺寸靠谱得多。失调在这个项目里主要靠一点冗余位来放松。动态比较器失调一般有几个毫伏到几十毫伏在低频10位分辨率下如果不处理某些工艺角下会出现可见杂散。加LSB冗余位的思路是让DAC最后多比较一位但把最后一位的权重缩小这样比较器失调和建立误差导致的方向误差可以被冗余位局部修正。代价是信噪比损失一点点换来的是对失调和建立误差的包容度大幅提升。kickback问题则是高频性能的大敌。比较器在再生翻转那一瞬间内部节点的电压跃变会通过输入管栅漏寄生电容回踢到DAC顶板导致参考电压抖动。拥塞的顶板又给下一次比较带来记忆效应。常用的对策是加隔离级、在比较器前面加一个低增益前置放大器以及做好顶板节点屏蔽布局。我的经验是不要只在原理图上讨论kickback要在transient里看比较器翻转前后顶板电压的实际毛刺幅度这比等后仿真报告直观得多。2.4 SAR逻辑异步时序和最后一位的形成100MS/s的SAR如果所有比较都用外部固定时钟派发留给每次比较和DAC建立的时间窗口都被最慢的worst-case占满效率很低。实际设计里几乎都用异步SAR逻辑比较器完成一次判断后立刻产生valid信号直接触发下一步开关动作不需要等外部时钟。异步带来的好处是速度上限由链路上最慢的一拍决定而不是所有拍的耗时总和。但异步环路的稳定性要小心比较器复位不全、valid信号传播延迟变化都可能导致下一拍DAC切换时前面电荷还没稳定。我用了一个延迟链去匹配DAC建立时间比较器valid出来之后先通过可配置的延迟单元再去触发开关延迟量根据各工艺角仿真标定。还有一处常被忽略最后一位比较完成后数字码在最坏情况下还在DAC阵列上倒换这个时候直接采样输出码可能抓到转换中间态。正确做法是给输出加打拍同步在下一转换开始后一个确定延迟再去锁存本次结果。这个细节在低频慢速设计里无所谓100MS/s下如果不处理偶尔一个码字错误就会在FFT里冒出一根不和谐的杂散。3. 建模代码电路下网表之前先把账算清楚3.1 行为级模型在设计流程里的位置很多刚入门的朋友有个习惯拿到工艺文件就开画原理图画完直接跑transient指标不好再返工调参数。这种闯关式设计在简单模块上可行但放到完整SAR ADC上非常浪费时间。最糟的情况是蒙特卡洛跑到一半才发现某路电容权重给错了全部推倒重来。我的做法是先用建模代码把算法和数据链验证到足够精细。行为级模型用Python描述一套理想SAR算法包括逐位比较、DAC电压重构、采样过程。这个阶段完全不涉及工艺跑一千次蒙特卡洛也只要几秒。等算法逻辑确定之后再逐步往模型里注入电路非理想项观察ENOB的恶化规律。这样每一步性能变化都能定位到具体非理想源而不是等电路仿真结果出来之后靠经验猜。这个模型的另一个价值是可以算预算账。比如我发现电容失配带来的INL占掉0.5 LSB比较器噪声占0.3 LSBDAC建立误差占0.2 LSB加起来离1 LSB的总预算还有一点余量那这个设计方向基本可以放心往下走。3.2 模型里必须包含的非理想项模型不能只做一个理想ADC。如果行为级模型跑出来ENOB 9.9位而电路设计目标只要9位这个模型就没有预警意义。真正有用的行为级模型要把下面这些非理想项像积木一样可以单独开关采样开关的非线性电阻和有限带宽用随输入变化的Ron建模。时钟抖动对每个采样点叠加满足高斯分布的采样时刻偏移幅度由时钟源rms抖动决定。电容失配每个单位电容给一个(1 δ)的乘性扰动δ服从高斯分布标准差按工艺经验值设置。比较器失调与噪声分别在每拍比较前叠加固定偏置和随机噪声。DAC建立不完整每级DAC切换后只更新到一个比例系数默认不收敛到理想值。这些项的顺序也很讲究。比如抖动不只影响采样瞬间还会叠加到参考电压上这就需要在模型里把参考电压采样回路一起建出来。如果只采样抖动不加参考抖动高频ENOB会偏乐观0.3位以上。3.3 模型和后续电路文件怎么互相验证建模代码不是用过就扔。电路搭完之后我会把行为模型的输出和SPICE瞬态仿真的结果并排对比做法是在测试bench里用理想DAC重构网络把SAR电路的逐拍比较过程打印出来。两组码流输入同一个测试脚本如果ENOB偏差在合理范围内说明行为模型的误差源设置和真实电路基本相符。这时候行为模型的作用就从预演变成了诊断。后仿真如果发现某个工艺角下ENOB异常我回到底层模型里把失真源单独置为0看ENOB恢复到什么水平就能快速锁定是采样网络还是比较器的问题。这套互验流程是单纯靠电路仿真很难做到的。我还习惯把行为模型的蒙特卡洛散点图和电路前仿的工艺角结果放在同一张图里。如果电路仿真的散点分布明显偏出模型预测的区间说明模型里至少有个非理想项的量级估计错了这时回头查模型比继续调电路划算得多。4. 仿真测试代码奈奎斯特频ENOB怎么测才靠谱4.1 测试台架与相干采样配置动态指标测试最怕频谱泄漏。你明明给的是一个纯净正弦FFT出来却每根谱线都拖一条裙边噪底抬高ENOB直接没法看。解决的方案是相干采样fin M / N × fs其中N是FFT点数M是小于N/2且与N互质的正整数。这样采样序列正好涵盖M个完整信号周期FFT结果里信号能量稳稳落在单一bin不需要额外加窗。为了测奈奎斯特频有效位这个项目里的仿真配置是采样率fs100MHzFFT点数N8192取M4095算出fin4095/8192×100MHz约等于49.99MHz。由于4095和8192互质频谱没有泄漏信号bin位置就在第4095根谱线附近。激励源侧同样要注意正弦源要用理想源加很小的谐波失真参数避免测试本身的高谐波污染SNDR。比较器和DAC的参考电压仿真里我会分别跑理想源和带内阻模型两版看看被测电路对参考阻抗有多敏感。4.2 有效位计算的核心代码仿真结束后拿到的是一串数字码流先用脚本把它重建成对应模拟电压再做FFT。我给一个简化的Python思路可以直接拿走再用真实波形替代import numpy as np def calc_enob(codes, nbits, vref, nfft, sig_bin): codes np.asarray(codes, dtypefloat) # 码字转电压差分满幅按±vref/2归一化 v (codes - (2**(nbits-1) - 0.5)) * vref / (2**nbits) # 矩形窗FFT相干采样下不需要加窗 spec np.fft.fft(v * 2.0 / nfft, nnfft) spec spec[:nfft // 2] power np.abs(spec) ** 2 signal_power power[sig_bin] # 收集谐波位置2*sig_bin, 3*sig_bin... 超出N/2的要折返 harmonics [] for h in range(2, 9): pos (h * sig_bin) % nfft if pos nfft // 2: pos nfft - pos harmonics.append(pos) harmonic_power sum(power[pos] for pos in harmonics) noise_power power.sum() - signal_power - harmonic_power - power[0] sndr_db 10 * np.log10(signal_power / (noise_power harmonic_power)) enob (sndr_db - 1.76) / 6.02 return enob实际上代码需要注意如果CDAC有冗余位重建电压时要把冗余位的权重折算回去这块很容易出错。我的习惯是在testbench里直接用理想DAC重构输出波形对重构波形做FFT这样能避开码字权重折算带来的系统偏差。SNDR的计算就是把信号bin的功率当信号把除DC、信号及其谐波之外的所有bin功率当噪声加失真。SFDR是最大杂散THD是前几阶谐波功率之和。这几个指标要一起打出来只盯ENOB会漏掉一些异常形态。4.3 奈奎斯特频测试最容易出现的假分数测出9.5位低频ENOB不稀奇测出9.0位奈奎斯特ENOB才值得说道。我踩过的大坑至少有四个。第一个是FFT点数不够。长度256点和8192点的噪底差异巨大点数太少会把量化噪声的谱密度抬高很多ENOB看着偏低。第二个是没有锁定输出码字的采样时刻。异步SAR的码字有效时刻和采样时钟之间有延迟变化重建波形相位对不准谐波会散开ENOB也被低估。第三个是只把输入频率拨到49.9MHz但忘了用相干采样组合频谱泄漏直接吃掉1位。第四个最隐蔽测高频性能时时钟源用的是理想方波忽略了时钟抖动。抖动对高频输入的影响前面说过想让它显露出来必须给激励源加抖动参数。还有一个习惯很值得保留必须分别跑低频Fin测试和高频Fin测试。低频测试的作用是暴露除了采样网络之外的误差比如比较器失调、CDAC失配、参考噪声高频测试则额外叠加采样带宽、抖动、开关非线性的影响。两张频谱图都打出来对比SNDR的差值能帮你判断性能瓶颈是偏静态还是偏动态。5. 电路文件组织与整机仿真收敛5.1 交付目录怎么组织才配得上完整电路这套工程交付的时候我不是只交一个顶层netlist完事而是按照别人拿到就能直接复现的结构来组织。模拟IP完整交付要含四层内容。最顶层是集成测试台架包含testbench、激励配置、输出码流收集逻辑。核心层是电路文件也就是采样前端、CDAC、比较器、SAR逻辑、参考网络的schematic或网表。辅助层是行为模型Verilog-A或者Python参考模型用于交叉验证。最后一层是运行脚本覆盖DC/AC/TRAN/NOISE/Monte Carlo配置和FFT指标脚本。命名规则也值得多说一句。所有cell按模块前缀加功能加版本号命名比如COMP_MAIN_V2、CDAC_CTRL_RC2版本注释写在网表头部避免改了几版之后再也分不清哪个是加了冗余位的版本。我自己吃过这个亏交付给后续团队时发现调了一周的失调校准代码还是旧版白忙一场。5.2 工艺角、温度与后仿真之间的时间账前仿真ENOB漂亮是应该的后仿真和PVT才是真实水平。一般我会跑TT、SS、FF三个工艺角再叠加-40、25、125三档温度外加电源电压高低两端。比较器的速度在SS角和低温组合下最难受采样开关的线性度在FF角和高温组合下更容易出谐波。这些组合不一定会同时拉爆但必须让脚本自动化跑完不能靠手工改参数。后仿真的寄生抽取在这个项目里属于重头戏。CDAC顶板节点、比较器输入的寄生会直接影响分压比例和kickback幅度。前仿ENOB 9.2位、后仿真掉到8.6位的案例我见得太多了。所以前仿阶段至少要留出0.4到0.6位的余量这样经过PVT和寄生抽取之后还有可能守住9.0位的目标。5.3 静态指标DNL/INL的测试台动态指标之外10位SAR还必须有静态指标。DNL/INL的测法是用缓慢斜坡或满幅正弦统计输出码字出现频次转换成直方图再对直方图做处理。正弦直方图法比斜坡更常用因为正弦发生器的谐波更容易控制。测INL需要足够的样本量通常每个码bin期望命中几千次才够统计置信度。这一环节不要贪快我曾在某次项目里用2^15个点测出的INL完全看不出问题扩到2^18点后暴露出衰减电容比例偏了0.15%的问题。所以静态测试的采样点数宁多勿少。静态指标主要衡量CDAC的匹配和开关切换的单调性。对完整SAR来说静态指标要和动态指标放在同一个报告里看不能只报一个ENOB。低频静态性能决定了这个ADC在慢信号场景的表现奈奎斯特动态性能则决定它在高速场景里的上限。6. 做完这套工程后最值得复用的三条经验6.1 高频性能掉点先查采样网络而不是比较器面对低频ENOB正常、奈奎斯特频ENOB跳水这一类现象第一反应应该是采样前端。因为比较器噪声和失调在低频、高频输入下几乎不变而采样带宽、抖动、开关非线性恰好只在输入频率高的时候发作。我在这个项目里最典型的一次修调就是把自举电容和采样管尺寸重新调整在高频点把ENOB从8.4拉回到9.1。遇到同样的表现先做带宽和抖动的预算核算别一上来就怀疑比较器、改比较器。改完采样网络再看频谱谐波结构往往就清楚了一半。6.2 参考电压的动态行为是隐藏变量很多人把CDAC的参考电压当成理想电网但真正的片内参考网络有电阻、有寄生电容还有数字开关导致的大电流抽取。当比较器一拍一拍切换CDAC时参考节点会在纳秒尺度上出现压降和恢复延迟而参考电压的毛刺会直接进入DAC的模拟输出表现为谐波和杂散。低频时恢复时间够用奈奎斯特频点附近恢复时间不够了毛刺就变成不可忽略的误差。解决思路通常是在DAC附近加去耦电容以及降低参考驱动的输出阻抗。但更重要的是在仿真阶段就把参考模型从理想源换成带内阻电容模型否则你永远测不到这个隐患。6.3 建模-电路-测试三个闭环才是完整工程做完整交付和做模块Demo最大的区别是三个闭环必须互相咬合。建模代码定的误差预算要能翻译成设计指标每个电路模块的仿真结果要能回溯到模型里的对应参数测试脚本算出来的ENOB要能快速定位到具体模块去修。这套流程一旦建立每次改动都变得有迹可循。以后再做下一个ADC我不会从零开始。行为模型改几个参数就是新规格的预演仿真bench和测试脚本直接复用真正花时间的地方只会在电路差异上。对想入手SAR ADC的朋友我强烈建议也按这个思路来先别追求画出多完美的原理图先用建模代码把预算和算法吃透再用一个完整的高频测试环境倒逼所有模块设计到位。