PN diode example (1D): Difference between revisions
No edit summary |
No edit summary |
||
Line 1: | Line 1: | ||
This example builds on the 1D resistor example, showing how to create a floods structure with a doping profile that varies with x. After solving, the example compares floods's numerical results with an analytical solution. | |||
== New Concepts == | |||
* refining the grid with non-tagged lines | |||
* Doping=f(x) : use "sel z=" | |||
* "sel z=" if-then-else syntax (?:) | |||
* tcl "foreach" | |||
== 1D PN Diode Deck == | |||
Create 1D structure - [[PN diode example 1D - Create 1D structure explanation | explanation]] | |||
#Grid | |||
#line x loc=0.0 spac=.01 tag=Top | |||
#line x loc=0.4 spac=0.01 | |||
#line x loc=0.7 spac=0.01 | |||
#line x loc=2.0 spac=0.05 tag=Bottom | |||
line x loc=0.0 spac=0.1 tag=Top | |||
line x loc=0.5 spac=0.01 | |||
line x loc=1.0 spac=0.1 tag=Bottom | |||
mater add name=Silicon | |||
region Silicon xlo=Top xhi=Bottom | |||
init | |||
#Contacts | |||
contact name=VSS Silicon xlo=-0.1 xhi=0.1 add | |||
contact name=GND Silicon xlo=0.9 xhi=1.1 add | |||
Declare solution variables | |||
DevicePackage | |||
solution add name=DevPsi pde solve negative damp | |||
solution add name=Elec pde solve !negative | |||
solution add name=Hole pde solve !negative | |||
Define constants | |||
set T 300.0 | |||
set k 1.38066e-23 | |||
set q 1.619e-19 | |||
set Vt [expr {$k*$T/$q}] | |||
set ni 1.1e10 | |||
set esi [expr 11.8 * 8.85418e-14] | |||
set eps [expr $esi / $q] | |||
set Emob 350.0 | |||
set Hmob 150.0 | |||
set small 1.0e-10 | |||
Ionized dopant profile - [[PN diode example 1D - Ionized dopant profile explanation | explanation]] | |||
sel z=1.0e20*(x<0.5) name=Nd | |||
sel z=1.0e17 name=Na | |||
sel z=(Nd-Na) name=Doping | |||
#plot doping | |||
sel z=Doping | |||
plot.1d | |||
#sel z=1.0e20*(x<0.5)-1.0e17 name=Doping | |||
Bulk Equations | |||
set eqnP "$eps * grad(DevPsi) + $Doping - Elec + Hole" | |||
set eqnE "ddt(Elec) - ($Emob) * $Vt * sgrad(Elec, DevPsi/$Vt)" | |||
set eqnH "ddt(Hole) - ($Hmob) * $Vt * sgrad(Hole, -DevPsi/$Vt)" | |||
pdbSetString Silicon DevPsi Equation $eqnP | |||
pdbSetString Silicon Elec Equation $eqnE | |||
pdbSetString Silicon Hole Equation $eqnH | |||
pdbSetDouble Silicon DevPsi DampValue $Vt | |||
pdbSetDouble Silicon DevPsi Abs.Error 1.0e-9 | |||
pdbSetDouble Silicon Elec Abs.Error 1.0e-5 | |||
pdbSetDouble Silicon Hole Abs.Error 1.0e-5 | |||
Contact Equations | |||
proc OhmicContact {Contact} { | |||
global Vt ni Nd Na | |||
pdbSetBoolean $Contact Elec Flux 1 | |||
pdbSetBoolean $Contact Hole Flux 1 | |||
pdbSetBoolean $Contact DevPsi Flux 1 | |||
pdbSetBoolean $Contact Elec Fixed 1 | |||
pdbSetBoolean $Contact Hole Fixed 1 | |||
pdbSetBoolean $Contact DevPsi Fixed 1 | |||
pdbSetDouble $Contact Elec Flux.Scale 1.619e-19 | |||
pdbSetDouble $Contact Hole Flux.Scale 1.619e-19 | |||
pdbSetString $Contact DevPsi Equation "$Nd - $Na - Elec + Hole" | |||
pdbSetString $Contact Elec Equation "DevPsi - $Vt*log((Elec)/$ni) -$Contact" | |||
pdbSetString $Contact Hole Equation "DevPsi + $Vt*log((Hole)/$ni) -$Contact" | |||
} | |||
OhmicContact VSS | |||
OhmicContact GND | |||
Initial | Initial Conditions - [[PN diode example 1D - Initial conditions explanation | explanation]] | ||
#Bias contacts | |||
contact name=VSS voltage supply=0.0 | |||
contact name=GND voltage supply=0.0 | |||
#Initial Guess | |||
sel z= {(Doping>0.0) | |||
? ( 0.025*log( (Doping+$small) / $ni)) | |||
: (-0.025*log(-(Doping+$small) / $ni))} name = DevPsi | |||
sel z=$ni*exp(DevPsi/$Vt) name=Elec | |||
sel z=$ni*exp(-DevPsi/$Vt) name=Hole | |||
1st DC Solve at Equilibrium (0V) | |||
device | device | ||
puts "Electron Flux [contact name=top sol=Elec flux]" | puts "Electron Flux [contact name=top sol=Elec flux]" | ||
puts "Hole Flux [contact name=top sol=Hole flux]" | puts "Hole Flux [contact name=top sol=Hole flux]" | ||
Plot the concentration profiles | #Plot the equilibrium concentration profiles | ||
sel z=log10(abs( | foreach var {Doping Elec Hole} { | ||
sel z=log10(abs($var+1.0)) | |||
plot.1d !cle | |||
} | |||
initialize an array, bias (Vb) and counter (i), and create and new graph window | Ramp the DC Bias to make I-V plot | ||
#initialize an array, bias (Vb) and counter (i), and create and new graph window | |||
array set curr {} | array set curr {} | ||
set Vb 0.0 | set Vb 0.0 | ||
Line 95: | Line 117: | ||
set i 1 | set i 1 | ||
#Ramp from 0.0-1.2V and Plot | |||
for {set Vb 0.0} {$Vb < 1.2} {set Vb [expr $Vb+0.05]} { | for {set Vb 0.0} {$Vb < 1.2} {set Vb [expr $Vb+0.05]} { | ||
contact name=top supply = -$Vb | contact name=top supply = -$Vb | ||
set Vbias($i) -$Vb | |||
device init | |||
set curr($i) [expr ([contact name=top sol=Elec flux] - [contact name=top sol=Hole flux])] | |||
plot.1d !cle | |||
AddtoLine $Win IV -$Vb $curr($i) | |||
incr i | |||
} | } | ||
Revision as of 18:02, 5 November 2010
This example builds on the 1D resistor example, showing how to create a floods structure with a doping profile that varies with x. After solving, the example compares floods's numerical results with an analytical solution.
New Concepts
- refining the grid with non-tagged lines
- Doping=f(x) : use "sel z="
- "sel z=" if-then-else syntax (?:)
- tcl "foreach"
1D PN Diode Deck
Create 1D structure - explanation
#Grid #line x loc=0.0 spac=.01 tag=Top #line x loc=0.4 spac=0.01 #line x loc=0.7 spac=0.01 #line x loc=2.0 spac=0.05 tag=Bottom
line x loc=0.0 spac=0.1 tag=Top line x loc=0.5 spac=0.01 line x loc=1.0 spac=0.1 tag=Bottom
mater add name=Silicon region Silicon xlo=Top xhi=Bottom init #Contacts contact name=VSS Silicon xlo=-0.1 xhi=0.1 add contact name=GND Silicon xlo=0.9 xhi=1.1 add
Declare solution variables
DevicePackage solution add name=DevPsi pde solve negative damp solution add name=Elec pde solve !negative solution add name=Hole pde solve !negative
Define constants
set T 300.0 set k 1.38066e-23 set q 1.619e-19 set Vt [expr {$k*$T/$q}] set ni 1.1e10 set esi [expr 11.8 * 8.85418e-14] set eps [expr $esi / $q] set Emob 350.0 set Hmob 150.0 set small 1.0e-10
Ionized dopant profile - explanation
sel z=1.0e20*(x<0.5) name=Nd sel z=1.0e17 name=Na sel z=(Nd-Na) name=Doping
#plot doping sel z=Doping plot.1d
#sel z=1.0e20*(x<0.5)-1.0e17 name=Doping
Bulk Equations
set eqnP "$eps * grad(DevPsi) + $Doping - Elec + Hole" set eqnE "ddt(Elec) - ($Emob) * $Vt * sgrad(Elec, DevPsi/$Vt)" set eqnH "ddt(Hole) - ($Hmob) * $Vt * sgrad(Hole, -DevPsi/$Vt)" pdbSetString Silicon DevPsi Equation $eqnP pdbSetString Silicon Elec Equation $eqnE pdbSetString Silicon Hole Equation $eqnH
pdbSetDouble Silicon DevPsi DampValue $Vt pdbSetDouble Silicon DevPsi Abs.Error 1.0e-9 pdbSetDouble Silicon Elec Abs.Error 1.0e-5 pdbSetDouble Silicon Hole Abs.Error 1.0e-5
Contact Equations
proc OhmicContact {Contact} { global Vt ni Nd Na pdbSetBoolean $Contact Elec Flux 1 pdbSetBoolean $Contact Hole Flux 1 pdbSetBoolean $Contact DevPsi Flux 1 pdbSetBoolean $Contact Elec Fixed 1 pdbSetBoolean $Contact Hole Fixed 1 pdbSetBoolean $Contact DevPsi Fixed 1 pdbSetDouble $Contact Elec Flux.Scale 1.619e-19 pdbSetDouble $Contact Hole Flux.Scale 1.619e-19 pdbSetString $Contact DevPsi Equation "$Nd - $Na - Elec + Hole" pdbSetString $Contact Elec Equation "DevPsi - $Vt*log((Elec)/$ni) -$Contact" pdbSetString $Contact Hole Equation "DevPsi + $Vt*log((Hole)/$ni) -$Contact" } OhmicContact VSS OhmicContact GND
Initial Conditions - explanation
#Bias contacts contact name=VSS voltage supply=0.0 contact name=GND voltage supply=0.0
#Initial Guess sel z= {(Doping>0.0) ? ( 0.025*log( (Doping+$small) / $ni)) : (-0.025*log(-(Doping+$small) / $ni))} name = DevPsi sel z=$ni*exp(DevPsi/$Vt) name=Elec sel z=$ni*exp(-DevPsi/$Vt) name=Hole
1st DC Solve at Equilibrium (0V)
device puts "Electron Flux [contact name=top sol=Elec flux]" puts "Hole Flux [contact name=top sol=Hole flux]"
#Plot the equilibrium concentration profiles foreach var {Doping Elec Hole} { sel z=log10(abs($var+1.0)) plot.1d !cle }
Ramp the DC Bias to make I-V plot
#initialize an array, bias (Vb) and counter (i), and create and new graph window array set curr {} set Vb 0.0 set Win [CreateGraphWindow] set i 1
#Ramp from 0.0-1.2V and Plot for {set Vb 0.0} {$Vb < 1.2} {set Vb [expr $Vb+0.05]} { contact name=top supply = -$Vb set Vbias($i) -$Vb device init set curr($i) [expr ([contact name=top sol=Elec flux] - [contact name=top sol=Hole flux])] plot.1d !cle AddtoLine $Win IV -$Vb $curr($i) incr i }
Get the last few points on the IV curve to use for linear extrapolation of the built-in voltage
set l [list "$Vbias(24)" "$curr(24)" "$Vbias(23)" "$curr(23)" "$Vbias(22)" "$curr(22)" ]
Fit the data points with "Bestline". The output will give the x-intercept or built-in voltage
Bestline $l
Create a "fit" line to plot on top of IV curve using the data points and "Bestline" x-intercept result
set line [list "$Vbias(24)" "$curr(24)" "$Vbias(23)" "$curr(23)" "$Vbias(22)" "$curr(22)" 0.9998 0] CreateSingleLine $Win Vbi_fit $line
In forward bias (negative voltage applied to the top (n-type) contact), the output IV plot with the absolute value of the built-in voltage equal to 0.9998 is shown below. The built in voltage calculated by the equation Vbi=Vt*ln((Nd*Na)/ni^2) is 0.9786.