所示。在CLKc的第1个下降沿即ck<9>的上升沿,逻辑电路根据比较器输出comp的值来决定N<9>和P<9>的值,切换对应的P端或N端C9电容(256C)的下极板电压(GND或VR)。在CLKc的第2个下降沿即ck<8>的上升沿切换C8电容(128C)的下极板电压...在ck<I>的上升沿切换C1电容(1C)的下极板电压,最终得到的P<9:1>和最后一次比较结果作为D<9:0>输出。CLK_sCLK_c/ck<9>ck<8>.....ck<1>图5采样与转化时序二、SARADC的验证方法(一)CDAC电容验证CDAC单位电容的失配系数可以通过仿真得到,并与工艺文档中的失配系数相对照。具体的仿真方法是搭建一个简单的RC滤波网络原理图schematic,其中电阻使用无失配的理想电阻,电容则使用工艺库中的MIM电容,容值为单位电容大小。使用cadence软件中的ac仿真,可以得到该滤波网络的3dB带宽,即1BW =2元RCu之后在schematic界面新建adexlcellview,选择mc或者mismatch工艺角(不同工艺的失配工艺角不同),进行多次MonteCarlo仿真。根据仿真得到oBw反推得到单位电容的失配系数ou。CDAC的各项参数确定之后,可以在matlab中建模验证ADC的静态参数DNL和INL。定义电容失配的代码参考如下:%sar_adc电容阵列定义cu=20%单位电容20fc_i-[512 256 128 64 32 16 8 4 2 1 1];c_i=c_i*cu,ctotal_i=sum(c_i);%总电容n=length(c_i);%位数
所示。在 CLK_c 的第 1 个下降沿即 ck<9>的上升沿,逻辑电路根据比较器输出 comp 的值来决定 N<9>和 P<9>的值,切换对应的 P 端或 N 端 C9 电容(256C)的下极板电压(GND 或 VR)。在 CLK_c 的第 2 个下降沿即 ck<8>的上升沿切换 C8 电容(128C)的下极板电压.在 ck<1>的上升 沿切换 C1 电容(1C)的下极板电压,最终得到的 P<9:1>和最后一次比较结果作为 D<9:0>输出。 图 5 采样与转化时序 二、SAR ADC 的验证方法 (一)CDAC 电容验证 CDAC 单位电容的失配系数可以通过仿真得到,并与工艺文档中的失配系数相对照。具体的 仿真方法是搭建一个简单的 RC 滤波网络原理图 schematic,其中电阻使用无失配的理想电阻,电 容则使用工艺库中的 MIM 电容,容值为单位电容大小。使用 cadence 软件中的 ac 仿真,可以得 到该滤波网络的 3dB 带宽,即 BW = 1 2𝜋𝑅𝐶௨ 之后在 schematic 界面新建 adexl cellview,选择 mc 或者 mismatch 工艺角(不同工艺的失配 工艺角不同),进行多次 Monte Carlo 仿真。根据仿真得到𝜎ௐ反推得到单位电容的失配系数𝜎௨。 CDAC 的各项参数确定之后,可以在 matlab 中建模验证 ADC 的静态参数 DNL 和 INL。 定义电容失配的代码参考如下: %sar_adc 电容阵列定义 cu=20; %单位电容 20f c_i=[512 256 128 64 32 16 8 4 2 1 1]; c_i=c_i*cu; ctotal_i=sum(c_i); %总电容 n=length(c_i); %位数
%电容失配定义sigma_cu=cu*0.015;%以单位电容的失配值为基准%考虑失配后CDAC的真实电容值c=zeros(1,length(c_i);for i=1:length(c_i)sigma=sigma_cu*power(sqrt(2),log2(c_i(i)/cu);c(i)=c_i(i)+normrnd(0,sigma),endctotal=sum(c);%实际CDAC总电容SARADC切换过程的代码参考如下:%pure sar adc modelfunction [dout)-pure_sar_adc(vin,c,c_p,vos,vn,vref,vn_ref)n=length(c);ctotal=sum(c);vcm=vref/2;vin_p=vcm-vin;vin_n=vcm+vin;,%下级板采样并复位Q_p=(vcm-vin_p)*ctotal+(vcm-0)*c_p;Q_n=(vcm-vin_n)*ctotal+(vcm-0)*c_p;vdac_p=(Q_p+vcm*ctotal)/(ctotal+c_p);vdac_n=(Q_n+vcm*ctotal)/(ctotal+c_p),%电路开始量化相应电容进行切换,P端与N端电容上极板电压也做相应的变化vcmp_temp=zeros(1,n);for i-[1:n]vos_temp=vos+normrnd(0,vn),vref temp=vref+normrnd(O,vn_ref)if vdac_p-vdac_n-vos_temp>0vcmp_temp(i)=1;vdac_p=vdac_p-(vref temp/2)*c(i)/(ctotal+c_p);vdac_n=vdac_n+(vref_temp/2)*c(i)/(ctotal+c_p);elsevcmp_temp(i)=0;vdac_p=vdac_p+(vref_temp/2)*c(i)/(ctotal+c_p);vdac_n=vdac_n-(vref_temp/2)*c(i)/(ctotal+c_p);end
%电容失配定义 sigma_cu=cu*0.015; %以单位电容的失配值为基准 c=zeros(1,length(c_i)); %考虑失配后 CDAC 的真实电容值 for i=1:length(c_i) sigma=sigma_cu*power(sqrt(2),log2(c_i(i)/cu)); c(i)=c_i(i)+normrnd(0,sigma); end ctotal=sum(c); %实际 CDAC 总电容 SAR ADC 切换过程的代码参考如下: %pure sar adc model function [dout]=pure_sar_adc(vin,c,c_p,vos,vn,vref,vn_ref) n=length(c); ctotal=sum(c); vcm=vref/2; vin_p=vcm-vin; vin_n=vcm+vin; %下级板采样并复位 Q_p=(vcm-vin_p)*ctotal+(vcm-0)*c_p; Q_n=(vcm-vin_n)*ctotal+(vcm-0)*c_p; vdac_p=(Q_p+vcm*ctotal)/(ctotal+c_p); vdac_n=(Q_n+vcm*ctotal)/(ctotal+c_p); %电路开始量化相应电容进行切换,P 端与 N 端电容上极板电压也做相应的变化 vcmp_temp=zeros(1,n); for i=[1:n] vos_temp=vos+normrnd(0,vn); vref_temp=vref+normrnd(0,vn_ref); if vdac_p-vdac_n-vos_temp>0 vcmp_temp(i)=1; vdac_p=vdac_p-(vref_temp/2)*c(i)/(ctotal+c_p); vdac_n=vdac_n+(vref_temp/2)*c(i)/(ctotal+c_p); else vcmp_temp(i)=0; vdac_p=vdac_p+(vref_temp/2)*c(i)/(ctotal+c_p); vdac_n=vdac_n-(vref_temp/2)*c(i)/(ctotal+c_p); end