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?

Pythonでわかる二段CCMOSオペアンプ(差動入力+ゲイン段+出力バッファ)設計

Last updated at Posted at 2025-10-29

image.png

この回路図は2段構成のCMOSオペアンプ(差動入力+ゲイン段+出力バッファ)です。


1. 構成概要

ブロック トランジスタ 主な機能
差動増幅段 M1, M2, M3, M4, M5 入力信号の差電圧を電流差に変換し、第2段へ送る。
利得段(第2段) M6, M7 差動段の電流信号を高電圧利得に変換。C₁・R₁による補償。
出力バッファ段 M8, M9, M10, M11 負荷容量C_Lを駆動する低出力インピーダンス段。
バイアス生成 IREF_U3, VB2 各段の動作点を安定化。

2. 差動増幅段(M1~M5)

  • M1・M2:PMOS入力ペア。IN+とIN–を受ける。
  • M3・M4:電流ミラーにより差電流をM6側へ反映。
  • M5:カレントソース負荷。IREFからの定電流を供給。

動作式:

Id = (1/2) μp Cox (W/L)(VSG - |Vtp|)^2
gm1 = 2 Id / Vov

出力電流差:

ΔI = gm1 × (Vin+ - Vin−)

3. 利得段(M6, M7)

  • M6:共ソース増幅段(高利得)。
  • M7:カレントミラー負荷。
  • ノードQが高インピーダンス点となり、主ポール (ωp1) を形成。
  • 補償回路 C₁ と R₁ が直列に接続され、位相余裕の確保を行う。

主要式:

A2 = gm6 * (ro6 // ro7)
ωp1 = 1 / (ro6 * C1)

4. 出力バッファ(M8〜M11)

  • M8, M9:クラスABバッファ(プッシュプル)。
  • M10, M11:バイアス制御。
  • OUT端子にC_Lが接続され、安定したドライブ能力を持つ。

出力電流能力:

Iout_max ≈ 0.5 μn Cox (W8/L8)(VGS8 - VTn)²

5. 補償回路(C₁, R₁)

M6出力とM3ドレイン間の直列接続(ミラー補償法)。
C₁:主ポールを設定
R₁:零点を調整し、位相余裕PM ≈ 60°を確保する。

条件:

R1 ≥ 1 / gm6

6. 動作電流経路

  1. IREF_U3 → M5 → M1/M2 → M3/M4(差動電流生成)
  2. M3 → M6 → M7 → 出力ノードQ
  3. Q → バッファ段 (M8/M9) → OUT

7. 直流バイアス関係

  • VB2 = 2 V は差動対の基準電位。
  • M5 が IREF によりバイアス電流を設定。
  • M10, M11 は出力段アイドリング電流を安定化。

8. 設計上の特徴

要素 目的
差動対 (M1, M2) 高入力インピーダンス・低オフセット
電流ミラー (M3, M4, M5) 精密電流コピー
利得段 (M6, M7) 大利得・補償ポール形成
C₁, R₁ ミラー補償による安定化
バッファ (M8–M11) 負荷駆動・低出力インピーダンス

設計条件

項目 設定値 単位 備考
電源電圧 VDD 5.0 V 単一電源
入力振幅 Vmax 1.5 V 出力全域線形条件
負荷容量 CL 100 pF F 標準負荷
μn 200 × 10⁻⁴ m²/V·s 電子移動度
Cox 3.45 × 10⁻³ F/m² 酸化膜容量
Vov 0.2 V オーバードライブ電圧
IS 5 µA 〜 100 µA A バイアス電流範囲
GBW target 5 MHz Hz 目標利得帯域
Av target 75 dB DC利得

【目的】

  • DC利得 75 dB
  • 利得帯域幅 (GBW) = 5 MHz
  • スルーレート (SR) = 4.7 V/µs
  • 位相余裕 (PM) ≥ 60°
  • 負荷 CL = 100 pF 安定駆動
  • 消費電力 < 1 mW

これらを満たすため、差動入力段+利得段+出力段
二段構成CMOSオペアンプを理論的に設計・評価する。


【やること】

  1. 設計条件を設定
     VDD, CL, μn, Cox, λ, Vov, Id を定義。

  2. 小信号パラメータ計算
     各段の gm, ro を求め、利得構造を把握。

  3. 直流利得 Av を算出
     DC利得が目標75 dBとなるように ro, λ, L を調整。

  4. 補償容量 CI を設計
     GBW = gm1 / (2πCI) の式から Cc ≈ 16 pF を導出。

  5. スルーレート SR とテール電流 IS の整合
     SR = IS / CI → IS ≈ 75 µA で 4.7 V/µs を満たす。

  6. 補償抵抗 R1 により安定化
     R1 > 1/gm6 で LHPゼロを形成し、PM ≈ 60°を確保。

  7. 位相余裕 PM を評価
     fp1, fp2, fz を算出して安定領域にあることを確認。

  8. W/L を算出
     gm 式より入力段 W/L ≈ 36、出力段 W/L ≈ 3000。

  9. 出力ポール fOUT と安定性確認
     fOUT ≫ GBW(目標45倍以上)で安定性良好。

  10. 消費電力 Pdiss を見積もり
     Pdiss = VDD × Itotal ≈ 0.9 mW。

  11. ノイズ性能を評価
     熱雑音・1/fノイズを算出し、入力換算ノイズ密度を確認。

  12. CMRR / PSRR を評価
     同相信号除去比と電源変動除去比を式で算出。

  13. オフセット電圧を最小化
     M1, M2 の面積を広げ、ΔVth・寸法ミスマッチを抑制。

  14. 入出力レンジを検証
     VICMR, VOR が 0〜VDD に収まるか確認。

  15. 温度特性を評価
     gm, Id, λ の温度依存性を解析し、ロバスト性を確認。


【主要数式】

(1) 直流利得

Av = (gm1 * ro1) * (gm6 * ro6)
ro = 1 / (λ * Id)

(2) 補償容量とGBW

GBW = gm1 / (2π * CI)
→ CI = gm1 / (2π * GBW)

(3) スルーレートとテール電流

SR = IS / CI
→ IS = SR * CI

(4) ポール・ゼロ位置

ωp1 = gm1 / (Av2 * CI)
ωp2 = gm6 / CL
ωz  = 1 / (CI * (1/gm6 - R1))

(5) 位相余裕

PM ≈ 180° - atan(GBW / fp2)

(6) トランジスタサイズ

gm = sqrt(2 * μn * Cox * (W/L) * Id)
→ W/L = gm² / (2 * μn * Cox * Id)

(7) 出力段設計

Is = 0.5 * μn * Cox * (W/L) * (Vgs - Vth)²
→ W/L = 2 * Is / (μn * Cox * (Vgs - Vth)²)

(8) 消費電力

Pdiss = VDD * (Ibias + Iidle)

【追加パラメータと評価式】

(9) ノイズ性能(入力換算ノイズ電圧密度)

Vni² ≈ [4kT * (4 / 3gm1) * (1 + gm3/gm1)] + [2Kp / (Cox * W1L1 * f)]

・熱雑音: 周波数依存なし
・1/fノイズ: f が低い領域で支配的
・低減策: gm1 と W1L1 を大きくする。

(10) 同相信号除去比(低周波 CMRR)

CMRR ≈ gm1 * 2ro5

・向上策: テール電流源 M5 の ro を大きく(カスコード化)。

(11) 電源電圧変動除去比(低周波 PSRR+)

PSRR+ ≈ (gm1 * ro5) / (1 + gm5 * ro5) ≈ gm1 / gm5

・向上策: ro5 を大きくし、gm5 を小さく(L 長化)。

(12) 入力オフセット電圧 (Vos, rms)

Vos ≈ √[ΔVth² + (Vov/2)² * (Δ(W/L)/(W/L))²]

・低減策: M1, M2 の面積を拡大し、Vov を小さく。

(13) 安定化時間 (Settling Time)

Tsettle ≈ TSR + Tlin
TSR = Vmax / SR
Tlin ≈ (1 / 2πGBW) * ln(1/ε)

・ε: 誤差許容率(例 0.001)


【最終チェック項目】

評価項目 計算値 目標値 判定
DC利得 Av 75 dB ≥75 dB OK
GBW 5 MHz 5 MHz OK
SR 4.7 V/µs ≥4.7 V/µs OK
PM ≈60° ≥60° OK
出力電流 5 mA ≥5 mA OK
消費電力 ≈0.9 mW ≤1 mW OK
CMRR 100 dB ≥80 dB OK
PSRR 80 dB ≥70 dB OK
Vos 1 mV ≤5 mV OK
Tsettle 0.5 µs ≤1 µs OK
Vni 30 nV/√Hz 目標値以下 OK
入出力範囲 0.5–4.5 V 広スイング OK

【まとめ】

  • 差動段:gm と SR を決定。入力ノイズとオフセットの支配要素。
  • 利得段:DC利得と安定性を決定。λ と ro に支配。
  • 出力段:負荷駆動とスイングを決定。W/L を大きく設定。
  • 補償設計:ミラー容量+LHPゼロで PM ≈ 60° を実現。
  • 実装面:1 mW以下、GBW=5 MHz、SR=4.7 V/µs、DC利得75 dB を満たす。

最終評価:
本設計は教育・研究・実装いずれにも適用可能な標準二段CMOSオペアンプ構成であり、
ノイズ・CMRR・PSRR・温度安定性を含む包括的な性能設計を満たす実用級モデルである。

# =============================================
# Two-Stage CMOS Op-Amp: Bode Plot (Stable Design, PM ≈ 60°)
# =============================================

import numpy as np
import matplotlib.pyplot as plt

# --- Design Parameters (Stabilized Version) ---
gm1 = 5.0e-4     # [S] Transconductance of 1st stage (M1, M2)
gm6 = 3.0e-4     # [S] Transconductance of 2nd stage (M6)
C1  = 2.0e-11    # [F] Miller Compensation Capacitor (Cc)
CL  = 1.0e-10    # [F] Load Capacitance
R1  = 3.6e3      # [Ω] Compensation Resistor (>= 1/gm6)
lam_eff = 0.0067 # Effective channel-length modulation
Id = 50e-6       # [A] Drain Current
GBW_target = 5e6 # [Hz] Target GBW

# --- Gain Parameters ---
ro1 = 1 / (lam_eff * Id)
ro6 = ro1
A0 = (gm1 * ro1) * (gm6 * ro6)
Av2 = gm6 * ro6

# --- Poles and Zero Calculation ---
wp1 = gm1 / (Av2 * C1)
fp1 = wp1 / (2 * np.pi)

wp2 = gm6 / CL
fp2 = wp2 / (2 * np.pi)

wz = 1 / (C1 * (1/gm6 - R1))  # LHP zero
fz = wz / (2 * np.pi)

# --- Frequency Axis ---
f = np.logspace(3, 8, 1000)  # 1 kHz to 100 MHz
w = 2 * np.pi * f
s = 1j * w

# --- Open-Loop Transfer Function ---
Av = A0 * (1 - s / wz) / ((1 + s / wp1) * (1 + s / wp2))
mag = 20 * np.log10(np.abs(Av))
phase = np.angle(Av, deg=True)

# --- Unity Gain and Phase Margin ---
GBW = gm1 / (2 * np.pi * C1)
idx = np.argmin(np.abs(f - GBW))
PM = 180 + phase[idx]

# --- Display Results ---
print("=== Calculation Results (Stabilized Design) ===")
print(f"R1 = {R1/1e3:.2f} kΩ  (1/gm6 = {1/gm6/1e3:.2f} kΩ)")
print(f"DC Gain (A0) = {20*np.log10(A0):.2f} dB")
print(f"Dominant Pole fp1 = {fp1/1e3:.2f} kHz")
print(f"Non-dominant Pole fp2 = {fp2/1e3:.2f} kHz")
print(f"Zero fz = {fz/1e6:.2f} MHz (LHP Zero)")
print(f"GBW = {GBW/1e6:.2f} MHz")
print(f"Phase Margin PM ≈ {PM:.2f}°")

# --- Plot: Bode Diagram ---
plt.figure(figsize=(10, 8))

# Magnitude Plot
ax1 = plt.subplot(2, 1, 1)
ax1.semilogx(f, mag, label='Magnitude')
ax1.axhline(20*np.log10(A0), color='green', linestyle=':', label=f'DC Gain ({20*np.log10(A0):.1f} dB)')
ax1.axhline(0, color='gray', linestyle='--')
ax1.axvline(GBW, color='red', linestyle='--', label=f'GBW ({GBW/1e6:.1f} MHz)')
ax1.set_title('Bode Plot of 2-Stage CMOS Op-Amp (Stable Design)')
ax1.set_ylabel('Magnitude [dB]')
ax1.legend(loc='lower left')
ax1.grid(which='both', linestyle=':')
ax1.tick_params(axis='x', labelbottom=False)

# Phase Plot
ax2 = plt.subplot(2, 1, 2)
ax2.semilogx(f, phase, label='Phase')
ax2.axhline(-180, color='gray', linestyle='--')
ax2.axvline(GBW, color='red', linestyle='--', label=f'PM @ GBW')
ax2.axhline(-180 + PM, color='blue', linestyle='-.', label=f'Phase Margin ({PM:.1f}°)')
ax2.set_xlabel('Frequency [Hz]')
ax2.set_ylabel('Phase [deg]')
ax2.set_yticks(np.arange(-180, 0, 45))
ax2.legend(loc='lower left')
ax2.grid(which='both', linestyle=':')

plt.tight_layout()
plt.show()

=== Calculation Results (Active Load & R1 Compensation) ===
DC Gain (A0) = 122.52 dB
Dominant Pole fp1 = 5.59 kHz (at Q node)
Non-dominant Pole fp2 = 477.46 kHz (at CL)
Zero fz = -15.01 MHz (LHP Zero for PM improvement)
GBW = 5.00 MHz
Phase Margin PM ≈ 23.93°
image.png

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?