アナログ回路におけるMOSトランジスタのキャラクタライズ


```py
import matplotlib.pyplot as plt
import numpy as np

# Define variables in milliSiemens
VGS1 = 0.2
Veff = 0.2
VGS2 = VGS1 + 0.23
VGS3 = VGS2 + Veff

gm1 = 0.04  # in milliSiemens
gm2 = gm1 + 0.6  # in milliSiemens

# Generate VGS values for the parabolic curve
VGS_parabola = np.linspace(VGS1, VGS2, 100)
# Create a parabolic curve from (VGS1, 0) to (VGS2, gm1)
a = (gm1 - 0) / ((VGS2 - VGS1) ** 2)  # Coefficient for parabolic equation y = a*(x - VGS1)^2
gm_parabola = a * (VGS_parabola - VGS1) ** 2

# Generate VGS and gm values for the linear part
VGS_line = np.array([VGS2, VGS3])
gm_line = np.array([gm1, gm2])

# Calculate the slope of the linear line (gm vs VGS)
linear_slope = (gm2 - gm1) / (VGS3 - VGS2)

# Calculate the slope at each point of the parabolic curve
parabola_slopes = 2 * a * (VGS_parabola - VGS1)  # Derivative of parabolic equation

# Convert slopes to milliSiemens/V (already in milliSiemens/V as gm is in mS)
parabola_slopes_ms = parabola_slopes
linear_slope_ms = linear_slope

# Plotting the gm vs VGS curve
plt.figure(figsize=(12, 6))

# Plot parabolic curve
plt.plot(VGS_parabola, gm_parabola, label='Parabolic Curve', color='blue')
# Plot linear line
plt.plot(VGS_line, gm_line, label='Linear Line', color='orange')

# Plot the slope at each point of the parabolic curve
for i in range(0, len(VGS_parabola), 10):  # Plot slope every 10 points for clarity
    plt.arrow(
        VGS_parabola[i], gm_parabola[i],
        0.01, parabola_slopes_ms[i] * 0.01,  # Arrow direction and size
        head_width=0.01, head_length=0.005, fc='lightblue', ec='lightblue'
    )

# Plot the slope for the linear line
plt.arrow(
    (VGS2 + VGS3) / 2, (gm1 + gm2) / 2,
    0.02, linear_slope_ms * 0.02,
    head_width=0.01, head_length=0.005, fc='orange', ec='orange'
)

# Annotations for the linear slope
plt.text((VGS2 + VGS3) / 2, (gm1 + gm2) / 2,
         f"Slope (linear) = {linear_slope_ms:.2f} mS/V", fontsize=12, color='orange')

# Labeling points
plt.scatter([VGS1, VGS2, VGS3], [0, gm1, gm2], color='red')
plt.text(VGS1, 0, f"({VGS1:.2f}, 0)", fontsize=12, verticalalignment='bottom')
plt.text(VGS2, gm1, f"({VGS2:.2f}, {gm1:.2f} mS)", fontsize=12, verticalalignment='bottom')
plt.text(VGS3, gm2, f"({VGS3:.2f}, {gm2:.2f} mS)", fontsize=12, verticalalignment='bottom')

# Labeling the plot
plt.xlabel('VGS (V)')
plt.ylabel('gm (mS)')
plt.title('gm vs VGS Plot with Slopes (in mS)')
plt.legend()
plt.grid(True)

# Show the plot
plt.show()


```

```
import numpy as np
import matplotlib.pyplot as plt

# Given points (Vgs, gm)
Vgs = np.array([0.45, 0.65])  # Vgs values (Gate-Source Voltage)
gm = np.array([0.01, 0.7])    # gm values (Transconductance)

# Calculate the slope (m) and intercept (b) for the line (linear regression)
m = (gm[1] - gm[0]) / (Vgs[1] - Vgs[0])  # Slope of the line (gm vs Vgs)
b = gm[0] - m * Vgs[0]  # Intercept of the line

# Generate x values (Vgs) for the line to create a smooth line
Vgs_line = np.linspace(min(Vgs), max(Vgs), 100)

# Calculate the corresponding y values (gm) using the linear equation (y = mx + b)
gm_line = m * Vgs_line + b

# Plot the data points and the fitted line
plt.plot(Vgs, gm, 'ro', label="Given Data Points")  # Red dots for data points
plt.plot(Vgs_line, gm_line, 'b-', label="Fitted Line")  # Blue line for fitted line
plt.xlabel("Vgs (V)")  # x-axis label
plt.ylabel("gm (S)")  # y-axis label
plt.title("gm vs Vgs with Fitted Line")  # Title of the plot
plt.grid(True)  # Display grid
plt.legend()  # Show legend
plt.show()  # Display the plot

# Print the slope and intercept
print(f"Slope (m): {m:.4f}")
print(f"Intercept (b): {b:.4f}")


# Second part: Calculating μCox and W
# Calculate the derivative of gm with respect to Vgs (finite difference method)
gm_derivative = (gm[1] - gm[0]) / (Vgs[1] - Vgs[0])

# Parameters for the calculation of μCox and W
L = 0.2e-6  # Length in meters (0.2 μm)
VDS = 1.0  # Drain-source voltage (example value)
VA = 50.0  # Early voltage (example value)
Veff = Vgs[1] - 0.7  # Effective voltage (assuming Vth = 0.7V)
IDS = 1e-6  # Drain current in Amperes (example value)

# μCox calculation
W_to_L_ratio = 1  # Assuming W/L = 1 for simplicity
mu_Cox = gm_derivative * W_to_L_ratio * (1 + VDS / VA)

# W calculation (Width of the MOSFET channel)
W = 2 * IDS * L / (mu_Cox * (Veff**2) * (1 + VDS / VA))

# Print calculated results
print(f"gm derivative (d(gm)/dVgs): {gm_derivative:.4e} S/V")
print(f"μCox: {mu_Cox:.4e} A/V^2")
print(f"Width W: {W:.4e} m")

# Plot gm vs Vgs for visualization
plt.plot(Vgs, gm, 'ro', label="Given Data Points")  # Red dots for data points
plt.xlabel("Vgs (V)")  # x-axis label
plt.ylabel("gm (S)")  # y-axis label
plt.title("gm vs Vgs")  # Title of the plot
plt.grid(True)  # Display grid
plt.legend()  # Show legend
plt.show()  # Display the plot


```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/9bb42fae-7099-b9eb-c55c-4fa82846f221.png
)




```py
# Constants
mu_cox_1 = 2.91e-3 / (2 / 0.2 * (1 + 1.8 / 4.2))
mu_cox_2 = 2.91e-3 / (4 / 0.4 * (1 + 1.8 / 13.0))
id_1 = 5.1e-6  # 5.1 μA
id_2 = 5.59e-6  # 5.59 μA
veff = 0.04
vds = 1.0
va_1 = 4.0
va_2 = 11.0
l_1 = 0.2e-6  # 0.2 μm
l_2 = 0.4e-6  # 0.4 μm

# Formula A11a
wl_1 = (2 * id_1) / (mu_cox_1 * veff**2 * (1 + vds / va_1))
print(f"W/L for A11a: {wl_1}")

# Formula A11b
wl_2 = (2 * id_2) / (mu_cox_2 * veff**2 * (1 + vds / va_2))
print(f"W/L for A11b: {wl_2}")

# Formula A12: Calculate W
id_example = 100e-6  # 100 μA
w = (id_example / 5.59) * l_2
print(f"W for A12: {w} meters")





```

https://gunma-u.repo.nii.ac.jp/record/2858/files/T171D006.pdf



```py
import numpy as np
import matplotlib.pyplot as plt

# Vgsの範囲を定義
Vgs = np.linspace(0, 1.2, 1000)

# 各種パラメータの設定
V_T = 0.45  # 閾値電圧（仮定）
V_eff = 0.15  # 有効電圧（仮定）

# I_dsの定義 (Vgs > V_T の範囲でのカレント)
I_ds = np.where(Vgs > V_T, 100 * (Vgs - V_T)**2, 0)

# g_m = d(I_ds)/d(Vgs) を計算
g_m = np.gradient(I_ds, Vgs)

# g_mの傾きを求める
g_m_slope = np.gradient(g_m, Vgs)

# プロットの作成
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(8, 10))

# I_ds vs Vgs のプロット
ax1.plot(Vgs, I_ds, color='blue')
ax1.set_title(r'$I_{ds}$ vs $V_{gs}$')
ax1.set_xlabel(r'$V_{gs}$ (V)')
ax1.set_ylabel(r'$I_{ds}$ (A)')
ax1.axvline(V_T, color='red', linestyle='--', label=r'$V_T$')
ax1.axvline(V_T + V_eff, color='red', linestyle='--', label=r'$V_T + V_{eff}$')
ax1.legend()
ax1.grid(True)

# g_m vs Vgs のプロット
ax2.plot(Vgs, g_m, color='blue', label=r'$g_m$')
ax2.plot(Vgs, g_m_slope, color='orange', label=r'$g_m$ slope')
ax2.set_title(r'$g_m$ and its slope vs $V_{gs}$')
ax2.set_xlabel(r'$V_{gs}$ (V)')
ax2.set_ylabel(r'$g_m$ (S)')
ax2.axvline(V_T, color='red', linestyle='--', label=r'$V_T$')
ax2.axvline(V_T + V_eff, color='red', linestyle='--', label=r'$V_T + V_{eff}$')
ax2.legend()
ax2.grid(True)

# プロット表示
plt.tight_layout()
plt.show()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/10905fd3-ae03-12bb-72cc-2caddef5b957.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/12a9db11-c21d-ac3c-2f5c-589755469e22.png)


https://www.ssc.pe.titech.ac.jp/private/publications/2007/Matsuzawa_Presentation/VDEC_200701.pdf


### 条件まとめ

静特性のシミュレーションをする
1. ドレイン電圧 ( $V_{ds}$ )、幅 ( $W = n \times w$ )、長さ ( $L$ ) を設定
	- $n$ : フィンガーの数
	- $w$ : 各フィンガーの幅
2. ドレイン電流 ( $I_{ds}$ ) と有効ゲート電圧 ( $V_{eff} = V_{gs} - V_{th}$ ) を求める
3. トランスコンダクタンスの変化率 ( $\Delta g_m / \Delta V_{gs}$ ) をシミュレーションで求める
4. 移動度・酸化膜容量 ( $\mu C_{ox}$ ) を用いて $W$ を算出
5. アーリー電圧 ( $V_A$ ) を求める
6. MOSFET のゲインを以下の式で求める
   $\text{ゲイン} = \frac{2 \times V_A}{V_{eff}}$

### パラメータの定義

1.	W (Width): トランジスタのチャネル幅。
2.	L (Length): トランジスタのチャネル長。
3.	マルチ (Multiplier): トランジスタの並列接続の数（通常、同じWとLを持つトランジスタを並列に接続することで、実効Wを拡大）。
4.	フィンガー (Fingers): トランジスタのフィンガー数（1つのトランジスタを複数のフィンガーに分割して配置することで寄生容量の減少やレイアウトの調整を行う）。
5.	Gds (Output Conductance): ドレイン-ソース間の出力コンダクタンス。低Gdsは高い出力インピーダンスを意味し、電流源としての性能向上につながる。
6.	Gm (Transconductance): トランジスタのゲート電圧変化に対するドレイン電流の変化率。大きいGmはトランジスタのゲインの高さを示す。
7.	Veff (Vgs - Vth): 実効ゲート-ソース電圧。しきい値電圧からのVgsの超過量であり、MOSトランジスタの動作点を決定する。
8.	Ids (Drain-Source Current): ドレイン-ソース間の電流。

### 設計条件

以下の条件を基に、低リーク電流を維持しながらMOSトランジスタのパラメータを調整します。

1. スケーリング条件 (W/L)

	- W/L比はトランジスタの電流駆動能力に強く影響するため、目的の動作点に応じて適切なスケーリングを行います。
	- Wを広げると電流駆動能力（Ids）が増加し、Lを長くするとリーク電流が低減する傾向があります。
	- 低リークを目指す場合、通常はLを長めに設定（Short Channel Effects の抑制）。

2. W, Lの偶数制約

	- MOSトランジスタのレイアウト効率を考慮し、通常WとLは偶数値に設定します。これはフィンガー数やレイアウトの対称性を保ちやすくするためです。

3. マルチとフィンガー数の設定

	- 同じWとLのトランジスタを複数並列接続して使用する際は、レイアウトの配線負荷や寄生容量を考慮し、マルチやフィンガー数を設定します。
	- フィンガー数は通常2のべき乗 (2, 4, 8, …) の値を用いることでレイアウトの最適化を図ります。

4. カレントミラーの場合のべき乗条件

	- カレントミラーを構成する場合、W/L比は参照トランジスタとミラートランジスタ間でべき乗比（例: 1:2, 1:4）を取ることが多いです。これにより、電流のミラー比が容易に設定できます。

5. gdsとgmの設計条件

	- 低リークを目的とする場合、低gds（出力コンダクタンス）を維持することが重要です。これには、Lを長く設定することで、リーク電流を抑えつつgdsを低減させる設計が効果的です。
	- gm（トランスコンダクタンス）を高く保つには、Vgsをしきい値電圧（Vth）よりも十分高い値に設定し、電流駆動能力を向上させます。

6. Veffの調整

	- 実効ゲート-ソース電圧 (Veff = Vgs - Vth) はトランジスタの動作点を決定する重要なパラメータです。
	- 低リークを目指す場合、Veffを小さく設定（Vgsをしきい値電圧に近い値）し、必要な電流特性を満たしつつリーク電流を抑制します。

7. Idsの制御

	•	ドレイン電流 (Ids) は、トランジスタの設計時に必要な動作点（例えばカレントミラーのターゲット電流）を基に設定されます。
	•	Idsは主にW, L, Vgs, Vthに依存するため、必要な電流を満たすようにこれらのパラメータを調整します。

### 設計まとめ

1. 低リーク電流を目指す場合
	- Lを長めに設定し、Wを調整して必要なIdsを得る。
	- マルチ、フィンガー数を2の倍数とし、レイアウトの効率化を図る。
	- Veffを小さく設定し、必要最小限の電流を維持。
2. カレントミラーの場合
	- 参照トランジスタとミラー側トランジスタのW/L比をべき乗に設定し、電流ミラー比を安定化させる。
	- gdsを低く保ち、gmを高く設定し、安定した電流源動作を実現。