1. SAR ADC基础与设计概述
逐次逼近型模数转换器(SAR ADC)作为中高精度、中等速度应用的主流选择,在工业控制、医疗设备和消费电子等领域广泛应用。其核心优势在于结构简单、功耗低且易于集成。我设计过多个采用TSMC 65nm工艺的SAR ADC芯片,实测10位分辨率下功耗可控制在3mW以内,特别适合电池供电场景。
传统SAR ADC的工作流程就像用天平称重:先用最大砝码(MSB)比较,根据结果决定保留或移除,再用次大砝码继续比较,直到最小砝码(LSB)。这种二分搜索算法使得N位转换仅需N个时钟周期,效率极高。但实际工程实现时,需要解决比较器失调、电容失配、开关非线性等一系列问题。
2. 关键模块深度解析
2.1 栅压自举开关设计要点
在采样阶段,MOS开关的导通电阻会随输入电压变化,导致非线性失真。采用栅压自举技术后,实测THD改善超过20dB。具体实现时需要注意:
-
自举电容值选择:太小会导致栅压维持不足,太大会增加寄生电容。经验公式:
$$C_{boot} ≥ 10 \times C_{gs}$$
其中$C_{gs}$为开关管的栅源电容 -
时钟交叠处理:必须确保自举时钟φ1和采样时钟φ2有足够重叠时间,但又要避免同时导通。建议采用下图时序:
code复制φ1: _|‾|___|‾|___ φ2: ___|‾|___|‾| ↑ 重叠区域 -
电荷注入补偿:可通过dummy开关管匹配尺寸,将残余电荷误差降低到0.1LSB以下
2.2 电容阵列(CDAC)优化方案
10位二进制加权电容阵列若采用单位电容,MSB电容将达到512C,面积过大。实际采用分段结构:
- 高6位:二进制加权(64C)
- 低4位:温度计编码(15C)
总面积缩减约40%
电容失配是影响INL的主要因素。在65nm工艺下建议:
- 单位电容≥1fF以保证匹配性
- 采用共中心对称布局
- 添加dummy电容环绕
实测数据显示,这种结构在50MHz采样率下可实现9.8位有效精度。
2.3 动态比较器设计技巧
比较器需要满足:
- 分辨率 < 1LSB(约1mV)
- 延迟 < 1/2时钟周期(10ns@50MHz)
采用两级动态比较器结构:
- 预放大器:提供约20dB增益
- 锁存器:完成最终判决
关键参数设计:
- 输入对管尺寸:(W/L)=10μm/0.2μm
- 尾电流:50μA(折中噪声与速度)
- 复位时间:占时钟周期的15%
注意:比较器失调电压需通过auto-zeroing技术校准,否则会导致DNL恶化
3. 系统级设计与仿真
3.1 异步时钟生成方案
传统同步时钟需要严格匹配各阶段时序,而异步方案通过"就绪-应答"握手协议更可靠。具体实现:
verilog复制module async_control (
input cmp_result,
output reg dac_update,
output reg sample
);
always @(posedge clk) begin
case(state)
IDLE: begin
sample <= 1'b1;
state <= SAMPLE;
end
SAMPLE: begin
sample <= 1'b0;
state <= CONVERT;
end
CONVERT: begin
if(bit_counter < 10) begin
dac_update <= 1'b1;
state <= WAIT_CMP;
end
else state <= DONE;
end
WAIT_CMP: begin
dac_update <= 1'b0;
if(cmp_ready) begin
reg[bit_counter] <= cmp_result;
bit_counter <= bit_counter + 1;
state <= CONVERT;
end
end
endcase
end
endmodule
3.2 冗余位数字校准
添加1位冗余可容忍±1LSB的比较器误差。校准算法流程:
- 记录原始码字D[9:0]
- 计算冗余校正量:
$$D_{cal} = D + (D_{red} - 0.5) \times 2^{N-k}$$
其中k为冗余位位置 - 饱和处理:限制输出在0-1023范围内
Matlab验证代码:
matlab复制function corrected = redundancy_cal(raw, red_bit)
weight = 2^(10 - red_bit);
corrected = raw + (red_bit - 0.5) * weight;
corrected = min(max(corrected, 0), 1023);
end
4. 前仿真与性能验证
4.1 瞬态仿真设置要点
在Cadence环境中需特别注意:
-
建立工艺库链接:
code复制libManager -> Attach to existing techlib -> tsmc65rf -
仿真器设置:
- 选择spectre作为引擎
- 最大步长设为0.1ns
- 开启tran noise分析
-
激励信号生成:
python复制import numpy as np fs = 50e6 # 采样率 fin = 1e6 # 输入频率 t = np.arange(0, 100/fs, 1/fs/100) vin = 0.5 * np.sin(2*np.pi*fin*t) + 0.5
4.2 关键指标测试方法
-
DNL/INL测量:
- 施加满幅斜坡信号
- 统计各码字出现的频率
- 使用Histogram方法计算
-
动态性能测试:
- 输入单频正弦波
- 做4096点FFT
- 计算SNR/SFDR/ENOB
实测典型结果:
| 指标 | 条件 | 实测值 |
|---|---|---|
| ENOB | fin=1MHz | 9.6bit |
| SFDR | fs=50MHz | 68dB |
| 功耗 | VDD=1.2V | 2.8mW |
| 转换时间 | 10bit | 200ns |
5. 常见问题与调试记录
5.1 采样保持阶段失真
现象:高频输入时SNDR急剧下降
排查过程:
- 检查自举开关栅压波形,发现高频时自举不足
- 增大自举电容从20fF→30fF
- 调整时钟驱动强度
解决后:1MHz输入时SNDR提升12dB
5.2 比较器亚稳态
现象:输出码字出现随机跳变
解决方案:
- 增加预放大级增益
- 延长比较阶段时间20%
- 添加输出锁存器
修改后误码率<1e-6
5.3 电容失配补偿
当INL超限时可采用:
- 前仿真提取电容比例误差
- 在Matlab中建立误差模型:
matlab复制cap_error = [0.01, -0.02, ..., 0.005]; % 各电容相对误差 ideal_weight = 2.^(9:-1:0); actual_weight = ideal_weight .* (1 + cap_error); - 通过数字后端校准系数修正
我在实际流片中发现,65nm工艺下电容匹配性通常能控制在0.5%以内,足够满足10位精度要求。但对于更高精度的设计,建议采用校准技术或改用差分结构。