Carrier Statistics: Fermi-Dirac, Density of States & Fermi Level

Counting carriers properly. Learn the density of states g(E) near band edges, the Fermi-Dirac distribution and its meaning, the Maxwell-Boltzmann approximation and when it is valid (E − E_F > 3kT), effective densities of states N_c and N_v from effective masses, the equations n = N_c·e^(−(E_c−E_F)/kT) and p = N_v·e^(−(E_F−E_v)/kT), intrinsic level E_i, Fermi-level position vs doping and temperature, and degenerate semiconductors — with Python evaluating the Fermi function, computing N_c, N_v, n_i and checking Boltzmann validity.

The number of carriers in a band is the product of how many states exist at each energy (density of states) and the probability that each is occupied (Fermi-Dirac function), summed over the band.

The result — simple exponential expressions linking carrier densities to the Fermi level — is used in every device derivation that follows: junction voltages, diode currents, MOSFET thresholds.

An analogy

Imagine a stadium (band) where the number of seats per row grows with height (density of states), and fans fill seats from the bottom with a 'fuzzy' cut-off level (Fermi level): well below it every seat is taken, well above it seats are almost empty, and at the level itself half are filled.

The Fermi-Dirac distribution

Electrons are fermions: each state holds at most one electron (per spin). At T = 0, all states below E_F are full and above are empty; at finite T the step smears over a few kT. E_F is the energy where occupation probability is ½ — it need not correspond to an allowed state (in semiconductors it lies in the gap).

Where is the Fermi level?

Rules of thumb:

Density of states and effective mass

The parabolic-band approximation gives g(E) ∝ √(E − E_c). Silicon's six conduction-band valleys and anisotropic masses combine into a density-of-states mass m_n* ≈ 1.08m₀ (different from the conductivity mass 0.26m₀ used for mobility). Holes combine heavy- and light-hole bands. Low-dimensional structures change g(E) to steps (2-D wells) or spikes (1-D wires).

Quasi-Fermi levels

Out of equilibrium (under bias or light), electrons and holes each settle into their own distributions described by quasi-Fermi levels E_Fn and E_Fp, with np = n_i² e^((E_Fn−E_Fp)/kT). Their separation equals the applied junction voltage in a diode and the open-circuit voltage in a solar cell; their gradient drives current.

Formulas

Worked example: Occupation

Given: E − E_F = 3kT

Find: f(E).

Answer: 0.047

Worked example: Fermi level

Given: N_A 10¹⁶, n_i 10¹⁰, 300 K

Find: E_i − E_F.

Answer: 0.357 eV

Worked example: Electron density from E_F

Given: E_c − E_F = 0.2 eV, N_c 2.8e19

Find: n.

Answer: ≈ 1.2 × 10¹⁶ cm⁻³

Carrier density = DOS × occupation

  E ↑        g_c(E) ∝ √(E−E_c)     × f(E)          = n(E) (electrons, peak ~kT/2 above E_c)
  E_c ─────  ╱                    tail of f(E)
  E_F ─ ─ ─  (in the gap)         f = 0.5 here
  E_v ─────  ╲                    1 − f(E)        = p(E) (holes)
             g_v(E) ∝ √(E_v−E)

Only the exponential tail of the Fermi function reaches the bands, so integrating g(E)f(E) gives a simple exponential law with an 'effective' number of states N_c located at the band edge. The same holds for holes using 1 − f(E).

Fermi function, N_c, N_v and Boltzmann validity

import math
# Fermi-Dirac statistics, effective density of states and the Fermi level
k, T = 8.617e-5, 300.0
kT = k * T
for dE in (-0.1, -0.05, 0.0, 0.05, 0.1, 0.2):
    fd = 1 / (1 + math.exp(dE / kT))
    mb = math.exp(-dE / kT)
    print(f"E - EF = {dE:+.2f} eV: f_FD = {fd:.4f}" + (f", Boltzmann approx {mb:.4f}" if dE >= 0.05 else ""))
h, m0, kB = 6.626e-34, 9.109e-31, 1.381e-23
Nc = 2 * (2 * math.pi * 1.08 * m0 * kB * T / h**2) ** 1.5 * 1e-6
Nv = 2 * (2 * math.pi * 0.81 * m0 * kB * T / h**2) ** 1.5 * 1e-6
print(f"Si: Nc = {Nc:.2e} cm^-3, Nv = {Nv:.2e} cm^-3")
Eg = 1.12
print(f"ni = sqrt(NcNv) exp(-Eg/2kT) = {math.sqrt(Nc*Nv)*math.exp(-Eg/(2*kT)):.2e} cm^-3")
for Nd in (1e15, 1e17, 1e19):
    d = kT * math.log(Nc / Nd)
    ok = "valid" if d > 3 * kT else "NOT valid (degenerate: use Fermi-Dirac)"
    print(f"Nd = {Nd:.0e}: Ec - EF = {d:.3f} eV -> Boltzmann {ok}")
# E - EF = -0.10 eV: f_FD = 0.9795
# E - EF = -0.05 eV: f_FD = 0.8737
# E - EF = +0.00 eV: f_FD = 0.5000
# E - EF = +0.05 eV: f_FD = 0.1263, Boltzmann approx 0.1445
# E - EF = +0.10 eV: f_FD = 0.0205, Boltzmann approx 0.0209
# E - EF = +0.20 eV: f_FD = 0.0004, Boltzmann approx 0.0004
# Si: Nc = 2.82e+19 cm^-3, Nv = 1.83e+19 cm^-3
# ni = sqrt(NcNv) exp(-Eg/2kT) = 8.88e+09 cm^-3
# Nd = 1e+15: Ec - EF = 0.265 eV -> Boltzmann valid
# Nd = 1e+17: Ec - EF = 0.146 eV -> Boltzmann valid
# Nd = 1e+19: Ec - EF = 0.027 eV -> Boltzmann NOT valid (degenerate: use Fermi-Dirac)

The Boltzmann approximation is accurate once E − E_F exceeds ~3kT (0.078 eV): at 0.1 eV the error is 2%, at 0.05 eV it is 14%. For N_D = 10¹⁹ the Fermi level is only 27 meV below E_c — the material is degenerate and Fermi-Dirac integrals must be used. N_c and N_v from effective masses give n_i ≈ 9 × 10⁹ cm⁻³.

Common mistakes

Applications

Key takeaways

Going further