1. MOSFET の3次元 I–V モデルの基本式
MOSFET のドレイン電流 $I_D$ は ゲート電圧 $V_{GS}$ と ドレイン–ソース電圧 $V_{DS}$ の2変数で決まり、3D空間 $(V_{GS}, V_{DS}, I_D)$ に曲面を作ります。
古典的なShichman–Hodgesモデル(長チャネルMOSFET強反転領域)では:
(1) カットオフ領域(off)
$$
V_{GS} \le V_{th} \quad\Rightarrow\quad I_D \approx 0
$$
ゲート電圧がしきい値未満 → チャネル形成されず。
(2) 線形領域(Triode)
$$
V_{GS} > V_{th},\quad V_{DS} < V_{GS} - V_{th}
$$
$$
I_D = \mu C_{ox} \frac{W}{L} \left[ (V_{GS} - V_{th})V_{DS} - \frac{V_{DS}^2}{2} \right]
$$
- パラボラ形の V_DS 依存:電圧が小さいとオーム的振る舞い(抵抗)
- W/L比と移動度 μ がゲイン係数を決定
(3) 飽和領域(Saturation)
$$
V_{GS} > V_{th},\quad V_{DS} \ge V_{GS} - V_{th}
$$
チャネルピンチオフ後もドレイン電流はほぼ一定:
$$
I_D = \frac{1}{2} \mu C_{ox} \frac{W}{L} (V_{GS} - V_{th})^2 ,(1+\lambda V_{DS})
$$
- 最初の項:理想的な飽和電流
- $1+\lambda V_{DS}$ はチャネル長変調(出力抵抗有限化)
- λ が0なら本当に水平な飽和特性
2. 三次元的な見方
- X軸:$V_{DS}$(ドレイン–ソース電圧)
- Y軸:$V_{GS}$(ゲート–ソース電圧)
- Z軸:$I_D$(ドレイン電流)
この3D面は、
- $V_{GS}$ を一定にすると、I_D–V_{DS}曲線(出力特性)
- $V_{DS}$ を一定にすると、I_D–V_{GS}曲線(転送特性)
が得られる。
3. gm と ro の関係(微分的な3D情報)
- トランスコンダクタンス $g_m$:
$$
g_m = \frac{\partial I_D}{\partial V_{GS}}\bigg|{V{DS}=\text{const}}
= \mu C_{ox} \frac{W}{L} (V_{GS} - V_{th})
$$
飽和領域では一定の V_DS で gm は $V_{GS}$ に比例。
- 出力コンダクタンス $g_{ds}$:
$$
g_{ds} = \frac{\partial I_D}{\partial V_{DS}}\bigg|{V{GS}=\text{const}}
\approx \lambda I_D
$$
逆数は出力抵抗 $r_o$。
4. 三次元式の総合形(1つの式で表現)
条件分けを含めた一式で書くと:
$$
I_D(V_{GS},V_{DS}) =
\begin{cases}
0, & V_{GS} \le V_{th} \
\mu C_{ox} \frac{W}{L} \left[ (V_{GS} - V_{th})V_{DS} - \frac{V_{DS}^2}{2} \right], & V_{GS}>V_{th},\ V_{DS} < V_{GS} - V_{th} \
\frac{1}{2} \mu C_{ox} \frac{W}{L} (V_{GS} - V_{th})^2 (1+\lambda V_{DS}), & V_{GS}>V_{th},\ V_{DS} \ge V_{GS} - V_{th}
\end{cases}
$$
Pythonコード
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# パラメータ設定(例として仮定)
mu = 200e-4 # 移動度 (cm^2/Vs) → 200 cm^2/Vs
Cox = 1e-3 # ゲート酸化膜容量 (F/m^2) → 1 mF/m^2(適当なスケール)
W = 10e-6 # チャネル幅 (m)
L = 1e-6 # チャネル長 (m)
Vth = 1.0 # しきい値電圧 (V)
lambd = 0.1 # チャネル長変調パラメータ (1/V)
# 電圧範囲
VGS = np.linspace(0, 3, 100) # 0V から 3V
VDS = np.linspace(0, 3, 100) # 0V から 3V
VGS, VDS = np.meshgrid(VGS, VDS)
# IDの計算関数
def ID(VGS, VDS, mu, Cox, W, L, Vth, lambd):
ID = np.zeros_like(VGS)
for i in range(len(VDS)):
for j in range(len(VGS)):
if VGS[i, j] <= Vth:
ID[i, j] = 0 # カットオフ領域
elif VDS[i, j] < (VGS[i, j] - Vth):
ID[i, j] = mu * Cox * (W / L) * ((VGS[i, j] - Vth) * VDS[i, j] - VDS[i, j]**2 / 2) # 線形領域
else:
ID[i, j] = 0.5 * mu * Cox * (W / L) * (VGS[i, j] - Vth)**2 * (1 + lambd * VDS[i, j]) # 飽和領域
return ID
# ドレイン電流計算
ID = ID(VGS, VDS, mu, Cox, W, L, Vth, lambd)
# 3Dプロットの作成
fig = plt.figure(figsize=(12, 6))
# 3D曲面
ax1 = fig.add_subplot(121, projection='3d')
surf = ax1.plot_surface(VGS, VDS, ID, cmap='viridis', edgecolor='none')
ax1.set_xlabel('V_GS (V)')
ax1.set_ylabel('V_DS (V)')
ax1.set_zlabel('I_D (A)')
ax1.set_title('3D I_D vs V_GS vs V_DS')
fig.colorbar(surf, ax=ax1, label='I_D (A)')
# 等高線図
ax2 = fig.add_subplot(122)
contour = ax2.contourf(VGS, VDS, ID, levels=20, cmap='viridis')
ax2.set_xlabel('V_GS (V)')
ax2.set_ylabel('V_DS (V)')
ax2.set_title('Contour Plot of I_D')
fig.colorbar(contour, ax=ax2, label='I_D (A)')
plt.tight_layout()
plt.show()