GMID方法基本模块设计
本征增益共源级ICS模型
下图是理想本征增益共源级ICS的小信号电路,可以从中得到关于GMID方法设计的一些基本参数定义。
-
传递函数特性:
该系统的传递函数如下所示
\[A_{V}(j\omega)={V_{out}\over{V_{in}}}\approxeq{A_{V0}\over{1+j{\omega\over{\omega_c}}}}\tag{1.1} \]\[A_{V0}=-{g_m\over g_{ds}}\tag{1.2} \]\[\omega_c={g_{ds}\over{C_L}}\tag{1.3} \]其中,\(\omega_c\)是系统的转角频率(Corner Frequency),也称为-3dB带宽。另一个重要的参数是单位增益带宽,写作\(\omega_u\),表示系统传递函数增益下降到0dB时的带宽。
\[\omega_u\approxeq{g_m\over C_L}\tag{1.4} \] -
扇出:
扇出是一个常用在数字逻辑中的概念,写作\(FO\),它表示的是系统驱动的输出等效电容和系统输入电容的比值。\(FO\)相当于以一种归一化的形式表示了系统的负载电容,并且在系统中负载常常为另一晶体管。由于在设计过程中,所有器件的大小常常同时放大或缩小,因此可以用\(FO\)变化不大。
在之后的设计中,\(FO\)可以用来表示\(GBW\)、偏置电流、噪声等参数之间的折衷。本征增益共源级ICS的\(FO\)可以表示为
\[FO={C_L\over{C_{gs}+C_{gb}+C_{gd}}}={C_L\over C_{gg}}\tag{1.5} \]也可以表示为
\[FO={C_L\over C_{gg}}={g_m/C_{gg}\over{g_m/C_L}}={f_T\over f_u}\tag{1.6} \]当\(f_u>(1/10)f_T\)时模型精确度会大大降低,因此在设计中一般令\(FO\geq10\)。
注:在系统输入电容计算时应该会考虑\(C_{gd}\)的密勒效应,但由于增益\(A_{V}(j\omega)\)在高频时会下降,因此使用公式\((1.5)\)有效而简单的等效。
本征增益共源级ICS设计
-
常规设计:(偏置在强反型区或中等反型区)
常规的设计中常常是以\(g_m/I_D\)为”旋钮“来调节带宽、增益、噪声等关系的折衷。一般的设计步骤为
- 根据指标要求确定\(g_m\);
- 选择所需的\(L\):
- 短沟道:高速、小面积;
- 长沟道:高本征增益、良好的匹配…;
- 选择合适的\(g_m/I_D\):
- 大的\(g_m/I_D\):低功耗、大信号摆幅(\(g_m/I_D\)和\(V_{Dsat}\)成反比);
- 小的\(g_m/I_D\):高速、小面积;
- 找到电流密度\(J_D=(I_D/W)\);
- 找到管子宽度\(W\)。
设计实例1:
设计IGS,其中\(C_L=1pF\)且\(f_u=1GHz\)。找到合适的\(g_m/I_D\)和\(L\),使得低频增益最大;
假设\(FO=10\)、\(V_{DS}=0.6V\)、\(V_{SB}=0V\),并通过仿真软件验证结果
由该题目写出的 Matlab程序如下
%载入数据 nch = load('D:\Personal\Desktop\GmId\180tmsc_nch_27_tt.mat'); pch = load('D:\Personal\Desktop\GmId\180tmsc_pch_27_tt.mat'); %确定扫描维度L和gm/ID L = nch.L; gmid = 1:0.2:25; %输入设计条件 CL = 1e-12; fu = 500e6; FO = 10; VDS = 0.9; VSB = 0; %找到符合fu的gm/ID值 for i = 1: length(L) Ln = L(i); de.fu(:,i) = look_up(nch, 'GM_CGG', 'GM_ID', gmid, 'VDS',... VDS, 'VSB', VSB, 'L', Ln)/2/pi/FO; de.gmidfu(:,i) = gmid'.*(de.fu(:,i)>fu); de.av(:,i) = look_up(nch, 'GM_GDS', 'GM_ID', de.gmidfu(:,i), 'VDS',... VDS, 'VSB', VSB, 'L', Ln); de.maxav(:,i) = max(de.av(:,i)); de.maxgmid(:,i) = max(de.gmidfu(:,i)); end %画出满足fu要求且gmid最大时,gmid、Av和L的关系图 semilogy(L, de.maxgmid, 'LineStyle', '--','DisplayName','gm/ID'); hold on; semilogy(L, de.maxav, 'LineStyle', '-','DisplayName','av'); %找到最大增益的L和gmid [x,y] = find(de.av==max(de.maxav)); fin.L = L(y); fin.gmid = gmid(x); %计算出管子的W fin.gm = fu*CL*2*pi; fin.ID = fin.gm/fin.gmid; de.Jd = look_up(nch, 'ID_W', 'GM_ID', fin.gmid, 'VDS',... VDS, 'VSB', VSB, 'L', fin.L); fin.W = fin.ID/de.Jd; fin.VGS = look_upVGS(nch, 'GM_ID', fin.gmid, 'VDS',... VDS, 'VSB', VSB, 'L', fin.L); fin.VDS = VDS; fin.VSB = VSB; fin.Av = look_up(nch, 'GM_GDS', 'GM_ID', fin.gmid, 'VDS',... VDS, 'VSB', VSB, 'L', fin.L); fin.fu = fu; fin.Av_dB = db20(fin.Av); clearvars -EXCEPT nch pch fin
此时设计出的参数都存储在了结构fin中,查看fin的信息可知
fin =
包含以下字段的 struct:
L: 0.3800
gmid: 14
gm: 0.0031
ID: 2.2440e-04
W: 58.5652
VGS: 0.5583
VDS: 0.9000
VSB: 0
Av: 131.3310
fu: 500000000
Av_dB: 42.3673
验证:在Linux中使用Virtuoso进行了验证,将\(L\)、\(W\)、\(VGS\)、\(VDS\)代入电路图中。
注意:版图参数也会影响仿真结果,可以尝试宽度\(W=2\mu m\),增加\(Finger\)
仿真结果如下所示,可以看到VGS、电流、增益基本在目标上。而GBW误差较大,
Ac仿真 | Dc仿真 |
自负载电容Cdd对GBW的影响
-
在设计过程中,关于输出节点的电容我们只考虑了负载电容,而没有考虑MOS管自身的寄生电容。在大\(g_m\)或者大的器件宽度时,寄生电容可能会引起超过6.7%的误差。
将寄生电容也加进负载中的小信号模型为
其中\(C_{dd}=C_{db}+C_{gd}\)是MOS管寄生电容的等效负载。
若在设计中考虑\(C_{dd}\)的影响,可以使用迭代的方式:
- 假设\(C_{dd}=0\);
- 利用\(GBW\)指标和\(C_L+C_{dd}\)计算出管子参数;
- 计算当前设计的\(C_{dd}\);
- 回到第二步将\(C_{dd}\)带入开始迭代;
- 重复该过程直到\(GBW\)符合要求。
实际CS设计
实际的共源级不会是理想电流源负载,而是有真正的负载,例如电阻、电流镜等。这一节学习如何设计实际的CS级。
有源负载CS
理想电流源被替换为了电流镜负载,因此输出电阻成为两个管子的并联,会减小。因此低频增益会减小,但增益带宽积变化不大,因为单位增益带宽约为\(f_u=g_{m1}/C_L\)(假设管子寄生远小于\(C_L\))。
-
设计自由度:由于单位增益带宽的要求,M1已经决定了M2的电流。对于M2我们只能设计它的\(g_m/I_D\)值和沟道长度\(L\)。
-
低频增益:该电路的低频增益由以下公式得到
\[A_{V0}=-{g_{m1}\over{g_{ds1}+g_{gs2}}}=-{({g_m\over I_D})_1\over{({g_{ds}\over{I_D}})_1+({g_{ds}\over{I_D}})_2}}=-{({g_m\over{I_D}})_1\over{{1\over{V_{EA1}}}+{1\over{V_{EA2}}}}}\tag{2.1} \]其中\(1/V_{EA}\)为当前器件的厄利电压。当两个MOS管厄利电压相等时,相比理想电流源负载,增益减小了约50%。并且可以通过提高\(V_{EA2}\)或减小\((g_{ds2}/I_D)\)的方式来提高增益。
-
电流镜参数的选择:
上图显示了电流镜\((g_{ds}/I_D)\)和\((g_m/I_D)\)之间的关系。可以看出,电流镜\((g_m/I_D)\)较小时\((g_{ds}/I_D)\)也才比较小。但由于\({g_m/{I_D}}={2/{V_{ov}}}\),,当\(g_m/I_D=5\)时,\(V_{ov}=400mV\),因此为了保证合适的电压摆幅,\(g_m/I_D\)的值不能太小,可以取在10附近。
但电流镜的长度\(L\)选择并不清楚,更大的\(L\)会增加增益,但会带来更大的寄生电容。因此\(L\)的选择存在折衷关系,在后面慢慢解决。
-
设计实例:
\(f_u=1GHz\),\(C_L=1pF\),\(FO=10\),\(V_{DD}=1.8\),输出共模电压\(V_{out}=V_{DD}/2=0.9\),令\((g_{m}/I_D)_2=10\ S/A\),考虑电流镜\(L\)对电路的影响。
matlab程序如下
clear all % 载入数据库 load('/home/harroy/Workspace/Gmid_Design/Database/180tmsc_nch_27_tt.mat'); load('/home/harroy/Workspace/Gmid_Design/Database/180tmsc_pch_27_tt.mat'); % 输入设计条件 p.CL = 1e-12; p.fu = 0.5e9; p.FO = 10; p.VDS = 0.9; p.VSB = 0; % 确定输入NMOS管的扫描L p.L = 0.18:0.02:1; % 根据FO和fu确定输入管的gmid de.gmid1 = look_up(nch, 'GM_ID', 'GM_CGG', 2*pi*p.fu*p.FO, ... 'VDS', p.VDS, 'VSB', p.VSB, 'L', p.L); de.gdsid1 = diag(look_up(nch, 'GDS_ID', 'GM_ID', de.gmid1, ... 'VDS', p.VDS, 'VSB', p.VSB, 'L', p.L)); % 扫描负载管L,确定最大增益 de.gmid2 = 10; de.L2 = 0.2:0.1:2; for i = 1:length(de.L2) de.gdsid2(i) = look_up(pch, 'GDS_ID', 'GM_ID', de.gmid2, 'L', de.L2(i)); de.Av(:,i) = de.gmid1./(de.gdsid1 + de.gdsid2(i)); end [a,b] = max(de.Av); de.Avmax = a'; % 迭代计算MOS自负载电容对fu的影响 de.Cself = 0; for i = 1:5 de.gm1 = 2*pi*p.fu.*(p.CL+ de.Cself); de.ID = de.gm1./de.gmid1(b); de.W1 = de.ID./diag(look_up(nch, 'ID_W', 'GM_ID', de.gmid1(b), 'L', p.L(b))); de.Cdd1 = de.W1.*diag(look_up(nch, 'CDD_W', 'GM_ID', de.gmid1(b), 'L', p.L(b))); de.W2 = de.ID./look_up(pch, 'ID_W', 'GM_ID', de.gmid2, 'L', de.L2); de.Cdd2 = de.W2.*look_up(pch, 'CDD_W', 'GM_ID', de.gmid2, 'L', de.L2); de.Cself = de.Cdd1 + de.Cdd2; end % 输出结果,保存于结构fin中 fin.L2 = 0.5; de.index1 = find(de.L2==fin.L2); fin.gm1 = de.gm1(de.index1); fin.gmid1 = de.gmid1(b(de.index1)); fin.ID = de.ID(de.index1); fin.W1 = de.W1(de.index1); fin.L1 = p.L(b(de.index1)); fin.W2 = de.W2(de.index1); fin.Av = de.Avmax(de.index1); fin.fu = p.fu; fin.VGS1 = look_upVGS(nch, 'GM_ID', fin.gmid1, 'VDS',... p.VDS, 'VSB', p.VSB, 'L', fin.L1); fin.VGS2 = look_upVGS(nch, 'GM_ID', de.gmid2, 'L', fin.L2); fin.gds1 = fin.ID*de.gdsid1(b(de.index1)); fin.gds2 = fin.ID*de.gdsid2;
此时得到的设计结果为
fin = 包含以下字段的 struct: Ln: 0.3000 Lp: 0.5000 Wn: 58.5373 Wp: 144.9534 gmidn: 14.8066 gmidp: 10 ID: 2.4933e-4 gmn: 0.0037 Av: 65.8323 fu: 500e6 Cself: 175.17e-15 VGSn: 0.5493 VGSp: 0.6393 gdsn: 3.2968e-5 gdsp: 2.3109e-5
使用Spectre验证\(L=0.5\mu m\)时的系统指标。
指标 仿真结果 Av 64.9583 fu 487 MHz Cload 1.19179 pF gmn 3.6686 mS 可以看到,即使考虑自负载电容,增益带宽积依然存在误差,观察发现很可能是数据库中的Cdd电容存在一定误差,建议根据仿真结果手动添加补偿电容到设计程序中。
有源负载CS大信号仿真
gmid数据库同样能够预测系统的大信号特征。
-
设计实例:
以上文设计的有源负载CS放大器为例,仿真出该系统的大信号特性。
matlab程序如下:
% 完成上一个设计
ActiveGS_ex1;
% 设置扫描的输出信号VDS
VDD = 1.8;
VDSn = 0.05:0.01:1.8;
% 找到不同VDS下的电流值
IDn = fin.W1*look_up(nch,'ID_W','VGS',nch.VGS,'VDS',VDSn,'L',fin.L1)';
IDp = fin.W2*look_up(pch,'ID_W','VGS',fin.VGS2,'VDS',VDD-VDSn,'L',fin.L2);
% 根据电流相等来插值搜索输入信号VGS
for i = 1:length(VDSn)
VGSn (:,i) = interp1(IDn(i, :), nch.VGS, IDp(i));
end
% 画图
plot(VGSn, VDSn);
hold on
plot(VGSn, (VDD-(2*(1/de.gmid2)))* ones(1,length(VGSn)),'LineStyle','--');
plot(VGSn, (2*(1/fin.gmid1)* ones(1,length(VGSn))),'LineStyle','--');
仿真结果对比
Matlab | Spectre |
---|---|
可以看出Matlab的仿真结果在Spectre得到了很好的验证。
电阻负载CS
-
低频增益:
\[A_{v0}=-{g_{m1}\over{g_{ds}+{1\over{R}}}}=-{({g_m\over{I_D}})_1\over{({g_{ds}\over{I_D}})_1+{1\over{I_DR}}}}=-{({g_m\over{I_D}})_1\over{1\over{V_{EA}}}+{1\over{I_DR}}}\tag{4.1} \]实际设计中\(I_DR<<V_{EA}\)常常满足,因此增益可以简写为:
\[A_{v0}\approx -({g_m\over{I_D}})_1I_DR\tag{4.2} \] -
输出摆幅:
已知\(g_m/I_D=2/V_{ov}\),则当MOS偏置在强反型区(\(g_m/I_D\)较小)时,MOS的VDS可能会很接近Vov,导致输出信号摆幅很小。因此设计时\(g_m/I_D\)常常比较大。
-
设计实例:
CL=1pF,fu=500MHz,VDD=1.8V和FO=10。找到低频增益最大时的VDS、R和L。
% 载入数据
clear all
load('D:\Personal\Desktop\GmId\180tmsc_nch_27_tt.mat');
load('D:\Personal\Desktop\GmId\180tmsc_pch_27_tt.mat');
% 配置参数和扫描变量L、VDS
p.CL = 1e-12; p.fu = 0.5e9; p.FO = 10;
p.VSB = 0; p.VDS = 0.1:0.05:1.2;
p.VDD = 1.8; p.L = nch.L;
% 通过两个变量扫描出gmid和gdsid的二维数组
for i = 1:length(p.VDS)
gmid(:,i) = look_up(nch, 'GM_ID', 'GM_CGG', 2*pi*p.FO*p.fu, ...
'VDS', p.VDS(i), 'L', p.L);
gdsid(:,i) = look_up(nch, 'GDS_ID', 'GM_CGG', 2*pi*p.FO*p.fu, ...
'VDS', p.VDS(i), 'L', p.L);
end
% 计算并找到最大增益下的gmid、L、VDS
Avor = gmid./(gdsid+ 1./ (p.VDD-p.VDS(ones(length(p.L),1),:)));
[a,b] = max(Avor);
[c,d] = max(a);
fin.Avmax = c;
fin.L = p.L(b(d));
fin.VDS = p.VDS(d);
fin.gmid = gmid(b(d),d);
% 考虑自负载电容的影响
JD = look_up(nch, 'ID_W', 'GM_ID', fin.gmid, ...
'VDS', fin.VDS, 'L', fin.L);
Cdd_W = look_up(nch, 'CDD_W', 'GM_ID', fin.gmid, ...
'VDS', fin.VDS, 'L', fin.L);
fin.Cdd = 0;
for i = 1:5
fin.gm = 2*pi*p.fu*(p.CL+ fin.Cdd);
fin.ID = fin.gm/fin.gmid;
fin.W = fin.ID/JD;
fin.Cdd = fin.W*Cdd_W;
end
fin.R = (p.VDD - fin.VDS)/fin.ID;
fin.VGS = look_upVGS(nch, 'GM_ID', fin.gmid, ...
'VDS', fin.VDS, 'L', fin.L);
仿真对比结果如下
参数 | Matlab | Spectre |
---|---|---|
L(nm) | 220 | - |
W(\(\mu\)m) | 74.4167 | 74 |
VDS(mV) | 500 | 499 |
gmID(S/A) | 18.0333 | 18.0293 |
ID(\(\mu\)A) | 185.91 | 185 |
|Av|(V/V) | 16.1128 | 16.0496 |
VGS(mV) | 499.8 | - |
fu(MHz) | 500 | 491 |
R(k\(\Omega\)) | 6.9926 | 7.03 |
从结果发现GBW还是存在一些差距,主要还是Cdd在数据库中的表现不太完善,师兄提到在漏极看到的电容除了Cdd以外应该还有Cjd。并且在电路实现时还会进行一些微调来保证偏置正确。
差分对设计
差分对时模拟设计中最关键的模块。和IGS、CS不同,差分对的gm由尾电流源决定,而和栅极电压无关。
-
理想差分对设计实例:
有一个理想电流源偏置的差分对,其中CL=1 pF、fu=500 MHz、VDD=1.8 V、gm/ID=15 S/A、L=180 nm;输入共模信号VIC=0.9 V,输出共模信号被CMFB钳制在1V。设计电路。
% 载入数据库
clear all
load('D:\Personal\Desktop\GmId\180tmsc_nch_27_tt.mat');
load('D:\Personal\Desktop\GmId\180tmsc_pch_27_tt.mat');
% 输入参数
CL = 1e-12; fu = 0.5e9; gmid = 15; L = 0.18;
VIC = 0.9; VOC = 1;
% 根据偏置限制求得管子参数信息
VGS = look_upVGS(nch, 'GM_ID', gmid, 'VDB', VOC, ...
'VGB', VIC);
VSB = VIC - VGS;
JD = look_up(nch, 'ID_W', 'GM_ID', gmid, 'VSB', VSB, ...
'VDS', VOC-VSB);
gdsid = look_up(nch, 'GDS_ID', 'GM_ID', gmid, 'VSB', VSB, ...
'VDS', VOC-VSB);
Av = gmid/gdsid;
% 迭代计算自负载电容的影响
Cdd = 0;
for i = 1:5
gm = 2*pi*fu*CL;
ID = gm/ gmid;
Cdd_W = look_up(nch, 'CDD_W', 'GM_ID', gmid, 'VSB', VSB, ...
'VDS', VOC-VSB);
W = ID / JD;
Cdd = W * Cdd_W;
end
仿真结果对比如下
参数 | Matlab | Spectre |
---|---|---|
gmid(S/A) | 15 | 15.08 |
ID(\(\mu\)A) | 429.46 | 429.5 |
gm(mS) | 3.2 | 3.239 |
W(\(\mu\)m) | 30.46 | 31 |
L(nm) | 180 | - |
GBW(MHz) | 500 | 495.12 |
|Av|(V/V) | 31.3737 | 31.4123 |
-
5管OTA设计:
fu > 100MHz、CL=1 pF、VIC=0.9 V、VDD=1.8 V。尾电流源是理想电流源。设计电路。
令FO=20,预留更多裕度。同时gmIDp=10,以获得摆幅和增益上的折衷。得到的Matlab程序为
% 载入数据库
clear all
load('D:\Personal\Desktop\GmId\180tmsc_nch_27_tt.mat');
load('D:\Personal\Desktop\GmId\180tmsc_pch_27_tt.mat');
% 载入参数和扫描变量
CL = 1e-12; fu = 0.1e9;
VIC = 0.9; FO = 20;
Ln = 0.18:0.02:2;
Lp = 0.2:0.1:0.8;
gmidp = 10;
% 找到满足fu条件下的增益的最大值
gmidn = look_up(nch, 'GM_ID', 'GM_CGG', fu*FO*2*pi, ...
'VGB', 0.9,'L', Ln);
gdsidn = diag(look_up(pch, 'GDS_ID', 'GM_ID', gmidn, ...
'VGB', 0.9, 'L', Ln));
for i = 1:length(Lp)
gdsidp(:,i) = look_up(pch, 'GDS_ID', 'GM_ID', gmidp, ...
'L', Lp(i));
Av(:,i) = gmidn./(gdsidn +gdsidp(:,i));
end
[Av_Lp, Ind_Lp] = max(Av);
[Avmax, Ind_Ln] = max(Av_Lp);
% 将最大增益时的所有参数存储起来
fin.gmIDn = gmidn(Ind_Lp(Ind_Ln)); fin.Ln = Ln(Ind_Lp(Ind_Ln));
fin.gmIDp = gmidp; fin.Lp = Lp(Ind_Ln); fin.Av = Avmax;
fin.VGSn = look_upVGS(nch, 'GM_ID', fin.gmIDn, 'L', fin.Ln);
VGSpl = look_upVGS(pch, 'GM_ID', fin.gmIDp, 'L', fin.Lp);
fin.VGSp = look_upVGS(pch, 'GM_ID', fin.gmIDp, 'VDS', VGSpl, 'L', fin.Lp);
JDn = look_up(nch, 'ID_W', 'GM_ID', fin.gmIDn, ...
'L', fin.Ln);
JDp = look_up(pch, 'ID_W', 'GM_ID', fin.gmIDp, ...
'L', fin.Lp);
% 迭代自负载电容的影响
fin.Cload = 0;
for i = 1:5
fin.gmn = 2*pi*fu*(CL + fin.Cload);
fin.IDsin = fin.gmn/ fin.gmIDn;
fin.Wn = fin.IDsin / JDn;
Cdd_Wn = look_up(nch, 'CDD_W', 'GM_ID', fin.gmIDn, ...
'L', fin.Ln);
Cddn = fin.Wn * Cdd_Wn;
fin.Wp = fin.IDsin / JDp;
Cdd_Wp = look_up(pch, 'CDD_W', 'GM_ID', fin.gmIDp, ...
'L', fin.Ln);
Cddp = fin.Wp * Cdd_Wp;
fin.Cload = Cddn + Cddp;
end
fin.IDtot = fin.IDsin * 2;
fin.gdsn = fin.IDsin/ gdsidn(Ind_Lp(Ind_Ln));
fin.gdsp = fin.IDsin/ gdsidp(Ind_Ln);
下面是结果对比
参数 | Matlab | Spectre |
---|---|---|
gmIDn(S/A) | 18.1092 | 18.0304 |
Lp(nm) | 800 | - |
Ln(nm) | 360 | - |
Wn(\(\mu\)m) | 25.75 | 26 |
Wp(\(\mu\)m) | 34.77 | 34 |
IDtotal(\(\mu\)A) | 72.96 | 73 |
GBW(MHz) | 100 | 90.4 |
Av(V/V) | 88.7354 | 88.6612 |
总结
本文总结了使用Gmid进行设计的基本方法。基本原则是先根据条件(例如最大增益、GBW要求)寻找合适的gmID值,再通过迭代计算自负载效应对GBW的影响,最后得到系统的所有参数。gmID同时可以模拟大信号特性,一般做法是通过电流相等来寻找VGS。后面的设计中会将噪声的影响考虑进来,同时会进行一个完整的运放设计,敬请期待!