Numerical simulation of a directly modulated semiconductor laser using coupled rate equations for carrier and photon density. The device is biased just above threshold, pulsed to a higher drive current for 100 ps, then returned to bias. This is the same scenario a laser sees under direct modulation in a data link.
Rate equations
Carrier and photon densities are coupled through a gain term that includes compression:
Device parameters
| Parameter | Symbol | Value |
|---|---|---|
| Active region volume | \(V\) | \(120\ \mu\mathrm{m}^3\) |
| Photon lifetime | \(\tau_p\) | \(4\ \mathrm{ps}\) |
| Carrier lifetime | \(\tau\) | \(1\ \mathrm{ns}\) |
| Spontaneous emission factor | \(\beta\) | \(10^{-5}\) |
| Differential gain | \(dg/dn\) | \(5\times10^{-16}\ \mathrm{cm}^2\) |
| Gain compression | \(\varepsilon\) | \(10^{-17}\ \mathrm{cm}^3\) |
| Confinement factor | \(\Gamma\) | \(0.30\) |
| Transparency carrier density | \(n_0\) | \(10^{18}\ \mathrm{cm}^{-3}\) |
Results
Threshold came out to \(n_{\mathrm{th}} \approx 1.19 \times 10^{18}\ \mathrm{cm}^{-3}\) and \(I_{\mathrm{th}} \approx 22.9\ \mathrm{mA}\). Steady state at \(1.1\,I_{\mathrm{th}}\) was found by integrating to convergence over 8 ns rather than assuming carrier clamping, so the transient starts from a self-consistent bias point.
When the current steps up, carrier density overshoots \(n_{\mathrm{th}}\) before stimulated emission can respond. Once photon density spikes it clamps the carriers, triggering a damped oscillatory exchange, plus a second burst on the step back down. Relaxation oscillation frequency for this parameter set landed at ~5 to 15 GHz.
MATLAB source: rate equations and threshold
% Part (a): Threshold current
% Threshold condition: Gamma * vg * dgdn * (nth - n0) = 1/tau_p
delta_nth = 1 / (Gamma * vg * dgdn * tau_p);
nth = n0 + delta_nth;
I_th = q * V * nth / tau;
% Transient: 1.1*Ith -> 4*Ith for 100 ps -> back to 1.1*Ith
I_func = @(t) I_bias + (I_high - I_bias) * (t >= t_on & t <= t_off);
opts = odeset('RelTol', 1e-8, 'AbsTol', 1e-10, 'MaxStep', 0.2e-12);
t_eval = linspace(0, t_end, 8000);
[t_sol, y_sol] = ode45(@(t, y) rate_eqs(t, y, I_func, q, V, tau, tau_p, ...
beta, Gamma, vg, dgdn, n0, epsilon), t_eval, y0, opts);
function dydt = rate_eqs(t, y, I_func, q, V, tau, tau_p, beta, ...
Gamma, vg, dgdn, n0, epsilon)
n = max(y(1), 0);
s = max(y(2), 0);
I = I_func(t);
G = vg * dgdn * (n - n0) / (1 + epsilon * s);
dndt = I/(q*V) - n/tau - Gamma*G*s;
dsdt = Gamma*G*s - s/tau_p + beta*n/tau;
dydt = [dndt; dsdt];
end