簡易パラメータ抽出
1. はじめに
MOSFETの設計や回路解析を行う際、教科書の理論値をそのまま使っても実際のプロセスでは一致しない。
特に、トランスコンダクタンス係数 β(ベータ) は、回路の利得・速度・電流効率を決定する重要パラメータである。
本稿では、0.18 µm CMOSプロセスを例に、Excelを使って β・Vth・λ を抽出する実務手法を紹介する。
参考文献は以下の2つである:
- Carusone “Analog Integrated Circuit Design” (第1章)
- Allen “CMOS Analog Circuit Design” (Appendix)
──────────────────────────────
2. 使用ファイルと構成
| ファイル名 | 内容 | 備考 |
|---|---|---|
| nmos_p18.xlsx | NMOSのβ・Vth・λの抽出用 | Excel関数のみ使用 |
| pmos_p18_vgs.txt | PMOSのId–VGS特性 | Excelに貼付して線形近似 |
| pmos_p18_vds.txt | PMOSのId–VDS特性 | λ抽出用 |
| summary_p18.xlsx | まとめ表 | 設計パラメータ整理用 |
すべての処理はExcel上で完結し、マクロ不要。
シミュレーション結果を貼り付けるだけで、各種パラメータが自動的に算出される。
──────────────────────────────
3. 基礎式
MOSFETの基本式(飽和領域):
Id = (1/2) * β * (Vgs − Vth)^2 * (1 + λVds)
β = μn * Cox * (W/L)
ここで、
- μn:電子移動度
- Cox:ゲート酸化膜容量(単位面積あたり)
- W, L:トランジスタの幅と長さ
- λ:チャネル長変調係数
──────────────────────────────
4. Id–VGS解析による β・Vth 抽出
手順
- SPICEで Id–Vgs を測定(Vds を一定値に固定)
- 飽和領域データのみ抽出(Vgs > Vth)
- √Id と Vgs の関係をプロット
- 線形近似で傾き a、切片 b を求める
- 以下の式から β と Vth を算出する:
√Id = √(1/2 * β) * (Vgs − Vth)
→ a = √(1/2 * β)
→ β = 2 * a²
→ Vth = −b / a
Excel関数例:
=SLOPE(√Id範囲, Vgs範囲)
=INTERCEPT(√Id範囲, Vgs範囲)
=2*(SLOPE(√Id範囲, Vgs範囲)^2)
──────────────────────────────
5. Id–VDS解析による λ抽出
手順
- 飽和領域(Vgs > Vth + 0.2 V)のデータを使用
- Id–Vds特性を直線近似
- 傾き S と切片 I₀ から λ を算出:
Id = Idsat * (1 + λVds)
→ λ = S / I₀
Excel関数例:
=SLOPE(Id範囲, Vds範囲)/INTERCEPT(Id範囲, Vds範囲)
──────────────────────────────
6. 抽出結果(0.18 µm CMOS例)
| Parameter | Symbol | Example (NMOS) | Unit | Method |
|---|---|---|---|---|
| しきい値電圧 | Vth | 0.52 | V | √Id–Vgs 線形近似 |
| トランスコンダクタンス係数 | β | 1.8 × 10⁻⁴ | A/V² | 傾き²×2 |
| チャネル長変調係数 | λ | 0.02 | 1/V | Id–Vds 線形近似 |
──────────────────────────────
7. β(トランスコンダクタンス係数)の意味
βはMOSFETの「電流駆動力」を定める物理パラメータであり、
デバイス構造とプロセス技術(μn, Cox, W/L)に依存する。
βの物理的意味
β = μn * Cox * (W/L)
- μn が高い(電子が速い)ほど β が大きい。
- W を広げると電流容量が増え、L を短くすると速度が上がる。
- したがって、βは“デバイスがどれだけ効率的に電流を流せるか”を表す。
βの単位と典型値(0.18 µm)
| デバイス | β [A/V²] | 備考 |
|---|---|---|
| NMOS | 約1.5×10⁻⁴ ~ 2.0×10⁻⁴ | μn ≈ 400 cm²/V·s |
| PMOS | 約1.0×10⁻⁴ ~ 1.5×10⁻⁴ | μp ≈ 200 cm²/V·s |
→ NMOSはPMOSより約2倍の電流駆動力を持つ。
──────────────────────────────
8. βとgm・Avの関係
抽出したβを用いて、小信号パラメータを計算できる。
gm = √(2 * β * Id)
ro = 1 / (λ * Id)
Av = −gm * ro
gm/Id = 2 / (Vgs − Vth)
- βが大きい → gm増加 → 利得上昇・スルーレート向上
- ただし消費電流も増えるため、低電力設計ではバランスが重要。
──────────────────────────────
9. Excelでの実装例(数式)
| 項目 | Excel式 |
|---|---|
| 傾き a | =SLOPE(√Id範囲, Vgs範囲) |
| 切片 b | =INTERCEPT(√Id範囲, Vgs範囲) |
| β | =2*(a^2) |
| Vth | =-b/a |
| λ | =SLOPE(Id範囲, Vds範囲)/INTERCEPT(Id範囲, Vds範囲) |
| gm | =SQRT(2*β*Id) |
| ro | =1/(λ*Id) |
| Av | =-gm*ro |
──────────────────────────────
10. 実務的なまとめ
- β は 設計初期のデバイス性能指標。
- Excelで簡単に再抽出でき、SPICEを使わずに動作点を評価可能。
- Vth・λとともに「プロセス指紋」として管理しておくと便利。
- 設計資料(summary_p18.xlsx)にまとめて、回路設計時のパラメータ参照に用いる。
──────────────────────────────
11. まとめ式
Id = (1/2) * β * (Vgs − Vth)^2 * (1 + λVds)
β = μn * Cox * (W/L)
Vth = −b / a
β = 2 * a²
λ = S / I₀
gm = √(2 * β * Id)
ro = 1 / (λ * Id)
Av = −gm * ro
gm/Id = 2 / (Vgs − Vth)
β = μn · Cox · (W / L) から求める。
1. 基本式の整理
β = μn * Cox * (W / L)
→ W = (β * L) / (μn * Cox)
L が固定されている場合、β・μn・Cox が分かれば W を決定できる。
2. 各パラメータの単位
| パラメータ | 意味 | 単位例 |
|---|---|---|
| β | トランスコンダクタンス係数 | A/V² |
| μn | 電子移動度 | cm²/V·s → 1 cm²/V·s = 1e-4 m²/V·s |
| Cox | 単位面積あたり酸化膜容量 | F/m² |
| L | チャネル長 | m |
| W | チャネル幅 | m |
3. 例(0.18 µm CMOS)
与え:
L = 0.18e-6 m
μn = 400 cm²/V·s = 0.04 m²/V·s
tox = 4 nm
εox = 3.45e-11 F/m
→ Cox = εox / tox = 8.63e-3 F/m²
β = 1.8e-4 A/V²
計算:
W = (β * L) / (μn * Cox)
= (1.8e-4 * 0.18e-6) / (0.04 * 8.63e-3)
= 1.26e-7 m = 0.126 µm
→ この値は単セル換算。実際の設計では W/L 比をスケーリングして適正 Id を得る。
4. Python 計算例
# W from β when L is fixed
mu_n = 400e-4 # [m²/V·s]
tox = 4e-9 # [m]
eps_ox = 3.45e-11 # [F/m]
Cox = eps_ox / tox
beta = 1.8e-4 # [A/V²]
L = 0.18e-6 # [m]
W = (beta * L) / (mu_n * Cox)
print(f"W = {W*1e6:.3f} µm")
出力:
W = 0.126 µm
5. 設計上の補足
- β ∝ W/L なので、電流能力を2倍にしたければ W を2倍にする。
- L はプロセス最小値より短くできない。
- 実際には配線寄生やシリーズ抵抗を考慮してやや大きめに設計する。
- 同プロセスの PMOS は移動度が約1/2なので、同電流を流すには W を約2倍に取る。
# 必要なライブラリをインストール
!pip install numpy pandas matplotlib openpyxl
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# =========================================
# 1. 基本設定 / Basic parameters
# =========================================
# Excelファイルの代わりにPythonで自動計算を行う例
# ここではサンプルデータを生成(実測値で置き換え可)
Vgs = np.linspace(0.4, 1.2, 9) # Vgs sweep [V]
Id_vgs = np.array([0, 2e-6, 8e-6, 18e-6, 32e-6, 50e-6, 72e-6, 98e-6, 128e-6]) # Id [A]
Vds = np.linspace(1.0, 2.0, 6) # Vds sweep [V]
Id_vds = np.array([100e-6, 102e-6, 104e-6, 106e-6, 108e-6, 110e-6]) # Id [A]
# =========================================
# 2. Id–Vgs 解析で β・Vth 抽出
# =========================================
# √Id–Vgs の線形近似を行う
sqrt_Id = np.sqrt(Id_vgs)
a, b = np.polyfit(Vgs, sqrt_Id, 1) # 傾き a, 切片 b
# β, Vth の算出
beta = 2 * a**2
Vth = -b / a
print("=== β・Vth Extraction (Id–Vgs) ===")
print(f"Slope a = {a:.4e}")
print(f"Intercept b = {b:.4e}")
print(f"β = {beta:.4e} [A/V²]")
print(f"Vth = {Vth:.3f} [V]")
# =========================================
# 3. Id–Vds 解析で λ抽出
# =========================================
S, I0 = np.polyfit(Vds, Id_vds, 1) # 傾き S, 切片 I₀
lam = S / I0
print("\n=== λ Extraction (Id–Vds) ===")
print(f"Slope S = {S:.4e}")
print(f"Intercept I₀ = {I0:.4e}")
print(f"λ = {lam:.4f} [1/V]")
# =========================================
# 4. 小信号パラメータ計算
# =========================================
Id_op = 100e-6 # 動作点電流 [A]
gm = np.sqrt(2 * beta * Id_op)
ro = 1 / (lam * Id_op)
Av = -gm * ro
gm_Id = 2 / (1.0 - Vth) # 仮に Vgs=1.0V と仮定
print("\n=== Small-Signal Parameters ===")
print(f"gm = {gm:.4e} [S]")
print(f"ro = {ro:.4e} [Ω]")
print(f"Av = {Av:.2f}")
print(f"gm/Id = {gm_Id:.2f} [V⁻¹]")
# =========================================
# 5. 可視化 / Plot
# =========================================
plt.figure()
plt.plot(Vgs, sqrt_Id, 'o', label='√Id data')
plt.plot(Vgs, a*Vgs + b, '-', label='Linear fit')
plt.title("√Id vs Vgs (β, Vth Extraction)")
plt.xlabel("Vgs [V]")
plt.ylabel("√Id [A^0.5]")
plt.legend()
plt.grid(True)
plt.show()
plt.figure()
plt.plot(Vds, Id_vds, 'o', label='Id data')
plt.plot(Vds, S*Vds + I0, '-', label='Linear fit')
plt.title("Id vs Vds (λ Extraction)")
plt.xlabel("Vds [V]")
plt.ylabel("Id [A]")
plt.legend()
plt.grid(True)
plt.show()