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

# Constants
epsilon_0 = 8.85e-14  # Vacuum permittivity in F/cm
epsilon_ox = 3.9 * epsilon_0  # Permittivity of SiO2 in F/cm

# Given values
mu_n = 350  # Electron mobility in cm^2/V/s
mu_p = 150  # Hole mobility in cm^2/V/s
tox = 9e-9  # Oxide thickness in cm
V_th = 1.0  # Threshold voltage in V
V_gs = 2.0  # Gate-source voltage in V
beta = 50e-6  # Transconductance parameter in A/V^2
W = 10e-6  # Channel width in cm
L = 1e-6   # Channel length in cm

# Capacitance calculation
C_ox = epsilon_ox / tox  # Gate capacitance in F/cm^2

# Drain current in saturation region
I_D = (beta / 2) * (V_gs - V_th)**2

# Transconductance
g_m = beta * (V_gs - V_th)

# Small-signal transconductance
g_m_small = 2 * I_D / (V_gs - V_th)

# Small-signal drain current
I_D_small = (beta / 2) * (W / L) * (V_gs - V_th)**2

# Output the results
print(f"Gate capacitance (C_ox): {C_ox:.3e} F/cm^2")
print(f"Drain current (I_D): {I_D:.3e} A")
print(f"Transconductance (g_m): {g_m:.3e} S")
print(f"Small-signal transconductance (g_m_small): {g_m_small:.3e} S")
print(f"Small-signal drain current (I_D_small): {I_D_small:.3e} A")

import math

# 定数の定義
q = 1.6e-19  # 電荷 (C)
N_A = 1e17  # アクセプタ濃度 (cm^-3)
phi_F = 0.3  # フェルミポテンシャル (V)
V_BS = 0.0  # ソースバルク電圧 (V)
lambda_value = 0.02  # チャネル長調整効果係数 (V^-1)
V_DS = 3.0  # ドレインソース電圧 (V)

# これまでの定義
epsilon_0 = 8.85e-14  # 真空の誘電率 (F/cm)
epsilon_ox = 3.9 * epsilon_0  # 酸化膜の誘電率 (F/cm)
tox = 9e-9  # 酸化膜の厚さ (cm)
C_ox = epsilon_ox / tox  # ゲート容量 (F/cm^2)
beta = 50e-6  # トランスコンダクタンスパラメータ (A/V^2)
V_th0 = 1.0  # 基準しきい値電圧 (V)
V_gs = 2.0  # ゲートソース電圧 (V)
I_D = (beta / 2) * (V_gs - V_th0)**2  # 飽和領域におけるドレイン電流 (A)

# チャネル長調整式 (2.4)
V_th = V_th0 + math.sqrt((2 * q * N_A / C_ox) * (V_BS + 2 * phi_F)) - math.sqrt((2 * q * N_A / C_ox) * 2 * phi_F)

# ドレイン電流式 (2.5)
I_D_lambda = (beta / 2) * (V_gs - V_th)**2 * (1 + lambda_value * V_DS)

# トランスコンダクタンス (2.6)
g_m = math.sqrt(2 * beta * I_D) * (1 + lambda_value * V_DS)

# 小信号モデルの出力抵抗 (2.7)
r_o = 1 / (lambda_value * I_D)

# チャネル長調整効果 (2.18)
g_m_channel = g_m / (2 * math.sqrt(2 * phi_F + V_BS))

# 出力抵抗 (2.38)
r_o_small = 1 / I_D

# 結果表示
print(f"しきい値電圧 (V_th): {V_th:.3f} V")
print(f"ドレイン電流 (I_D_lambda): {I_D_lambda:.3e} A")
print(f"トランスコンダクタンス (g_m): {g_m:.3e} S")
print(f"小信号モデルの出力抵抗 (r_o): {r_o:.3e} Ω")
print(f"チャネル長調整効果を考慮したトランスコンダクタンス (g_m_channel): {g_m_channel:.3e} S")
print(f"小信号モデルの出力抵抗 (r_o_small): {r_o_small:.3e} Ω")

P28

import math

# 定数の定義
q = 1.6e-19  # 電荷 (C)
N_A = 1e17  # アクセプタ濃度 (cm^-3)
phi_F = 0.3  # フェルミポテンシャル (V)
V_BS = 0.0  # ソースバルク電圧 (V)
lambda_value = 0.02  # チャネル長調整効果係数 (V^-1)
V_DS = 3.0  # ドレインソース電圧 (V)
epsilon_0 = 8.85e-14  # 真空の誘電率 (F/cm)
epsilon_ox = 3.9 * epsilon_0  # 酸化膜の誘電率 (F/cm)
tox = 9e-9  # 酸化膜の厚さ (cm)
C_ox = epsilon_ox / tox  # ゲート容量 (F/cm^2)
V_th0 = 1.0  # 基準しきい値電圧 (V)
V_gs = 2.0  # ゲートソース電圧 (V)
V_sg = 2.5  # ソースゲート電圧 (V, PMOS用)
W = 10e-6  # チャネル幅 (cm)
L = 1e-6  # チャネル長 (cm)
mu_n = 350  # 電子の移動度 (cm^2/V/s)
mu_p = 150  # 正孔の移動度 (cm^2/V/s)

# ドレイン電流 (NMOS)
I_D_nmos = (1/2) * mu_n * C_ox * (W / L) * (V_gs - V_th0)**2

# チャネル長調整効果を考慮したドレイン電流 (2.5)
I_D_lambda = (1/2) * mu_n * C_ox * (W / L) * ((V_gs - V_th0)**2 - (V_DS - V_gs)**2 / 4)

# トランスコンダクタンス (2.6)
g_m_nmos = (2 * I_D_nmos) / (V_gs - V_th0)

# 小信号モデルの出力抵抗 (2.7)
r_o_nmos = 1 / (lambda_value * I_D_nmos)

# PMOSのドレイン電流
I_D_pmos = (1/2) * mu_p * C_ox * (W / L) * (V_sg - V_th0)**2

# PMOSの出力抵抗
r_o_pmos = 1 / (lambda_value * I_D_pmos)

# チャネル長調整効果を考慮したしきい値電圧 (2.4)
V_th_adjusted = V_th0 + math.sqrt((2 * q * N_A / C_ox) * (V_BS + 2 * phi_F)) - math.sqrt((2 * q * N_A / C_ox) * 2 * phi_F)

# ゲート容量計算式 (CG)
C_G = (2 / 3) * W * L * C_ox

# ソース・ドレイン間の浮遊容量 (C_DB)
C_DB = W * L * C_ox

# しきい値電圧の変化量 (ΔV_th)
V_SB = 0.4  # ソースバルク電圧 (V)
gamma = 0.5  # ゲートのしきい値の係数
Delta_Vth = gamma * (math.sqrt(2 * phi_F - V_SB) - math.sqrt(2 * phi_F))

# 結果表示
print(f"NMOS ドレイン電流 (I_D_nmos): {I_D_nmos:.3e} A")
print(f"PMOS ドレイン電流 (I_D_pmos): {I_D_pmos:.3e} A")
print(f"チャネル長調整効果を考慮した NMOS ドレイン電流 (I_D_lambda): {I_D_lambda:.3e} A")
print(f"NMOS トランスコンダクタンス (g_m_nmos): {g_m_nmos:.3e} S")
print(f"NMOS 小信号モデルの出力抵抗 (r_o_nmos): {r_o_nmos:.3e} Ω")
print(f"PMOS 小信号モデルの出力抵抗 (r_o_pmos): {r_o_pmos:.3e} Ω")
print(f"しきい値電圧の変化量 (ΔV_th): {Delta_Vth:.3e} V")
print(f"ゲート容量 (C_G): {C_G:.3e} F")
print(f"ソース・ドレイン間の浮遊容量 (C_DB): {C_DB:.3e} F")


P22

import math

# 定数の定義
q = 1.6e-19  # 電荷 (C)
N_A = 1e17  # アクセプタ濃度 (cm^-3)
phi_F = 0.3  # フェルミポテンシャル (V)
V_BS = 0.0  # ソースバルク電圧 (V)
lambda_value = 0.02  # チャネル長調整効果係数 (V^-1)
V_DS = 3.0  # ドレインソース電圧 (V)
epsilon_0 = 8.85e-14  # 真空の誘電率 (F/cm)
epsilon_ox = 3.9 * epsilon_0  # 酸化膜の誘電率 (F/cm)
tox = 9e-9  # 酸化膜の厚さ (cm)
C_ox = epsilon_ox / tox  # ゲート容量 (F/cm^2)
V_th0 = 1.0  # 基準しきい値電圧 (V)
V_gs = 2.0  # ゲートソース電圧 (V)
V_sg = 2.5  # ソースゲート電圧 (V, PMOS用)
W = 10e-6  # チャネル幅 (cm)
L = 1e-6  # チャネル長 (cm)
mu_n = 350  # 電子の移動度 (cm^2/V/s)
mu_p = 150  # 正孔の移動度 (cm^2/V/s)
E = 1.5e-6  # 拡散領域の幅 (cm)
C_sw = 5e-15  # 単位面積あたりの拡散容量 (F/cm^2)
C_ov = 2e-15  # オーバーラップ容量 (F/cm)

# ドレイン電流 (NMOS) の計算
I_D_nmos = mu_n * C_ox * (W / L) * ((V_gs - V_th0) * V_DS - (V_DS**2) / 2)

# チャネル長調整効果を考慮したドレイン電流 (2.5)
I_D_lambda = mu_n * C_ox * (W / L) * ((V_gs - V_th0) * V_DS - (V_DS**2) / 2)

# トランスコンダクタンス (2.6)
g_m_nmos = math.sqrt(2 * mu_n * C_ox * (W / L) * I_D_nmos)

# 小信号モデルの出力抵抗 (2.7)
r_o_nmos = 1 / (lambda_value * I_D_nmos)

# ゲートドレイン間の容量 (C_DB)
C_DB = (W / 2) * E * C_ox + 2 * ((W / 2) + E) * C_sw

# ゲートソース間の容量 (C_SB)
C_SB = (W / 2) * E * C_ox + 2 * ((W / 2) + E) * C_sw

# ゲートソース間の容量 (C_GS)
C_GS = (2 / 3) * W * L * C_ox + W * C_ov

# トランジスタの周波数特性 (f_T)
f_T = g_m_nmos / (2 * math.pi * (C_DB + C_GS))

# 結果表示
print(f"NMOS ドレイン電流 (I_D_nmos): {I_D_nmos:.3e} A")
print(f"チャネル長調整効果を考慮した NMOS ドレイン電流 (I_D_lambda): {I_D_lambda:.3e} A")
print(f"NMOS トランスコンダクタンス (g_m_nmos): {g_m_nmos:.3e} S")
print(f"NMOS 小信号モデルの出力抵抗 (r_o_nmos): {r_o_nmos:.3e} Ω")
print(f"ゲート-ドレイン容量 (C_DB): {C_DB:.3e} F")
print(f"ゲート-ソース容量 (C_SB): {C_SB:.3e} F")
print(f"ゲート-ソース間容量 (C_GS): {C_GS:.3e} F")
print(f"トランジスタの周波数特性 (f_T): {f_T:.3e} Hz")

P37

import math

# 定数の定義
mu_n = 350  # 電子の移動度 (cm^2/V/s)
mu_p = 100  # 正孔の移動度 (cm^2/V/s)
C_ox = 8.85e-8  # 酸化膜容量 (F/cm^2)
W = 50e-6  # チャネル幅 (cm)
L = 0.5e-6  # チャネル長 (cm)
lambda_value = 0.02  # チャネル長調整パラメータ (V^-1)
V_gs = 1.5  # ゲート-ソース電圧 (V)
V_th = 0.7  # しきい値電圧 (V)
V_ds = 1.466  # ドレイン-ソース電圧 (V)
I_D = 0.5e-3  # ドレイン電流 (A)
gamma = 0.4  # 基板バイアス係数
V_SB = 0.5  # ソースバルク電圧 (V)

# しきい値電圧の計算 (基板バイアス効果を考慮)
V_th_adjusted = V_th + gamma * (math.sqrt(2 * phi_F + V_SB) - math.sqrt(2 * phi_F))

# ドレイン電流の計算 (飽和領域)
I_D_calculated = (1 / 2) * mu_n * C_ox * (W / L) * (V_gs - V_th_adjusted)**2 * (1 + lambda_value * V_ds)

# トランスコンダクタンス g_m1
g_m1 = math.sqrt(2 * mu_n * C_ox * (W / L) * I_D)

# 出力抵抗 r_o1
r_o1 = 1 / (lambda_value * I_D)

# M2 トランジスタのトランスコンダクタンス g_m2
g_m2 = math.sqrt(2 * mu_p * C_ox * (W / L) * I_D)

# M2 トランジスタの出力抵抗 r_o2
r_o2 = 10e3  # 10kΩ

# 負荷抵抗 R_L の計算 (並列接続)
R_L = 1 / (1 / r_o1 + 1 / r_o2 + g_m2)

# 増幅回路の電圧利得 A_v の計算
A_v = -g_m1 * R_L

# PMOS の場合のトランスコンダクタンス g_m2 (PMOS用)
g_m2_PMOS = 0.876e-3  # 0.876 mS

# PMOS の場合の負荷抵抗 R_L の計算
R_L_PMOS = 1 / (1 / r_o1 + 1 / r_o2 + g_m2_PMOS)

# PMOS の場合の増幅回路の電圧利得 A_v の計算
A_v_PMOS = -g_m1 * R_L_PMOS

# 結果表示
print(f"しきい値電圧 (V_th_adjusted): {V_th_adjusted:.3f} V")
print(f"ドレイン電流 (I_D_calculated): {I_D_calculated:.3e} A")
print(f"トランスコンダクタンス g_m1: {g_m1:.3e} S")
print(f"出力抵抗 r_o1: {r_o1:.3e} Ω")
print(f"M2 のトランスコンダクタンス g_m2: {g_m2:.3e} S")
print(f"M2 の出力抵抗 r_o2: {r_o2:.3e} Ω")
print(f"負荷抵抗 R_L: {R_L:.3e} Ω")
print(f"増幅回路の電圧利得 A_v: {A_v:.3f}")
print(f"PMOS の負荷抵抗 R_L_PMOS: {R_L_PMOS:.3e} Ω")
print(f"PMOS の増幅回路の電圧利得 A_v_PMOS: {A_v_PMOS:.3f}")


P39

import math

# 定数の定義
mu_n = 350  # 電子の移動度 (cm^2/V/s)
mu_p = 100  # 正孔の移動度 (cm^2/V/s)
C_ox = 8.85e-8  # 酸化膜容量 (F/cm^2)
W = 50e-6  # チャネル幅 (cm)
L = 0.5e-6  # チャネル長 (cm)
lambda_p = 0.05  # PMOSのチャネル長調整パラメータ (V^-1)
V_gs = 1.5  # ゲート-ソース電圧 (V)
V_th = 0.7  # しきい値電圧 (V)
I_D1 = 0.5e-3  # M1のドレイン電流 (A)
I_D2 = 0.5e-3  # M2のドレイン電流 (A)
V_DS2 = 1.534  # M2のドレイン-ソース電圧 (V)
V_dd = 2.00  # 電源電圧 (V)

# M2 の出力抵抗 r_o2 の計算
r_o2 = 1 / (lambda_p * I_D2)  # 40kΩ として計算される

# トランスコンダクタンス g_m1
g_m1 = math.sqrt(2 * mu_n * C_ox * (W / L) * I_D1)

# トランスコンダクタンス g_m2
g_m2 = math.sqrt(2 * mu_p * C_ox * (W / L) * I_D2)

# 負荷抵抗 R_L の計算 (r_o1 || r_o2 || 1/g_m2)
r_o1 = r_o2  # M1とM2の同一条件で
R_L = 1 / (1 / r_o1 + 1 / r_o2 + g_m2)

# 電圧利得 A_v の計算
A_v = -g_m1 * R_L

# 最小 V_DS1 の計算
V_DS1_min = 0.269  # V_DS1 の最小値は問題文の計算から与えられる

# 最大出力電圧スイングの計算
V_out_min = V_DS1_min
V_out_max = V_dd
output_swing = (V_out_min, V_out_max)

# 結果表示
print(f"M2 の出力抵抗 r_o2: {r_o2:.3e} Ω")
print(f"トランスコンダクタンス g_m1: {g_m1:.3e} S")
print(f"トランスコンダクタンス g_m2: {g_m2:.3e} S")
print(f"負荷抵抗 R_L: {R_L:.3e} Ω")
print(f"電圧利得 A_v: {A_v:.3f}")
print(f"出力電圧スイング: {output_swing[0]:.3f} V - {output_swing[1]:.3f} V")

P40

import math

# 定数の定義
mu_n = 350  # 電子の移動度 (cm^2/V/s)
C_ox = 8.85e-8  # 酸化膜容量 (F/cm^2)
W = 50e-6  # チャネル幅 (cm)
L = 0.5e-6  # チャネル長 (cm)
lambda_value = 0  # チャネル長調整パラメータ (V^-1), 飽和領域を仮定
V_gs = 1.5  # ゲート-ソース電圧 (V)
V_th = 0.7  # しきい値電圧 (V)
I_D = 1e-3  # ドレイン電流 (A)
R_D = 2e3  # 負荷抵抗 (Ω)
V_dd = 3.0  # 電源電圧 (V)

# トランスコンダクタンス g_m の計算
g_m = math.sqrt(2 * mu_n * C_ox * (W / L) * I_D)

# 小信号抵抗 r_o の計算 (lambda がゼロの場合 r_o = 無限大)
r_o = 1 / (lambda_value * I_D) if lambda_value != 0 else float('inf')

# 負荷抵抗 R_D と r_o の並列接続 (飽和領域では r_o は無限大なので R_D の値に近づく)
R_parallel = R_D if r_o == float('inf') else 1 / (1 / r_o + 1 / R_D)

# 小信号利得 A_v の計算
A_v = -g_m * R_parallel

# オーバードライブ電圧 V_ov の計算
V_ov = V_gs - V_th

# ドレイン電流の式を用いた入力電圧 V_in の計算
V_in = V_ov / math.sqrt(2 * mu_n * C_ox * (W / L) * I_D)

# 出力電圧の計算
V_out_max = V_dd - I_D * R_D
V_out_min = V_th + V_ov  # 出力電圧スイングの最小値
output_swing = (V_out_min, V_out_max)

# 結果表示
print(f"トランスコンダクタンス g_m: {g_m:.3e} S")
print(f"小信号抵抗 r_o: {r_o:.3e} Ω")
print(f"負荷抵抗 R_parallel: {R_parallel:.3e} Ω")
print(f"小信号利得 A_v: {A_v:.3f}")
print(f"入力電圧 V_in: {V_in:.3f} V")
print(f"出力電圧スイング: {output_swing[0]:.3f} V - {output_swing[1]:.3f} V")

P41

import math

# Given constants
mu_n = 1.342e-4  # Electron mobility in A/V^2
C_ox = 1  # Oxide capacitance per unit area (assuming normalized)
W = 50e-6  # Channel width in meters
L = 0.5e-6  # Channel length in meters
V_TH = 1  # Threshold voltage in volts
R_D = 2000  # Drain resistance in ohms

# Drain current for different scenarios
I_D1 = 1e-3  # Drain current 1 in Amperes (for V_out = 1V)
I_D2 = 0.25e-3  # Drain current 2 in Amperes (for V_out = 2.5V)

# Calculating input voltage for both cases
V_in1 = math.sqrt((2 * I_D1) / (mu_n * C_ox * (W / L))) + V_TH
V_in2 = math.sqrt((2 * I_D2) / (mu_n * C_ox * (W / L))) + V_TH

# Calculating transconductance for both cases
g_m1 = math.sqrt(2 * mu_n * C_ox * (W / L) * I_D1)
g_m2 = math.sqrt(2 * mu_n * C_ox * (W / L) * I_D2)

# Calculating voltage gain for both cases
A_v1 = -g_m1 * R_D
A_v2 = -g_m2 * R_D

# Display results
results = {
    "Input Voltage for V_out = 1V": V_in1,
    "Input Voltage for V_out = 2.5V": V_in2,
    "Transconductance for V_out = 1V": g_m1,
    "Transconductance for V_out = 2.5V": g_m2,
    "Voltage Gain for V_out = 1V": A_v1,
    "Voltage Gain for V_out = 2.5V": A_v2
}

results

P50

P68

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?