热度 5| |||
一、offset测算的三种方法的参考
1.方法一:输入斜坡信号失调仿真 https://zhuanlan.zhihu.com/p/659558175
2.方法二:码密度法 《A Methodology for the Offset-Simulation of Comparators》、模拟\比较器\学习资料\eetop.cn_蒙特卡洛分析比较器的输入误差
2.方法二:环路仿真失调 比较器 offset 的精确仿真方法基于verilog-A Cadence-up主南城花再开《 A Simulation Method for Accurately Determining DC and Dynamic Offsets
in Comparators》
ref:https://bbs.eetop.cn/thread-662987-1-1.html
最终使用下来还是最传统的斜坡好用,方法三可以作为方法一的快速验证。
二、方法一:常规失调仿真
给比较器差分输入端一个缓慢变化(远慢于比较器时钟周期,保证在一个比较周期里输入改变的量很小,测出来才准)的斜坡信号,另一端输入Vcm,检测比较器输出发生改变的那个比较周期内在比较一开始时的输入斜坡信号与VCM的差值。
仿真电路:设置Vin2=Vcm,Vin1为叠加在共模上的缓慢斜坡信号(也可以Vin1和VIN2是相反方向的斜坡,找输出结果改变时Vin1和VIn2之差)
Vin1设置如下:因为比较周期为2ns,只要在1/2Tck=1ns内vin变化很小就好。设置输入变化率为15uV/ns,扫描从-30mV~+30mV,那么下面Time2=4u(通常offset是mV级,vin的uV变化影响很小)。斜坡时长可以是几百个甚至上千个时钟周期,本次仿真斜坡时长是2000个时钟周期。
SRlatch输出接一个DFF用于寄存输出值(每个参数都要设置值),DFF输出变化会滞后一个时钟周期。
设置输出值:因为DFF输出变化会滞后一个时钟周期,所以当DFF输出变化到1/2VDD的时刻减去一个时钟周期,此时为输出变化的上一个周期一开始比较的时间,value此时的斜坡值。
设置好MC工艺角和MC仿真,为了保存时域图像可以勾选红框内容
将希望被分析失配的管子换成mac的,这里将主要失配贡献的输入对管进行替换。可以通过分别替换mac的方式来看管子对offset的贡献,或者全替换后逐个勾选 mismatch effect。
尝试了两种找vin的方式:第一种是直接根据Vo1输出变化时间减去1/2Tck;第二种是当DFF输出变化到1/2VDD的时刻减去一个时钟周期。后者应该是更加准确,因为选择vin的时间更接近于比较一开始的时间。
跑了500次,标准差两种取值方法差不多。从图中3sigma可以看出,mean+3sigma为13.8mV。
看看将所有管子替换成mac的再测失配,3sigma值为14mV。说明对管的影响很显著。
三、方法二:码密度法
没有看懂原理,参考资料也写的有点莫名其妙,仅记录我所理解的仿真过程。
测试原理图如下:
输入为一个缓慢的三角波:
三角波通过被sah_ideal在CLK上升沿进行采样得到一个三角阶梯波形:
xfmr将输入转为差分信号:
输入各波形如下所示:因为时钟周期为2ns,所以Vin1和Vin2为每个周期变化20μV
设置trans仿真,时长和三角一样
设置500次MC仿真,查看VO1的情况
将所有VO1的数据以2ns为间隔,结束时间为一半三角波的时间导出:
所导出的数据为每次MC的截取时间+电压值(不知道为何第二次MC仿真的数据会被移到最后两列)
接着到Matlab里统计出每一个输入电压下对应的VO1为1的概率,即将csv数据中VO1的值数字化为1和0后按行相加再除以MC次数,然后通过统计函数计算sigma和均值,这里的统计处理不清楚原理:
clc
clear
VDD = 1.8;
cycle = 500; %MC仿真次数
VO1_tmp=csvread('mc_VO1.csv',2,0);
VO1_tmp1 = NaN * ones(size(VO1_tmp,1),size(VO1_tmp,2)/2);
VO1_digi = VO1_tmp1;
for i = 1 : size(VO1_tmp,2)/2 %取出数据中VO1的电压数据,删除时间数据
VO1_tmp1(:,i) = VO1_tmp(:,i*2);
end
for i = 1 : size(VO1_tmp1,1) %将VO1的电压数据数字化为1和0
for j = 1 : size(VO1_tmp1,2)
VO1_digi(i,j) = round(abs(VO1_tmp1(i,j))/VDD);
end
end
Ydata=[];
for i = 1 : size(VO1_digi,1) %计算每一个输入电压下1的占比
Y = sum(VO1_digi(i,:)) /cycle;
Ydata=[Ydata Y];
end
Xdata = -20:0.02:(-20 + 0.02 * (size(VO1_digi,1)-1)); %取决于你的 ramp 的范围和步长,取前一半时间的斜坡
figure(1)
plot(Xdata,Ydata); %得到概率随输入电压变化曲线
v = sqrt(2) * erfinv(Ydata * 2 - 1); %估计在 Ydata 概率出的标准正态分布的 x 取值
i = find(v > -3 & v < 3); %3sigma 准则
[p,s]=polyfit(Xdata(i),v(i),1); %用一阶 Xdata 去拟合 v 从而得出 Xdata 的方差和均值
figure(2)
plot(Xdata(i), v(i), Xdata(i), polyval(p,Xdata(i))) %展示拟合效果
Sigma = 1 / p(1)
Mu = -p(2) / p(1)
程序得到的1的占比随输入电压变化曲线
展示拟合效果
最终得到的均值mu和sigma,和方法一结果有些差别,不确定过程的正确性。
四、方法三:环路仿真失调
4.1 测试原理:
理想比较器在VP=VN时输出0和1概率对半,但由于offset存在使得VP=VN时输出概率不对等。只有当|VP-Vn|=offset时输出0和1才对半开。所以在下图中,通过环路的无限DC增益使得vod平均为0,所以比较器输出0和1的概率相等。那么此时的Vref-Vfb的均值就是比较器阈值的偏移量即offset。
各点波形如下,VFB的峰值应小于DOTB所希望的分辨率,VFB的峰峰值越小,精度越高。峰值取决于积分器增益和时钟周期。
gearshift技术:在达到平衡后,降低积分器的增益,使vFB的峰值非常小。vFB的峰间变化越小,准确性就越高。“gearshift”可以设置为在特定时间开始,例如下图中通过后期S2断开来减小环路增益以降低Vfb峰值提高offset测量精度。
|
|
4.2测试实例
其中积分器和运放是VerilogA的。
代码如下:
module integrator_VA(vout,vip,vin); input vip,vin; output vout; electrical vout,vin,vip; electrical vid; parameter real RC_val = 0.001 from(0:inf);
parameter real gnd = 0; real pole; Analog begin @(initial_step) pole = 1/RC_val; V(vid) <+ (V(vip)-V(vin)); V(vout) <+ pole*idt(V(vid),gnd); //$bound_step (1e-7); end
endmodule | module comparator_offset_VA(sigin,sigref,clk,sigout); input sigin,sigref,clk; output sigout; electrical sigin,sigref,clk,sigout; parameter real sigout_high = 1.8; parameter real sigout_low = 0; parameter real latch = 0.9; parameter real sigin_offset=0 from[-0.5:0.5];// in V parameter real comp_slope = 1000; parameter real trise =20p from (0:inf); parameter real tfall =10p from (0:inf); parameter real tdel = 0 from [0:inf); real out_val;
analog begin @(initial_step)begin if (sigout_high <= sigout_low)begin $display("RAange spes error");
out_val = 0; end end
@(cross(V(clk)-latch,+1))begin if(V(sigin)-V(sigref)+sigin_offset > 0) out_val=sigout_high; else out_val=sigout_low; end
V(sigout) <+ transition(out_val,tdel,trise,tfall); end endmodule |
仿真时需要根据Vfb的波形来调整运放增益和积分器的RC使得Vfb围绕Vref波动
设置好MC仿真后,设置观察的输出为Vfb和Vref之差在Vfb稳定波动时一段时间的平均值:average(clip((VT("/Vfb") - VT("/Vref")) 2e-06 4e-06))
仿真看到offset的3sigma为-34.5u±3*4.8m,和方法一结果差不多。
对该方法的感受:由于不使用缓慢输入信号,测试更快;在MC仿真的时域波形中会看到有些情况下Vfb整体在Vref上方或下方波动,而没有围绕,可能会影响结果;Vfb的峰峰值反映测量精度的关系不太明确。
个人觉得该方法可以作为方法一结果的快速验证。