Loading

中国科学院大学模数转换器作业开源

1.编写12-bit SAR-ADC的行为级模型:

clear;
%% 信号产生
fclk=1e6;    %采样时钟
N=8192;      %采样点数
fsig=fclk/N*13;     %信号频率
amp=1.0;    %信号幅度
vi=amp*sin(2*pi*fsig/fclk*(1:N));  %输入信号
%% DAC电容
w1=[1024,512,256,128,64,32,16,8,4,2,1,0.5];
w2=[1024,512,256,128,64,32,16,8,4,2,1,0.5];
%% sar逻辑
for p=1:length(vi)
    vres=vi(p);
    dp = 0;
    for q = 1:12
        if(vres>0)
            d=1;
            vres=vres-w1(q)/sum(w1);
        else
            d=0;
            vres=vres+w1(q)/sum(w1);
        end
        dp = dp + d*w2(q);
    end
dout(p)=dp;
end
%% 去掉直流量
dout = dout -mean(dout);
%% 画PSD
ed_psd(dout',fsig,fclk,1,'r',0)

其中sar逻辑部分:

最外层循环即对整个信号进行采样,内层循环进行12次比较(对应12bit)

d为比较器输出,vres为残差电压,dp为数字输出(由于DAC最小单位为0.5,所以如果想要获得12bit,即-2048到+2048的整数值需要乘以2),sar逻辑即根据残差电压大于或小于0确定比较器输出,控制DAC更新残差电压,再次进行比较

运行结果:

vin:

img

dout(量化到12bit后):

img

1.1计算SNR

function snrdB=ed_psd(x,fin,fs,osr,color,debug)
N=length(x);
data=x;
Ts=1/fs;
N=N-mod(N,2);                               
f=fin/fs;

FL=1;                       %in Hertz of lower frequency
FH=fs/2/osr;                      %in Hertz of higher frequency
fBL=FL/fs*N;				         %in Bins of lower frequency 
fBH=FH/fs*N;                  %in Bins of higher frequency


data=data';
w=hann_pv(N);									%Window function
%w=blackmanharris(N)';
%w=nuttallwin(N)';
%w=kaiser(N,30)';
%w=hodiewindow(N)';
%w=ones(1,N);

[snrdB,ptotdB,psigdB,pnoisedB] = calcSNR(data,f,fBL,fBH,w,N);
ENOBloc=(snrdB-1.76)/6.02
%%%%   plot the power spctrum 
semilogx(linspace(0,fs/2,N/2), ptotdB(1:N/2), color);
%hold on
%semilogx(linspace(0,fs/2,N/2), pnoisedB(1:N/2), color);
text_handle = text(floor(fs/40),-25, sprintf('SNDR = %4.1f dB \nENOB = %2.2f bits ',snrdB,ENOBloc), ...
      'EdgeColor','red','LineWidth',3,'BackgroundColor',[1 1 1],'Margin',10);
grid on;
title('Power Spectral Density','Fontweight','bold','Fontsize',13)
xlabel('Frequency [Hz]','Fontweight','bold')
ylabel('PSD [dB]','Fontweight','bold')
set(gcf,'NumberTitle','off'); 
set(gcf,'Name', 'Power Spectral Density');
if (debug==1)
figure
noise=pnoisedB(1:N/2);
noise_out=10*log10(sum(10.^(noise/10)))
semilogx(noise,'b*')
end

运行结果:

PSD:

img

可见SNR达到74.1dB,有效位数达到12bit

1.2研究比较器噪声的影响

为了研究比较器噪声的影响,在sar逻辑部分增加一个高斯白噪声,均值为0,方差可调

%% sar逻辑
for p=1:length(vi)
    vres=vi(p);
    dp = 0;
    for q = 1:12
        %% 噪声生成
        n = randn * sqrt(0.1);
        if(vres + n>0)
            d=1;
            vres=vres-w1(q)/sum(w1);
        else
            d=0;
            vres=vres+w1(q)/sum(w1);
        end
        dp = dp + d*w2(q);
    end
dout(p)=dp;
end

扫描后,高斯白噪声方差与SNR之间的关系如下表:

噪声方差(\(\sigma^2\) SNR(dB)
0.1 10.9
0.01 20.8
0.001 30.6
0.0001 40.3

大致关系为噪声方差减小10倍,SNR提升10dB

不同方差下的信号采样结果:

噪声方差0.1:

img

噪声方差0.01:

img

噪声方差0.001:

img

噪声方差0.0001:

img

1.3研究DAC电容Mismatch的影响

DAC电容的容值本应该满足\(2^{11}:2^{10}:2^{9}:\dots:2^0\)的比例关系,Mismatch会破坏这一比例关系,导致SNR降低

使用如下DAC权重:

w1=[943,507,274,148,80,43,23,13,7,4,2,1,0.5];
w2=[943,507,274,148,80,43,23,13,7,4,2,1,0.5];

img

测得SNR下降到68dB,有效位数降低到11bit

2.编写单环3阶1-bit DSM的行为级模型:

clear;
%% 信号产生
fclk=1e6;  %采样时钟
N=8192;    %采样点数
fsig=fclk/N*13;   %信号频率
amp=0.4;      %信号幅度
vi=amp*sin(2*pi*fsig/fclk*(1:N));   %输入信号

%% 调制器参数
d=1;x1=0;x2=0;x3=0;vfb=0;
a1=0.3;a2=0.4;a3=0.5;

%% 3阶delta sigma调制器
for p=1:N
    x3 = x3 + a3*(x2-vfb);
    x2 = x2 + a2*(x1-vfb);
    x1 = x1 + a1*(vi(p)-vfb);
    test(p)=x1;
    if(x3>0)
        vfb = 1;
    else
        vfb =-1;
    end
   dout(p)=vfb;
end
ed_psd(dout',fsig,fclk,128,'g',0)

3阶DSM的行为级模型如上,其中3阶delta sigma调制器的部分,x1、x2、x3分别为一、二、三级积分器输出。x3送入到1bit量化器,输出+1和-1的判别结果vfb,并反馈到各级积分器中。

运行结果:

vin:

img

dout(1bit码流):

img

2.1计算SNR

同样通过ed_psd进行SNR的计算

img

可见SNR达到107.2dB,ENOB达到17bits

2.2研究积分器极点误差的影响

理想放大器中A为无穷大,因此理想积分器系统方程会表示如:

\[H(z)=\frac{az^{-1}}{1-z^{-1}} \]

因此对应的差分方程为:

\[y(n)=y(n-1)+ax(n-1) \]

而实际放大器A有限,因此实际积分器系统方程会表示如:

\[H(z)=\frac{az^{-1}}{1-\alpha z^{-1}} \]

因此对应的差分方程为:

\[y(n)=\alpha y(n-1)+ax(n-1) \]

其中\(\alpha\)趋于1,但总小于1,因此会导致极点误差。

这里假设第一级积分器存在极点误差:

%% 3阶sigma delta调制器
for p=1:N
    x3 = x3 + a3*(x2-vfb);
    x2 = x2 + a2*(x1+vn*randn()-vfb);
    x1 =(A-1)/A*x1 + a1*(vi(p)+vn*randn() - vfb);
    test(p)=x1;
    if(x3>0)
        vfb = 1;
    else
        vfb =-1;
    end
   dout(p)=vfb;
end

A的取值越小,极点误差越严重

放大器增益A SNR(dB)
\(\infin\) 107.2
1000 104.5
100 102.5
10 92.1

可以看到极点误差会造成SNR的下降

3.编写10-bit 时间交织ADC的行为级模型:

clear;
%% 信号产生
fclk=1e6;  %采样时钟
N=8192;    %采样点数
fsig=fclk/N*13;   %信号频率
amp=0.5;   %信号幅度
vi=amp*sin(2*pi*fsig/fclk*(1:N));  %输入信号
viq=round(vi*2^10);
%% 定义增益与失调
vos1=0;
vos2=0;
vos3=0;
vos4=0;
g1=1;
g2=1;
g3=1;
g4=1;
%% 4bit时间交织
for p =1:length(viq)
   if (mod(p,4)==0)
       viq(p) = round((g1*vi(p)+vos1)*2^10);
   end
   if (mod(p,4)==1)
       viq(p) = round((g2*vi(p)+vos2)*2^10);
   end
   if (mod(p,4)==2)
       viq(p) = round((g3*vi(p)+vos3)*2^10);
   end
   if (mod(p,4)==3)
       viq(p) = round((g4*vi(p)+vos4)*2^10);
   end
end

ed_psd(viq',fsig,fclk,1,'r',0)

定义了四路SUB-ADC,vi为输入信号,

运行结果:

vin:

img

viq:

img

3.1计算SNR

同样通过ed_psd进行SNR的计算

img

可见SNR达到62dB,ENOB达到10bits

3.2研究失调失配、增益失配的影响

模拟失调失配和增益失配,修改参数如下:

vos1=0.01;
vos2=0.02;
vos3=-0.03;
vos4=-0.04;
g1=1;
g2=1.01;
g3=0.99;
g4=1;

运行结果:

img

img

SNR下降到了21.8dB,有效位数下降到3bits

4.编写带有前馈结构的3阶4-bit Delta-Sigma调制器的行为级模型:

clear;
%% 信号产生
fclk=1e6;  %采样时钟
N=8192;    %采样点数
fsig=fclk/N*13;   %信号频率
amp=0.7;    %信号幅度
vi=amp*sin(2*pi*fsig/fclk*(1:N));   %输入信号

%% 带前馈的3阶4bit delta sigma调制器
N_bit=4;
Q_level = [-1+2/2^(N_bit):2/2^(N_bit):1-2/2^(N_bit)];
Q_dc = (2^N_bit-1)/2;
d=1;x1=0;x2=0;x3=0;vfb=0;
A = 10000;
a1=0.3;a2=0.6;a3=0.15;


for p=1:N
    x3 = x3 + 3*vi(p) - vfb * 3 + x2 + 3*x1;
    x2 = x2 + x1;
    x1 = x1 + (vi(p) - vfb);
    d = sum(x3>Q_level);
    vfb = (d-Q_dc)/Q_dc;
    dout(p) = (d-Q_dc)/Q_dc;
end
ed_psd(dout',fsig,fclk,128,'g',0)

3阶4bit前馈DSM的行为级模型如上,其中3阶delta sigma调制器的部分,x1、x2、x3分别为一、二、三级积分器输出。x3送入到4bit量化器,判别结果vfb,并反馈到各级积分器中。这里的量化器使用了flash结构,直接与16个Q_level进行比较输出结果。

运行结果:

vin:

img

dout(4bit码流):

img

psd:

img

4.1量化器采用SAR结构

将上面代码中的量化器(flash结构)更换为4bit sar结构:

%% sar量化器
w1=[8,4,2,1];
w2=[8,4,2,1];

for p=1:N
    x3 = x3 + 3*vi(p) - vfb * 3 + x2 + 3*x1;
    x2 = x2 + x1;
    x1 =x1 + (vi(p) - vfb);
    vres= x3;
    dp = 0;
    for q = 1:4
        if(vres > 0)
            d=1;
            vres=vres-(w1(q)/sum(w1));
        else
            d=0;
            vres=vres+(w1(q)/sum(w1));
        end
        dp = dp + d*w2(q);
    end
    vfb = (dp-Q_dc)/Q_dc;
    dout(p) = (dp-Q_dc)/Q_dc;
end
ed_psd(dout',fsig,fclk,128,'g',0)

运行结果:

vin:

img

dout:

img

psd:

img

4.2研究反馈DAC电容失配的影响

调整反馈DAC如下:

w1=[7,4,2,1];
w2=[7,4,2,1];

img

导致SNR产生了4dB的下降

进一步调整DAC如下:

w1=[6,4,2,1];
w2=[6,4,2,1];

img

SNR极度下降,ADC无法正常工作

4.3实现动态元件匹配

img

根据原理图进行代码实现:

clear
%% 动态元件匹配
% 位置寄存器值
pos = 0;
% 输入数据总数
N = 4;
% 以16位温度计码格式输入
Q{1} = '0000000011111111';
Q{2} = '0000000011111111';
Q{3} = '0000000011111111';
Q{4} = '0000000011111111';
for i = 1:N
    % 温度计码转换为十进制数
    Q_dec = sum(Q{i}=='1');
    % 更新移位寄存器输出
    out{i}=circshift(Q{i}',pos)';
    % 更新位置寄存器
    pos = Q_dec + pos;
    if(pos>16)
        pos = pos-16;
    end
end

运行结果:

img

该动态元件匹配因作为DAC的一个子模块,DAC作用于SAR量化器输出,转为模拟反馈电压vfb

posted @ 2022-07-22 20:42  sasasatori  阅读(1654)  评论(0编辑  收藏  举报