模拟集成电路实践记录_MOS的特性曲线
模拟集成电路实践记录
本实践记录以北京理工大学微电子实验室培训教程为参考,结合我的个人学习经历和工作方向进行了一定的思考和整理。
我本科阶段参与的竞赛主要为数字方向,对于算法,单片机,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);