一维PN结的数值模拟(非平衡态)
写在前面
五一期间复习了一维 PN 结的poisson 方程数值模拟 (https://www.cnblogs.com/ghzhan/articles/17368238.html), 今天打算把非平衡态输运的情况也记录一下, 当然这些都是基于经典图像下的. 严格点的话,需要对 PN 结进行量子框架下的输运计算(例如DFT-NEGF等), 不过这些经典图像对理解传统器件输运已经足够了!
理想 PN 结非平衡态
对于非平衡态时, 其载流子浓度为:
其中, 是本征载流子浓度, 分别是 PN 结两端的准费米能级. . 且 , 为 PN 结两端的偏压.
将上述载流子公式代入 Poisson 方程
为:
再根据 Newton-Raphason 方法迭代求解得到电势分布.
结果分析
平衡态时,
正偏 1V 时,
反偏 -1V 时,
该结果与QuantumATK 官网例子大致相同. https://docs.quantumatk.com/tutorials/silicon_pn_junction/silicon_pn_junction.html
附件
点击查看代码
%%%%%%
% 2023/5/4
% The Newton-Raphson method for PN diode.
% This code is modified by ghzhan(ghzphysics@163.com) based on the Ref. 1.
% This code repoduce the results in the Ref1
% This code also repoduce the result on Website: https://docs.quantumatk.com/tutorials/silicon_pn_junction/silicon_pn_junction.html
% Ref 1: https://doi.org/10.7227/IJEEE.44.1.3
%
clear;
epsilon = 1.05*1e-12; %F/cm
q = 1.6*1e-19;% C
kT = 0.02585;% eV
n0 = 1.45*1e10; %cm^-3
theta = 1e-8; %cm
m = 140;
Na = 2e19; %cm^-3
Nd = Na;
Eg = 1.12;%eV
%Vds = 0; % V Equilibrium
%Vds = 1; % V Positive voltage
Vds = -1;% V Negative voltage
Vp = Vds/2; Vn = -Vds/2;
VP = Vp - kT*log(Na/n0);
VN = Vn + kT*log(Nd/n0);
%%% pn
Na = Na*[ones(m/2,1);zeros(m/2,1)];
Nd = Nd*[zeros(m/2,1);ones(m/2,1)];
%%% p-i-n
%Na = Na*[ones(m/4,1);zeros(m/2,1);zeros(m/4,1)];
%Nd = Nd*[zeros(m/4,1);zeros(m/2,1);ones(m/4,1)];
V=zeros(m,1);
V(1:m/2,1)=VP; %VP has to be predefined as in (7)
V(m/2+1:m,1)=VN; %VN has to be predefined as in (8)
D2=-(2*diag(ones(1,m)))+(diag(ones(1,m-1),1))+(diag(ones(1,m-1),-1));
V0 = [VP;zeros(m-2,1);VN]; % Boundary condition
beta = q*theta^2/epsilon;
%figure;
Error = 10;
while Error > 1e-15
%hold on;
%plot(V)
%drho_dv = -2*n0/kT*cosh(V/kT);
drho_dv = -n0/kT*exp((V-Vn)/kT)-n0/kT*exp((Vp-V)/kT);
%rho = Nd - Na - 2*n0*sinh(V/kT);
rho = Nd - Na - n0*exp((V-Vn)/kT) + n0*exp((Vp-V)/kT);
%%%% Newton-Raphon Method
M = D2 + diag(beta*drho_dv);
R = -(D2*V + V0 + beta*rho);
dv = M\R;
V = V + 0.1*dv;
Error = norm(dv,2)/sqrt(m);
end
figure;
plot(V);
xlabel('Length (A)');
ylabel('Potential profile (eV)');
ylim([-2,2])
title(['Bias: ', num2str(Vds),' V']);
figure;
theta = 1e8*theta;
plot(theta*[1:1:m],-V+Eg/2,'r',theta*[1:1:m],-V-Eg/2,'r')
hold on
plot(theta*[1:1:m],Vn*ones(m,1),'k-',theta*[1:1:m],Vp*ones(m,1),'k-');
xlabel('Length (A)');
ylabel('Energy (eV)');
ylim([-2,2])
title(['Bias: ', num2str(Vds),' V']);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现