SAR ADC 是我做过的第一个真正从头搭晶体管级的混合信号模块,当时手里压着的题目就是一个 4 位 SAR ADC 的仿真验证。说来惭愧,最开始我以为“4 位”这种精度,接根导线都能当 ADC 用,结果真把 CDAC、比较器、SAR 逻辑串起来跑仿真时,踩的坑一点不比 12 位少。
这个项目适合三类人:一是刚接触混合信号设计、想搞明白 SAR ADC 内部到底怎么工作的初学者;二是手里有工艺 PDK,想做一次完整仿真验证流程的在校研究生;三是想快速评估架构、给后续更高位设计打基础的工程师。4 位的优势在于量化台阶少、容差大,可以让你把所有注意力放在“验证流程”本身,而不是跟各种二阶效应死磕。等这套流程跑顺了,再去做 10 位、12 位,你至少知道每一步该看什么、该抓什么。
下面我把整个设计、仿真和排查过程完整记录下来,包括我最终采用的参数、踩过的坑和对应的解决思路,希望能帮你少走一些弯路。
1. 为什么选 4 位 SAR ADC 做仿真验证
1.1 SAR 架构在 ADC 谱系中的位置
ADC 的主流架构有好几种:Flash、SAR、Pipeline、Sigma-Delta。在精度 8~12 位、采样率几百 kS/s 到几十 MS/s 这个区间里,SAR ADC 几乎是统治级的存在。它之所以流行,核心原因就一句话:结构简单、功耗低、面积小,而且数字工艺越先进越受益。
SAR 的全称是 Successive Approximation Register,逐次逼近寄存器。它的工作方式很像猜数字游戏:裁判心里想了一个数,你每次报一个中间值,对方告诉你“大了”还是“小了”,你根据答案不断缩小范围,直到猜中。SAR ADC 里的“裁判”是比较器,“报数字”的是 DAC,“记录范围”的是逐次逼近逻辑。
对比其他架构:
| 架构 | 速度 | 精度 | 功耗 | 面积 | 典型场景 |
|---|---|---|---|---|---|
| Flash | 极高 | 低(≤8位) | 极高 | 极大 | 高速接口、SerDes |
| SAR | 中高 | 中(8~14位) | 低 | 小 | 工业控制、IoT、生物电采集 |
| Pipeline | 高 | 高(10~16位) | 中高 | 中大 | 无线通信、视频 |
| Sigma-Delta | 低 | 极高(16~24位) | 中 | 小 | 音频、精密测量 |
4 位精度离实际产品需求确实有点远,但作为验证载体,它的好处是:哪怕你用最简单的二进制加权 CDAC、用最粗暴的同步时序,只要开关和比较器逻辑正确,转换结果基本都能出来。这种“低门槛”正是它适合做全流程验证的原因。
1.2 4 位分辨率的设计余量
4 位意味着输出码字范围是 0 到 15,也就是 16 个量化台阶。设定电源电压 1.8V、参考电压 1.8V、单端输入时,一个 LSB 就是 1.8V / 16 = 112.5mV。
这个 LSB 数值带来的直接好处是:比较器失调要求非常宽松。理论上只要失调小于半个 LSB,也就是 56mV,就不会出现明显的大码宽误判。在常规 180nm 工艺下,一个动态锁存比较器的输入对管失配典型值只有 5~20mV,完全在余量范围内。换句话说,4 位设计基本不需要做失调校准,这省掉了一大块工作。
同样,采样开关的导通电阻非线性、CDAC 电容失配、比较器回踢噪声这些让高阶设计头疼的问题,在 4 位精度下都不构成致命威胁。这不是说可以忽略这些效应,而是说你可以先跑通功能,再回头观察这些非理想因素如何影响性能——这正是教学和验证最好的节奏。
所以我的验证目标很清晰:
- 功能正确:输入任意电压,转换得到的 4 位码符合预期;
- 静态性能:DNL 和 INL 都在 ±0.5 LSB 以内;
- 动态性能:SFDR 和 SNDR 接近 4 位理想值 25.84dB,ENOB 能到 3.5bit 以上;
- 鲁棒性:在不同 PVT 条件下至少保证功能正确。
2. 整体设计与关键模块拆解
2.1 CDAC 电容阵列:4 位 ADC 的“主裁判”
SAR ADC 的核心是 DAC。DAC 的作用是把每一次比较后得到的数字码转换成模拟电压,送回比较器另一端。可以说 DAC 的线性度直接决定 ADC 最终能到多少位。
我选的是二进制加权 CDAC(电容型 DAC),这也是最经典的结构。4 位二进制加权电容阵列由 4 个电容组成,权重分别为 1Cu、2Cu、4Cu、8Cu,总电容 15Cu。
单位电容 Cu 的取值参考的是 kT/C 噪声约束和工艺匹配能力:
- kT/C 噪声:采样电容 15Cu = 750fF 时,热噪声均方根值约为 74μV,远小于 1 LSB 对应的量化噪声均方根 32.5mV,完全不构成瓶颈;
- 失配约束:180nm 工艺下 MIM 电容的失配系数大约在 1% 左右,单位电容取 50fF,最大权重电容 400fF,这个面积对应的失配足够让 4 位 ADC 做到 INL/DNL 远小于 0.5 LSB;
- 面积考虑:如果取 50fF,按照 MIM 电容密度约 2fF/μm² 估算,单位电容面积约 25μm²,整个 CDAC 也就几百平方微米,非常小。
最终电容阵列参数如下:
| 电容 | 权重 | 数值 |
|---|---|---|
| C0 | 1Cu | 50fF |
| C1 | 2Cu | 100fF |
| C2 | 4Cu | 200fF |
| C3 | 8Cu | 400fF |
| 总采样电容 | 15Cu | 750fF |
采样方式我采用了上极板采样(top-plate sampling),也就是所有电容下极板接输入信号,上极板接到比较器输入端,采样结束后断开输入,把所有下极板切到参考电压。这种做法的好处是信号路径上的开关数量少,电荷注入的误差也相对容易控制。
2.2 比较器:每次决定一个 bit 的“裁判”
比较器在 SAR 里承担的是二元判决任务,任何时刻只要比较器输出错了,对应的 bit 就可能出错。4 位精度下,我直接使用经典的 StrongARM 动态锁存比较器,这个结构在绝大多数论文里都能看到,特点是零静态功耗、速度极快、不需要额外的偏置电流源。
我用的比较器管子和初始尺寸如下:
- 输入对管 NMOS,W/L = 10μm / 0.18μm;
- 交叉耦合锁存 PMOS,W/L = 2μm / 0.18μm;
- 交叉耦合锁存 NMOS,W/L = 2μm / 0.18μm;
- 尾电流管 NMOS,W/L = 5μm / 0.18μm;
- 复位开关 PMOS,W/L = 1μm / 0.18μm。
这里有一个工程习惯:输入对管尺寸尽量做得比锁存管大。因为输入对管的失调和噪声会直接折算到比较器输入端,增大面积可以有效降低失配;锁存管尺寸则决定正反馈速度,太大反而增加回踢噪声。
比较器的回踢噪声(kickback noise)在 4 位精度下问题不大,但如果你后面做 12 位,就必须认真对待。回踢噪声的来源是:比较器在锁存阶段,内部节点电压发生大幅度翻转,这些翻转通过输入对管的栅漏寄生电容耦合到 CDAC 上极板,导致 DAC 电压被扰动。减小回踢的常用手段包括增加输入对管面积(减小寄生电容到输入节点的耦合)、在比较器前加一级预放大器、或者增大 CDAC 电容量来吸收电荷扰动。
2.3 SAR 逻辑与时序:每一步都必须踩准
SAR 逻辑是连接比较器和 CDAC 的桥梁。4 位转换需要 4 个比较周期,每个周期确定一个 bit,从 MSB 开始到 LSB 结束。
完整的一次转换流程可以拆成 5 个阶段:
- 采样阶段:下极板接 Vin,上极板复位到共模电压;
- 保持阶段:关断输入开关,准备开始转换;
- 第 1 次比较:把所有下极板接 GND,等效于 DAC 输出 0,比较器先确定符号?不,更准确的流程是 DAC 先输出 1/2 Vref,也就是 MSB 对应的中间电平;
- 第 2~4 次比较:根据前一次比较结果决定上一 bit 保留 1 还是 0,同时把下一 bit 的位置触发;
- 转换结束:4 个 bit 全部确定,输出数字码,进入下一次采样。
我采用同步逻辑实现:用一个 4MHz 的主时钟做比较时钟,用它的下降沿做采样阶段的同步信号。每次转换需要 4 个时钟周期,加 1 个采样周期,总共 5 个周期完成一次 4 位转换。如果采样率设定为 1MS/s,那么需要主时钟 5MHz,而不是 4MHz。这一点很多初学者容易算错。
时序上最容易遇到的问题,是“比较器的输出还没稳定下来,SAR 逻辑就把开关切走了”。为了规避这个风险,我在比较时钟的上升沿触发比较,在下降沿锁存结果,并把 DAC 开关更新放到下降沿之后,保证比较器的判决结果至少有半个时钟周期的稳定时间。这个设计习惯在更高速的设计里会成为瓶颈,但在 4 位精度下非常稳妥。
3. 仿真验证全流程实操
3.1 仿真 testbench 搭建与参数设置
本次仿真我用的工具是 Cadence Virtuoso IC6.1.8 + Spectre 19.1,工艺库是典型的 180nm Mixed-Signal PDK。其实工具不是关键,你只要明白了原理,换 HSPICE、Ngspice 甚至 LTspice 都能完成同样的事情。
Testbench 整体结构如下:
- 模拟输入:0~1.8V 可调直流源或慢斜坡,用 vpwl 实现;
- 采样时钟:1MS/s 方波,占空比 20%,高电平时间 200ns;
- 转换时钟:5MHz 方波,占空比 50%;
- 电源:1.8V;
- 负载:比较器输出接 4 位寄存器和理想 ADC code 记录器(可写成 Verilog-A 模块,也可以直接用理想 ADC 模型提取波形)。
我强烈建议第一步先把 CDAC 换成理想电容、比较器换成理想 Verilog-A 模型,先把整体功能和时序验证跑通,再逐步替换成真实晶体管模块。道理很简单:如果理想模型下功能就错了,那一定是逻辑或时序问题;换成真实晶体管后再出错,才可能是电路的非理想效应导致。这样分层排查,问题定位会快很多。
仿真参数上,Spectre 里我会设置tran stop=5.1u,因为 1MS/s 采样率下,一个采样周期是 1μs,加上 4 个转换周期共 5μs,跑 5.1μs 正好能看到完整的一次转换过程。为了控制精度,最大步长maxstep=20p通常足够,但如果你发现比较器翻转阶段波形异常,可以把 maxstep 调小到 2p 看一次翻转波形,正常之后再把 maxstep 调回来,否则全芯片 long transient 会跑得非常痛苦。
3.2 功能验证:从斜坡台阶看 16 个码
功能验证的第一步,是给一个固定直流输入,确认码字正确。
我给的第一个输入是 0.3V。0.3V / 1.8V × 16 = 2.67,理论上应该量化到 3 或 2。跑完一次转换后,观察输出寄存器,得到码字 3(二进制 0011)。这一步能说明最基本的功能是通的。
接下来做斜坡测试。用 vpwl 生成一个从 0 到 1.8V、步进 10mV、每步维持 10μs 的准斜坡信号。所谓“准斜坡”,本质上是 180 个直流台阶,让 ADC 在每个台阶上都能完成多次采样转换。
跑完斜坡后,我把输出码字按照时间顺序画出来,应该看到从 0 到 15 共 16 个清晰的台阶。如果某一个码字跳过去没出现,或者某个码字宽度明显偏窄,那就要回头查 CDAC 开关逻辑或者比较器的判决方向。我第一次跑的时候就出现过码字 7 和 8 之间跳变异常,后来定位到是 MSB 电容在切换时出现了建立不足的问题。
功能验证的最后一步,是验证传输特性曲线。把输入电压跟输出的码字对应起来,画成类似阶梯的曲线,检查每个码字的上下边界是否都在理论值附近。这一步刚开始不用追求精确到小数点后几位,只要阶梯形状完整、步进单调,功能就算基本过关了。
3.3 动态性能仿真:FFT 与 SFDR/SNDR/ENOB
功能通了之后,进入性能验证环节。SAR ADC 的动态性能通常看三个指标:SNDR(信纳比)、SFDR(无杂散动态范围)、ENOB(有效位数)。
我采用的 FFT 测试方法是相干采样法。设置如下:
- 采样率 fs = 1MS/s;
- FFT 点数 N = 4096;
- 输入频率 fin = 127/4096 × 1MHz ≈ 31.006kHz;
- 输入幅度为满量程正弦,即幅度 0.9V、偏置 0.9V。
为什么选 127 这个数?因为相干采样要求 fin/fs = M/N,其中 M 和 N 必须互质,这样采样点才能均匀分布在正弦波周期上,避免频谱泄漏,FFT 结果不需要加窗也能得到干净的频谱。我习惯选一个质数 M,配合 2 的幂次 N,这是标准做法。
从仿真中提取 4096 个采样点对应的输出码字后,我在 Python 里做了 FFT:
import numpy as np # codes 是从仿真中抽取的 4096 个整型码字 codes = np.array(codes, dtype=float) x = codes - np.mean(codes) # 去掉直流分量 win = np.blackman(len(x)) X = np.fft.rfft(x * win) spectrum = np.abs(X) ** 2 # 找基波 bin,理论上在 127 fin_bin = 127 signal_power = spectrum[fin_bin] noise_power = np.sum(spectrum[:fin_bin]) + np.sum(spectrum[fin_bin+1:]) # SNDR 和 ENOB sndr_db = 10 * np.log10(signal_power / noise_power) enob = (sndr_db - 1.76) / 6.024 位 ADC 的理想 SNDR 是 25.84dB,理想 ENOB 是 4bit。实测晶体管级仿真,在输入幅度接近满量程时,我得到的结果是 SNDR 约 24.5dB,ENOB 约 3.78bit,SFDR 约 28.7dB。这个结果在 4 位精度下很合理:损失的一小部分主要来自采样开关的导通电阻非线性、比较器的回踢扰动和有限的建立精度。
如果 SNDR 掉得非常严重,比如低于 20dB,那就要怀疑是不是采样保持阶段出了问题。常见问题包括:采样开关尺寸不够导致高阻状态下信号失真严重;CDAC 上极板复位开关动作导致信号被拉偏;或者比较器判决延迟导致 SAR 逻辑采到了错误输出。
3.4 静态性能仿真:INL/DNL 与码密度测试
静态性能主要看 DNL(差分非线性)和 INL(积分非线性)。传统思路上,可以从斜坡传输曲线提取跳变点来计算,但实测中更可靠的是码密度测试(code density test)。
码密度测试的思路是:给 ADC 一个频率与采样率不相干的慢正弦信号,均匀覆盖整个输入范围,采集足够多的码字样本,统计每个码出现的次数,再根据已知的正弦概率密度函数反推出每个码的实际宽度。
4 位 ADC 总共只有 16 个码,每个码理论上需要几百次出现才能得到统计稳定结果。我采集了 8000 个样本,每个码大约 500 次出现,足够估算 DNL/INL。
实测得到的 DNL 最大绝对值约 0.15 LSB,INL 最大绝对值约 0.20 LSB。这个结果说实话比我预期的要好,主要原因是 4 位分辨率对电容失配的容忍度太高了——就算电容失配 2%,对 4 位 DAC 线性度的影响也压进了 0.5 LSB 以内。
这个环节我最想提醒的一点是:码密度测试得到的码宽如果出现个别码明显偏窄或偏宽,先别急着怀疑比较器,先检查输入正弦是否真的覆盖了满量程。我发现过因为输入正弦偏置设置错误导致正负半周期不对称,最终码密度统计结果出现假性 DNL 尖峰的情况——那是测试设置问题,不是 DNL 问题。
4. 常见问题与排查技巧实录
4.1 比较器亚稳态、回踢噪声与毛刺
做比较器仿真时,最让人恼火的问题就是毛刺。表现为比较器输出在判决边缘反复翻转,或者从波形上看 CDAC 上极板电压在比较器翻转后出现一个明显的尖峰。
先说亚稳态。动态比较器是正反馈结构,如果输入差分电压非常接近零,锁存器可能需要很长时间才能翻转到稳定的数字电平。在仿真里,这表现为比较器输出长时间停在 VDD/2 附近上不去。4 位精度下这种概率很小,但一旦出现,结果就是该 bit 判决错误,最终码字偏差巨大。
解决思路有两个:一是加强锁存管正反馈强度,让翻转更快;二是在 SAR 逻辑里加“比较器完成”检测,等输出真正稳定后再锁存。后者更彻底,代价是逻辑复杂度增加,这也是很多工业级 SAR ADC 采用异步控制的原因。
回踢噪声的典型表现是:比较器输出翻转前后,CDAC 上极板电压出现几十毫伏的毛刺。在 4 位精度下,只要毛刺幅度小于半个 LSB(56mV)通常不影响结果,但它在波形上看起来非常吓人。要区分“毛刺是否影响性能”,我通常直接看最终码字:如果毛刺导致结果差 2 个码以上,那就要进一步处理。
减小回踢噪声的工程手段:
- 在比较器输入和 CDAC 上极板之间插入一个缓冲级或预放大器;
- 增大 CDAC 电容总量,提高节点对电荷扰动的吸收能力;
- 优化比较器输入对管尺寸,降低与内部锁存节点的寄生耦合;
- 实在不行,采用两级比较器结构。
4 位仿真验证阶段,我建议先不做这些优化,而是记录毛刺幅度,确认在容差范围内即可。把精力留给后面的流程。
4.2 DAC 建立时间不够,量化结果“差一码”
CDAC 的建立时间是 SAR 转换中很重要的约束。每次比较结果出来后,SAR 逻辑要把某个开关切换到位,CDAC 上极板电压需要在新状态稳定后才能进行下一次比较。如果建立时间不够,比较器就会在一个还没稳定的电压上做判断,结果自然不可靠。
建立时间可以用一阶 RC 模型近似分析。设开关导通电阻为 Ron,CDAC 总电容为 C。切换后 DAC 电压需要从旧值过渡到新值,允许的最大误差是 0.5 LSB。对于 4 位转换,初始最大误差约 1.8V,目标误差 56mV,衰减倍数是 32 倍,也就是要求 t > 3.47 × Ron × C。
示例计算:Ron = 1kΩ,C = 750fF,时间常数 τ = 0.75ns,需要的建立时间约 2.6ns。5MHz 时钟下半个周期 100ns,从理论上看离很充足。如果你用的开关很弱或者电容取值非常大,这个余量会急剧缩小。
我在项目中遇到的“差一码”问题,根源不是开关电阻,而是 SAR 逻辑里开关切换动作与比较器判决同时发生。解决办法是重新调整时钟相位,确保 DAC 开关更新后至少留出 20ns 的建立窗口。如果你用同步逻辑,可以把比较器判决放在时钟下降沿,DAC 开关更新放在下一个时钟上升沿之后,这样就有整整一个周期让 CDAC 稳定。
4.3 时序竞争与仿真收敛问题
同步 SAR 的时序竞争和异步 SAR 还不一样。同步 SAR 的竞争主要出现在时钟偏斜和组合逻辑延迟上。两个触发器如果共用同一个时钟,但时钟到达时间不同,就可能出现前一级的输出还没稳定的情况下后一级已经采样的局面。这个问题在仿真里通常不明显,因为仿真没有真实的时钟偏斜,但换成真实电路后要特别小心。
在 Spectre 仿真中,比较器这种正反馈结构经常导致收敛困难。典型报错是“Newton-Raphson did not converge”或者瞬态仿真突然中止。一些行之有效的处理技巧:
- 设置合理的仿真精度参数:
gmin默认值可能太小,可以尝试gmin=1e-12或更大; - 给可能的振荡节点加一个很小的电容,比如
cmin=1fF,帮助数值收敛; - 降低 maxstep,让仿真器能捕捉到比较器翻转过程;
- 比较器内部复位阶段节点电压可能飞很高,如果没有 ESD 保护钳位,可以临时在节点上并联大电阻到电源或地。
还有一个经验:如果仿真卡死在一个时间点上反复迭代,优先检查是不是时钟沿瞬间有多个开关同时动作,导致 CDAC 节点出现极小的时间常数,仿真器被迫用极小步长推进。解决思路是让这些开关动作在时序上错开一点,而不是完全同时。
4.4 仿真速度优化:把半天缩短到半小时
晶体管级 SAR ADC 的 transient 仿真速度是非常慢的,尤其当你为了算 FFT 需要跑 4096 个采样点时,全晶体管仿真可能要跑好几个小时甚至更久。4 位单体还好,但如果你不提前规划,等一下午不是梦。
我实际采取的提速组合拳:
- 功能验证阶段用慢速时钟,采样率降到 100kS/s,转换时钟 500kHz,这样 50μs 就能看到 5 次完整转换,跑完只要几秒;
- 性能验证阶段,不必全晶体管跑 4096 个点。我的做法是先用理想模型跑 4096 点验证 FFT 流程和脚本正确性,再抽 128 个有代表性的采样点跑晶体管级仿真,确认性能在预期范围内;
- 在 Spectre 中关闭不需要的寄生提取,只用 schematic 级别的仿真,速度和精度都够;
- 对比不同 tran 算法,
gear2在开关电容电路里通常比trap更稳定,误收敛现象更少; - 利用仿真器的“fast”模式或
aps加速器,对于中小规模电路可以做到 3~5 倍提速。
另外一个小技巧:在 FFT 测试时,如果你只需要看前几次谐波和噪声底,可以把 FFT 点数从 4096 降到 1024,采样点少了四倍,仿真时间就能大幅缩短。代价是频谱频率分辨率降低,但对于 4 位 ADC 的性能评估,1024 点已经足够看清谐波结构了。
5. 关于这个小项目的几点心得
走完整个 4 位 SAR ADC 仿真验证流程,我最深的体会是:低分辨率项目从来不是“低价值项目”。它最大的价值在于帮你把从电路结构、参数计算到验证方法的整套方法论建立起来。
比如单位电容怎么选、比较器失调容限怎么算、相干采样频率怎么定、FFT 结果怎么解读、码密度测试怎么排除测试本身引入的误差,这些能力在位数提高后依然完全复用。我后来去看 10 位 SAR ADC 的失配仿真和动态性能验证时,思路跟做 4 位时几乎是同一个框架,只是把余量收紧、把模型做精细。
最后再分享一个经验:在做这类小项目时,一定要养成保存“中间快照”的习惯。我会在一次转换完成的位置、采样结束的位置、每次比较结束的位置分别打标记,跑一次 transient 后快速查看这几个时间点的节点电压,极大提升排错效率。如果你一开始就觉得“仿真全绿”就是万事大吉,后面大概率会在某一步被一个很细微的时序问题绊住脚。
4 位 SAR ADC 的 16 个量化台阶看起来很简单,但它背后藏着一整套模拟与混合信号设计的核心思维。把它吃透了,你后续再面对更复杂的 ADC,心里就有底了。