Contact potentials, equilibrium metal and semiconductors, Metal-oxide-metal (MOM) structures Download.
PN junctions for CMOS Download.
Note the new homework. It is a proof you need to make.
Hint: now as you have charges inside the oxide, you need to apply Poisson’s equation to find out how electric field varies inside the oxide, which was constant previously.
You are going to be correct once you have proved it.
The problem asks for flatband, meaning the gate voltage when the surface potential and silicon charge is zero.
Please bring your solution to class. Calculations can be made by hand or using the python program provided.
You are not required to learn python for this class. They are provided for your convenience. The most basic usage is to just use it as a calculator. You can use it interactively which is excellent for testing out ideas on the fly, or just write scripts or programs.
If you are using Mac or Linux, python is already installed. For windows users, I recommend using the free academic version from engthoughts, http://enthought.com/products/epd.php, which has many useful scientific packages already.
The python module for these examples can be downloaded here. First place this in a working directory of yours or a folder in your PYTHONPATH.
You can then run my programs and explore on your own.
Now create a new file named metal.py. For now, do this in the same folder as equisemi.py, the module you just downloaded. Copy and paste the following codes into the newly created file. Save and run. How you run it will depend on what python IDE you use.
from equisemi import Metal
# create a metal named m1 and with a workfunction potential of 3.5V
m1 = Metal('m1', 3.5)
# check out its information
print m1
# create metal 2 and 3 similarly
m2 = Metal('m2', 4)
print m2
m3 = Metal('m3', 5)
print m3
print 'contact potential from %s to %s is %s V' % (m1.name, m2.name, m1.contact_potential_to(m2))
print 'contact potential from %s to %s is %s V' % (m2.name, m3.name, m2.contact_potential_to(m3))
print 'the sum of the two equals %f V' % (m1.contact_potential_to(m2) + m2.contact_potential_to(m3))
print 'this is the same as contact potential from %s to %s, which is %s V' % (m1.name, m3.name, m1.contact_potential_to(m3))
The first line of the code imports Metal from the module equisemi I wrote. Run this program. The result is:
>>>
name = m1
fermi potential is -1.110000 V
workfunction potential is 3.500000 V
name = m2
fermi potential is -0.610000 V
workfunction potential is 4.000000 V
name = m3
fermi potential is 0.390000 V
workfunction potential is 5.000000 V
contact potential from m1 to m2 is 0.5 V
contact potential from m2 to m3 is 1.0 V
the sum of the two equals 1.500000 V
this is the same as contact potential from m1 to m3, which is 1.5 V
What does the fermi_potential() method mean?
Work through the math yourself and see if the program output is expected. Pay attention to the relation between fermi_potential and workfunction potential, see if that is the same as what we discussed in class.
Now let us consider doped semiconductors. Create a new file semidemo.py and paste the following codes. You will see how you can create semiconductors with different doping. You can add two semiconductors, their doping will just add.
from equisemi import Semi
s1 = Semi(nd = 1e15)
print '-' * 80
print 's1 info:'
print s1
s2 = Semi(na = 1e14)
print '-' * 80
print 's2 info:'
print s2
print 'built-in potential from s1 to s2 is %f V' % s1.contact_potential_to(s2)
s3 = Semi(nd = 1e15, na = 1e14)
print '-' * 80
print 's3 info:'
print s3
The method contact_potential_to calculates the contact potential of the current semiconductor to another semiconductor. The result is:
>>>
--------------------------------------------------------------------------------
s1 info:
nd = 1e+15/cm^3 na = 0/cm^3
p = 195999.999962 /cm^3, n = 1.0000000002e+15 /cm^3
Ef - Ei = 0.29 eV Ei - Ef = -0.29 eV
s1 type is n
fermi potential is -0.288352 V
workfunction potential is 4.321648 V
--------------------------------------------------------------------------------
s2 info:
nd = 0/cm^3 na = 1e+14/cm^3
p = 1.0000000196e+14 /cm^3, n = 1959999.96158 /cm^3
Ef - Ei = -0.23 eV Ei - Ef = 0.23 eV
s1 type is p
fermi potential is 0.228946 V
workfunction potential is 4.838946 V
built-in potential from s1 to s2 is 0.517298 V
--------------------------------------------------------------------------------
s3 info:
nd = 1e+15/cm^3 na = 1e+14/cm^3
p = 217777.777725 /cm^3, n = 9.00000000218e+14 /cm^3
Ef - Ei = 0.29 eV Ei - Ef = -0.29 eV
s1 type is n
fermi potential is -0.285634 V
workfunction potential is 4.324366 V
n is not equal to nd in n-type semiconductor
It is worth noting the small difference between electron concentration n and donor concentration nd for s1, which is n-type. Recall that nd + p = n for s1, as na = 0. For n-type, n is always larger than nd by p.
If you compare the values of nd + p and n, they are the same.
A similar observation can be made for p-type doped semiconductor.
s3 is a compensated semiconductor where both donors and acceptors co-exist.
things you can try
Consider putting a n-type and a p-type semiconductor together, without any bias. Electrons and holes move across junction interface, leaving behind positively charged donors on the n-side and negatively charged acceptors on the p-side.
Electric field lines point from positive to negative charges. So we have a higher potential on the n-side.
You see this type of description all the time. You are also told that this is what happens at zero bias, that is, the two sides are shorted electrically.
The first question I had in college in learning about PN junctions was: how can we have a potential difference over a short circuit?
The answer lies in the metal-semiconductor contact potentials at the contacts to the p-type and n-type semiconductors. Near these contacts, we indeed have a thin layer of space charge, where potential varies, as shown in the drawings in our notes.
A numerical example will clear up the confusion. Consider a metal with a work function potential of 4.1V. This metal is used to form ohmic contact to both sides of the PN junction. Doping level is 1e17 on both sides.
The source codes using the python module I provided are:
from equisemi import Metal, Semi, Mom, Psemi, Nsemi
psemi = Psemi(1e17)
nsemi = Nsemi(1e17)
metal = Metal(name='m1', wfpotential = 4.1)
print 'psemi info:'
print psemi
print 'nsemi info:'
print nsemi
print 'metal info'
print metal
print 'nsemi to psemi potential drop = %g V' % nsemi.contact_potential_to(psemi)
print 'nsemi to metal potential drop = %g V' % nsemi.contact_potential_to(metal)
print 'metal to psemi potential drop = %g V' % metal.contact_potential_to(psemi)
The result is:
psemi info:
nd = 0/cm^3 na = 1e+17/cm^3
p = 1e+17 /cm^3, n = 1960.0 /cm^3
Ef - Ei = -0.41 eV Ei - Ef = 0.41 eV
s1 type is p
fermi potential is 0.407166 V
workfunction potential is 5.017166 V
nsemi info:
nd = 1e+17/cm^3 na = 0/cm^3
p = 1960.0 /cm^3, n = 1e+17 /cm^3
Ef - Ei = 0.41 eV Ei - Ef = -0.41 eV
s1 type is n
fermi potential is -0.407166 V
workfunction potential is 4.202834 V
metal info
name = m1
fermi potential is -0.510000 V
workfunction potential is 4.100000 V
nsemi to psemi potential drop = 0.814332 V
nsemi to metal potential drop = -0.102834 V
metal to psemi potential drop = 0.917166 V
For problem 3 above, you can use the following codes:
#-------------------------------------------------------------------------------
# Name: pn_basics_hw1
# Purpose: sample solution for students
# you can also learn about creating a list and adding items to it
# Author: GuofuNiu
#
# Created: 19/01/2012
# Copyright: (c) GuofuNiu 2012
# Licence: <your licence>
#-------------------------------------------------------------------------------
#!/usr/bin/env python
'''
What is new for using python:
* create and add item to a list
* iterate over part of a list (there are more pythonic ways of iteration for full list)
'''
from equisemi import Metal, Semi, Psemi, Nsemi
def problem3():
materials = []
names = []
m1 = Metal("m1", 4.1)
materials.append(m1)
names.append('m1')
psemi = Psemi(1e17)
materials.append(psemi)
names.append('psemi')
nsemi = Nsemi(1e17)
materials.append(nsemi)
names.append('nsemi')
m2 = m1
materials.append(m2)
names.append('m1')
nmaterials = len(materials)
for idx in range(nmaterials -1):
print 'contact potential from %s to %s is: %f V' % \
(names[idx],
names[idx+1],
materials[idx].contact_potential_to(materials[idx+1]))
def main():
pass
if __name__ == '__main__':
## main()
problem3()
The result is:
contact potential from m1 to psemi is: 0.917166 V
contact potential from psemi to nsemi is: -0.814332 V
contact potential from nsemi to m1 is: -0.102834 V