模擬集成電路實踐記錄
本實踐記錄以北京理工大學微電子實驗室培訓教程為參考,結合我的個人學習經歷和工作方向進行了一定的思考和整理。
我本科階段參與的競賽主要為數字方向,對於算法,單片機,FPGA,數字前后端花了很多時間去學習課外的知識以及參與實踐,並感到裨益匪淺。但模擬方向只是上過理論課,缺乏實踐經驗,而我博士研究的方向卻同時需要數字和模擬兩個方面的知識和技能,因此我決定抽出時間進行鍛煉。
課件來自北京理工大學微電子器件課程與國科大高等模擬集成電路課程,未經允許禁止轉載。
使用軟件為Cadence Virtuoso IC6,工藝庫為smic18mmrf。
實驗一,MOS的特性曲線
1.1 實驗背景
1.2 實驗內容
- 通過單管直流掃描,繪制smic18mmrf庫中的NMOS與PMOS的特性曲線,驗證MOSFET的工作特性
- 觀察MOS管的溝道調制效應
- 獲取MOS管的基本工藝參數(\(μC_{ox}(μA/V^2)\),\(V_{TH0}\)),用於后續實驗的電路設計
1.3 實驗過程
- 首先選取smic18mmrf ---> n18 作為測試元件
- 選取analoglib ---> vdc 作為直流電源,並分別設置DC voltage為變量VGS和VDS
- 如圖所示連接電路(除n18和vdc外,還需添加analoglib ---> gnd 作為參考地),點擊check and save檢查並保存電路
- Launch ---> ADE L啟動仿真
- 在Design Variables窗口中右鍵,點擊Copy From Cellview,加入變量VGS和VDS到仿真環境中,並初始化兩個變量的值為0
- Outputs ---> To Be Plotted ---> Select On Schematic,點擊MOS管漏極,將漏極電流加入Outputs窗口
- Analyses ---> Choose,設置dc仿真,變量VDS從0--3.3V線性掃描,步長為0.01
- Tools ---> Parametric Analysis,設置變量VGS從0--1V線性掃描,步長為0.1
- Analysis ---> Start Selected運行仿真
- 得到NMOS管在VGS:0 --- 1V,VDS:0 --- 3.3V的輸出曲線
- 以同樣的方法繪制NMOS的轉移特性曲線,dc掃描時選擇VGS作為變量VGS:0 --- 1V,VDS:0.5 --- 3V
- 如下圖所示連接PMOS測試電路(smic18mmrf ---> p18,analoglib ---> vdc,analoglib ---> vdd)
- 重復NMOS管的測量步驟(范圍步長等均相同),得到PMOS管在VGS:0 --- 1V,VDS:0 --- 3.3V的輸出特性曲線和轉移特性曲線
1.4 實驗分析
以下的分析主要以NMOS作為對象,PMOS的分析實際上與NMOS是類似的。
- 工作區間,從仿真得到輸出特性曲線上可以很容易的看出NMOS的工作區間——截止區,線性區和飽和區,在飽和區后進一步增大VDS會導致IDS急速增大,即出現擊穿現象
- 從轉移特性曲線上來看,可以發現MOS管的開關特性,VGS小於閾值電壓時IDS非常小,當VGS大於閾值電壓后IDS開始快速上升
- 可以觀察到明顯的溝道調試效應,溝道調制系數決定了MOS管的輸出電阻。
- 通過特性曲線,可以大致計算出MOS管的基本工藝參數(\(μC_{ox}(μA/V^2)\)與\(V_{TH}\))
\(V_{TH}\)通過轉移特性曲線的轉折點獲取。
\(μC_{ox}\)通過將輸出特性曲線中的飽和區的\(I_{DS}\),\(V_{GS}\),\(V_{DS}\),以及晶體管的\(W/L\)代入公式飽和區電流公式\(I_{DS}=\frac{1}{2}μ_nC_{ox}\frac{W}{L}(V_{GS}-V_{TH})^2(1+\lambda V_{DS})\)中來進行計算。
\(μC_{ox}(μA/V^2)\) | \(V_{TH}(mV)\) | \(\lambda(V^{-1})\) | |
---|---|---|---|
NMOS | 235 | 410 | 0.126 |
PMOS | 73.6 | -456 | 0.197 |
matlab代碼:
%% NMOS
% VGS = input("VGS = ");
% VDS1 = input("VDS1 = ");
% IDS1 = input("IDS1 = ");
% VDS2 = input("VDS2 = ");
% IDS2 = input("IDS2 = ");
%
% WLp = 1.2222; % 220/180
% VTH = 0.41;
%
% slope = (IDS2 - IDS1)/(VDS2 - VDS1);
% bias = IDS1 - slope*VDS1;
%
% uCox = bias * 2 / (WLp * (VGS - VTH)^2);
% lambda = slope / bias;
%
% fprintf("uCox = %f\n",uCox);
% fprintf("lambda = %f\n",lambda);
%% PMOS
VGS = input("VGS = ");
VDS1 = input("VDS1 = ");
IDS1 = input("IDS1 = ");
VDS2 = input("VDS2 = ");
IDS2 = input("IDS2 = ");
WLp = 1.2222; % 220/180
VTH = 0.456;
slope = (IDS2 - IDS1)/(VDS2 - VDS1);
bias = IDS1 - slope*VDS1;
uCox = bias * 2 / (WLp * (VGS - VTH)^2);
lambda = slope / bias;
fprintf("uCox = %f\n",uCox);
fprintf("lambda = %f\n",lambda);