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 OPアンプ回路 実務設計の基礎

Last updated at Posted at 2024-08-23

P19
単位面積あたりのゲート容量

# Constants
epsilon_0 = 8.854e-14  # Permittivity of free space in F/cm
kappa_ox = 3.9         # Relative permittivity of SiO2
t_ox = 10e-7           # Oxide thickness in cm (adjust as needed)

# Calculate the gate capacitance per unit area
Cox = (epsilon_0 * kappa_ox) / t_ox

# Output the result
print(f"Gate capacitance per unit area (Cox): {Cox:.4e} F/cm^2")

p25

# 定数とパラメータの設定
mu_p = 100e-6  # キャリア移動度 (例: 100e-6 m^2/Vs)
C_ox = 10e-9   # 酸化膜容量 (例: 10e-9 F/m^2)
W = 10e-6      # トランジスタの幅 (例: 10e-6 m)
L = 1e-6       # トランジスタの長さ (例: 1e-6 m)
V_TP = -0.7    # PMOSトランジスタの閾値電圧 (例: -0.7 V)
V_SD = -0.2    # ソース-ドレイン間電圧 (例: -0.2 V)
V_SG = -1.0    # ソース-ゲート間電圧 (例: -1.0 V)

# 非飽和領域のドレイン電流 (1-7式)
def drain_current_linear(mu_p, C_ox, W, L, V_SG, V_TP, V_SD):
    return mu_p * C_ox * (W / L) * ((V_SG - V_TP) * V_SD - 0.5 * V_SD**2)

# 飽和領域のドレイン電流 (1-8式)
def drain_current_saturation(mu_p, C_ox, W, L, V_SG, V_TP):
    return 0.5 * mu_p * C_ox * (W / L) * (V_SG - V_TP)**2

# 非飽和領域のドレイン電流 (PMOS式 1-9)
def drain_current_pmos_linear(mu_p, C_ox, W, L, V_GS, V_TP, V_DS):
    return mu_p * C_ox * (W / L) * ((abs(V_GS) - abs(V_TP)) * abs(V_DS) - 0.5 * abs(V_DS)**2)

# 飽和領域のドレイン電流 (PMOS式 1-10)
def drain_current_pmos_saturation(mu_p, C_ox, W, L, V_GS, V_TP, V_DS):
    return 0.5 * mu_p * C_ox * (W / L) * (abs(V_GS) - abs(V_TP))**2

# ドレイン電流を計算
I_D_linear = drain_current_linear(mu_p, C_ox, W, L, V_SG, V_TP, V_SD)
I_D_saturation = drain_current_saturation(mu_p, C_ox, W, L, V_SG, V_TP)
I_D_pmos_linear = drain_current_pmos_linear(mu_p, C_ox, W, L, V_SG, V_TP, V_SD)
I_D_pmos_saturation = drain_current_pmos_saturation(mu_p, C_ox, W, L, V_SG, V_TP, V_SD)

# 結果の表示
print(f"非飽和領域のドレイン電流 (1-7式) I_D = {I_D_linear:.6e} A")
print(f"飽和領域のドレイン電流 (1-8式) I_D = {I_D_saturation:.6e} A")
print(f"PMOS非飽和領域のドレイン電流 (1-9式) I_D = {I_D_pmos_linear:.6e} A")
print(f"PMOS飽和領域のドレイン電流 (1-10式) I_D = {I_D_pmos_saturation:.6e} A")


p28

# 定数とパラメータの設定
mu = 100e-6  # キャリア移動度 (例: 100e-6 m^2/Vs)
C_ox = 10e-9  # 酸化膜容量 (例: 10e-9 F/m^2)
W = 10e-6     # トランジスタの幅 (例: 10e-6 m)
L = 1e-6      # トランジスタの長さ (例: 1e-6 m)
Delta_L = 0.1e-6  # 空乏層幅 Delta L (例: 0.1e-6 m)
V_GS = 1.2    # ゲート-ソース間電圧 (例: 1.2 V)
V_T = 0.6     # 閾値電圧 V_T (例: 0.6 V)
V_DS = 0.3    # ドレイン-ソース間電圧 (例: 0.3 V)

# (1-12) 式: チャネル長変調を考慮した非飽和領域のドレイン電流
def drain_current_with_channel_modulation(mu, C_ox, W, L, Delta_L, V_GS, V_T):
    return 0.5 * mu * C_ox * (W / (L - Delta_L)) * (V_GS - V_T)**2

# (1-13) 式: チャネル長変調を考慮しない非飽和領域のドレイン電流
def drain_current_without_channel_modulation(mu, C_ox, W, L, V_GS, V_T):
    return 0.5 * mu * C_ox * (W / L) * (V_GS - V_T)**2

# (1-14) 式: ピンチオフ点における電圧の式
def pinch_off_voltage(V_GS, V_T, Delta_L):
    return (V_GS - V_T) / (1 - (Delta_L / L))

# (1-16) 式: チャネルの横方向電界 E の計算
def channel_field(V_DS, L):
    return V_DS / L

# 各式に基づく計算
I_D_with_modulation = drain_current_with_channel_modulation(mu, C_ox, W, L, Delta_L, V_GS, V_T)
I_D_without_modulation = drain_current_without_channel_modulation(mu, C_ox, W, L, V_GS, V_T)
V_pinch_off = pinch_off_voltage(V_GS, V_T, Delta_L)
E_field = channel_field(V_DS, L)

# 結果の表示
print(f"チャネル長変調を考慮したドレイン電流 (1-12式) I_D = {I_D_with_modulation:.6e} A")
print(f"チャネル長変調を考慮しないドレイン電流 (1-13式) I_D = {I_D_without_modulation:.6e} A")
print(f"ピンチオフ点における電圧 (1-14式) V_pinch_off = {V_pinch_off:.6f} V")
print(f"チャネルの横方向電界 (1-16式) E_field = {E_field:.6e} V/m")

P30


import numpy as np
import matplotlib.pyplot as plt

# Define MOSFET parameters
mu_n = 200e-4  # Electron mobility (cm^2/Vs converted to m^2/Vs)
C_ox = 10e-9  # Oxide capacitance per unit area (F/m^2)
W = 10e-6  # Width of the MOSFET (m)
L = 1e-6   # Length of the MOSFET (m)
V_GS = 1.8  # Gate-source voltage (V)
V_th = 0.2  # Threshold voltage (V)
lambda_param = 0.2  # Channel-length modulation parameter (1/V)

# Calculate process-dependent parameter K
K = (1/2) * mu_n * C_ox * (W / L)

# Create a range of V_DS values
V_DS = np.linspace(0, 5, 500)  # Drain-source voltage range from 0 to 5 V

# Calculate I_D using the saturation region equation with channel-length modulation
I_D = K * (V_GS - V_th)**2 * (1 + lambda_param * V_DS)

# Plot I_D vs V_DS
plt.figure(figsize=(8, 6))
plt.plot(V_DS, I_D, label=f'V_GS = {V_GS} V', color='b')
plt.title('MOSFET Drain Current with Channel-Length Modulation')
plt.xlabel('V_DS (V)')
plt.ylabel('I_D (A)')
plt.grid(True)
plt.legend()
plt.show()

P32

import numpy as np

# Constants
q = 1.60219e-19  # Elementary charge in C
epsilon_0 = 8.854e-12  # Permittivity of free space in F/m
epsilon_si = 11.7  # Relative permittivity of silicon
N_sub = 1e17  # Substrate doping concentration in m^-3 (example value)
C_ox = 2.3e-3  # Oxide capacitance per unit area in F/m^2 (example value)

# Calculate gamma
gamma = np.sqrt((2 * q * epsilon_0 * epsilon_si * N_sub) / C_ox)

# Parameters for threshold voltage calculation
phi_F = 0.3  # Fermi potential in V (example value)
V_SB = 0.2  # Source-bulk voltage in V (example value)
V_T0 = 0.5  # Threshold voltage without body effect in V (example value)

# NMOS Threshold Voltage with Body Effect
V_TN = V_T0 + gamma * (np.sqrt(2 * phi_F + V_SB) - np.sqrt(2 * phi_F))

# PMOS Threshold Voltage with Body Effect (Assuming same gamma)
V_TP = V_T0 - gamma * (np.sqrt(2 * phi_F - V_SB) - np.sqrt(2 * phi_F))

print(f"Gamma (γ): {gamma:.3f} V^0.5")
print(f"NMOS Threshold Voltage (V_TN): {V_TN:.3f} V")
print(f"PMOS Threshold Voltage (V_TP): {V_TP:.3f} V")

P33
抵抗に必ず生じる熱雑音、ホワイトノイズ、MOSトランジスタの熱雑音電圧、フリッカ雑音、熱雑音電流、移動度のゆらぎ


import numpy as np

# Constants
k_B = 1.38e-23        # Boltzmann constant in J/K
T = 300               # Temperature in Kelvin
R = 1e3               # Resistance in ohms (adjust as needed)
delta_f = 1e3         # Bandwidth in Hz (adjust as needed)
gamma = 2/3           # Process-dependent constant for MOSFETs (adjust as needed)
g_m = 1e-3            # Transconductance in S (adjust as needed)
W = 1e-6              # Channel width in meters (adjust as needed)
L = 1e-6              # Channel length in meters (adjust as needed)
Cox = 1e-8            # Gate capacitance per unit area in F/cm^2 (adjust as needed)
Kf = 1e-25            # Flicker noise coefficient (adjust as needed)
alpha_H = 2e-3        # Hooge's constant (adjust as needed)
N = 1e21              # Number of charge carriers (adjust as needed)
V = 1.2               # Applied voltage in V (adjust as needed)

# Thermal noise voltage in resistor
v_n_resistor = np.sqrt(4 * k_B * T * R * delta_f)

# Thermal noise voltage in MOSFET
v_n_mosfet = np.sqrt(4 * k_B * T * gamma * (1 / g_m) * delta_f)

# Flicker noise in MOSFET
S_V_flicker = (Kf / (W * L * Cox)) * (1 / delta_f)

# Thermal noise current in MOSFET
i_n_mosfet = np.sqrt(4 * k_B * T * gamma * g_m * delta_f)

# Mobility fluctuations (Hooge's Law)
S_V_mobility = (alpha_H / N) * (V**2 / delta_f)

# Print results
print(f"Thermal noise voltage (Resistor): {v_n_resistor:.4e} V")
print(f"Thermal noise voltage (MOSFET): {v_n_mosfet:.4e} V")
print(f"Flicker noise (MOSFET): {S_V_flicker:.4e} V^2/Hz")
print(f"Thermal noise current (MOSFET): {i_n_mosfet:.4e} A")
print(f"Mobility fluctuations (Hooge's Law): {S_V_mobility:.4e} V^2/Hz")


P41


import numpy as np

# Constants and parameters
mu = 1e-3  # Mobility in m^2/Vs (example value)
Cox = 1e-8  # Oxide capacitance per unit area in F/m^2 (example value)
W = 10e-6  # Channel width in meters
L = 1e-6  # Channel length in meters
VGS = 1.5  # Gate-source voltage in Volts
VT = 0.7  # Threshold voltage in Volts
lambda_val = 0.02  # Channel length modulation parameter (example value)
VDS = 2.0  # Drain-source voltage in Volts
ID = 1e-3  # Drain current in Amperes (example value)
gamma = 0.4  # Bulk threshold parameter (example value)
phi_F = 0.3  # Surface potential in Volts (example value)
VSB = 0.5  # Source-bulk voltage in Volts

# Transconductance gm (considering lambda VDS)
gm_with_lambda = mu * Cox * (W / L) * (VGS - VT) * (1 + lambda_val * VDS)

# Transconductance gm (ignoring channel length modulation)
gm_without_lambda = mu * Cox * (W / L) * (VGS - VT)

# Transconductance gm using drain current ID
gm_id = np.sqrt(2 * mu * Cox * (W / L) * ID) / np.sqrt(1 + lambda_val * VDS)

# Simplified gm (when lambda VDS is small)
gm_simplified = np.sqrt(2 * mu * Cox * (W / L) * ID)

# Bulk transconductance gmb
gmb = gamma * gm_simplified / np.sqrt(2 * np.abs(phi_F) + VSB)

# Drain conductance gd
gd = (lambda_val * ID) / (1 + lambda_val * VDS)

# Output the calculated values
print(f"gm with lambda: {gm_with_lambda} S")
print(f"gm without lambda: {gm_without_lambda} S")
print(f"gm using ID: {gm_id} S")
print(f"Simplified gm: {gm_simplified} S")
print(f"Bulk transconductance gmb: {gmb} S")
print(f"Drain conductance gd: {gd} S")


P42

# 定数(例としての値、実際の値に置き換えてください)
mu = 1e-2       # 移動度 (m^2/Vs)
C_OX = 2e-8     # 酸化膜容量 (F/m^2)
W = 10e-6       # チャンネル幅 (m)
L = 2e-6        # チャンネル長 (m)
V_GS = 1.8      # ゲート-ソース電圧 (V)
V_T = 0.7       # 閾値電圧 (V)
gamma = 0.5     # ボディ効果係数
lambda_param = 0.02  # チャンネル長変調パラメータ (V^-1)
I_D = 1e-3      # ドレイン電流 (A)
V_DS = 1.0      # ドレイン-ソース電圧 (V)

# 計算
g_m = mu * C_OX * (W / L) * (V_GS - V_T)
g_mb = gamma * g_m
g_d = lambda_param * I_D / (1 + lambda_param * V_DS)

# 小信号ドレイン電流の計算
v_gs = 0.01  # 小信号入力電圧の例 (V)
v_bs = 0.01
v_ds = 0.01
i_d = g_m * v_gs + g_mb * v_bs + g_d * v_ds

# 結果の出力
print(f"トランスコンダクタンス g_m: {g_m:.5e} S")
print(f"バルク・トランスコンダクタンス g_mb: {g_mb:.5e} S")
print(f"ドレインコンダクタンス g_d: {g_d:.5e} S")
print(f"小信号ドレイン電流 i_d: {i_d:.5e} A")

P44

import numpy as np
import matplotlib.pyplot as plt

# 定数
I_0 = 1e-6      # プロセスに依存する定数 (A)
W = 10e-6       # チャンネル幅 (m)
L = 2e-6        # チャンネル長 (m)
q = 1.6e-19     # 電子の電荷 (C)
V_T = 0.7       # 閾値電圧 (V)
k = 1.38e-23    # ボルツマン定数 (J/K)
T = 300         # 温度 (K)
V_DS = 1.0      # ドレイン-ソース電圧 (V)
C_d = 1e-12     # 空乏層容量 (F)
C_ox = 2e-8     # ゲート酸化膜容量 (F/m^2)

# スロープ・ファクタの計算
n = 1 + (C_d / C_ox)

# V_GS の範囲を定義
V_GS = np.linspace(0, 1.5, 500)

# ドレイン電流 I_D の計算
I_D = I_0 * (W / L) * np.exp(q * (V_GS - V_T) / (n * k * T)) * (1 - np.exp(-q * V_DS / (k * T)))

# プロット
plt.plot(V_GS, I_D)
plt.xlabel('Gate-Source Voltage V_GS (V)')
plt.ylabel('Drain Current I_D (A)')
plt.title('Drain Current vs. Gate-Source Voltage (Weak Inversion)')
plt.grid(True)
plt.yscale('log')  # I_D が指数関数的に増加するので、y軸を対数スケールに設定
plt.show()

P45
S=2.3n(kT/q)
gm=(q/(nkT))ID

VGS=VTh+2n(kT/q)
n=1.5と T=300K

# Constants
k = 1.38e-23         # Boltzmann constant in J/K
q = 1.6e-19          # Elementary charge in C
n = 1.5              # Subthreshold slope factor
T = 300              # Temperature in Kelvin
ID = 1e-6            # Drain current I_D in A (example value, adjust as needed)
VTh = 0.5            # Threshold voltage V_Th in V (example value, adjust as needed)

# Calculate S
S = 2.3 * n * (k * T / q)

# Calculate gm
gm = (q / (n * k * T)) * ID

# Calculate VGS
VGS = VTh + 2 * n * (k * T / q)

# Output the results
print(f"Thermal Voltage S: {S:.4e} V")
print(f"Transconductance gm: {gm:.4e} S")
print(f"Gate-Source Voltage VGS: {VGS:.4e} V")


P59
ポリシリコン抵抗、シート抵抗

# Constants
rho = 1e-5          # Resistivity of polysilicon in ohm-meters (example value, adjust as needed)
L = 10e-6           # Length of the resistor in meters (example value, adjust as needed)
W = 2e-6            # Width of the resistor in meters (example value, adjust as needed)
t = 200e-9          # Thickness of the polysilicon film in meters (example value, adjust as needed)

# Calculate the cross-sectional area
A = W * t

# Calculate the resistance R
R = rho * (L / A)

# Calculate the sheet resistance Rs
Rs = rho / t

# Alternatively, calculate R using sheet resistance Rs and L/W ratio
R_alternative = Rs * (L / W)

# Output the results
print(f"Resistance R: {R:.4e} ohms")
print(f"Sheet Resistance Rs: {Rs:.4e} ohms per square")
print(f"Alternative Resistance R (using Rs): {R_alternative:.4e} ohms")

P72

# 定数の設定
V_DD = 5.0  # 電源電圧 (例: 5V)
V_BIAS = 1.2  # バイアス電圧 (例: 1.2V)
V_TP = -0.7   # PMOSトランジスタの閾値電圧 (例: -0.7V)
V_OUT = 3.0   # 出力電圧 (例: 3V)

# 飽和条件を満たすためのV_SDの計算
def calculate_vsd(V_SG, V_TP):
    return abs(V_SG) - abs(V_TP)

# 最大出力電圧の計算
def calculate_vout_max(V_DD, V_BIAS, V_TP):
    return V_DD - V_BIAS + abs(V_TP)

# 最小出力電圧の計算
def calculate_vout_min(V_DD, V_BIAS, V_TP):
    return V_DD - V_BIAS - abs(V_TP)

# 電流源として使用できる範囲かどうかを判定する関数
def is_within_current_source_range(V_OUT, V_DD, V_BIAS, V_TP):
    V_out_max = calculate_vout_max(V_DD, V_BIAS, V_TP)
    V_out_min = calculate_vout_min(V_DD, V_BIAS, V_TP)
    return V_out_min <= V_OUT <= V_out_max

# 飽和条件の計算例
V_SG = V_BIAS  # 飽和条件を満たすようにソース-ゲート電圧をバイアス電圧とする
V_SD_saturation = calculate_vsd(V_SG, V_TP)
print(f"飽和条件を満たすV_SDの値: {V_SD_saturation} V")

# 最大出力電圧と最小出力電圧の計算
V_out_max = calculate_vout_max(V_DD, V_BIAS, V_TP)
V_out_min = calculate_vout_min(V_DD, V_BIAS, V_TP)

print(f"最大出力電圧 V_OUT(max): {V_out_max} V")
print(f"最小出力電圧 V_OUT(min): {V_out_min} V")

# 出力電圧が電流源として使用できる範囲内かどうかの判定
if is_within_current_source_range(V_OUT, V_DD, V_BIAS, V_TP):
    print(f"出力電圧 V_OUT = {V_OUT} V は電流源として使用できる範囲内です。")
else:
    print(f"出力電圧 V_OUT = {V_OUT} V は電流源として使用できる範囲外です。")

P74


# Given parameters
gm2 = 1e-3       # Transconductance in S (1 mS)
gmb2 = 200e-6    # Body transconductance in S (200 µS)
gd1 = 10e-6      # Drain conductance in S (10 µS)
gd2 = 10e-6      # Drain conductance in S (10 µS)
ro1 = 100e3      # Output resistance for MOS transistor 1 (100 kΩ)
ro2 = 100e3      # Output resistance for MOS transistor 2 (100 kΩ)

# Calculate rout1
rout1 = (gm2 + gmb2 + gd1 + gd2) / (gd1 * gd2)

# Calculate rout2
rout2 = (gm2 * ro2) * ro1

# Print results
print(f"Output Resistance rout1: {rout1:.4e} Ω")
print(f"Output Resistance rout2: {rout2:.4e} Ω")

# Example of intrinsic gain calculation for different channel lengths
def intrinsic_gain(L):
    if L == 1.2e-6:
        gm = 1e-3   # 1 mS for 1.2 µm
        ro = 100e3  # 100 kΩ for 1.2 µm
    elif L == 0.18e-6:
        gm = 15e-3  # Approx. 15 mS for 0.18 µm
        ro = 10e3   # Approx. 10 kΩ for 0.18 µm
    elif L <= 0.13e-6:
        gm = 10e-3  # Approx. 10 mS for 0.13 µm to 65 nm
        ro = 12e3   # Approx. 12 kΩ for 0.13 µm to 65 nm
    elif L <= 45e-9:
        gm = 6e-3   # Approx. 6 mS for 45 nm
        ro = 6e3    # Approx. 6 kΩ for 45 nm
    else:
        gm = 1e-3   # Default values
        ro = 100e3

    return gm * ro

# Calculate intrinsic gain for different channel lengths
L1 = 1.2e-6  # 1.2 µm
L2 = 0.18e-6 # 0.18 µm
L3 = 65e-9   # 65 nm
L4 = 45e-9   # 45 nm

print(f"Intrinsic Gain for L=1.2 µm: {intrinsic_gain(L1):.4e}")
print(f"Intrinsic Gain for L=0.18 µm: {intrinsic_gain(L2):.4e}")
print(f"Intrinsic Gain for L=65 nm: {intrinsic_gain(L3):.4e}")
print(f"Intrinsic Gain for L=45 nm: {intrinsic_gain(L4):.4e}")

P74

# Given parameters
gm2 = 1e-3       # Transconductance in S (1 mS)
gmb2 = 200e-6    # Body transconductance in S (200 µS)
gd1 = 10e-6      # Drain conductance in S (10 µS)
gd2 = 10e-6      # Drain conductance in S (10 µS)
ro1 = 100e3      # Output resistance for MOS transistor 1 (100 kΩ)
ro2 = 100e3      # Output resistance for MOS transistor 2 (100 kΩ)

# Calculate rout1
rout1 = (gm2 + gmb2 + gd1 + gd2) / (gd1 * gd2)

# Calculate rout2
rout2 = (gm2 * ro2) * ro1

# Print results
print(f"Output Resistance rout1: {rout1:.4e} Ω")
print(f"Output Resistance rout2: {rout2:.4e} Ω")

# Example of intrinsic gain calculation for different channel lengths
def intrinsic_gain(L):
    if L == 1.2e-6:
        gm = 1e-3   # 1 mS for 1.2 µm
        ro = 100e3  # 100 kΩ for 1.2 µm
    elif L == 0.18e-6:
        gm = 15e-3  # Approx. 15 mS for 0.18 µm
        ro = 10e3   # Approx. 10 kΩ for 0.18 µm
    elif L <= 0.13e-6:
        gm = 10e-3  # Approx. 10 mS for 0.13 µm to 65 nm
        ro = 12e3   # Approx. 12 kΩ for 0.13 µm to 65 nm
    elif L <= 45e-9:
        gm = 6e-3   # Approx. 6 mS for 45 nm
        ro = 6e3    # Approx. 6 kΩ for 45 nm
    else:
        gm = 1e-3   # Default values
        ro = 100e3

    return gm * ro

# Calculate intrinsic gain for different channel lengths
L1 = 1.2e-6  # 1.2 µm
L2 = 0.18e-6 # 0.18 µm
L3 = 65e-9   # 65 nm
L4 = 45e-9   # 45 nm

print(f"Intrinsic Gain for L=1.2 µm: {intrinsic_gain(L1):.4e}")
print(f"Intrinsic Gain for L=0.18 µm: {intrinsic_gain(L2):.4e}")
print(f"Intrinsic Gain for L=65 nm: {intrinsic_gain(L3):.4e}")
print(f"Intrinsic Gain for L=45 nm: {intrinsic_gain(L4):.4e}")

P83

import math

# 定数とパラメータの設定
I_REF = 100e-6  # 基準電流 (例: 100uA)
mu = 100e-6     # キャリア移動度 (例: 100e-6 m^2/Vs)
C_ox = 10e-9    # 酸化膜容量 (例: 10e-9 F/m^2)
W = 10e-6       # トランジスタの幅 (例: 10e-6 m)
L = 1e-6        # トランジスタの長さ (例: 1e-6 m)
V_TN = 0.7      # 閾値電圧 V_TN (例: 0.7 V)

# (4-16) ゲート-ソース間電圧 V_GS1 の計算
def calculate_vgs1(I_REF, mu, C_ox, W, L, V_TN):
    return math.sqrt((2 * I_REF) / (mu * C_ox * (W / L))) + V_TN

# (4-19) ソース-ドレイン間飽和電圧 V_DSsat1 の計算
def calculate_vdssat1(I_REF, mu, C_ox, W, L):
    return math.sqrt((2 * I_REF) / (mu * C_ox * (W / L)))

# (4-21) 出力電圧の最小値 V_OUT(min) の計算
def calculate_vout_min(V_DSsat1):
    return 2 * V_DSsat1

# 各式に基づく計算
V_GS1 = calculate_vgs1(I_REF, mu, C_ox, W, L, V_TN)
V_DSsat1 = calculate_vdssat1(I_REF, mu, C_ox, W, L)
V_OUT_min = calculate_vout_min(V_DSsat1)

# 結果の表示
print(f"ゲート-ソース間電圧 V_GS1 (4-16式) = {V_GS1:.6f} V")
print(f"ソース-ドレイン間飽和電圧 V_DSsat1 (4-19式) = {V_DSsat1:.6f} V")
print(f"出力電圧の最小値 V_OUT(min) (4-21式) = {V_OUT_min:.6f} V")

P84

# 定数とパラメータの設定
g_d1 = 0.01   # コンダクタンス g_d1 (例: 0.01 S)
g_d2 = 0.02   # コンダクタンス g_d2 (例: 0.02 S)
g_m2 = 0.005  # トランスコンダクタンス g_m2 (例: 0.005 S)
r_o1 = 10000  # 出力抵抗 r_o1 (例: 10 kΩ)
r_o2 = 5000   # 出力抵抗 r_o2 (例: 5 kΩ)
A = 10        # 増幅度 A (例: 10)

# (4-22)式: 小信号等価回路の電流と電圧の関係式
def calculate_itest(g_d2, v_test, g_m2, v_x, A, g_d1):
    return g_d2 * v_test - g_m2 * v_x * (A + 1) - g_d1 * v_x

# (4-23)式: 出力抵抗 r_out の計算
def calculate_rout(g_d1, g_m2, g_d2, A, r_o1, r_o2):
    return (1 / g_d1) * (g_m2 / g_d2) * A * (g_m2 * r_o2) * r_o1

# 計算例
v_test = 1.0  # テスト電圧 (例: 1V)
v_x = 1.0     # ノード電圧 (例: 1V)

# (4-22) 式に基づくテスト電流の計算
i_test = calculate_itest(g_d2, v_test, g_m2, v_x, A, g_d1)
print(f"テスト電流 i_test (4-22式) = {i_test:.6f} A")

# (4-23) 式に基づく出力抵抗の計算
r_out = calculate_rout(g_d1, g_m2, g_d2, A, r_o1, r_o2)
print(f"出力抵抗 r_out (4-23式) = {r_out:.2f} Ω")

P85
rout=A(gm2×ro2)×ro1

P87とP88

# Given parameters
mu = 450e-4         # Mobility of charge carriers in m^2/(V*s) (example value)
Cox = 3.45e-3       # Oxide capacitance per unit area in F/m^2 (example value)
W1 = 10e-6          # Width of MOSFET in meters (example value)
L1 = 1e-6           # Length of MOSFET in meters (example value)
VREF = 1.2          # Reference voltage in Volts (example value)
VTh = 0.6           # Threshold voltage in Volts (example value)
VDD = 3.3           # Supply voltage in Volts (example value)
R = 10e3            # Resistance in Ohms (example value)

# Calculate current I using the MOSFET equation
I_MOSFET = (1/2) * mu * Cox * (W1 / L1) * (VREF - VTh)**2

# Calculate current I using Ohm's law
I_Ohm = (VDD - VREF) / R

# Print results
print(f"Current I (using MOSFET equation): {I_MOSFET:.4e} A")
print(f"Current I (using Ohm's law): {I_Ohm:.4e} A")

P92

import math

# 定数とパラメータの設定
I_REF = 100e-6   # 基準電流 (例: 100uA)
mu_n = 100e-6    # キャリア移動度 (例: 100e-6 m^2/Vs)
C_ox = 10e-9     # 酸化膜容量 (例: 10e-9 F/m^2)
W_L_5 = 10       # M5トランジスタの幅と長さの比 (W/L)
V_T = 0.7        # 閾値電圧 (例: 0.7V)
R = 10000        # 抵抗 R (例: 10kΩ)
B = 1            # 定数 B

# (5-12)式: 基準電圧 V_GSS の計算
def calculate_vgss(I_REF, mu_n, C_ox, W_L_5, V_T):
    return math.sqrt((2 * I_REF) / (mu_n * C_ox * W_L_5)) + V_T

# (5-13)式: 基準電流 I_REF の計算
def calculate_iref(V_T, R, B):
    term1 = V_T / R
    term2 = (1 / R) * math.sqrt((2 * V_T) / (mu_n * C_ox * (W_L_5 / R)))
    term3 = (2 * V_T) / (B * R)
    term4 = 1 / (B**2 * R**2)
    return term1 + term2 + term3 + term4

# 各式に基づく計算
V_GSS = calculate_vgss(I_REF, mu_n, C_ox, W_L_5, V_T)
I_REF_calculated = calculate_iref(V_T, R, B)

# 結果の表示
print(f"基準電圧 V_GSS (5-12式) = {V_GSS:.6f} V")
print(f"基準電流 I_REF (5-13式) = {I_REF_calculated:.6e} A")

P95


# Parameters (example values)
I_REF = 1e-3  # Reference current in Amperes
mu_n = 500e-4  # Electron mobility in m^2/Vs (example value)
V_TDI = 0.7  # Threshold voltage in Volts (example value)
dmu_n_dT = -1e-4  # Derivative of mobility with respect to temperature (example value)
dV_TDI_dT = -2e-3  # Derivative of threshold voltage with respect to temperature (example value)

# Partial derivatives
dI_REF_dmu_n = I_REF / mu_n
dI_REF_dV_TDI = -I_REF / V_TDI * (2 / V_TDI)

# Temperature coefficient TC calculation
TC = (1/mu_n) * dmu_n_dT + (2/V_TDI) * dV_TDI_dT

# Output the calculated value
print(f"Temperature Coefficient (TC): {TC} 1/K")


P96

# Given parameters
mu_n_Cox = 75e-6  # Mobility times oxide capacitance, in A/V^2
V_GS1_VT = 0.2  # V_GS1 - V_T, in V
I_D = 150e-6  # Desired drain current, in A

# Calculate W/L ratio
W_by_L = (2 * I_D) / (mu_n_Cox * V_GS1_VT**2)

# Example calculation for W, given L
L = 1e-6  # Length in meters (example: L = 1 µm)
W = W_by_L * L

print(f"Required W/L ratio: {W_by_L:.2f}")
print(f"Width W for L = {L*1e6:.0f} µm: {W*1e6:.2f} µm")

P99

P101

P102

# Given parameters
g_m1 = 1e-3   # Transconductance of M1, in S (Siemens)
g_m2 = 1e-3   # Transconductance of M2, in S (Siemens)
g_m3 = 1e-3   # Transconductance of M3, in S (Siemens)
g_d1 = 1e-6   # Drain conductance of M1, in S (Siemens)
g_d2 = 1e-6   # Drain conductance of M2, in S (Siemens)
g_d3 = 1e-6   # Drain conductance of M3, in S (Siemens)
g_d4 = 1e-6   # Drain conductance of M4, in S (Siemens)

# Calculate the voltage gain
numerator = g_m1
denominator = (g_d4 * g_d3 / g_m3) + (g_d1 * g_d2 / g_m2)
voltage_gain = -numerator / denominator

print(f"Voltage Gain (v_out/v_in): {voltage_gain:.2e}")

P101
-gm1/(gd1+gd2)

P103

# 定数とパラメータの設定
g_m1 = 0.01  # トランスコンダクタンス g_m1 (例: 0.01 S)
g_m2 = 0.015  # トランスコンダクタンス g_m2 (例: 0.015 S)
g_m3 = 0.02   # トランスコンダクタンス g_m3 (例: 0.02 S)
r_o1 = 10000  # 出力抵抗 r_o1 (例: 10 kΩ)
r_o2 = 5000   # 出力抵抗 r_o2 (例: 5 kΩ)
r_o3 = 10000  # 出力抵抗 r_o3 (例: 10 kΩ)
r_o4 = 5000   # 出力抵抗 r_o4 (例: 5 kΩ)
g_m = 0.01    # トランスコンダクタンス g_m (例: 0.01 S)
r_o = 5000    # 出力抵抗 r_o (例: 5 kΩ)

# (6-9)式: r_down と r_up の計算
def calculate_rdown(g_m2, r_o2, r_o1):
    return g_m2 * r_o2 * r_o1

def calculate_rup(g_m3, r_o3, r_o4):
    return g_m3 * r_o3 * r_o4

# (6-9)式: 出力抵抗 r_out の計算
def calculate_rout(r_down, r_up):
    return (r_up * r_down) / (r_up + r_down)

# (6-10)式: 電圧利得の計算
def calculate_voltage_gain(g_m1, r_down, r_up):
    return g_m1 * (1 / r_down + 1 / r_up)

# (6-10)式の特別ケース: 利得の近似計算
def calculate_approx_gain(g_m, r_o):
    return 0.5 * (g_m * r_o) ** 2

# 各式に基づく計算
r_down = calculate_rdown(g_m2, r_o2, r_o1)
r_up = calculate_rup(g_m3, r_o3, r_o4)
r_out = calculate_rout(r_down, r_up)
voltage_gain = calculate_voltage_gain(g_m1, r_down, r_up)
approx_gain = calculate_approx_gain(g_m, r_o)

# 結果の表示
print(f"抵抗成分 r_down (6-9式) = {r_down:.2f} Ω")
print(f"抵抗成分 r_up (6-9式) = {r_up:.2f} Ω")
print(f"出力抵抗 r_out (6-9式) = {r_out:.2f} Ω")
print(f"電圧利得 (6-10式) = {voltage_gain:.6f}")
print(f"電圧利得の近似値 (6-10式の近似) = {approx_gain:.6f}")

P107

# 定数とパラメータの設定
g_m1 = 0.01  # トランスコンダクタンス g_m1 (例: 0.01 S)
g_m2 = 0.015 # トランスコンダクタンス g_m2 (例: 0.015 S)
g_m3 = 0.02  # トランスコンダクタンス g_m3 (例: 0.02 S)
g_m4 = 0.025 # トランスコンダクタンス g_m4 (例: 0.025 S)
g_d1 = 0.001 # 出力抵抗の逆数 g_d1 (例: 0.001 S)
g_d2 = 0.002 # 出力抵抗の逆数 g_d2 (例: 0.002 S)
g_d4 = 0.003 # 出力抵抗の逆数 g_d4 (例: 0.003 S)
g_a1 = 0.005 # ゲイン g_a1 (例: 0.005 S)
g_a2 = 0.005 # ゲイン g_a2 (例: 0.005 S)
g_a3 = 0.005 # ゲイン g_a3 (例: 0.005 S)

# (6-11) 式: v1, v2, v3, vx の関係
def equation_611(g_m1, g_a1, g_m3, g_a3, v1, v2, v3, vx):
    return g_m1 * v1 + g_a1 * v2 + g_m3 * v3 + g_a3 * vx

# (6-12) 式: v2, v_out, vx の関係
def equation_612(g_m2, g_a2, g_m4, g_d4, v2, v_out, vx):
    return g_m2 * v2 + g_a2 * v_out + g_m4 * vx + g_d4 * v_out

# (6-13) 式: v_out と v_x の関係
def equation_613(g_m1, g_m3, g_a3, g_d1, v1, v_x):
    return v_x - v_out - (g_m1 / (g_m3 + g_a3 + g_d1)) * v1

# (6-14) 式: 電圧利得の計算
def calculate_voltage_gain(g_m1, g_d2, g_d4):
    return g_m1 / (g_d2 + g_d4)

# 計算例の設定
v1 = 1.0   # 入力電圧 v1 (例: 1V)
v2 = 0.5   # 入力電圧 v2 (例: 0.5V)
v3 = 0.8   # 入力電圧 v3 (例: 0.8V)
vx = 0.6   # ノード電圧 vx (例: 0.6V)
v_out = 1.2 # 出力電圧 v_out (例: 1.2V)

# (6-11) 式の計算
result_611 = equation_611(g_m1, g_a1, g_m3, g_a3, v1, v2, v3, vx)
print(f"(6-11 式) 結果 = {result_611:.6f}")

# (6-12) 式の計算
result_612 = equation_612(g_m2, g_a2, g_m4, g_d4, v2, v_out, vx)
print(f"(6-12 式) 結果 = {result_612:.6f}")

# (6-13) 式の計算
result_613 = equation_613(g_m1, g_m3, g_a3, g_d1, v1, vx)
print(f"(6-13 式) 結果 = {result_613:.6f}")

# (6-14) 式の電圧利得の計算
voltage_gain_614 = calculate_voltage_gain(g_m1, g_d2, g_d4)
print(f"電圧利得 (6-14 式) = {voltage_gain_614:.6f}")

P108


import math

# Given intrinsic gain
gm_ro = 50  # gm * r0 value

# Cascode Common-Source Amplifier Gain
def cascode_gain(gm_ro):
    return -0.5 * (gm_ro) ** 2

# Regulated Cascode Common-Source Amplifier Gain
def regulated_cascode_gain(gm_ro):
    return ((gm_ro) ** 3) / 4

# Convert gain to dB
def gain_to_dB(gain):
    return 20 * math.log10(abs(gain))

# Calculate gains
cascode_amplifier_gain = cascode_gain(gm_ro)
regulated_cascode_amplifier_gain = regulated_cascode_gain(gm_ro)

# Convert gains to dB
cascode_amplifier_gain_dB = gain_to_dB(cascode_amplifier_gain)
regulated_cascode_amplifier_gain_dB = gain_to_dB(regulated_cascode_amplifier_gain)

# Print the results
print(f"Cascode Common-Source Amplifier Gain: {cascode_amplifier_gain}")
print(f"Cascode Common-Source Amplifier Gain in dB: {cascode_amplifier_gain_dB:.2f} dB")
print(f"Regulated Cascode Common-Source Amplifier Gain: {regulated_cascode_amplifier_gain}")
print(f"Regulated Cascode Common-Source Amplifier Gain in dB: {regulated_cascode_amplifier_gain_dB:.2f} dB")

P110


import numpy as np
import matplotlib.pyplot as plt
from scipy import signal

# Constants
gm1 = 1e-3  # Example value for g_m1 in S (adjust as needed)
gm6 = 1e-3  # Example value for g_m6 in S (adjust as needed)
gd2 = 1e-6  # Example value for g_d2 in S (adjust as needed)
gd4 = 1e-6  # Example value for g_d4 in S (adjust as needed)
gd6 = 1e-6  # Example value for g_d6 in S (adjust as needed)
gd7 = 1e-6  # Example value for g_d7 in S (adjust as needed)
C1 = 1e-12  # Example value for C1 in F (adjust as needed)
C2 = 1e-12  # Example value for C2 in F (adjust as needed)

# Resistances
R1 = 1 / (gd2 + gd4)
R2 = 1 / (gd6 + gd7)

# Poles
wp1 = -1 / (R1 * C1)
wp2 = -1 / (R2 * C2)

# Transfer function coefficients
numerator = [gm1 * gm6 * R1 * R2]
denominator = [1, (1/wp1 + 1/wp2), 1/(wp1*wp2)]

# Create transfer function
system = signal.TransferFunction(numerator, denominator)

# Frequency range for Bode plot
w, mag, phase = signal.bode(system)

# Plot Bode magnitude plot
plt.figure()
plt.semilogx(w, mag)
plt.title('Bode Magnitude Plot')
plt.xlabel('Frequency [rad/s]')
plt.ylabel('Magnitude [dB]')
plt.grid(which='both', axis='both')

# Plot Bode phase plot
plt.figure()
plt.semilogx(w, phase)
plt.title('Bode Phase Plot')
plt.xlabel('Frequency [rad/s]')
plt.ylabel('Phase [degrees]')
plt.grid(which='both', axis='both')

plt.show()

import numpy as np

# 定数の設定(適宜変更してください)
gm1 = 1e-3  # 相互コンダクタンス gm1 (S)
gm6 = 2e-3  # 相互コンダクタンス gm6 (S)
gd2 = 1e-4  # ドレインコンダクタンス gd2 (S)
gd4 = 1e-4  # ドレインコンダクタンス gd4 (S)
gd6 = 1e-4  # ドレインコンダクタンス gd6 (S)
gd7 = 1e-4  # ドレインコンダクタンス gd7 (S)
Cc = 1e-12  # コンデンサ Cc (F)
C2 = 1e-12  # コンデンサ C2 (F)

# R1, R2 の計算
R1 = 1 / (gd2 + gd4)
R2 = 1 / (gd6 + gd7)

# ωp1, ωp2, ωz, ωu の計算
ωp1 = -1 / (gm6 * Cc * R1 * R2)
ωp2 = -gm6 / C2
ωz = gm6 / Cc
ωu = gm1 / Cc

# gm1 × gm6 × R1 × R2 の計算
product1 = gm1 * gm6 * R1 * R2

# gm1 × gm6 × R1 × R2 のデシベル
db_product1 = 20 * np.log10(product1)

# 出力
print(f"R1: {R1:.2e} Ω")
print(f"R2: {R2:.2e} Ω")
print(f"ωp1: {ωp1:.2e} rad/s")
print(f"ωp2: {ωp2:.2e} rad/s")
print(f"ωz: {ωz:.2e} rad/s")
print(f"ωu: {ωu:.2e} rad/s")
print(f"gm1 × gm6 × R1 × R2: {product1:.2e}")
print(f"デシベル (gm1 × gm6 × R1 × R2): {db_product1:.2f} dB")


P116


# 定数とパラメータの設定
g_m1 = 0.01   # トランスコンダクタンス g_m1 (例: 0.01 S)
g_m6 = 0.015  # トランスコンダクタンス g_m6 (例: 0.015 S)
g_d2 = 0.002  # コンダクタンス g_d2 (例: 0.002 S)
g_d4 = 0.002  # コンダクタンス g_d4 (例: 0.002 S)
g_d6 = 0.003  # コンダクタンス g_d6 (例: 0.003 S)
g_d7 = 0.003  # コンダクタンス g_d7 (例: 0.003 S)
R1 = 1000     # 抵抗 R1 (例: 1kΩ)
R2 = 2000     # 抵抗 R2 (例: 2kΩ)
C_C = 10e-12  # 補償容量 C_C (例: 10pF)
C2 = 20e-12   # 容量 C2 (例: 20pF)

# (7-12) 式: DC利得 A_DC の計算
def calculate_adc(g_m1, g_m6, R1, R2, g_d2, g_d4, g_d6, g_d7):
    return (g_m1 * g_m6 * R1 * R2) / ((g_d2 + g_d4) * (g_d6 + g_d7))

# (7-13) 式: ポール周波数 ω_p1 の計算
def calculate_wp1(g_m6, C_C, R1, R2):
    return -1 / (g_m6 * C_C * R1 * R2)

# (7-14) 式: ポール周波数 ω_p2 の計算
def calculate_wp2(g_m6, C2):
    return -g_m6 / C2

# (7-15) 式: ゼロ周波数 ω_z の計算
def calculate_wz(g_m6, C_C):
    return g_m6 / C_C

# (7-16) 式: ユニティ・ゲイン周波数 ω_u の計算
def calculate_wu(A_DC, wp1):
    return A_DC * abs(wp1)

# 各式に基づく計算
A_DC = calculate_adc(g_m1, g_m6, R1, R2, g_d2, g_d4, g_d6, g_d7)
omega_p1 = calculate_wp1(g_m6, C_C, R1, R2)
omega_p2 = calculate_wp2(g_m6, C2)
omega_z = calculate_wz(g_m6, C_C)
omega_u = calculate_wu(A_DC, omega_p1)

# 結果の表示
print(f"DC利得 A_DC (7-12 式) = {A_DC:.6f}")
print(f"ポール周波数 ω_p1 (7-13 式) = {omega_p1:.6e} rad/s")
print(f"ポール周波数 ω_p2 (7-14 式) = {omega_p2:.6e} rad/s")
print(f"ゼロ周波数 ω_z (7-15 式) = {omega_z:.6e} rad/s")
print(f"ユニティ・ゲイン周波数 ω_u (7-16 式) = {omega_u:.6e} rad/s")

P121

import numpy as np
import matplotlib.pyplot as plt
from scipy import signal

# Given constants
gm1 = 1e-3  # example value for gm1 in S
gm6 = 1e-3  # example value for gm6 in S
R1 = 1e3    # example value for R1 in ohms
R2 = 1e3    # example value for R2 in ohms
CC = 1e-12  # example value for CC in farads
C1 = 1e-12  # example value for C1 in farads
C2 = 1e-12  # example value for C2 in farads
RC = 1/(gm6) # example value for RC in ohms

# Pole and zero frequencies
wp1 = 1 / (gm6 * CC * R1 * R2)
wp2 = -gm6 / C2
wp3 = -1 / (RC * C1)
wz = gm6 / (CC * (1 - gm6 * RC))

# Transfer function numerator and denominator
num = [gm1 * gm6 * R1 * R2, -gm1 * gm6 * R1 * R2 * wz]
den = [1, -(wp1 + wp2 + wp3), wp1*wp2 + wp2*wp3 + wp3*wp1, -wp1*wp2*wp3]

# Create transfer function
system = signal.TransferFunction(num, den)

# Generate Bode plot
w, mag, phase = signal.bode(system)

# Plot Bode magnitude
plt.figure()
plt.semilogx(w, mag)
plt.title('Bode Plot - Magnitude')
plt.xlabel('Frequency [rad/s]')
plt.ylabel('Magnitude [dB]')
plt.grid(True)

# Plot Bode phase
plt.figure()
plt.semilogx(w, phase)
plt.title('Bode Plot - Phase')
plt.xlabel('Frequency [rad/s]')
plt.ylabel('Phase [degrees]')
plt.grid(True)

plt.show()

P122

import math

# 定数とパラメータの設定
g_m6 = 0.015  # トランスコンダクタンス g_m6 (例: 0.015 S)
C_C = 10e-12  # 補償容量 C_C (例: 10pF)
C_L = 20e-12  # 負荷容量 C_L (例: 20pF)
C_1 = 15e-12  # 容量 C_1 (例: 15pF)
omega_u = 1e6 # ユニティ・ゲイン周波数 ω_u (例: 1 MHz)
omega_p2 = 5e6 # ポール周波数 ω_p2 (例: 5 MHz)

# (7-20) 式: 位相余裕の計算
def calculate_phase_margin(omega_p2, omega_u):
    return math.degrees(math.atan(abs(omega_p2) / omega_u))

# (7-19) 式: 抵抗 R_C の計算
def calculate_rc(C_L, C_C, g_m6):
    return (1 + (C_L / C_C)) / g_m6

# (7-21) 式: ポール周波数 ω_p3 の計算
def calculate_wp3(R_C, C_1):
    return 1 / (R_C * C_1)

# 各式に基づく計算
phase_margin = calculate_phase_margin(omega_p2, omega_u)
R_C = calculate_rc(C_L, C_C, g_m6)
omega_p3 = calculate_wp3(R_C, C_1)

# 結果の表示
print(f"位相余裕 φ_M (7-20 式) = {phase_margin:.2f} 度")
print(f"抵抗 R_C (7-19 式) = {R_C:.6f} Ω")
print(f"ポール周波数 ω_p3 (7-21 式) = {omega_p3:.2e} rad/s")

P127

# 定数とパラメータの設定
I_BIAS = 100e-6  # バイアス電流 (例: 100 µA)
W_L_1 = 2        # M1トランジスタの幅と長さの比 (例: 2)
W_L_2 = 2        # M2トランジスタの幅と長さの比 (例: 2)
W_L_6 = 4        # M6トランジスタの幅と長さの比 (例: 4)
W_L_8 = 4        # M8トランジスタの幅と長さの比 (例: 4)
V_DD = 5         # 電源電圧 V_DD (例: 5V)
V_SS = 0         # 基準電圧 V_SS (例: 0V)
V_TN = 0.7       # NMOSの閾値電圧 V_TN (例: 0.7V)
V_TP = -0.7      # PMOSの閾値電圧 V_TP (例: -0.7V)
V_DSsat = 0.2    # 飽和状態のドレイン・ソース間電圧 V_DSsat (例: 0.2V)

# (7-22) 式: プル電流 I_pull の計算
def calculate_ipull(I_BIAS, W_L_2, W_L_6):
    return I_BIAS * (W_L_2 / W_L_6)

# (7-23) 式: プッシュ電流 I_push の計算
def calculate_ipush(I_BIAS, W_L_1, W_L_8):
    return I_BIAS * (W_L_1 / W_L_8)

# (7-24) 式: プル電流とプッシュ電流の関係
def calculate_iq(I_pull, I_push):
    return I_pull if I_pull == I_push else None  # プル電流とプッシュ電流が等しいときのみ静止電流

# (7-26) 式: 出力電圧の最大値 V_outmax の計算
def calculate_voutmax(V_DD, V_DSsat, V_TN):
    return V_DD - 2 * V_DSsat - V_TN

# (7-27) 式: 出力電圧の最小値 V_outmin の計算
def calculate_voutmin(V_SS, V_DSsat, V_TP):
    return V_SS + 2 * V_DSsat + V_TP

# 各式に基づく計算
I_pull = calculate_ipull(I_BIAS, W_L_2, W_L_6)
I_push = calculate_ipush(I_BIAS, W_L_1, W_L_8)
I_Q = calculate_iq(I_pull, I_push)
V_outmax = calculate_voutmax(V_DD, V_DSsat, V_TN)
V_outmin = calculate_voutmin(V_SS, V_DSsat, V_TP)

# 結果の表示
print(f"プル電流 I_pull (7-22 式) = {I_pull:.6f} A")
print(f"プッシュ電流 I_push (7-23 式) = {I_push:.6f} A")
print(f"静止電流 I_Q (7-24 式) = {I_Q:.6f} A" if I_Q is not None else "プル電流とプッシュ電流が等しくありません")
print(f"出力電圧の最大値 V_outmax (7-26 式) = {V_outmax:.2f} V")
print(f"出力電圧の最小値 V_outmin (7-27 式) = {V_outmin:.2f} V")

P132


# 定数とパラメータの設定
V_SS = 0          # 基準電圧 V_SS (例: 0V)
V_DD = 5          # 電源電圧 V_DD (例: 5V)
V_TN = 0.7        # NMOSの閾値電圧 V_TN (例: 0.7V)
V_TP = -0.7       # PMOSの閾値電圧 V_TP (例: -0.7V)
V_DSsat3 = 0.2    # M3トランジスタの飽和状態のドレイン・ソース間電圧 V_DSsat3 (例: 0.2V)
V_DSsat5 = 0.2    # M5トランジスタの飽和状態のドレイン・ソース間電圧 V_DSsat5 (例: 0.2V)
V_DSsat1 = 0.2    # M1トランジスタの飽和状態のドレイン・ソース間電圧 V_DSsat1 (例: 0.2V)

# (7-36) 式: 同相入力電圧の最小値 V_CMmin の計算
def calculate_vcmmin(V_SS, V_DSsat3, V_TN, V_TP):
    return V_SS + V_DSsat3 + V_TN - V_TP

# (7-37) 式: 同相入力電圧の最大値 V_CMmax の計算
def calculate_vcmmax(V_DD, V_DSsat5, V_DSsat1, V_TP):
    return V_DD - V_DSsat5 - V_DSsat1 - V_TP

# 各式に基づく計算
V_CMmin = calculate_vcmmin(V_SS, V_DSsat3, V_TN, V_TP)
V_CMmax = calculate_vcmmax(V_DD, V_DSsat5, V_DSsat1, V_TP)

# 結果の表示
print(f"同相入力電圧の最小値 V_CMmin (7-36 式) = {V_CMmin:.2f} V")
print(f"同相入力電圧の最大値 V_CMmax (7-37 式) = {V_CMmax:.2f} V")

P134

# 定数とパラメータの設定
V_SS = 0          # 基準電圧 V_SS (例: 0V)
V_DD = 5          # 電源電圧 V_DD (例: 5V)
V_TN = 0.7        # NMOSの閾値電圧 V_TN (例: 0.7V)
V_TP = -0.7       # PMOSの閾値電圧 V_TP (例: -0.7V)
V_DSsat5 = 0.2    # M5トランジスタの飽和状態のドレイン・ソース間電圧 V_DSsat5 (例: 0.2V)
V_DSsat1 = 0.2    # M1トランジスタの飽和状態のドレイン・ソース間電圧 V_DSsat1 (例: 0.2V)
V_SG3 = 1.0       # M3トランジスタのソース・ゲート間電圧 V_SG3 (例: 1V)

# (7-34) 式: 同相入力電圧の最小値 V_CMmin の計算
def calculate_vcmmin(V_SS, V_DSsat5, V_DSsat1, V_TN):
    return V_SS + V_DSsat5 + V_DSsat1 + V_TN

# (7-39) 式: 同相入力電圧の最大値 V_CMmax の計算
def calculate_vcmmax(V_DD, V_SG3, V_DSsat1, V_TN):
    return V_DD - V_SG3 - V_DSsat1 + V_TN

# 各式に基づく計算
V_CMmin = calculate_vcmmin(V_SS, V_DSsat5, V_DSsat1, V_TN)
V_CMmax = calculate_vcmmax(V_DD, V_SG3, V_DSsat1, V_TN)

# 結果の表示
print(f"同相入力電圧の最小値 V_CMmin (7-34 式) = {V_CMmin:.2f} V")
print(f"同相入力電圧の最大値 V_CMmax (7-39 式) = {V_CMmax:.2f} V")


P163


import numpy as np
import matplotlib.pyplot as plt
from scipy import signal

# Parameters (example values)
G1 = 1.0  # Assuming unit conductance for G1
G2 = 10.0  # Assuming unit conductance for G2
gm1 = 1e-3  # Transconductance of transistor 1
gm6 = 1e-3  # Transconductance of transistor 6
CC = 1e-12  # Compensation capacitance
C1 = 1e-12  # Capacitance C1
C2 = 1e-12  # Capacitance C2

# First transfer function components (numerator and denominator)
num1 = [-gm1 * gm6, gm1 * gm6 * CC]
den1 = [G1 * G2, gm6 * CC + G1 * (C1 + CC) + G2 * (C2 + CC), (C1 + CC) * (C2 + CC) - CC**2]

# Second simplified transfer function components (numerator and denominator)
num2 = [gm1 * gm6, -gm1 * CC]
den2 = [G1 * G2, gm6 * CC, C2 * CC]

# Create transfer functions
tf1 = signal.TransferFunction(num1, den1)
tf2 = signal.TransferFunction(num2, den2)

# Frequency range for Bode plot
frequencies = np.logspace(1, 9, 500)  # From 10 Hz to 1 GHz

# Bode plots
w1, mag1, phase1 = signal.bode(tf1, frequencies)
w2, mag2, phase2 = signal.bode(tf2, frequencies)

# Plotting the magnitude and phase response
plt.figure(figsize=(12, 8))

# Magnitude Plot
plt.subplot(2, 1, 1)
plt.semilogx(w1, mag1, label='Original Transfer Function')
plt.semilogx(w2, mag2, label='Simplified Transfer Function')
plt.title('Bode Plot')
plt.ylabel('Magnitude (dB)')
plt.grid(True)
plt.legend()

# Phase Plot
plt.subplot(2, 1, 2)
plt.semilogx(w1, phase1, label='Original Transfer Function')
plt.semilogx(w2, phase2, label='Simplified Transfer Function')
plt.ylabel('Phase (degrees)')
plt.xlabel('Frequency (Hz)')
plt.grid(True)
plt.legend()

plt.tight_layout()
plt.show()




import numpy as np

# 固有利得の計算
gm_r0 = 50

# カスコード型ソース増幅回路の固有利得
gain_cascode = -0.5 * (gm_r0 ** 2)

# レギュレーテッドカスコードソース増幅回路の固有利得
gain_regulated_cascode = (gm_r0 ** 3) / 4

# デシベル単位での固有利得の計算
gain_cascode_db = 10 * np.log10(np.abs(gain_cascode))
gain_regulated_cascode_db = 10 * np.log10(np.abs(gain_regulated_cascode))

# 結果の表示
print(f'カスコード型ソース増幅回路の固有利得: {gain_cascode:.2f}')
print(f'カスコード型ソース増幅回路の固有利得 (dB): {gain_cascode_db:.2f} dB')

print(f'レギュレーテッドカスコードソース増幅回路の固有利得: {gain_regulated_cascode:.2f}')
print(f'レギュレーテッドカスコードソース増幅回路の固有利得 (dB): {gain_regulated_cascode_db:.2f} dB')


# Define the parameters
gm1 = 1e-3   # Transconductance of M1 in Siemens (example value)
gm2 = 1e-3   # Transconductance of M2 in Siemens (example value)
gm3 = 1e-3   # Transconductance of M3 in Siemens (example value)
gd1 = 1e-6   # Drain conductance of M1 in Siemens (example value)
gd2 = 1e-6   # Drain conductance of M2 in Siemens (example value)
gd3 = 1e-6   # Drain conductance of M3 in Siemens (example value)
gd4 = 1e-6   # Drain conductance of M4 in Siemens (example value)
ro1 = 100e3  # Output resistance of M1 in Ohms (example value)
ro2 = 100e3  # Output resistance of M2 in Ohms (example value)
ro3 = 100e3  # Output resistance of M3 in Ohms (example value)
ro4 = 100e3  # Output resistance of M4 in Ohms (example value)

# Calculate the gain
def cascode_gain(gm1, gm2, gm3, gd1, gd2, gd3, gd4, ro1, ro2, ro3, ro4):
    term1 = (gd4 * gd3) / gm3
    term2 = (gd1 * gd2) / gm2
    denominator = term1 + term2
    
    gain = -gm1 / denominator
    
    # Simplified expression using output resistances
    simplified_gain = -gm1 / (1 / (gm3 * ro3 * ro4) + 1 / (gm2 * ro2 * ro1))
    
    return gain, simplified_gain

# Calculate the gains
gain, simplified_gain = cascode_gain(gm1, gm2, gm3, gd1, gd2, gd3, gd4, ro1, ro2, ro3, ro4)

# Print the results
print(f"Cascode Amplifier Gain: {gain}")
print(f"Simplified Cascode Amplifier Gain: {simplified_gain}")






import math

# Given intrinsic gain
gm_ro = 50  # gm * r0 value

# Cascode Common-Source Amplifier Gain
def cascode_gain(gm_ro):
    return -0.5 * (gm_ro) ** 2

# Regulated Cascode Common-Source Amplifier Gain
def regulated_cascode_gain(gm_ro):
    return ((gm_ro) ** 3) / 4

# Convert gain to dB
def gain_to_dB(gain):
    return 20 * math.log10(abs(gain))

# Calculate gains
cascode_amplifier_gain = cascode_gain(gm_ro)
regulated_cascode_amplifier_gain = regulated_cascode_gain(gm_ro)

# Convert gains to dB
cascode_amplifier_gain_dB = gain_to_dB(cascode_amplifier_gain)
regulated_cascode_amplifier_gain_dB = gain_to_dB(regulated_cascode_amplifier_gain)

# Print the results
print(f"Cascode Common-Source Amplifier Gain: {cascode_amplifier_gain}")
print(f"Cascode Common-Source Amplifier Gain in dB: {cascode_amplifier_gain_dB:.2f} dB")
print(f"Regulated Cascode Common-Source Amplifier Gain: {regulated_cascode_amplifier_gain}")
print(f"Regulated Cascode Common-Source Amplifier Gain in dB: {regulated_cascode_amplifier_gain_dB:.2f} dB")



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?