从零构建12位SAR ADC:基于SMIC 18nm工艺的全定制电路设计与Cadence仿真验证
1. 12位SAR ADC设计入门指南第一次接触SAR ADC设计时我被这个看似简单实则精妙的架构深深吸引。SAR逐次逼近寄存器型ADC就像一位经验丰富的拍卖师通过不断缩小价格区间来精准定位商品价值。在物联网传感器节点这类低功耗场景中12位分辨率的SAR ADC凭借其结构简单、功耗低的优势成为首选。我使用的SMIC 18nm工艺是个不错的选择这个工艺节点在性能和成本间取得了良好平衡。记得第一次在Cadence Virtuoso里搭建测试环境时光是理解工艺库里的器件模型就花了两周时间。建议新手先从工艺文档的MOS管特性曲线看起特别是阈值电压和迁移率随温度变化的曲线这对后续比较器设计至关重要。整个ADC系统可以分解为几个关键模块采样保持电路、电容DAC阵列、高速比较器以及控制逻辑。这里要特别提醒千万别小看数字控制逻辑部分——虽然只占芯片面积的10%但时序上的任何差错都会导致整个ADC失效。我有个惨痛教训曾经因为一个反相器的延迟没算准导致转换结果错位了3个LSB。2. 电容DAC阵列设计实战2.1 分段式电容结构选择在12位设计中直接采用二进制加权电容阵列会面临两个致命问题面积爆炸和匹配精度下降。我的解决方案是采用48的分段式结构即高4位用二进制加权低8位采用温度计编码。这种结构在SMIC 18nm工艺下实测面积比全二进制结构节省了37%。电容匹配是另一个需要特别注意的点。在18nm工艺中建议使用金属-绝缘体-金属MIM电容而非MOS电容因为前者的电压系数更稳定。我通常会做蒙特卡洛仿真确保电容失配导致的DNL小于0.5LSB。这里有个小技巧在版图设计时采用共质心布局能有效改善梯度误差。2.2 开关网络优化技巧开关的非线性会直接恶化ADC的THD性能。我对比过传输门、bootstrapped开关等多种方案最终选择带电荷补偿的bootstrapped开关。具体实现时要注意补偿电容值取主电容的1/1000开关管的宽长比需要根据采样频率精细调整衬底偏置效应会引入额外非线性需要前仿真验证在Cadence里搭建开关网络时建议先用理想元件验证架构再逐步替换为实际器件。我曾经犯过的错误是直接使用工艺库里的标准开关单元结果发现导通电阻随输入信号变化太大导致INL曲线出现明显的S形畸变。3. 比较器设计要点解析3.1 动态锁存比较器设计比较器就像ADC的裁判其决策速度直接决定转换速率。在1.8V供电条件下我采用三级结构预放大器动态锁存器输出缓冲。实测表明这种结构在150MHz时钟下仍能保持小于0.5mV的输入失调。预放大器的增益设置很有讲究太高会增加功耗太低则无法抑制锁存器的kickback噪声。我的经验公式是Av ≥ (VDD/2) / (0.5LSB)对于12位ADCLSBVDD/4096因此Av至少需要2048。不过实际设计时会留50%余量我通常设定在3000左右。3.2 失调校准方案比较器的输入失调电压是影响ADC精度的主要因素之一。在18nm工艺下我实测的随机失调可达5mV。这里分享两种校准方法数字后台校准通过统计方法估计失调值在数字域补偿模拟前台校准采用电容存储失调电压在信号路径中抵消我更喜欢第二种方法因为不占用转换周期。具体实现时需要在比较器前端添加校准DAC注意校准电容的漏电流要控制在fA级以下。有个容易忽略的细节校准电压的建立时间必须比采样周期短否则会引入额外误差。4. 数字控制逻辑实现4.1 全定制时序生成电路与很多人用Verilog综合不同我坚持全定制设计数字逻辑。这样做的优势是时序可控性更好功耗能降低20%以上。关键模块包括16位环形计数器产生φ1-φ3时钟逐次逼近状态机输出锁存阵列在版图设计时要特别注意时钟信号的对称布线。我有次因为忽略了时钟树的RC延迟导致比较器采样时刻偏差了10ps使得ENOB下降了0.7位。现在我的做法是先用Spectre仿真提取寄生参数再进行时序验证。4.2 低功耗设计技巧物联网设备对功耗极其敏感这里分享几个实测有效的技巧采用时钟门控技术非工作时段切断组合逻辑时钟使用动态DOMINO逻辑替代静态CMOS关键路径采用低阈值电压器件电源电压分段设计数字部分用1.2V供电在SMIC 18nm工艺下通过这些优化可以将总功耗控制在3mW以内1.5MS/s采样率时。不过要注意降低电压会增加时序收敛难度需要做更严格的PVT仿真。5. Cadence仿真验证全流程5.1 瞬态仿真设置要点搭建测试平台时我习惯采用分层验证方法模块级单独验证DAC、比较器等子电路子系统级验证模拟前端数字逻辑的协同系统级完整ADC性能评估关键仿真参数设置tran 1p 16n sweep Vin 0 1.8 0.001 options accurate1 save V(comp_out) V(dac_out)特别注意要设置足够小的最大步长1ps否则会漏掉比较器的亚稳态。我通常会跑蒙特卡洛仿真检查工艺偏差下的性能波动。有个实用技巧在ADE L里设置自动测量脚本直接输出DNL/INL曲线。5.2 性能参数提取方法提取动态性能时我推荐用Cadence计算器中的FFT函数配合Matlab后处理。具体步骤采集至少4096个转换结果加Blackman-Harris窗减少频谱泄漏用Matlab计算[Pxx,f] pwelch(data,blackmanharris(N),[],N,fs); SNR 10*log10(sum(Pxx(signal_bins))/sum(Pxx(noise_bins)));对于静态参数我的测量方法是DNL用码字直方图法输入慢变三角波INL通过积分DNL得到注意要扣除端点误差失调误差测量中点码字偏移量记得保存所有仿真波形时加上annotate选项这样后期分析时可以快速定位问题点。我曾经通过波形标注发现一个奇怪的毛刺最终追踪到是电源去耦电容不足导致的。