0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

CMOSのカスコード増幅回路(テレスコピック)とフォールデッド・カスコード増幅回路

Posted at

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での検証が必要です。
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?