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)
\[\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)\)在高頻時會下降,因此使用公式\((3.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模擬 |
自負載電容\(C_{dd}\)對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。後面的設計中會將噪聲的影響考慮進來,同時會進行一個完整的運放設計,敬請期待!