1. 回路図と構造
Single Stage Cascode Op Amp
- 差動入力トランジスタ:M1, M2
- カスコードトランジスタ(NMOS側):MC1, MC2
- カスコードトランジスタ(PMOS側):MC3, MC4
- アクティブ負荷トランジスタ:M3, M4
- テール電流源:M5
2. 出力抵抗と利得の式
出力抵抗
1段目の出力抵抗は次のように表されます:
$$
R_I \approx (g_{mC2} r_{dsC2} r_{ds2}) \parallel (g_{mC4} r_{dsC4} r_{ds4})
$$
ここで:
- $g_{mC2}, g_{mC4}$:カスコードトランジスタのトランスコンダクタンス
- $r_{ds2}, r_{ds4}$:入力ペアM2, M4の出力抵抗
- $r_{dsC2}, r_{dsC4}$:カスコードの出力抵抗
電圧利得
電圧利得は:
$$
A_v = \frac{v_{o1}}{v_{in}} = g_{m1} R_I
$$
つまり、入力ペアM1のトランスコンダクタンスに、出力抵抗 $R_I$ を掛けたものになります。
カスコードによって、出力抵抗が非常に大きくなるため、利得も大幅に増加します。
3. 性能計算
与えられた条件:
- $W/L = 10,\mu m / 1,\mu m$
- $I_{DS1} = I_{DS2} = 50,\mu A$
- $K'_N = 120 \mu A / V^2$, $K'_P = 25 \mu A / V^2$
- $V_{TN} = 0.5 V$, $V_{TP} = -0.5 V$
- $\lambda_N = 0.06 V^{-1}$, $\lambda_P = 0.08 V^{-1}$
トランスコンダクタンス
$$
g_{m1} = g_{m2} = g_{mI} = 346.4,\mu S
$$
$$
g_{mC1} = g_{mC2} = 346.4,\mu S
$$
$$
g_{mC3} = g_{mC4} = 158.1,\mu S
$$
出力抵抗
NMOSとPMOSの出力抵抗は:
$$
r_{oN} = \frac{1}{\lambda_N I_D} = \frac{1}{0.06 \times 50 \mu A} = 0.333,M\Omega
$$
$$
r_{oP} = \frac{1}{\lambda_P I_D} = \frac{1}{0.08 \times 50 \mu A} = 0.25,M\Omega
$$
よって:
$$
R_I = 7.86,M\Omega
$$
電圧利得
$$
A_v(0) = g_{m1} R_I = (346.4 \mu S)(7.86 M\Omega) \approx 2,722, V/V
$$
これは 約 20 * log10(2722) = 68.7 dB に相当。
帯域幅と補償容量
ゲイン帯域積(GB)を10 MHzとする場合:
$$
C_I = \frac{g_{m1}}{2\pi GB} \approx 5.51,pF
$$
もし100 pFの負荷容量を接続すると:
$$
GB = \frac{g_{m1}}{2\pi C} = 0.551, MHz
$$
となり、帯域が大きく低下します。
まとめ
- カスコード化の効果 → 出力抵抗が大きくなり、利得が大幅に増加(68 dB程度)。
- 制約 → 負荷容量が大きいとGBが急激に下がるため、補償や設計調整が必要。
- 単段オペアンプ → 補償容量 $C_c$ は負荷容量そのものとなる。
import numpy as np
import matplotlib.pyplot as plt
# ===============================
# Parameters / パラメータ
# ===============================
gm1 = 346.4e-6 # [S] トランスコンダクタンス
RI = 7.86e6 # [Ω] 出力抵抗
GB_target = 10e6 # [Hz] 目標GB
C_load1 = 5.51e-12 # [F] 負荷容量 (計算結果)
C_load2 = 100e-12 # [F] 大きい負荷容量の場合
# ===============================
# Gain calculation / 利得計算
# ===============================
Av0 = gm1 * RI # DC gain [V/V]
Av0_dB = 20 * np.log10(Av0)
print("DC Gain (V/V):", Av0)
print("DC Gain (dB):", Av0_dB)
# ===============================
# Bandwidth calculation / 帯域計算
# ===============================
GB1 = gm1 / (2 * np.pi * C_load1)
GB2 = gm1 / (2 * np.pi * C_load2)
print("Unity GB with C_load1 = 5.51pF:", GB1, "Hz")
print("Unity GB with C_load2 = 100pF:", GB2, "Hz")
# ===============================
# Frequency response / 周波数応答
# ===============================
f = np.logspace(3, 8, 500) # 1kHz ~ 100MHz
w = 2 * np.pi * f
# Simple single-pole response model
H1 = Av0 / np.sqrt(1 + (f/GB1)**2)
H2 = Av0 / np.sqrt(1 + (f/GB2)**2)
# dB変換
H1_dB = 20 * np.log10(H1)
H2_dB = 20 * np.log10(H2)
# ===============================
# Plot / プロット
# ===============================
plt.figure(figsize=(8,6))
plt.semilogx(f, H1_dB, label="C_load = 5.51 pF")
plt.semilogx(f, H2_dB, label="C_load = 100 pF", linestyle="--")
plt.axhline(y=0, color="k", linestyle=":")
plt.title("Frequency Response of Cascode Op-Amp")
plt.xlabel("Frequency [Hz]")
plt.ylabel("Gain [dB]")
plt.legend()
plt.grid(True, which="both", ls="--")
plt.show()
電圧利得は次のように書けます:
$$
A_v = \frac{V_{OUT}}{V_{IN}} = g_{m1} R_{out}
$$
ここで出力抵抗 $R_{out}$ は、
$$
R_{out} = \big(A r_{ds6} g_{m6} r_{ds8}\big) \parallel \big(A r_{ds2} g_{m4} r_{ds4}\big)
$$
もし $r_{dsn} \approx r_{dsp}$ (NMOSとPMOSの出力抵抗がほぼ同じ)であれば、
$$
A \approx g_m' r_{ds}' / 2
$$
となり、電圧利得は
$$
A_v \approx 100\text{K} \sim 500\text{K}
$$
の範囲になる。
ただし、この構造では最大信号スイングは最適化されていない。
詳細な解説
-
基本の利得式
演算増幅器の小信号利得は「入力トランジスタのトランスコンダクタンス × 出力抵抗」で表されます。$$
A_v = g_{m1} \cdot R_{out}
$$ -
カスコードによる出力抵抗増大
通常のMOSFETの出力抵抗は $r_{ds}$ ですが、カスコード接続すると「電流源に近い振る舞い」となり、$$
R_{out} \approx g_m r_{ds}^2
$$のように桁違いに大きくなります。
-
並列合成
回路の左右対称性から、NMOS側とPMOS側の出力抵抗が並列になります。$$
R_{out} = (A r_{ds6} g_{m6} r_{ds8}) \parallel (A r_{ds2} g_{m4} r_{ds4})
$$ -
対称条件での近似
$r_{dsn} \approx r_{dsp}$ と仮定すると、式は簡略化され、$$
A_v \approx \frac{1}{2} g_m' r_{ds}'
$$ -
数値オーダー
典型的なCMOSプロセスでは、$$
g_m' r_{ds}' \sim 200K \text{ から } 1M
$$なので、実際の利得はその半分程度、
$$
A_v \approx 100K \sim 500K
$$という大きな利得が得られます。
-
制約:信号スイング
カスコード構造は高利得を実現しますが、ヘッドルーム(電圧余裕)が減るため、最大出力スイングは制限されます。
→ 高利得と引き換えに、大きな出力振幅が得られないのが欠点。
# Program Name: cascode_amp_gain.py
# Creation Date: 20250924
# Overview: Calculate and visualize voltage gain of a cascode CMOS amplifier
# Usage: Run in Python. It computes Av and plots gm*rds dependence.
!pip install numpy matplotlib
import numpy as np
import matplotlib.pyplot as plt
# ==============================
# Parameters / パラメータ
# ==============================
# gm と rds の代表値範囲
gm_values = np.linspace(50e-6, 500e-6, 200) # Transconductance [S] (50 µS ~ 500 µS)
rds_values = np.linspace(50e3, 500e3, 200) # Output resistance [Ω] (50 kΩ ~ 500 kΩ)
# 対称条件 (rdsn ≈ rdsp) の場合の近似式
# Av ≈ (1/2) * gm * rds
def calc_gain(gm, rds):
return 0.5 * gm * rds
# ==============================
# Calculate Gain for a grid
# ==============================
GM, RDS = np.meshgrid(gm_values, rds_values)
Av = calc_gain(GM, RDS) # Voltage gain (V/V)
# dB換算
Av_dB = 20 * np.log10(Av)
# ==============================
# Visualization / プロット
# ==============================
plt.figure(figsize=(8,6))
cp = plt.contourf(GM*1e6, RDS*1e-3, Av_dB, levels=30, cmap="viridis")
plt.colorbar(cp, label="Voltage Gain [dB]")
plt.xlabel("gm [µS]") # x軸: gm
plt.ylabel("rds [kΩ]") # y軸: rds
plt.title("Cascode CMOS Amplifier Gain (Av in dB)")
plt.show()
# ==============================
# Example numeric results / 数値例
# ==============================
gm_example = 200e-6 # 200 µS
rds_example = 500e3 # 500 kΩ
Av_example = calc_gain(gm_example, rds_example)
print("Example case:")
print(f"gm = {gm_example*1e6:.1f} µS, rds = {rds_example/1e3:.1f} kΩ")
print(f"Voltage gain Av ≈ {Av_example:.1f} V/V ({20*np.log10(Av_example):.1f} dB)")
1. 全体の利得式
オペアンプの全体の電圧利得は:
$$
A_v = g_{mI} g_{mII} R_I R_{II}
$$
- $g_{mI} = g_{m1} = g_{m2}$:第1段差動ペアのトランスコンダクタンス
- $g_{mII} = g_{m6}$:第2段トランジスタのトランスコンダクタンス
- $R_I$:第1段の出力抵抗
- $R_{II}$:第2段の出力抵抗
2. 第1段の出力抵抗 $R_I$
$$
R_I = \frac{1}{g_{ds2} + g_{ds4}}
= \frac{2}{(\lambda_2 + \lambda_4) I_D5}
$$
- $g_{ds2}, g_{ds4}$:入力差動ペア M2, M4 のチャネルコンダクタンス
- $\lambda_2, \lambda_4$:チャネル長変調係数
- $I_D5$:テール電流源M5の電流
👉 出力抵抗は、チャネル長変調効果によって制限されます。
3. 第2段の出力抵抗 $R_{II}$
$$
R_{II} = (g_{mC6} r_{dsC6} r_{ds6}) \parallel (g_{mC7} r_{dsC7} r_{ds7})
$$
ここで:
- $g_{mC6}, g_{mC7}$:カスコードトランジスタMC6, MC7のトランスコンダクタンス
- $r_{ds6}, r_{ds7}$:出力段トランジスタM6, M7の出力抵抗
- $r_{dsC6}, r_{dsC7}$:カスコードの出力抵抗
👉 カスコード接続により出力抵抗が大きくなり、利得が飛躍的に増加します。
4. コメントの意味
-
Second-stage gain
第2段の利得が大きくなるため、ミラー補償の効果が改善される。 -
Overall gain
全体の利得はおおよそ $(g_m r_{ds})^3$ のオーダーになる。
→ 通常の2段構成よりも高利得が期待できる。 -
Output pole $p_2$
負荷容量と第2段の gm に依存し、$C_c$ が一定ならほぼ変わらない。 -
RHP zero
ミラー補償によって右半平面ゼロが現れる。これも $C_c$ が一定なら同じ。 -
PSRR (電源除去比)
ミラー補償を行うとPSRRが悪化する。補償を取り除くと自己補償(op-ampが安定化)する。
5. まとめ
-
利得は
$$
A_v = g_{m1} g_{m6} R_I R_{II}
$$で表され、カスコード化によって $R_{II}$ が大きくなるので非常に高利得が得られる。
-
ミラー補償(Miller compensation)の効果は大きいが、右半平面ゼロやPSRR悪化という副作用がある。
# Program Name: two_stage_cascode_opamp.py
# Creation Date: 20250924
# Overview: Numerical simulation of two-stage cascode op-amp gain using Python and matplotlib
# Usage: Run in Python (NumPy + Matplotlib). It will plot Bode-like gain response.
!pip install numpy matplotlib
import numpy as np
import matplotlib.pyplot as plt
# ========================
# Parameters (仮定値)
# ========================
gm1 = 500e-6 # Transconductance of first stage [S]
gm6 = 1e-3 # Transconductance of second stage [S]
lambda2 = 0.05 # Channel length modulation coeff. of M2 [1/V]
lambda4 = 0.05 # Channel length modulation coeff. of M4 [1/V]
Id5 = 50e-6 # Tail current [A]
# 出力抵抗 R_I
RI = 2 / ((lambda2 + lambda4) * Id5)
# カスコード出力抵抗 R_II (近似)
gmC6 = 500e-6
ro6 = 200e3
roC6 = 300e3
gmC7 = 500e-6
ro7 = 200e3
roC7 = 300e3
RII = (gmC6 * roC6 * ro6) * (gmC7 * roC7 * ro7) / (gmC6 * roC6 * ro6 + gmC7 * roC7 * ro7)
# DC利得
Av0 = gm1 * gm6 * RI * RII
Av0_dB = 20 * np.log10(Av0)
# ゲイン帯域積 (仮定)
GB = 10e6 # 10 MHz
# ========================
# 周波数応答プロット
# ========================
f = np.logspace(1, 8, 500) # 10 Hz ~ 100 MHz
gain_dB = Av0_dB - 20 * np.log10(1 + f / GB)
plt.figure(figsize=(7,5))
plt.semilogx(f, gain_dB, label="Two-Stage Cascode Op-Amp")
plt.axhline(0, color='gray', linestyle='--')
plt.title("Frequency Response of Two-Stage Cascode Op-Amp")
plt.xlabel("Frequency [Hz]")
plt.ylabel("Gain [dB]")
plt.grid(True, which="both", ls="--")
plt.legend()
plt.show()
# ========================
# 結果出力
# ========================
print(f"DC Gain = {Av0:.2e} V/V ≈ {Av0_dB:.2f} dB")
print(f"Unity Gain Bandwidth = {GB/1e6} MHz")

図の Balanced, Two-Stage Cascode Output Stage Op Amp の数式を順番に解説します。
1. 出力電圧の式
まず差動入力から:
$$
v_{out} = \left( \frac{gm1 \cdot gm8}{gm3} \cdot \frac{v_{in}}{2} ;+; \frac{gm2 \cdot gm6}{gm4} \cdot \frac{v_{in}}{2} \right) R_{II}
$$
ここで:
- $gm1, gm2$:入力差動対 (M1, M2) のトランスコンダクタンス
- $gm3, gm4$:電流ミラー負荷 (M3, M4) のトランスコンダクタンス
- $gm6, gm8$:カスコード段で電流を出力ノードへ引き上げるトランジスタのトランスコンダクタンス
- $R_{II}$:出力抵抗
意味:入力電圧 $v_{in}$ が差動入力でそれぞれ M1, M2 に分かれ、電流ミラーを経て増幅され、最終的に出力電圧 $v_{out}$ が得られる。
2. 簡略化と係数 $k$
次に式をまとめると:
$$
v_{out} = \left( \frac{gm1}{2} + \frac{gm2}{2} \right) k , v_{in} , R_{II}
$$
ここで係数 $k$ は、電流ミラーによる増幅比:
$$
k = \frac{gm8}{gm3} = \frac{gm6}{gm4}
$$
👉 負荷トランジスタ M3, M4 とカスコード増幅トランジスタ M8, M6 の 比率 で決まる。
3. 出力抵抗 $R_{II}$
出力段にはカスコードがあるため、出力抵抗は非常に大きくなる:
$$
R_{II} = (gm7 , r_{ds7} , r_{ds6}) \parallel (gm12 , r_{ds12} , r_{ds11})
$$
- $gm7, gm12$:カスコードトランジスタ
- $r_{ds6}, r_{ds11}$:出力トランジスタのチャネル抵抗
- $r_{ds7}, r_{ds12}$:カスコードトランジスタのチャネル抵抗
👉 カスコード構造により、抵抗が $gm \cdot r_{ds}^2$ のオーダーに増大。
4. 最終的な利得式
したがって、全体の電圧利得は:
$$
A_v = \frac{1}{2} \left( \frac{gm1 \cdot gm8}{gm3} + \frac{gm2 \cdot gm6}{gm4} \right) R_{II}
$$
5. 設計関係式(Table 1)
- スルーレート(Slew Rate)
$$
SR = \frac{I_{out}}{C_L}
$$
負荷容量 $C_L$ に対して出力電流が制御する → 高速応答の目安。
- ゲイン帯域幅(GB, Gain Bandwidth)
$$
GB = \frac{gm1 \cdot gm8}{gm3 \cdot C_L}
$$
入力段のトランスコンダクタンスと電流ミラー比、負荷容量 $C_L$ に依存。
- 電圧利得(Voltage Gain)
$$
A_v = \frac{1}{2} \left( \frac{gm1 \cdot gm8}{gm3} + \frac{gm2 \cdot gm6}{gm4} \right) R_{II}
$$
大きな $R_{II}$ が利得を引き上げる。
- 入力電圧範囲(Input Range)
$$
V_{in(max)} = V_{DD} - \sqrt{\frac{I_S}{\beta_3}} - |V_{T03(max)}| + V_{T1(min)}
$$
$$
V_{in(min)} = V_{SS} + V_{DSS} + \sqrt{\frac{I_S}{\beta_1}} + V_{T1(min)}
$$
👉 これにより、差動入力段が飽和せず動作可能な入力電圧範囲が決まる。
まとめ
- 入力段差動ペアの電流 → 電流ミラーを通じて増幅 → カスコード出力段で高抵抗化。
- 出力利得は 入力 gm × 電流ミラー比 k × 出力抵抗 RII で決まる。
- スルーレートと帯域は負荷容量に強く依存。
- カスコードにより非常に大きな利得が得られるが、ヘッドルームが制約。
1. 小信号解析 (Small-Signal Analysis)
短絡出力電流を求めて、出力抵抗を掛けるアプローチです。
(1) 出力電流成分
- M2経路の電流 (右側分岐)
i7 = [ gm2 * (rds2 || rds5) * vin ] / [ 2 * ( RB + (rds2 || rds5) ) ]
≈ ( gm2 * vin ) / 2
- M1経路の電流 (左側分岐)
i9 ≈ -i10 = [ gm1 * (rds1 || rds4) * vin ] / [ 2 * ( RA + (rds1 || rds4) ) ]
≈ ( gm1 * vin ) / 2
よって、出力電流は
iout = i7 + i9 ≈ ( gm1/2 + gm2/2 ) * vin
(2) 出力抵抗
フォールデッド・カスコードの出力抵抗は、カスコードの gm·rds^2 効果で非常に大きくなります。
Rout ≈ ( gm9 * rds9 * rds11 ) || ( gm7 * rds7 * (rds2 || rds5) )
もし nMOS と pMOS の rds が同程度なら、近似的に
Rout ≈ ( gm * rds^2 ) / 3
(3) 電圧利得
Av = vout / vin
= ( (gm1/2 + gm2/2) * vin ) * Rout
≈ gm * Rout
≈ ( gm^2 * rds^2 ) / 3
→ カスコード効果により、(gm·rds)^2 のオーダーの高利得が得られる。
2. ゲイン帯域幅 (GB)
ゲイン帯域幅積は
GB = Av(0) / |p1|
= ( gm * Rout ) / ( Rout * CL )
= gm / CL
👉 利得に依存せず、gm/CL によって決まる点が特徴。
3. 周波数応答
主要な極 (pole) は出力ノードで決まります。
pout = -1 / ( Rout * Cout )
ここで Cout は出力ノードにぶら下がる容量 (CL や寄生容量) です。
その他の内部ノード極は以下:
- Node A:
pA ≈ -gm6 / (Cgs + 2Cdb)
- Node B:
pB ≈ -gm7 / (Cgs + 2Cdb)
- Drain of M6:
p6 ≈ -gm10 / (2Cgs + 2Cdb)
- Source of M8:
p8 ≈ -(gm8 * rds8 * gm10) / (Cgs + Cdb)
- Source of M9:
p9 ≈ -gm9 / (Cgs + Cdb)
4. 設計例 (Example)
与えられた値:
gmN = gmP = 100 µS
rdsN = 2 MΩ
rdsP = 1 MΩ
CL = 10 pF
(1) 出力抵抗:
Rout = ( gm9 * rds9 * rds11 ) || ( gm7 * rds7 * (rds5 || rds2) )
= 400 MΩ || (100 * 0.667 MΩ)
= 57.143 MΩ
(2) 電圧利得:
Av = gmN * Rout = (100 µS)(57.143 MΩ) = 5714 V/V
(3) 出力極周波数:
|pout| = 1 / ( Rout * Cout )
= 1 / (57.143 MΩ * 10 pF)
= 1750 rad/s ≈ 278 Hz
(4) GBW:
GB = 1.21 MHz
5. 設計アプローチ (表のまとめ)
- Slew Rate
I3 = SR * CL
- カスコードバイアス電流
I4 = I5 = 1.2 I3 ~ 1.5 I3
- 最大出力電圧
S5 = 2I5 / (Kp' VSD5^2)
S7 = 2I7 / (Kp' VSD7^2)
- 最小出力電圧
S11 = 2I11 / (Kn' VDS11^2)
S9 = 2I9 / (Kn' VDS9^2)
- GB
gm1 / CL
- 入力CM範囲
Vin(min), Vin(max) で決まる
- 差動利得
Av = ( (gm1/2 + gm2/2) ) * Rout



