Table Of Contents

Previous topic

1. Syllabus and Course Information

Next topic

3. Two Terminal MOS

This Page

2. Semiconductor Fundamentals for CMOS

2.1. Notes

  1. Contact potentials, equilibrium metal and semiconductors, Metal-oxide-metal (MOM) structures Download.

  2. 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.

2.2. Homeworks

Please bring your solution to class. Calculations can be made by hand or using the python program provided.

  1. Practice using the equisemi python module for all the examples given on this page. Modify values of doping or work function potential, and see if the program output is consistent with theoretical expection. Put the output in a txt file.
  2. Prove that for the same substrate doping level, the built-in potential for Npoly gate/oxide/p-substrate and that for Ppoly gate/oxide/n-substrate are the same in magnitude but opposite in sign.
  3. Find the potential drops across all interfaces found in a metal1/psemi doped at 1e17/nsemi doped at 1e17/metal1 donut. Assume metal work function potential is 4.1V.
  4. Sketch potential drop at all interfaces in a metal1/metal2/psemi/nsemi/metal1/metal2 structure, where the left most and right most metals are shorted by a wire made of metal 3. Work function potential is 4.1V, 4.5V and 5V for metal1, metal2, and metal3, respectively.
  5. See notes on proof in presence of oxide charges.

2.3. Book Sections to Read

  1. You are required to read the relevant textbook chapters
  2. 1.1, 1.2, 1.4, and 1.7
  3. 2.1 - 2.3 for 1/19/2012 lecture
  4. read 2.4 briefly which will be covered next

2.4. Numerical Examples by Python

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.

2.5. Metal Contact Potentials

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.

2.6. Doped Equilibrium Semiconductors

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

  1. sketch some band diagrams for s1, s2 and s3, see if it makes intuitive sense
  2. modify the code to try out different doping levels
  3. try to do a hand calculation and compare results with the program output

2.7. PN Junction

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

2.8. Solution to Selected Problems

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