Dirac源晶体管亚阈值摆幅推导
背景
亚阈值摆幅
亚阈值摆幅 (Subthrehold Swing) 是衡量晶体管开启与关断状态之间相互转换速率的性能指标,它代表源漏电流变化十倍所需要栅电压的变化量,又称为S因子,S越小意味着开启关断速率ON/OFF越快。 (来源: 百度百科)
因为加在栅极的电压 \(V_{gs}\) 分别降落在栅氧化蹭和衬底硅上,所以 \(V_{gs} >= V_s\), \(\frac{dV_{gs}}{dV_s}>=1\), 在室温下 (300K), SS 有最小值 \(k_BT/q * ln10\approx 60 mV\). 因此,对于常规的 MOSFET 而言,亚阈值摆幅一般大于 60 mV/dec。但一些新型器件,如隧穿器件(Tunneling Transistor),可以获得低于此理论值的亚阈值摆幅。
Dirac 源晶体管
简介
2018年,北京大学刘飞老师等人提出用 Dirac 材料作为源端的晶体管,可以打破亚阈值摆幅 60 \(mV/dec\) 的下限,实现更低功耗的作用。本文主要是推导 IEEE TED 65,7 (2018) 的 \(SS\) 值。
![](https://img2022.cnblogs.com/blog/2036749/202207/2036749-20220718103725268-2024887293.png)
根据 Landauer-Buttiker 公式, 通过器件的电流为:
这里的 \(D(E)\) 是注入载流子的态密度,\(f_S/f_D\) 是源漏电极的费米能级,\(T(E)\) 是源端到漏端的隧穿概率。在常规的MOSFET中,源端是通过金属载流子注入,所以它的态密度是个常数,因此,\(SS\) 存在一个极限 \(k_BT/q * ln10\),然而当栅压减小时,态密度如果出现急剧下降的话,则\(SS\) 将打破热力学极限。
对于某种材料,带边附近的电子色散关系为:
这里的 \(E_{c/v}\) 分别表示导带价带的带边能量。当 m = 2 表示有质量,m=1 表示 Dirac 电子,因此,\(d\)-维材料的态密度有如下关系:
\(\frac{d}{m}-1\) 的值为:
d/m-1 | m=2 | m=1 |
---|---|---|
d=1 | -1/2 | 0 |
d=2 | 0 | 1 |
d=3 | 1/2 | 2 |
详细推导
1. \(\frac{d}{m}-1 = 0\) 例子
态密度为 \(D(E)=D_0|E-E_{dirac}|^0=D_0\),电流值为:
这里的 \(C_1=-\frac{\partial\Phi_B}{\partial qV_{gs}} (0 < C_1 <=1)\)
2. \(\frac{d}{m}-1 = 1\) 例子
当源端是二维石墨烯 Dirac 材料时,d = 2,m =1, 那么 \(\frac{d}{m}-1 = 1\)。那么它的态密度为 \(D(E)=D_0|E-E_{dirac}|\) 电流值为:
这里假设\(T(E)=1\), 源端费米能级为 \(E_{FS}=0\),当 \(\Phi_B\) 大于 \(E_{dirac}\) 时,\(|E-E_{dirac}| = E-E_{dirac}\),电流值为
因此 SS 值为:
当 \(\Phi_B\) 小于 \(E_{dirac}\) 时,\(|E-E_{dirac}|\) 分情况讨论, 电流值为
3. \(\frac{d}{m}-1 = 2\) 例子
态密度 \(|E-E_{dirac}|^2 = (E-E_{dirac})^2\),电流值为
其中 \(a=k_BT,b=E_{dirac}\)
4. \(\frac{d}{m}-1 = 1/2\) 例子
当 \(\Phi_B\) 大于 \(E_{dirac}\) 时,\(|E-E_{dirac}|^{1/2} = \sqrt{E-E_{dirac}}\),电流值为
当 \(\Phi_B\) 小于 \(E_{dirac}\) 时,\(|E-E_{dirac}|^{1/2} = \sqrt{E_{dirac}-E}\),电流值为
5. \(\frac{d}{m}-1 = -1/2\) 例子
当 \(\Phi_B\) 大于 \(E_{dirac}\) 时,\(|E-E_{dirac}|^{-1/2} = (E-E_{dirac})^{-1/2}\),电流值为
当 \(\Phi_B\) 小于 \(E_{dirac}\) 时,\(|E-E_{dirac}|^{-1/2}\) 分情况讨论,电流值为
附录积分公式 (参考链接)
-
\[\int (x-b)^0e^{-x/a}dx = -ae^{-x/a} \]
-
\[\int (x-b)e^{-x/a}dx = -(ax-ab+a^2)e^{-x/a} \]
-
\[\int (x-b)^2e^{-x/a}dx = -(ax^2+(2a^2-2ab)x+ab^2-2a^2b+2a^3)e^{-x/a} \]
-
\[\int (x-b)^{1/2}e^{-x/a}dx = -\frac{1}{2}*e^{-\frac{x+b}{a}}\left(2ae^{\frac{b}{a}}\sqrt{x-b}-\sqrt{\pi}a^{3/2}e^{\frac{x}{a}} \mathbf{erf}(\sqrt{\frac{x-b}{a}})\right) \]
这里的 \(\mathbf{erf}\) 是误差函数:
所以 \(\mathbf{erf}(0)=0,\mathbf{erf}(\infty)=1\) 且 \(i\mathbf{erf}(ix)=-\mathbf{erf}(x)\).
-
\[\int (x-b)^{-1/2}e^{-x/a}dx = \sqrt{\pi}a^{1/2}e^{-\frac{b}{a}}\mathbf{erf}(\sqrt{\frac{x-b}{a}}) \]
Python 计算脚本
- \(D(E)=D_0|E-E_{dirac}|^0\) 例子
点击查看代码
import numpy as np
import matplotlib.pyplot as plt
import math
def current1(phi_b):
tmp = math.exp(-phi_b/KT)
return math.log(KT*tmp)
def current2(phi_b):
tmp = math.exp(-phi_b/KT)
return math.log(KT*tmp)
def derivative(f,x,deltax=0.1**10):
return (f(x+deltax)-f(x))/deltax
def main():
phiB = np.linspace(0,0.6,2000)
phi_B, SS = [], []
for i in phiB:
if i > E_dirac:
phi_B.append(i)
SS.append(-60/(KT*derivative(current1,i)))
elif i < E_dirac:
phi_B.append(i)
SS.append(-60/(KT*derivative(current2,i)))
plt.plot(phi_B,SS)
plt.xlim([0,0.6])
plt.ylim([0,200])
plt.title('$D(E) \\approx |E-E_{dirac}|^0$')
plt.show()
if __name__ == '__main__':
KT = 0.026
E_dirac = 0.3
main()
- \(D(E)=D_0|E-E_{dirac}|\) 例子
点击查看代码
import numpy as np
import matplotlib.pyplot as plt
import math
def current1(phi_b):
tmp = (phi_b + KT -E_dirac)*math.exp(-phi_b/KT)
return math.log(KT*tmp)
def current2(phi_b):
tmp = 2*KT*math.exp(-E_dirac/KT) + (-phi_b - KT +E_dirac)*math.exp(-phi_b/KT)
return math.log(KT*tmp)
def derivative(f,x,deltax=0.1**10):
return (f(x+deltax)-f(x))/deltax
def main():
phiB = np.linspace(0,0.6,2000)
phi_B,SS = [],[]
for i in phiB:
if i > E_dirac:
phi_B.append(i)
SS.append(-60/(KT*derivative(current1,i)))
elif i < E_dirac:
phi_B.append(i)
SS.append(-60/(KT*derivative(current2,i)))
plt.plot(phi_B,SS)
plt.xlim([0,0.6])
plt.ylim([0,200])
plt.title('$D(E) \\approx |E-E_{dirac}|$')
plt.show()
if __name__ == '__main__':
KT = 0.026
E_dirac = 0.3
main()
- \(D(E)=D_0|E-E_{dirac}|^2\) 例子
点击查看代码
import numpy as np
import matplotlib.pyplot as plt
import math
def current(x):
# tmp = (2*(phi_b-E_dirac)*(KT)**2 + 2*(KT)**3 + KT*(phi_b-E_dirac)**2)*math.exp(-phi_b/KT)
tmp = (a*x**2+(2*a**2-2*a*b)*x+a*b**2-2*a**2*b+2*a**3)*math.exp(-x/a)
return math.log(tmp)
def derivative(f,x,deltax=0.1**10):
return (f(x+deltax)-f(x))/deltax
def main():
phiB = np.linspace(0,0.6,2000)
phi_B,SS = [],[]
for i in phiB:
phi_B.append(i)
SS.append(-60/(KT*derivative(current,i)))
with open('dat.txt','w') as f:
for i in range(len(phi_B)):
f.write('{} {}\n'.format(phi_B[i],SS[i]))
plt.plot(phi_B,SS)
plt.xlim([0,0.6])
plt.ylim([0,200])
plt.title('$D(E) \\approx |E-E_{dirac}|^2$')
plt.show()
if __name__ == '__main__':
KT = 0.026
E_dirac = 0.3
a = KT
b = E_dirac
main()
- \(D(E)=D_0|E-E_{dirac}|^{1/2}\) 例子
点击查看代码
import numpy as np
import matplotlib.pyplot as plt
import math
def current1(phi_b):
tmp1 = math.exp(-(phi_b+b)/a)
tmp2 = ((phi_b-b)/a)**0.5
tmp = math.pi**0.5*a**1.5*math.exp(-b/a) +tmp1*(2*a*math.exp(b/a)*(phi_b-b)**0.5 - math.pi**0.5*a**1.5*math.exp(phi_b/a)*math.erf(tmp2))
return math.log(tmp/2)
def current2(phi_b):
tmp1 = math.exp(-(phi_b+b)/a)
tmp2 = ((b-phi_b)/a)**0.5
tmp = math.pi**0.5*a**1.5*math.exp(-b/a) +tmp1*(2*a*math.exp(b/a)*(b-phi_b)**0.5 - math.pi**0.5*a**1.5*math.exp(phi_b/a)*math.erf(tmp2))
return math.log(tmp/2)
def derivative(f,x,deltax=0.1**10):
return (f(x+deltax)-f(x))/deltax
def main():
phiB = np.linspace(0,0.6,2000)
phi_B,SS = [],[]
for i in phiB:
if i > E_dirac:
phi_B.append(i)
SS.append(-60/(KT*derivative(current1,i)))
elif i < E_dirac:
phi_B.append(i)
SS.append(-60/(KT*derivative(current2,i)))
plt.figure()
plt.plot(phi_B,SS)
plt.ylim([0,200])
plt.title('$D(E) \\approx |E-E_{dirac}|^{1/2}$')
plt.xlim([0,0.6])
plt.show()
if __name__ == '__main__':
KT = 0.026
E_dirac = 0.3
b = E_dirac
a = KT
main()
- \(D(E)=D_0|E-E_{dirac}|^{-1/2}\) 例子
点击查看代码
import numpy as np
import matplotlib.pyplot as plt
import math
def current1(phi_b):
tmp1 = (a*math.pi)**0.5*math.exp(-b/a)
tmp2 = ((phi_b-b)/a)**0.5
tmp = tmp1-tmp1*math.erf(tmp2)
return math.log(tmp)
def current2(phi_b):
tmp1 = (a*math.pi)**0.5*math.exp(-b/a)
tmp2 = ((b-phi_b)/a)**0.5
tmp = tmp1+tmp1*math.erf(tmp2)
return math.log(tmp)
def derivative(f,x,deltax=0.1**10):
return (f(x+deltax)-f(x))/deltax
def main():
phiB = np.linspace(0,0.6,2000)
phi_B,SS = [],[]
for i in phiB:
if i > E_dirac:
phi_B.append(i)
SS.append(-60/(KT*derivative(current1,i)))
elif i < E_dirac:
phi_B.append(i)
SS.append(-60/(KT*derivative(current2,i)))
plt.figure()
plt.plot(phi_B,SS)
plt.xlim([0,0.6])
plt.ylim([0,200])
plt.title('$D(E) \\approx |E-E_{dirac}|^{-1/2}$')
plt.show()
if __name__ == '__main__':
KT = 0.026
E_dirac = 0.3
b = E_dirac
a = KT
main()
![](https://img2022.cnblogs.com/blog/2036749/202207/2036749-20220717192247287-163028725.jpg)
部分推导笔记