アナログ回路設計におけるMOSFETの基礎について概説します。
まず、MOSFETが飽和領域で動作している場合、Veff(有効ゲート電圧)を0.2Vと仮定します。チャネル長Lを0.2μmに固定し、VGS- ID特性およびVGS- gm特性を考察します。この時、MOSFETのしきい値電圧Vthが0.45Vであるため、VGSはVeff + Vthであり、具体的には0.65Vとなります。この条件下では、トランスコンダクタンスgmが飽和値の70%に到達しています。
Veffをさらに高くすると、gmの増加は頭打ちとなり、結果として過剰な電力消費が発生するリスクがあります。一方で、Veffを小さくすると、電流を一定に保つためにはチャネル幅Wを大きく設定する必要が生じます。これにより寄生容量が増加し、周波数特性の劣化を招く可能性があります。
次に、MOSFETの静的特性からμCox、しきい値電圧Vth、アーリー電圧VA(VA = 1/λ)などのパラメータを導き出し、DC特性を用いて動作点を決定します。この際、WとLの選定は、これら静的特性を基に慎重に行う必要があります。
設計段階では、プロセス、電圧、温度(PVT)変動に対する最悪条件(worst-case PVT conditions)を含むすべての条件を考慮したシミュレーションが重要です。これには、レイアウト設計、LPE抽出、モンテカルロシミュレーションといった解析手法が含まれます。
MOSFET設計における留意点として以下が挙げられます:
- コーナー解析によって自ずとチャネル長Lの値が確定します。
- 動作点を安定させるためには、動作電圧差も一定に保つ必要があります。
また、以下のような設計原則が重要です:
- トポロジー全体でWとLの比率を維持しつつ両者を大きくすると、アーリー電圧が変化します。
- Wだけを大きくすると、トランスコンダクタンスgmが増加します。この際、Wを効果的に増加させる手段としては、複数のMOSFETを並列に配置することが挙げられます。
- MOSFETのフィンガー数は通常偶数に設定し、奇数にはしません。寄生容量の影響を防ぐため、ダミートランジスタを配置することも重要です。
- カレントミラー構成では、WとLはべき乗則に従ってスケーリングされます。
ユニティゲイン周波数は、以下の式で表されます:
[ \omega = \frac{gm1}{Cc} ]
ここで、gm1はトランスコンダクタンス、Ccは補償容量を意味します。
トランジスタのキャラクタライズ
MOSFETのキャラクタライズは、一般的にSPICEなどの回路シミュレータを使用して実施されます。MOSFETの特性はチャネル長Lによって大きく異なるため、キャラクタライズは各チャネル長ごとに行うことが基本です。特にアナログ回路設計においては、信頼性を考慮し、最小チャネル長より10〜15%程度長くすることが推奨されます。チャネル長が短すぎると、ホットキャリア効果によって信頼性が低下し、デバイス寿命が短くなる可能性があるためです。
今回の設計では、0.18μm CMOSプロセスを使用し、アナログ回路用の最小チャネル長を0.2μmと設定しています。さらに、高利得を必要とする回路には、チャネル長0.4μmのMOSFETを使用する場合もあります。
はじめてのアナログ電子回路 実用回路編 (KS理工学専門書) | 松澤 昭
より
# 必要なライブラリをインポート
import numpy as np
# 使用パラメータの設定
mu = 0.05 # キャリア移動度 (m^2/V·s)
Cox = 3e-4 # 酸化膜容量 (F/m^2)
W = 10e-6 # チャネル幅 (m)
L = 1e-6 # チャネル長 (m)
Vth = 0.7 # しきい値電圧 (V)
Vgs = 1.5 # ゲート・ソース間電圧 (V)
Vds = 1 # ドレイン・ソース間電圧 (V)
lam = 0.02 # チャネル長変調パラメータ (V^-1)
eta = 0.1
N = 1.5
V_T = 0.026 # 熱電圧 (V)
k_B = 1.38e-23 # ボルツマン定数 (J/K)
T = 300 # 温度 (K)
gamma = 2/3
K = 1e-24
# Id特性(非飽和領域、飽和領域、弱反転領域)
Id_non_sat = mu * Cox * (W / L) * ((Vgs - Vth) - 0.5 * Vds) * Vds # 非飽和領域
Id_sat = mu * Cox * (W / (2 * L)) * (Vgs - Vth)**2 * (1 + lam * Vds) # 飽和領域
Id_weak_inv = mu * Cox * (W / L) * np.exp((Vgs - Vth + eta * Vds) / (N * V_T)) * (1 - np.exp(-Vds / V_T)) # 弱反転領域
# 飽和時の gm
gm1 = mu * Cox * (W / L) * (Vgs - Vth)
gm2 = 2 * Id_sat / (Vgs - Vth)
gm3 = np.sqrt(2 * mu * Cox * (W / L) * Id_sat)
# 飽和時の Vgs
Vgs_sat = np.sqrt(Id_sat / (mu * Cox * (W / (2 * L)))) + Vth
# オーバードライブ電圧
Vov = Id_sat / (mu * Cox * (W / L))
# 出力抵抗 ro
ro = 1 / (lam * Id_sat)
# 飽和時の入力換算ノイズ (熱ノイズ)
vn_thermal_noise = 4 * k_B * T * gamma * (1 / gm1)
# 飽和時の入力換算ノイズ (フリッカノイズ)
vn_flicker_noise = K / (mu * Cox * W * L) * (1 / 1) # f = 1Hzで計算
# 結果を表示
Id_non_sat, Id_sat, Id_weak_inv, gm1, gm2, gm3, Vgs_sat, Vov, ro, vn_thermal_noise, vn_flicker_noise