Friday, February 8, 2019

Part #2: 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



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


  • 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


  • 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


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

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.