|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
×
小弟最近在学习做ADC,对于ADC ADC INL和DNL测试流程有几点疑问,感谢各位前辈不吝赐教~~
1、对于输入信号一般有两种三角波和正弦波,看到有前辈说正弦波会准一些,那么输入正弦波的频率需要满足相干采样吗?如果需要,那么对于10bit 20M的ADC,取1024个点509个周期,输入信号的频率就是fin=(fs/1024)*509,总的采样时间=1024/20M=51.2u,这样可以吗?
2、分析INL和DNL的时候是用ADC输出的10位2进制码来测试还是用理想DAC转化后的10进制波形进行测试?
3、看到论坛上有说用美信的matlab代码测试INL和DNL,我找了一下应该是下面这个代码,还是不太明白cadence仿真出来的波形数据怎么和代码联系起来,要怎么导出仿真数据进行测试呢?导出什么数据?matlab代码应该首先要读cadence导出的数据吧,那这部分代码应该怎么写呢?
function[DNLmax,DNLmin,INLmax,INLmin]=Static_test(Vin,N)
Dout=Vin;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%% 静态特性测试 %%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 计算DNL/INL
min_bin=min(Dout);
max_bin=max(Dout);
code_num=max_bin-min_bin;
h=hist(Dout, min_bin:max_bin); % 直方图
ch = cumsum(h); % 累积直方图
Tlevels = -cos(pi*ch/sum(h)); % 升余弦拟合
hlin = Tlevels(2:end) - Tlevels(1:end-1); % 相邻码箱之间的差异
hlin = hlin(3:end-2); % 丢弃边缘码箱
lsb = sum(hlin) / (length(hlin)); % 查找箱之间的平均差异,以消除增益误差
dnl = [0 hlin/lsb-1]; % 删除增益误差,中心处DNL为0
inl= cumsum(dnl); % INL是DNL的积分(求和)
DNLmax=max(dnl);
DNLmin=min(dnl);
INLmax=max(inl);
INLmin=min(inl);
% 绘出DNL/INL绘
figure;
subplot(2,1,1) %绘出DNL
Q_DNL=plot(linspace(min_bin+2, max_bin-2, length(dnl)), dnl,'k');
set(gca,'linewidth',2);
set(gca,'FontWeight','bold','fontsize',15,'fontname','Arial');
set(Q_DNL,'linewidth',2);
title(sprintf('DNL'),'FontWeight','bold','fontsize',20,'fontname','Arial');
xlabel('Digital Code [LSB]');
ylabel('DNL [LSB]');
grid on;
box on;
xlim([0 2^N]);
ylim([-1 ceil(max(dnl))]);
text(0.02,0.5,sprintf('DNLmax = %3.2fLSB\n\n\n\n\nDNLmin = %3.2fLSB',DNLmax,DNLmin),...
'sc','FontWeight','bold','fontsize',15,'fontname','Arial');
subplot(2,1,2) %绘出INL
Q_INL=plot(linspace(min_bin+2, max_bin-2, length(dnl)), inl,'k');
set(gca,'linewidth',2);
set(gca,'FontWeight','bold','fontsize',15,'fontname','Arial');
set(Q_INL,'linewidth',2);
title(sprintf('INL'),'FontWeight','bold','fontsize',20,'fontname','Arial');
xlabel('Digital Code [LSB]');
ylabel('INL [LSB]');
grid on;
box on;
xlim([0 2^N]);
ylim([floor(min(inl)) ceil(max(inl))]);
set(gca,'xgrid','off');
set(gcf, 'unit', 'centimeters', 'position', [10 5 18 14]);
text(0.02,0.5,sprintf('INLmax = %3.2fLSB\n\n\n\n\nINLmin = %3.2fLSB',INLmax,INLmin),...
'sc','FontWeight','bold','fontsize',15,'fontname','Arial');
|
|