Hi,
As a friendly reminder in the first document of the series: “CMOS Analog Design Basics: an example
of transistor sizing when using the first time new techno ( e.g. 1um ) and we need NMOS transistor
in saturation with ID=400uA and VGS bias is 1.5V” as a title said our goal was to using these input
data:
- 1μ techo ( here is a Spice models of CMOS transistors ):
- Alim. of Vdd =5V
- Assuming bias VGS=1.5V
To achieve ID=400μA .
And in the past, for this purpose I have chosen a following schematic:
For the schematic I calculated and adjusted in simulation the NMOS transistor sizing W/L=17 and
LTspice simulation showed: IDS = approx. 398 μA and VDSsat= approx. 711mV.
Now I would like to replace R1 with a diode connected PMOS ( and calculate it’s sizing W/L ):
To keep everything the same it should be: ID2 = 400 μA and VDS1_sat= VD2 = 711mV.
=> VSD2 in saturation is equal: VSD2_sat = VDD - VDS1_sat
=> VSD2_sat should be equal: VSD2_sat = 5V - 711mv = 4,289 V
This is the transistor equation used for the sizing calculation:
- μ of PMOS is from the Spice model :
Step 1: Cox is calculated using following formula:
where is a constant:
and ( units are meters[m] ) is from Spice model of the transistor:
- Here is a spreadsheet to calculate Cox:
P-mos ( techno data )
|
P-mos ( calculated data )
| |||
TOX[m]
|
UO [cm^^2/Vsec]
|
Cox[F/meter ^^2)
|
Cox[fF/micro meter ^^2)
| |
2.00E-08
|
250
|
1.73E-03
|
1.73E+04
|
Or here is an Octave program that do the same Cox calculation:
#include <octave/oct.h>
syms ID min eox tox WdivL VGS VTH Cox min_times_Cox VDSsat R VDD
e0x = 3.9*8.854*power(10, -12) ;
tox = 200*power(10,-10) ; % units: m
min = 250 ;
VDD = 5 ;
Cox = e0x/tox ;
disp( "Cox =" ), disp( Cox ), disp( "units: F/m2" ) ;
Cox = (e0x/tox)*( power(10,15)/power(10,8) ) ;
disp( "or Cox =" ), disp( Cox ), disp( "units: fF/micro-m2" ) ;
Result of the Octave program run:
Cox =
0.0017265
units: F/m2
or Cox =
1.7265e+04
units: fF/micro-m2
0.0017265
units: F/m2
or Cox =
1.7265e+04
units: fF/micro-m2
Step 2: Calculating Cox * μ pmos (units: F/Vsec)
- Here is a spreadsheet to calculate Cox * μ :
P-mos ( techno data )
|
P-mos ( calculated data )
| ||||
TOX[m]
|
UO [cm^^2/Vsec]
|
Cox[F/meter ^^2)
|
Cox[fF/micro meter ^^2)
|
Cox[F/micro meter ^^2)*UO [cm^^2/Vsec]=
Cox[F/micro meter ^^2)*UO [micro meter ^^2/Vsec]*10^^4[fF/micro meter ^^2]=
Cox[F/micro meter ^^2)*UO [micro meter ^^2/Vsec]*10^^4*10^^-15[F/micro meter ^^2]
| |
2.00E-08
|
250
|
1.73E-03
|
1.73E+04
|
4.31632500E-05
|
Or here is an Octave program that do the same Cox * μ calculation:
#include <octave/oct.h>
syms ID min eox tox WdivL VGS VTH Cox min_times_Cox VDSsat R VDD
e0x = 3.9*8.854*power(10, -12) ;
tox = 200*power(10,-10) ; % units: m
min = 250 ;
VDD = 5 ;
Cox = e0x/tox ;
disp( "Cox =" ), disp( Cox ), disp( "units: F/m2" ) ;
Cox = (e0x/tox)*( power(10,15)/power(10,8) ) ;
disp( "or Cox =" ), disp( Cox ), disp( "units: fF/micro-m2" ) ;
min_times_Cox = min * Cox * power(10,4) * power(10,-15) ;
disp ( "min * Cox =" ), disp( min_times_Cox ), disp( "units: F/Vsec" ) ;
Result of the Octave program run:
Cox =
0.0017265
units: F/m2
or Cox =
1.7265e+04
units: fF/micro-m2
min * Cox =
4.3163e-05
units: F/Vsec
0.0017265
units: F/m2
or Cox =
1.7265e+04
units: fF/micro-m2
min * Cox =
4.3163e-05
units: F/Vsec
Step 3: Calculating W/L
- Summary:
- Reminder, this is the equation we are using:
- We know that we want:
- ID1 = ID2 = 400μA
- We know we need M2 transistor in saturation :
- VSD2_sat = 5V - 711mv = 4,289 V
- From techno, meaning from SPICE model, the value of Vth[V] of a PMOS transistor is:
- We already calculated Cox * μ [F/Vsec] = 1.7265*10^^4
=> W/L of M2 PMOS = 1.637 or approx. 2
Here is an Octave program that do the same W/L calculation:
#include <octave/oct.h>
syms ID min eox tox WdivL VGS VTH Cox min_times_Cox VDSsat R VDD
e0x = 3.9*8.854*power(10, -12) ;
tox = 200*power(10,-10) ; % units: m
min = 250 ;
VDD = 5 ;
Cox = e0x/tox ;
disp( "Cox =" ), disp( Cox ), disp( "units: F/m2" ) ;
Cox = (e0x/tox)*( power(10,15)/power(10,8) ) ;
disp( "or Cox =" ), disp( Cox ), disp( "units: fF/micro-m2" ) ;
min_times_Cox = min * Cox * power(10,4) * power(10,-15) ;
disp ( "min * Cox =" ), disp( min_times_Cox ), disp( "units: F/Vsec" ) ;
f = -ID + (1/2)*min_times_Cox*(WdivL)*power((VGS-VTH),2)
% Substitute in values that are known
newf = subs(f, [ID VGS VTH], [( 400*power(10, -6) ), (VDD - 0.711), 0.9]);
% Solve the resulting symbolic expression for x
result = solve(newf == 0, WdivL)
% And if you need a numeric (rather than symbolic) result
double(result)
Result of the Octave program run:
Cox =
0.0017265
units: F/m2
or Cox =
1.7265e+04
units: fF/micro-m2
min * Cox =
4.3163e-05
units: F/Vsec
f = (sym)
result = (sym)
ans = 1.6137
0.0017265
units: F/m2
or Cox =
1.7265e+04
units: fF/micro-m2
min * Cox =
4.3163e-05
units: F/Vsec
f = (sym)
result = (sym)
ans = 1.6137
As a sanity check let’s verify do we really have VSD2_sat = 5V - 711mv = 4,289 V when using M2 PMOS sizing W/L = 2 and after calculations result is VSD2_sat = 3.0442V ( expecting 4.289V )
Here is an Octave program that do the same VSD2_sat calculation:
#include <octave/oct.h>
syms ID min eox tox WdivL VGS VTH Cox min_times_Cox VDSsat R VDD
e0x = 3.9*8.854*power(10, -12) ;
tox = 200*power(10,-10) ; % units: m
min = 250 ;
VDD = 5 ;
Cox = e0x/tox ;
disp( "Cox =" ), disp( Cox ), disp( "units: F/m2" ) ;
Cox = (e0x/tox)*( power(10,15)/power(10,8) ) ;
disp( "or Cox =" ), disp( Cox ), disp( "units: fF/micro-m2" ) ;
min_times_Cox = min * Cox * power(10,4) * power(10,-15) ;
disp ( "min * Cox =" ), disp( min_times_Cox ), disp( "units: F/Vsec" ) ;
f = -ID + (1/2)*min_times_Cox*(WdivL)*power((VGS-VTH),2)
% Substitute in values that are known
newf = subs(f, [ID VGS VTH], [( 400*power(10, -6) ), (VDD - 0.711), 0.9]);
% Solve the resulting symbolic expression for x
result = solve(newf == 0, WdivL)
% And if you need a numeric (rather than symbolic) result
double(result)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
f = -ID + (1/2)*min_times_Cox*(WdivL)*power(VDSsat,2)
% Substitute in values that are known
newf = subs(f, [ID WdivL] , [( 400*power(10, -6) ), 2 ]);
% Solve the resulting symbolic expression for x
result = solve(newf == 0,VDSsat)
% And if you need a numeric (rather than symbolic) result
double(result)
Result of the Octave program run:
Cox =
0.0017265
units: F/m2
or Cox =
1.7265e+04
units: fF/micro-m2
min * Cox =
4.3163e-05
units: F/Vsec
f = (sym)
result = (sym)
ans = 1.6137
f = (sym)
result = (sym 2×1 matrix)
⎡-√45409 ⎤
⎢────────⎥
⎢ 70 ⎥
⎢ ⎥
⎢ √45409 ⎥
⎢ ────── ⎥
⎣ 70 ⎦
ans =
-3.0442
3.0442
0.0017265
units: F/m2
or Cox =
1.7265e+04
units: fF/micro-m2
min * Cox =
4.3163e-05
units: F/Vsec
f = (sym)
result = (sym)
ans = 1.6137
f = (sym)
result = (sym 2×1 matrix)
⎡-√45409 ⎤
⎢────────⎥
⎢ 70 ⎥
⎢ ⎥
⎢ √45409 ⎥
⎢ ────── ⎥
⎣ 70 ⎦
ans =
-3.0442
3.0442
Source code of Octave program is here: octave program
Step 4: Verifying that when we have an PMOS ( in the techno used ) with W/L = 2 and and we want VSD2_sat = 4,289 V and alim. for this techno is VDD=5V, then the transistor M2 PMOS should be in saturation with ID = 400μA
- For this verification I will use LTSpice simulation of following schematic:
Note*: We expect VDS1_sat minimum to be VGS1 - Vth nmos = 1.5 - 0.8 = 0.7V
=> we expect that in this schematic VDS2_sat max. = VDD - VDS1_sat min. = 4.3V
LTspice simulation showed: ID2=ID1 = approx. 276 μA (expected 400 μA ) and VDS1_sat= 0.244V ( expected result: 711mV ) which is too low so M1 is not even in saturation.
Finally, by adjusting of M2 PMOS sizing W/L from 2 to 8, LTspice simulation showed: ID1 = 400.1 μA and VDS1_sat= 981mV
© 2011 ASIC Stoic. All rights reserved.