2. MOSFET阈值电压提取:常数电流法与最大跨导法对比
任务说明
本案例基于一组实测 NMOS 转移特性数据(VGS 扫描、VDS=0.1V 线性区),分别用常数电流法和最大跨导法提取阈值电压 Vth,然后把两个 Vth 代入同一 SPICE 模型,对比仿真 ID-VGS 曲线的差异。
- 常数电流法:取 ID = 0.1·(W/L)·1µA 对应的 VGS 作为 Vth。
- 最大跨导法:对 ID-VGS 求导得 gm,取 gm 最大处的切线外推到 ID=0 的 VGS 截距。
数据与依赖
环境:Python 3 + numpy + matplotlib;SPICE 用 ngspice(或 LTspice)。实测数据以 CSV 形式给出,两列:VGS(V)、ID(A)。
提取脚本
import numpy as np
# 实测转移特性数据 (VGS, ID),线性区 VDS=0.1V, W/L=10
data = np.array([
[0.0, 1e-12],[0.2, 3e-12],[0.4, 8e-12],[0.6, 2.5e-11],
[0.8, 8e-11],[1.0, 2.4e-10],[1.2, 6.5e-10],[1.4, 1.6e-9],
[1.6, 3.6e-9],[1.8, 7.4e-9],[2.0, 1.4e-8],[2.2, 2.5e-8],
[2.4, 4.2e-8],[2.6, 6.7e-8],[2.8, 1.02e-7],[3.0, 1.5e-7],
])
VGS, ID = data[:,0], data[:,1]
WL = 10.0
# --- 方法1: 常数电流法 ---
Iref = 0.1 * WL * 1e-6 # 0.1*(W/L)*1uA = 1e-6 A
vth_cc = np.interp(Iref, ID, VGS)
print(f"常数电流法 Vth = {vth_cc:.4f} V (Iref={Iref:.2e} A)")
# --- 方法2: 最大跨导法 ---
gm = np.gradient(ID, VGS) # 数值微分求跨导
imax = np.argmax(gm)
# 在最大gm点做切线: ID = gm_max*(VGS - Vth) => Vth = VGS - ID/gm_max
vth_gm = VGS[imax] - ID[imax]/gm[imax]
print(f"最大跨导法 Vth = {vth_gm:.4f} V (gm_max={gm[imax]:.3e} S @ VGS={VGS[imax]}V)")
# 导出两个Vth供SPICE使用
with open("vth.txt","w") as f:
f.write(f"{vth_cc:.4f} {vth_gm:.4f}\n")
SPICE 验证
用同一组模型参数,仅改 VTO,分别仿真 ID-VGS,与实测曲线叠加对比。
* nmos_vth.sp
.param VTO=0.8
M1 d g 0 0 nmos W=10u L=1u
Vgs g 0 0
Vds d 0 0.1
.model nmos nmos (LEVEL=1 VTO={VTO} KP=120u GAMMA=0.5 PHI=0.7)
.dc Vgs 0 3 0.05
.print dc V(g) I(Vds)
.end
运行:ngspice -b nmos_vth.sp,把 VTO 分别设为脚本输出的两个 Vth,各跑一次,导出 ID-VGS 曲线。
验证与判定
- 脚本应打印两个 Vth,且常数电流法结果通常略大于最大跨导法(因 Iref 落在亚阈区之上)。
- 把两条 SPICE 曲线与实测数据画在同一张图上:最大跨导法对应的曲线在强反型区与实测更贴合;常数电流法曲线整体右移。
- 通过条件:两法 Vth 差值在 0.05~0.3V 量级,且各自 SPICE 曲线在 VGS > Vth+0.3V 区间与实测偏差小于 15%。