1) カスコード増幅回路(Telescopic Cascode, CMOS)
■ 小信号モデルと基本式
-
下段(入力)NMOS: $g_{m1}, r_{o1}$、上段(カスコード)NMOS: $g_{m2}, r_{o2}$。
-
出力抵抗(テスト電流法の近似)
$$
R_{\text{out}};\approx;r_{o2}+(1+g_{m2}r_{o2}),r_{o1};\simeq;g_{m2},r_{o1},r_{o2}\quad(g_{m2}r_{o2}\gg1)
$$$\Rightarrow$ カスコードで 出力抵抗が大幅増加。(Iowa State University ECE Class)
-
電圧利得(単段,小信号)
$$
A_v ;\approx; -,g_{m1},R_{\text{out}}
$$一般の“レmma” $A_v\approx -G_mR_{\text{out}}$ に一致(増幅は反転)。(Iowa State University ECE Class)
■ 帯域とミラー抑制
-
カスコードにより下段ドレイン電位がほぼ一定→ $C_{gd1}$ のミラー増大が抑制。結果として高周波利得の劣化が小さい。講義ノートでは“cascode, Miller effect”として整理。(Iowa State University ECE Class, ocw.ece.cornell.edu)
-
単段OPアンプ的に使うと、支配極は出力側:
$$
p_1 \simeq -\frac{1}{R_{\text{out}}(C_L+C_{\text{par}})},\qquad
\text{GBW}\approx\frac{g_{m1}}{2\pi C_L}\ (\text{帰還1倍動作の目安})
$$(単段は自励補償不要/出力極支配になりやすい)。(pallen.ece.gatech.edu)
■ 出力スイング(ヘッドルーム)
- テレスコピックはヘッドルームが厳しい。代表的に $4V_{DSAT}+V_T$ 程度の余裕が電源間で必要、との講義スライド。(Iowa State University ECE Class)
2) フォールデッド・カスコード増幅回路(Folded Cascode, CMOS)
■ 目的/構成
- 入力段(例: NMOS差動)の電流を反対極性のカスコード素子(例: PMOS共通ゲート)で“折り返し”、高抵抗のアクティブ負荷へ引き上げる。
- 高利得(大きな $R_{\text{out}}$)と広い入出力範囲の両立がしやすい。(pallen.ece.gatech.edu)
■ 小信号式(単端取り出しの概算)
-
差動→単端の等価トラコンダクタンスはほぼ入力段の $g_{m,\text{in}}$:
$$
g_{m,\text{eff}} \approx g_{m,\text{in}}
$$(折返し素子は電流伝達主体で電流利得≒1のため)。
-
出力抵抗(上下枝の並列,それぞれカスコードで増強)
$$
R_p \approx r_{op}\bigl(1+g_{m,\text{pcas}},r_{o,\text{pcas}}\bigr),\quad
R_n \approx r_{on}\bigl(1+g_{m,\text{ncas}},r_{o,\text{ncas}}\bigr),\quad
R_{\text{out}} \approx R_p \parallel R_n
$$ -
電圧利得
$$
A_v^{(\text{se})};\approx; -,g_{m,\text{in}},(R_p\parallel R_n)
$$(差動出力なら約2倍)。これらは大学講義ノートで“Folded-Cascode: advantages/disadvantages, small-signal”として扱われる。(ocw.ece.cornell.edu, pallen.ece.gatech.edu)
■ 帯域・補償
- 単段Foldedは出力極が支配になりやすく“self-compensated”と説明される(CL で決まる)。(pallen.ece.gatech.edu)
- GBW は目安として $\text{GBW}\approx g_{m,\text{in}}/(2\pi C_L)$(帰還1倍)。
■ ICMR/PSRR/設計式
-
FoldedはICMRが広い(ミラー負荷差動より有利)。講義は“カレントミラー負荷→ICMR制限、Foldedで改善”と説明。(pallen.ece.gatech.edu)
-
PSRR解析例(負側):
$$
\frac{V_{\text{out}}}{V_{SS}} \approx \frac{sC_{gd},R_{\text{out}}}{1+sC_{\text{out}}R_{\text{out}}}
$$といった形で導かれ、二段より良好との結論。(pallen.ece.gatech.edu)
-
設計ステップ例(スルーレート等):
$$
\text{SR}=I_3/C_L,\quad I_4=I_5\simeq(1.2!\sim!1.5)I_3\ \ (\text{カスコードに電流欠損を出さない目安})
$$(実設計手順が表で整理)。(pallen.ece.gatech.edu)
3) テレスコピック vs フォールデッド(要点比較)
観点 | テレスコピック(直列) | フォールデッド |
---|---|---|
DC利得 $A_0$ | 高($R_{\text{out}}!\uparrow$) | 高(上下枝の並列でも大) |
帯域 | Miller抑制で高速 | 同様に高速(出力極支配) |
I/Oスイング | 狭い(ヘッドルーム厳) | 広い(折返しで有利) |
ICMR | 狭め | 広い |
設計難易度 | 低〜中 | 中(バイアス網が増加) |
代表用途 | 高利得・高GBWの1段/前段 | 単段OP, 広スイング/広ICMRが必要な場面 |
(ICMR改善・スイング制約・GBW/PMの実務的比較は講義資料にまとまる)(pallen.ece.gatech.edu, Iowa State University ECE Class)
4) 設計式の“使いどころ”早見
- MOS近似:$g_m\simeq 2I_D/V_{ov},\ r_o\simeq 1/(\lambda I_D)$
- 目標 $A_0$ から $g_m r_o$ を逆算しデバイス電流/長さを設定(テレスコピックはスイング制約も同時に満たす)。
- Folded は SR=I/C_L がダイレクトに効くので、SR仕様→バイアス電流→$g_m$→GBW の順で粗設計。(pallen.ece.gatech.edu)
参考資料(URL)
- Iowa State Univ., EE435 Lecture 9「Folded-Cascode Amplifiers」(テレスコピック/レギュレーテッドも含む、式と設計手順がまとまっている)(Iowa State University ECE Class)
- Georgia Tech(P.E. Allen)Lecture 200「Cascode Op Amps II」(FoldedのICMR/PSRR/設計手順と式)(pallen.ece.gatech.edu)
- Cornell OCW ECE3150 Handout 21「Telescopic & Folded Cascode designs」(高周波解析と設計の講義ノート)(ocw.ece.cornell.edu)
- Georgia Tech(P.E. Allen)「Simple CMOS OpAmps」(Foldedは自補償で出力極支配という要点)(pallen.ece.gatech.edu)
# Program Name: cmos_cascode_calculator.py
# Creation Date: 20250811
# Overview: Compute small-signal metrics (gain, output resistance, poles, GBW, SR, swing estimates) for CMOS Telescopic Cascode and Folded Cascode amplifiers.
# Usage: Run this script in Python (e.g., terminal or Jupyter). It installs required libraries, computes metrics from top-level variables, and shows a comparison plot.
!pip install numpy matplotlib --quiet
import numpy as np
import matplotlib.pyplot as plt
# ==============================
# Global Parameters / パラメータ一元管理
# ==============================
# Common / 共通
RL = np.inf # Load resistance [ohm] / 負荷抵抗
CL = 2e-12 # Load capacitance [F] / 負荷容量
Cpar = 0.5e-12 # Parasitic at output [F] / 出力ノード寄生容量
Cin = 1.0e-12 # Input capacitance (effective) [F] / 実効入力容量
VDD = 1.8 # Supply voltage [V] / 電源電圧
Vov_in = 0.15 # Overdrive of input device [V] / 入力Trのオーバドライブ
Vov_cas = 0.15 # Overdrive of cascode device [V] / カスコードTrのオーバドライブ
Vov_ld = 0.15 # Overdrive of load device [V] / 負荷Trのオーバドライブ
I_tail = 200e-6 # Tail current for diff pair [A] / 差動対テール電流
fsr = 1.0 # Safety factor for SR (current fraction to one side) / スルーレート用片側係数
# Telescopic Cascode small-signal params / テレスコピック用小信号パラメータ
gm1 = 2.0e-3 # [S] input NMOS gm / 入力NMOSのgm
ro1 = 100e3 # [ohm] input NMOS ro / 入力NMOSのro
gm2 = 4.0e-3 # [S] cascode NMOS gm / カスコードNMOSのgm
ro2 = 120e3 # [ohm] cascode NMOS ro / カスコードNMOSのro
# Folded Cascode small-signal params / フォールデッド用小信号パラメータ
gm_in = 2.0e-3 # [S] input device gm / 入力Trのgm
# PMOS branch (top) / 上側PMOS枝
rop = 150e3 # [ohm] PMOS load ro / PMOS負荷のro
gm_pcas = 3.0e-3 # [S] PMOS cascode gm / PMOSカスコードのgm
ro_pcas = 120e3 # [ohm] PMOS cascode ro / PMOSカスコードのro
# NMOS branch (bottom) / 下側NMOS枝
ron = 150e3 # [ohm] NMOS sink ro / 下側NMOSのro
gm_ncas = 3.0e-3 # [S] NMOS cascode gm / NMOSカスコードのgm
ro_ncas = 120e3 # [ohm] NMOS cascode ro / NMOSカスコードのro
# ==============================
# Utility functions / ユーティリティ関数
# ==============================
def par(a, b):
"""Parallel of two impedances / 並列合成"""
if np.isinf(a): return b
if np.isinf(b): return a
return (a * b) / (a + b)
def tel_metrics(gm1, ro1, gm2, ro2, RL, CL, Cpar, Cin, VDD, Vov_in, Vov_cas, Vov_ld):
"""
Telescopic cascode metrics / テレスコピックの指標計算
"""
# Rout ≈ ro2 + (1+gm2ro2)ro1 (gm2ro2 >> 1 なら ≈ gm2ro1ro2)
Rout_core = ro2 + (1.0 + gm2 * ro2) * ro1
Rout = par(Rout_core, RL)
# Av ≈ -gm1 * Rout
Av = -gm1 * Rout
# Dominant pole at output / 支配極(出力側)
Cout = CL + Cpar
p1 = -1.0 / (Rout * Cout)
# Unity-gain frequency (approx) / ユニティ利得周波数の近似
GBW = gm1 / (2.0 * np.pi * CL)
# Swing estimate / 出力スイング近似(ヘッドルーム)
Vout_max = VDD - Vov_ld # 上側制限
Vx = Vov_in + Vov_cas # 中間ノードの目安(下側)
Vout_min = Vx + Vov_in # 下側制限(概算)
return {
"Rout_core": Rout_core,
"Rout": Rout,
"Av": Av,
"p1_rad": p1,
"p1_Hz": p1 / (2 * np.pi),
"GBW_Hz": GBW,
"Vout_min": Vout_min,
"Vout_max": Vout_max
}
def folded_metrics(gm_in, rop, gm_pcas, ro_pcas, ron, gm_ncas, ro_ncas, RL, CL, Cpar, Cin, VDD, Vov_in, Vov_cas, Vov_ld, I_tail, fsr):
"""
Folded cascode metrics / フォールデッドの指標計算
"""
# Upper branch effective resistance / 上側有効抵抗 Rp ≈ rop*(1 + gm_pcas*ro_pcas)
Rp = rop * (1.0 + gm_pcas * ro_pcas)
# Lower branch effective resistance / 下側有効抵抗 Rn ≈ ron(1 + gm_ncas*ro_ncas)
Rn = ron * (1.0 + gm_ncas * ro_ncas)
# Rout = Rp || Rn || RL
Rout = par(par(Rp, Rn), RL)
# Av ≈ -gm_in * Rout (単端)
Av = -gm_in * Rout
# Dominant pole / 支配極
Cout = CL + Cpar
p1 = -1.0 / (Rout * Cout)
# GBW (unity gain approx) / ユニティ利得周波数
GBW = gm_in / (2.0 * np.pi * CL)
# Slew rate / スルーレート(片側に流れる電流で近似)
SR = (fsr * I_tail) / CL
# Swing estimate / 出力スイング近似(Foldedは広め)
Vout_max = VDD - Vov_ld
Vout_min = (Vov_cas + Vov_in) # 概算:下側にカスコード分の余裕
return {
"Rp": Rp,
"Rn": Rn,
"Rout": Rout,
"Av": Av,
"p1_rad": p1,
"p1_Hz": p1 / (2 * np.pi),
"GBW_Hz": GBW,
"SR_V_per_s": SR,
"Vout_min": Vout_min,
"Vout_max": Vout_max
}
# ==============================
# Compute / 計算実行
# ==============================
tel = tel_metrics(gm1, ro1, gm2, ro2, RL, CL, Cpar, Cin, VDD, Vov_in, Vov_cas, Vov_ld)
fc = folded_metrics(gm_in, rop, gm_pcas, ro_pcas, ron, gm_ncas, ro_ncas, RL, CL, Cpar, Cin, VDD, Vov_in, Vov_cas, Vov_ld, I_tail, fsr)
# ==============================
# Print results / 結果表示(英語+日本語)
# ==============================
def fmt(val):
"""Engineering format / 工学表記"""
if np.isinf(val): return "inf"
mag = abs(val)
if mag == 0: return "0"
units = [(1e-12,'p'),(1e-9,'n'),(1e-6,'u'),(1e-3,'m'),(1,''),
(1e3,'k'),(1e6,'M'),(1e9,'G')]
for scale, sym in units:
if mag < scale * 1000:
return f"{val/scale:.3g}{sym}"
return f"{val:.3e}"
print("=== Telescopic Cascode (CMOS) / テレスコピック・カスコード ===")
print(f"Rout_core = {fmt(tel['Rout_core'])} ohm")
print(f"Rout = {fmt(tel['Rout'])} ohm")
print(f"Av = {tel['Av']:.2f} V/V (|Av|={abs(tel['Av']):.2f})")
print(f"p1 = {fmt(tel['p1_Hz'])} Hz (dominant pole / 支配極)")
print(f"GBW = {fmt(tel['GBW_Hz'])} Hz (unity-gain approx)")
print(f"Vout_min = {tel['Vout_min']:.3f} V, Vout_max = {tel['Vout_max']:.3f} V (swing estimate / スイング概算)")
print()
print("=== Folded Cascode (CMOS) / フォールデッド・カスコード ===")
print(f"Rp = {fmt(fc['Rp'])} ohm")
print(f"Rn = {fmt(fc['Rn'])} ohm")
print(f"Rout = {fmt(fc['Rout'])} ohm")
print(f"Av = {fc['Av']:.2f} V/V (|Av|={abs(fc['Av']):.2f})")
print(f"p1 = {fmt(fc['p1_Hz'])} Hz (dominant pole / 支配極)")
print(f"GBW = {fmt(fc['GBW_Hz'])} Hz (unity-gain approx)")
print(f"SR = {fmt(fc['SR_V_per_s'])} V/s (slew rate / スルーレート)")
print(f"Vout_min = {fc['Vout_min']:.3f} V, Vout_max = {fc['Vout_max']:.3f} V (swing estimate / スイング概算)")
# ==============================
# Plot comparison / 比較プロット(英語表記)
# ==============================
labels = ["|Av|", "Rout (ohm)", "GBW (Hz)"]
tel_vals = [abs(tel["Av"]), tel["Rout"], tel["GBW_Hz"]]
fc_vals = [abs(fc["Av"]), fc["Rout"], fc["GBW_Hz"]]
x = np.arange(len(labels))
w = 0.35
plt.figure(figsize=(8,5))
plt.bar(x - w/2, tel_vals, width=w, label="Telescopic")
plt.bar(x + w/2, fc_vals, width=w, label="Folded")
plt.yscale("log")
plt.xticks(x, labels)
plt.ylabel("Metric (log scale)")
plt.title("CMOS Cascode vs Folded Cascode: Key Metrics")
plt.legend()
plt.grid(True, which="both", axis="y")
plt.tight_layout()
plt.show()
# ==============================
# Notes / 補足
# ==============================
# - This script uses first-order hand-analysis formulas for insight. / 本スクリプトは一次近似の手計算式に基づく指標を算出します。
# - Adjust gm/ro and capacitances to your process/bias to explore trade-offs. / gm, ro, 容量などをプロセス・バイアスに合わせて調整し、トレードオフを検討してください。
# - Swing estimates are rough and should be validated by full bias analysis. / スイングは概算であり、バイアス計算やSPICEでの検証が必要です。