1. 异步SAR ADC设计概述
在模拟数字转换器(ADC)领域,逐次逼近型(SAR)架构因其低功耗特性而备受青睐。而异步SAR ADC通过消除传统同步设计中的固定时钟周期约束,进一步提升了转换速度。刘纯成教授提出的单调开关技术更是将这一架构的优势发挥到极致,在TSMC 28nm工艺下实现了10bit 250MS/s的高性能指标。
异步SAR的核心创新在于其事件驱动的工作机制。与传统同步SAR不同,它不需要等待完整的时钟周期,而是利用比较器输出直接触发下一个转换阶段。这种设计理念类似于接力赛跑——只有当上一棒选手到达时,下一棒才会起跑,而不是按照固定的时间间隔盲目传递。实测表明,这种架构在250MS/s采样率下能节省约30%的转换时间,ENOB(有效位数)达到9.78bit。
2. 异步状态机实现细节
2.1 事件驱动状态转换
异步SAR的灵魂在于其状态机的特殊实现方式。与传统同步设计不同,这里的状态转换由比较器输出直接触发:
systemverilog复制always_ff @(posedge comp_out or posedge reset) begin
if(reset) begin
state <= IDLE;
clk_phase <= 1'b0;
end else begin
case(state)
IDLE: begin
samp_cmd <= 1'b1;
state <= SAMPLING;
end
// 其他状态转换逻辑...
endcase
end
end
这段代码的关键在于敏感列表中的comp_out信号。当比较器完成比较并输出结果时,会立即触发状态转换,而不是等待系统时钟的上升沿。这种设计带来了显著的性能提升,但也引入了新的时序挑战。
注意:在工艺角仿真中发现,tt/ss/ff三个corner下必须控制组合逻辑延迟在0.38ns以内,否则会导致状态机工作异常。
2.2 时序收敛策略
异步设计的时序约束与传统同步电路有本质区别。以下是关键的TCL约束脚本:
tcl复制set_clock_groups -asynchronous -group {comp_out}
set_max_delay 0.3 -from [get_pins comp_out] -to [get_pins state_reg*/D]
create_generated_clock -name async_clk -source comp_out [get_pins clk_phase]
这些约束告诉PR工具:
- 比较器输出信号
comp_out属于异步时钟域 - 从比较器到状态机寄存器的路径延迟必须控制在0.3ns以内
- 相位时钟
clk_phase是由comp_out生成的派生时钟
在实际布局布线中,需要特别注意这些路径的物理实现。建议采用以下策略:
- 将比较器与状态机寄存器尽量靠近放置
- 使用低阻金属层(如M6)布线关键路径
- 在tt工艺角下保留至少10%的时间裕量
3. 单调开关DAC设计
3.1 电容阵列优化
刘纯成提出的单调开关技术彻底改变了传统SAR ADC的电容阵列结构。传统10-bit SAR ADC需要31C单位电容,而单调开关方案仅需16C,面积节省近50%。Verilog-A模型展示了这一创新:
verilog复制`include "constants.vams"
module dac_monotonic (vin, dac_ctrl, vout);
// 端口定义...
electrical vin, vout;
parameter real C_unit = 100e-15 from (0:inf);
genvar i;
generate
for(i=0; i<4; i=i+1) begin : cap_array
if(i==0) begin
// 主电容分支
capacitor #(.c(C_unit*(8>>i))) Cmain (vin, vout);
end else begin
// 单调切换网络
switch #(.ron(100)) SW (dac_ctrl[i], C_unit*(8>>i), vin, vout);
end
end
endgenerate
endmodule
这个设计的精妙之处在于:
- 使用移位操作
8>>i动态调整电容权重 - 仅需4位控制信号即可实现10-bit精度
- 通过开关网络重构电荷分配路径
3.2 电荷注入补偿
在高采样率(>200MHz)下,开关的电荷注入效应会导致DNL恶化。实测数据显示:
- 未补偿时DNL:0.15LSB
- 添加dummy开关后DNL:0.05LSB
补偿方案建议:
- 在主开关两侧添加尺寸匹配的dummy管
- 采用差分对称布局减小梯度误差
- 使用传输门开关替代单管开关
4. 性能验证与调试
4.1 动态性能测试
使用Matlab进行频谱分析得到关键指标:
matlab复制[freq, psd] = pwelch(adc_out, 4096);
enob = (sinad(psd) - 1.76)/6.02;
sfdr = calculate_sfdr(psd);
disp(['ENOB: ' num2str(enob) '@250MS/s, SFDR: ' num2str(sfdr) 'dB']);
典型测试结果:
- 输入频率97.3MHz时SFDR=68.2dB
- ENOB=9.78bit@250MS/s
- 功耗:14.7mW
4.2 工艺角影响分析
不同工艺角下的性能波动:
| 工艺角 | SFDR(dB) | ENOB(bit) | 功耗(mW) |
|---|---|---|---|
| tt | 68.2 | 9.78 | 14.7 |
| ff | 67.5 | 9.65 | 16.2 |
| ss | 66.8 | 9.52 | 13.3 |
ff corner下SFDR下降0.7dB的主要原因是:
- 晶体管速度加快导致时序裕度减小
- 比较器失调电压增大
- 开关导通电阻变化影响电荷分配精度
解决方案:
- 增加后级数字校准电路
- 优化比较器偏置电路
- 采用自适应时序控制
5. 版图设计要点
5.1 电容阵列布局
单调开关DAC的版图需要特别注意:
- 单位电容采用共质心布局
- 金属走线对称分布
- 开关管靠近电容放置
- 添加屏蔽层减少串扰
5.2 异步时钟树综合
与传统时钟树不同,异步设计的"时钟"实际上是事件网络:
- 比较器输出需要低skew分布
- 状态机寄存器采用局部时钟缓冲
- 添加冗余缓冲器保证驱动强度
6. 调试经验分享
在实际流片前,仿真阶段发现几个关键问题:
-
亚稳态问题:比较器输出可能在不稳定时触发状态机
- 解决方案:添加亚稳态检测电路,超时重试机制
-
电荷共享误差:高位电容切换时影响低位精度
- 解决方案:优化开关时序,添加预充电相位
-
电源噪声敏感:异步逻辑对电源抖动更敏感
- 解决方案:增加片上稳压器,优化电源网格
在实验室测试中,发现以下实用技巧:
- 使用片上温度传感器监控热梯度影响
- 采用伪随机激励测试非线性度
- 利用扫描链调试内部节点波形