SAR ADC这几个字母做模拟IC的人应该都不陌生。8位精度看着不高却足够覆盖很多传感器读取、电池监控、医疗贴片这类中低速度场景结构天生省电、省面积几乎是每个模拟新手接触数据转换器时第一个要啃的硬骨头。今天这篇不打算讲教科书里的抽象原理而是把我自己在Cadence Virtuoso里从零搭建一个8位SAR ADC的完整过程摊开写——从最不起眼的D触发器开始一直跑到能出有效波形的完整仿真流程。你不需要多深厚的积累只要会画原理图、会跑tran跟着这套思路走一遍就能拥有一颗能出仿真结果的SAR ADC同时把逐次逼近的算法逻辑彻底吃透。1. SAR ADC整体设计与思路拆解1.1 为什么8位精度偏偏选SAR架构做ADC选架构本质是在速度、精度、功耗、面积四个框框里做取舍。8位这个精度段并行Flash ADC确实能做到极快但比较器数量是2的N次方翻倍8位就要255个比较器面积功耗直接爆炸流水线架构精度能做到12位以上但牵扯到级间放大器、MDAC这些复杂模块入门门槛太高而且中低速度下根本用不上那种带宽。Sigma-Delta倒是精度高问题是需要过采样和数字滤波转换速率天然受限制不适合逐点采样的低频信号链。SAR ADC在这中间的生态位非常舒服。它只需要一个比较器、一个DAC、一组数字逻辑复杂度低、功耗和面积都小8位、10位这种中低分辨率场景几乎是标配选择。更重要的是SAR ADC的模拟部分占比很小核心难点其实在那组控制时序的数字逻辑上——而这组逻辑说白了就是一堆D触发器组成的移位寄存器和数据寄存器。我遇到过很多同学一上来就死磕比较器失调、DAC失配结果连基本的逐次逼近时序都跑不出来最后仿真波形乱成一锅粥。所以我建议的顺序是先把D触发器吃透再回头看模拟模块。1.2 模块划分与“从数字到模拟”的设计顺序一颗8位SAR ADC的顶层结构拆开来看其实就四大块采样保持电路、比较器、电荷重分配DAC、SAR控制逻辑。前三个是模拟部分最后一个几乎全是数字逻辑。我最初搭建时的顺序是倒着来的——先写SAR逻辑再用理想比较器和理想开关把整体链路跑通最后才逐个替换成真实工艺器件。为什么这么干因为如果一开始就把模拟器件全部怼上去仿真失败时你根本分不清是逻辑时序错了还是比较器速度不够还是DAC建立时间太长。问题爆炸半径先缩小这是排查效率最高的做法。模块之间的连接关系也不复杂输入信号经过采样开关和采样电容存入电荷比较器不断判断DAC输出与输入的大小关系SAR逻辑根据比较结果逐位修改DAC的数字码最终把所有位确定完一组8位数字码就出来了。整条链路的时序由外部时钟统一驱动每个转换周期至少需要“8次比较余量处理”的时钟周期数。这里唯一要提前想清楚的是SAR逻辑的输出码位顺序是从MSB到LSB逐位逼近的也就是说第一个有效输出是最高位不是最低位这个方向搞反了后面全白搭。2. 从D触发器开始的SAR核心逻辑2.1 D触发器如何变出逐次逼近时序很多人可能觉得D触发器太基础跟ADC八竿子打不着。实际上SAR ADC最核心的“逐次逼近Successive Approximation”行为就是靠一组D触发器做成的移位寄存器来产生节拍另一组D触发器做成的数据寄存器来锁存每一位比较结果。举个实际例子假设现在要在8个时钟周期内逐位确定8位码。第一个周期SAR逻辑把最高位置1其余位全部置0DAC输出半个满量程比较器把输入Vin和Vref/2比一次结果存进最高位寄存器第二个周期把次高位置1连同刚确定的最高位一起送给DAC比较器再判断Vin是大于还是小于这个新电平结果存进次高位寄存器……如此重复8次每一位都确定了转换结束。这个“先置1试探不对就清零对了就保留”的过程硬件上就是一串D触发器。触发器时钟输入端共用数据端逐级串接形成移位寄存器产生节拍数据寄存器则在每个节拍到来时把比较器的0/1结果锁住。你可以用Verilog-A写一个理想行为模型来模拟这套逻辑但我个人强烈建议新手在Cadence里用原理图方式把D触发器真的搭出来跑一遍。只有亲手把时钟沿、Q端翻转、复位信号这些连对了你才会真正理解为什么SAR逻辑的建立时间不能超过半个比较周期——因为比较器结果必须在下一个时钟沿到来之前稳定摆到D端输入。2.2 逻辑实现与Cadence原理图搭建在Cadence Virtuoso里搭SAR逻辑我的习惯是先从最简单的单bit D触发器开始。用schematic Editor调出两个传输门加两个反相器搭一个主从结构的D触发器或者更省事一点直接用标准单元库里的D触发器symbol。如果是学生党手头没有PDK标准单元库用analogLib里的理想寄存器单元dff也行功能和时序仿真上差别不大关键是先把逻辑跑通。顶层SAR逻辑的搭建思路是这样的用一个8位移位寄存器初始值最高位为1其余位为0每个时钟周期右移一位产生8个节拍脉冲。用一个8位数据寄存器每一位的D端接比较器输出时钟端分别由对应的节拍脉冲控制。数据寄存器的输出Q[7:0]同时反馈去控制DAC的开关形成闭环。对照组这样画完瞬态里一眼就能看到“阶梯状”的DAC输出波形每到一个节拍就跳一个台阶8个台阶走完转换结束。我刚开始搭的时候犯过一个低级错误把数据寄存器的输出当成组合逻辑直接接到DAC导致DAC在每个时钟周期内反复跳变波形完全花掉。后来才意识到必须把比较结果锁存到时钟沿之后再去控制DAC这个时序关系是SAR逻辑最容易踩的坑。3. 模拟核心模块设计与参数计算3.1 采样保持第一个被低估的模块采样保持电路看着简单实际上决定了整个ADC的精度上限。最基础的拓扑就是一个NMOS开关加一个采样电容。采样时钟到来时开关导通输入信号给电容充电时钟结束后开关断开电容上的电荷保持住后续比较过程都用电容上存的这个电压。这里有两个问题必须提前考虑。第一个是开关关断时的电荷注入和时钟馈通。NMOS开关在关断瞬间会把沟道里的电荷注入采样电容导致采样电压偏移几十毫伏这个偏移对8位精度可能是致命的。解决办法是加虚拟开关dummy switch补偿或者用CMOS互补开关让P管和N管的注入互相抵消。第二个是采样电容的取值太小了KT/C热噪声大太大了前端驱动困难。以8位为例假设满量程1.8VLSB约7mV采样电容取1pF时KT/C噪声大约是64uV rms远小于LSB完全够用但考虑到后续DAC电容匹配和面积我实际取的是2pF左右留足裕量。比较经典的做法是把采样电容直接复用为DAC的电容阵列这就是后面要说的电荷重分配结构。这样做既能省掉一个独立的采样电容又天然实现了采样保持是绝大多数SAR ADC的标准方案。3.2 动态锁存比较器精度与速度的平衡点比较器是SAR ADC里最“模拟”的地方。8位SAR的比较器不需要多高的增益关键在于失调电压和速度。失调电压如果超过0.5LSB转换结果就会出固定码跳变8位0.5LSB大约是3.5mV1.8V满量程动态锁存比较器不校准的失调一般在5到15mV所以要嘛加大输入对管尺寸降低失调要嘛做失调校准。新手阶段直接在输入端加一个理想失调电压源做蒙特卡洛分析看看自己这颗比较器到底能不能扛住8位精度。速度方面动态锁存比较器靠正反馈锁存没有静态功耗非常适合SAR这种“比完就待机”的应用。但要注意它的回踢噪声——比较器锁存瞬间会把电源和输入节点的电荷往回踢干扰DAC电压严重时导致误判。解决办法是在比较器前面加一级预放大preamp既隔离回踢又放大微小差值。我给8位SAR做最简配置时用的就是一级PMOS输入差分对加锁存级预放大级用一个NMOS差分对加电阻负载整体结构非常经典。3.3 电荷重分配DAC8位精度的基石SAR ADC里的DAC业界主流就是电荷重分配Charge Redistribution结构靠电容阵列的比例分压产生参考电压。8位二进制加权电容阵列里最大电容是128C最小是C再加上一个与最小电容等值的unit电容完成全摆幅总共256C。假设取unit电容C20fF整个DAC总电容约5pF面积很小。电容匹配方面单位电容太小了匹配度差标准CMOS工艺下20fF的匹配误差大约在0.5%到1%量级足够8位用如果做10位我至少会取到50fF以上。转换过程走的是“采样-保持-逐位逼近”三步。采样相所有电容下极板接输入Vin上极板接共模电压Vcm保持相所有下极板切到地上极板电压变成Vcm-Vin逼近相先让最高位对应的128C下极板切到Vref上极板电压就加上Vref/2比较器判断Vin与Vref/2谁大结果决定这一位是否保留。接下来次高位64C切到Vref上极板再加Vref/4再比较一次。逐次进行8次电容阵列下极板的连接状态就编码了最终的8位数字输出。这里有个细节容易被忽略DAC电容阵列的建立时间。每一次开关切换电容都要通过开关的导通电阻充电建立到精度要求以内才能开始下一次比较。如果比较时钟是10MHz半个周期只有50ns要在这么短的时间内建立到0.5LSBRC时间常数必须远小于50ns典型要求是τ小于5ns左右。实际设计时开关尺寸要取到合适的大小既保证导通电阻低又不让时钟馈通太大。4. Cadence完整仿真流程实操4.1 库与工艺准备仿真之前先把环境搞定。Cadence版本尽量选6.1.8以上Virtuoso的界面和ADE L/ADE XL的操作基本通用。工艺库方面学生或自学者没有Foundry PDK的话用Cadence自带的gpdk180就非常合适它包含了cmos18rf工艺的器件模型、CDF参数和版图层次拿来学习SAR ADC绰绰有余。新建Library时记得选“Attach to an existing tech library”把gpdk180的工艺库挂上否则后面器件的模型参数全是空的。如果你打开一个现成的库却发现器件跑不了仿真第一件事就是检查这个库是否成功attach到了工艺库。另外库名不要用中文路径里也尽量不要有空格这是Cadence老生常谈的坑但每次都能坑到人。添加器件时在Library Manager里打开analogLib或gpdk180调出nmos4、pmos4、cap、res、vdc、vpulse这些基础单元。比较器的输入对管用gpdk180里的nmos4开关管我习惯用传输门也就是一个NMOS一个PMOS并联这样导通电阻在中段电压处不会太高。4.2 Testbench搭建与激励设置测试平台的构建会直接决定仿真结果能不能反映真实性能。我的建议是做一个独立的testbench库把DUT和所有激励源、负载都画在一起顶层原理图里只例化DUT和激励。输入信号用一个正弦波发生器频率设置要跟采样频率满足相干采样关系。比如采样频率1MSPS采样点数256输入频率就设在97.65625kHz这样FFT不会泄漏。时钟用vpulse周期1us脉宽设50%占空比即可。电源电压VDD设为1.8V参考电压Vref也取1.8V比较器的时钟和SAR逻辑的时钟共用同一个vpulse输出用buffer分两路驱动。一个非常实用的做法在testbench里放一个理想ADC的VerilogA模型跟真实的SAR ADC做对比输入同一个信号然后把两者的数字输出相减——差值是0说明转换完全正确差值恒定说明有失调差值随输入变化则说明线性度有问题。这个“背靠背对比法”是我调试ADC时最常用的手段比盯着波形猜高效得多。4.3 瞬态仿真关键参数与波形分析跑tran仿真前先想清楚要仿真多长时间。以1MSPS采样率、256点相干采样为例需要至少256us的转换时间再加上启动稳定时间总仿真时长我通常设在300us左右。这会让瞬态仿真在中等精度设置下跑十几分钟属于正常现象。ADE L里设置tran参数时最关键的是maxstep。如果maxstep太大采保开关的瞬态过程会被严重跳过波形看着没问题实际精度全丢了。我的建议是maxstep设为时钟周期的1/20到1/50也就是10MHz时钟下给20ns到50ns既能看清逐次逼近的细节又不至于慢到怀疑人生。仿真精度选择moderate或conservative如果仿真不收敛再切到conservative尝试。仿真完成后不要急着看整段波形。把x轴缩放到一个转换周期内应该能看到DAC输出即比较器输入负端呈现明显的逐次逼近阶梯第一个台阶接近Vref/2第二个台阶根据最高位结果决定跳向3Vref/4还是Vref/4方向后面依次细化。最后把8位数字输出转成十进制再还原成模拟值跟输入正弦信号对齐画在同一张图里两者应该几乎重合。要做性能分析信号的频谱分析也建议跑一下。Virtuoso自带的Calculator里有dft函数对数字输出码做FFT取SNR、SFDR再用ENOB (SNR - 1.76) / 6.02估算有效位数。8位SAR做下来SNR通常在45dB到50dB之间ENOB在7.2到7.8位属于正常水平如果连6位都不到直接去查失调和DAC建立问题。5. 常见问题与排查技巧实录5.1 瞬态仿真不收敛现象、原因、解法“Cadence瞬态仿真不收敛”是搜索量非常大的关键词实际遇到的情况也五花八门。最常见的场景是tran跑到某个节点突然报错说“Gmin/minStep exceeded”或者“Convergence not achieved”之类。我的排查顺序是这样的检查电路中是否有悬浮节点。比如电容一端没接好、理想开关断开后节点电荷悬空用“Check and Save”提前检查能避免大部分问题。把tran仿真算法的选项改一下。ADE L里点Choosing Simulation → Convergence Aids把iabstol和reltol适当放宽reltol从1e-3放到1e-2很多不收敛问题直接消失。如果还是不收敛改用带初始条件的仿真。从tran的“Initial Condition”选项卡里给电容上极板设置预充电压或者用别名为“ic”的语句直接给节点赋值。最后的大招是把仿真算法从默认的traponly改成gear2gear2对刚性系统更友好代价是稍微慢一点但8位SAR这种程度的电路完全跑得动。5.2 “器件未定义”与库配置仿真时提示器件未定义或者报“Unable to find model”十有八九是模型库没加载。如果用的gpdk180在ADE的Setup → Model Libraries里把gpdk180.scs文件加进去填写好工艺角的section比如tt确保路径正确。另一个常见原因是调器件的时候意外用了不存在的cellview检查Library Manager里器件是schematic还是symbol调用symbol视图而不是schematic。还有一次我调了analogLib里的理想运算放大器结果仿真报“opamp is undefined”后来发现是analogLib里根本没有叫opamp的cell正确的名字是opamp存在于ahdlLib里。Cadence的Lib列表很多别在analogLib里硬找直接去ahdlLib或者gpdk180里找效率高得多。5.3 精度达不到8位从哪几刀查起如果仿真能跑通但有效位数始终卡在6位或7位这时候要系统地查。第一步查DAC在testbench里给DAC单独加一个斜坡码输入从0递增到255看输出波形是不是严格等台阶的阶梯波台阶宽度不一致基本就是电容失配。第二步查比较器把比较器输入短接跑tran看输出是不是随机翻转如果是固定在一个方向说明有系统性失调。第三步查建立时间把比较器负端波形放大看每一个台阶如果台阶末端还有明显的指数上升尾巴说明建立不够加大开关尺寸或降低时钟频率。我自己的经验是8位SAR精度不够的原因一半以上出在DAC建立时间上不是比较器精度不够。很多新手喜欢把时钟频率调到很高结果DAC根本没建立好比较器拿到的是一个在漂移的电压自然比不准。先用低速跑通再把速度一点一点提上去是调试SAR ADC最稳妥的思路。5.4 仿真太慢的优化思路SAR ADC的仿真天然就慢尤其是采样点多的性能仿真。我常用的优化技巧有三个。第一把模拟精度要求不高的部分换成理想模型比如比较器用VerilogA行为级只在最后验证关键指标时才换成晶体管级第二仿真时长不要一上来就拉到300us先用几个采样点调试功能和时序确认无误后再跑长仿真第三在ADE XL里做参数扫描时优先用并行仿真几个corner同时跑比串行快好几倍。另外一个容易忽略的点是如果testbench里放了理想ADC对比模型它的仿真开销很小但如果放了很多冗余的电压源和探针也会拖慢仿真。测试平台里能删的探针尽量删波形存储只保留几个关键节点Shortlist不要存太多这些都是润物细无声的提速手段。最后分享一点个人体会整个项目做下来最大的收获不是那颗8位SAR ADC本身而是彻底理解了“逐次逼近”这四个字在电路里是怎么落地的。第一次把D触发器、比较器、电容阵列这些模块一个个拼起来看到示波器一样的比较器负端波形出现漂亮的八级阶梯时那种“原来译码过程真的可以这样一格格走完”的感觉是看书完全学不来的。如果你也是刚入门模拟IC做这个项目时记住一句话先让系统能跑再让系统跑对最后才让系统跑快。我见过太多人一上来就死抠比较器的增益、电容阵列的失配结果连基本时序都没调通白白消耗热情。按这篇文章的顺序——D触发器搭出逻辑理想器件跑通架构再逐级换成真实器件——两三个晚上就能见到一个能用的8位SAR ADC波形。后面想扩展的话可以试着把位数提升到10位、加入自校准逻辑、或者把采样率往上拉这些都会逼着你更深入地理解电容阵列的失配和开关时序的优化。祝你们第一次跑通的时候也能体会到那种步步逼近的快乐。
