Processing math: 100%


硅的能带结构 - a Monte Carlo view

硅的能带结构 - a Monte Carlo view

Pop E. Self-heating and scaling of thin body transistors[M]. stanford university, 2005


能带是半导体最重要的性质之一,也是Electron Monte Carlo最重要的输入,能带就是电子能量和动量的关系,也就是色散关系.

对于一个真空中的自由电子,他的色散关系很简单, E=12m(v2x+v2y+v2z)=p2x+p2y+p2z2m

根据德布罗意关系,我们知道粒子的动量和波长满足 px=kx,py=ky,pz=kz
在实际半导体中,色散关系并不是像自由电子这样这么简单的,半导体导带中的自由电子和内部原子、其他电子均存在着相互作用,即使对研究最充分结构最简单的硅来说,它的电子能带结构也是比较复杂的.

但幸运的是,电子满足的费米-狄拉克分布告诉我们,电子的数目在超过费米能级后,其数目会随着能量的增加而大幅衰减. 因此,对于电子导电的半导体来说,自由电子可能允许的状态基本都集中在导带的底部,相当于被困在了这个势阱里. 因此对于大部分情况来说,我们没有必要给出所有的导带形貌,我们只需要对导带底部做出一些合理的描述即可. 由于导带底部是导带的能量最低点,相当于稳定平衡位置,而在平衡位置附近由于势能的一阶导数(力)为0,所以任何势能分布都可以采用二阶简谐来近似,也就是抛物线,弹簧的胡克定律或者固体物理中推导的晶格相互作用,都是基于这种近似得到的.

所以我们可以认为,对于导带底部分布的电子,它的色散关系的形式应该还是满足 E=Ec+12m(v2x+v2y+v2z)=p2x+p2y+p2z2m

这种形式,其中Ec是导带底部的能量. 由于半导体内部原子等其他因素的作用,此时的分母会偏离电子的实际质量m,我们把内部势场的对电子的影响全部弄到分母上去,使得色散关系还能是抛物线的形状,我们把新的分母定义为电子的有效质量,不同半导体的有效质量是不同的. 同时,由于晶体具有各向异性的性质,不同方向的电子有效质量也是不同的,我们于是可以把导带底部的色散关系写成 E=Ec+22[(kxk0,x)2mx+(kyk0,y)2my+(kzk0,z)2mz]
其中mx,my,mz分别是x、y、z方向的电子有效质量,k0,x,k0,y,k0,z是导带底的坐标,可以看出这是一个旋转椭球的色散关系. 注意我们在这篇文章中讨论的坐标全部是动量空间(波矢空间)的概念,与实空间分布没有任何关系,动量空间的分布只决定电子的性质. 从这里也可以看出我们用Monte Carlo方法是怎么理解波粒二象性的,我们用波的色散描述粒子的性质,驱动粒子在实空间中进行运动.

所以表达式就是这样了,假如我们想针对一个实际半导体,比如硅,我们要描述它的导带底部的色散关系,我们需要知道什么呢?

首先是Ec,如果我们把价带顶的能量定义为0,那么Ec就是带隙Eg了,它是一个温度相关的量. 根据实验,我们可以得到下面这个关系式, Eg(T)=1.17568.3131×105T2.6814×107T2

在0K时Si的带隙为1.1756 eV. 我们还需要知道导带底部的位置,要知道对于实际半导体而言,它导带能量最小值的点并不在布里渊区的原点(0,0,0)!而且由于晶格的对称性,不一定只存在一个能量最低点,而是可能存在很多个对称的能量最低点。对于硅来说,它存在6个对称的导带最小值点,分别出现在[100],[ˉ100],[010],[0ˉ10],[001],[00ˉ1]这几个方向上,且导带最低点的位置位于对应方向布里渊区中心到布里渊区边界的0.85倍处的位置.

image-20220815210421063

[100]方向布里渊区边界的波矢和动量分别是 qm=2π/a,pm=qm

a是硅的晶格常数. 于是硅的导带底部的能带结构可以表示成了 Es=Ec+22[(kxks0,x)2mx+(kyks0,y)2my+(kzks0,z)2mz]
其中s=1,2,3,4,5,6,分别代表6个对称的导带底. 另一个需要的量就是等效质量,由于旋转椭球面的transverse方向是对称的(相当于声子有两个T声学支),我们可以把等效质量约化成横向有效质量和纵向有效质量两个有效质量, ml=0.9163×m0,mt=0.1880×m0×Eg(0)Eg(T)
现在我们基本上可以完全描述硅的能带结构了,但是人们发现这个抛物线近似并不是太好.. 因为它毕竟只是简谐近似,只会在电子能量很低、非常接近导带底的时候才近似成立. 那么只要引入一定非抛物近似,就可以扩展近似成立的范围了. 于是我们就有了non-parabolic Kane band, Esk(1+αEsk)=22[(kxks0,x)2mx+(kyks0,y)2my+(kzks0,z)2mz]
我们把电子高于导带底部的能量定义为Ek,再引入一个非抛物系数α,来更好地描述能带结构,当然α也是一个经验系数, α=0.5×Eg(0)Eg(T)
一般取为0.5就足够了. 我们可以看一下在预测态密度上的区别,non-parabolic还是要好很多的. 注意态密度只是电子可能存在的态的数目,并不是电子的数目,电子可以不填充在相应的态上.

jojo

态密度的计算公式为 DOS(E)=dZ/dE

能量为E时的态密度定义为E+dEE这两个等能面之间围成的态的数量. 而根据量子力学,相空间中一个量子态占据的体积是固定的,为r,其中r为体系的维数. 代入parabolic能带和non-parabolic能带,可以分别得到 gpara(Ek)=m3/2d2π23Ekgnon-para(Ek)=m3/2d2π23Ek(1+αEk)(1+2αEk)
到这里我们对硅的能带结构的描述已经很比较完全了,那么按照这样的结构我们应该怎么样初始化一些电子出来呢?我们知道处于热平衡状态的电子的平均能量是32kBT,假设现在这只电子处于某个导带最低点附近,那么在对应valley初始化电子的过程就可以描述为 px=p0,x+mxkbT×Gassuian-Dispx=p0,y+mykbT×Gassuian-Dispx=p0,z+mzkbT×Gassuian-Dis
而后可以代入能带结构获取对应动量Electron的能量, ϵ(k)=1+1+4αγ2α
其中 γ=22[(kxk0,x)2mx+(kyk0,y)2my+(kzk0,z)2mz]
总觉得这里有些奇怪.. 不过先这样把. 用Plotly可以画一下我们得到的300K下Silicon中的电子分布.

image-20220818170957281

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
import numpy as np
import pandas as pd

pi = 3.14159265
pi2 = 6.28318531
echarge = -1.0 # electron charge
ecoulom = -1.60217653e-19 # electron charge in Coulombs
kb = 8.61734318e-05 # eV/K
hbar = 6.58211915e-16 # eV*s
m0 = 5.68562975e-16 # eV*s^2/cm^2
eps0 = 5.52634972e05 # e/V/cm permittivity of free space

class Valley(object):
def __init__(self, px0, py0, pz0, mx, my, mz, T, alpha, PQMAX, number_of_electrons):
self.px0 = px0
self.py0 = py0
self.pz0 = pz0
self.mx = mx
self.my = my
self.mz = mz
self.T = T
self.alpha = alpha
self.PQMAX = PQMAX
self.number_of_electrons = number_of_electrons
electrons = []
E = []
for i in range(self.number_of_electrons):
electron = self.create_electron(T)
electrons.append(electron)
E.append(self.energy(electron))

self.electrons = pd.DataFrame(np.hstack([np.array(electrons), np.array(E).reshape(-1, 1)]), columns=['px', 'py', 'pz', 'E'])

def create_electron(self, T):
# create an electron in thermal equilibrium
px = py = pz = 100
while (px > self.PQMAX or py > self.PQMAX or pz > self.PQMAX):
px = np.random.normal() * np.sqrt(kb * T * self.mx) + self.px0
py = np.random.normal() * np.sqrt(kb * T * self.my) + self.py0
pz = np.random.normal() * np.sqrt(kb * T * self.mz) + self.pz0
electron = np.array([px, py, pz])
return electron

def gamma(self, electron):
return 0.5 * (
(electron[0] - self.px0) ** 2 / self.mx
+ (electron[1] - self.py0) ** 2 / self.my
+ (electron[2] - self.pz0) ** 2 / self.mz
)

def energy(self, electron):
return (-1 + np.sqrt(1 + 4 * self.alpha * self.gamma(electron))) / (2 * self.alpha)

class Silicon(object):
def __init__(self, T=300, number_of_electrons=600):
# number of electrons
electrons_per_valley = int(number_of_electrons / 6)
self.number_of_electrons = 6 * electrons_per_valley

# temperature
self.T = T

# lattice information
self.asi = 5.411e-8 # lattic constant, cm

# effective electron mass
self.ml = 0.9163 * m0
self.mt = 0.1880 * self.E_gap(0) * m0 / self.E_gap(self.T)

# Dos electron mass
self.md = 6 ** (2 / 3) * (self.ml * self.mt**2) ** (1 / 3)

# brillouin zone information
self.QMIN = 1.0
self.QMAX = 2 * pi / self.asi
self.PQMAX = hbar * self.QMAX # hbar * q = p

# Kane band
self.alpha = 0.5 * self.E_gap(0) / self.E_gap(self.T)

# six valleys
self.valley_kx0 = Valley(-0.85 * self.PQMAX, 0, 0, self.ml, self.mt, self.mt, self.T, self.alpha, self.PQMAX, electrons_per_valley)
self.valley_kx1 = Valley(0.85 * self.PQMAX, 0, 0, self.ml, self.mt, self.mt, self.T, self.alpha, self.PQMAX, electrons_per_valley)
self.valley_ky0 = Valley(0, -0.85 * self.PQMAX, 0, self.mt, self.ml, self.mt, self.T, self.alpha, self.PQMAX, electrons_per_valley)
self.valley_ky1 = Valley(0, 0.85 * self.PQMAX, 0, self.mt, self.ml, self.mt, self.T, self.alpha, self.PQMAX, electrons_per_valley)
self.valley_kz0 = Valley(0, 0, -0.85 * self.PQMAX, self.mt, self.mt, self.ml, self.T, self.alpha, self.PQMAX, electrons_per_valley)
self.valley_kz1 = Valley(0, 0, 0.85 * self.PQMAX, self.mt, self.mt, self.ml, self.T, self.alpha, self.PQMAX, electrons_per_valley)

def E_gap(self, T):
return 1.1756 - 8.8131e-5 * T - 2.6814e-7 * T**2

def DoS(self, E):
return (
self.md ** (3 / 2) * np.sqrt(2)
/ (pi**2 * hbar**3)
* np.sqrt(E * (1 + self.alpha * E))
* (1 + 2 * self.alpha * E)
)

def DoS_para(self, E):
return (
self.md ** (3 / 2) * np.sqrt(2)
/ (pi**2 * hbar**3)
* np.sqrt(E)
)

si = Silicon()