2REM MOS CIRCUIT SIMULATION BY ITERATIVE TIME ANALYSIS 3REM--------------------------------------------------------------- 100K=30 120 MAXNODES=16:MAXDEV=8 130K=30 140NTRANS=0:NINPUTS=0:NUNKNOWN=0:MAXCHANGE=0:DT=1 150 DIM V(MAXNODES),LASTV(MAXNODES),I(MAXNODES),C(MAXNODES) 160DIM T(MAXDEV),L(MAXDEV),W(MAXDEV),S(MAXDEV),G(MAXDEV),D(MAXDEV) 170FOR I%=1 TO MAXNODES:C(MAXNODES)=0:NEXT 180 185 PROC_DEFINE_CIRCUIT 190TMAX=100:DT=1:VCRIT=0.1:OMEGA=1 200MODE1:PROC_AXES(TMAX) 201GCOL 0,2 205LASTT=0 210FORT%=0TO60 215FORI%=1TONINPUTS 216GCOL0,I% 217IFI%<>VDD PROC_PLOT(LASTT,FN_VOLTAGE(I%,LASTT),T%,FN_VOLTAGE(I%,T%)) 225NEXT 227LASTT=T% 230NEXT 240 241GCOL 0,2 250PROC_INITIALISE_VOLTAGES 260REPEAT:PROC_TIMESTEP:UNTILT%>=TMAX 990END 995REM--------------------------------------------------------------- 1000 DEFPROC_AXES (TMAX) 1020LOCAL I% 1025 VDU 5 1030YFAC=100 1040MOVE 150,150+5*YFAC:DRAW 150,150:DRAW 1200,150 1050FOR I%=0 TO 5:MOVE 100,160+I%*YFAC:PRINT ;I% 1060MOVE 140,150+I%*YFAC:DRAW 150,150+I%*YFAC:NEXT 1070XFAC=1050/TMAX 1110 VDU4 1120ENDPROC 1125REM--------------------------------------------------------------- 1130DEFPROC_PLOT (T1,V1,T2,V2) 1140MOVE 150+XFAC*T1,150+YFAC*V1 1150DRAW 150+XFAC*T2,150+YFAC*V2 1160ENDPROC 1190REM--------------------------------------------------------------- 1590REM--------------------------------------------------------------- 1600DEFPROC_TIMESTEP 1610LOCAL N%,TEMP 1612FOR N%=1 TO NINPUTS 1614LASTV(N%)=V(N%):V(N%)=FN_VOLTAGE(N%,T%):NEXT 1619V%=MAXNODES+1-NUNKNOWN 1620FOR N%=V%TOMAXNODES 1625TEMP=LASTV(N%):Z=V(N%):LASTV(N%)=Z:V(N%)=Z+DT*(Z-TEMP)/(T%-LASTT):NEXT 1650REPEAT 1655 MAXCHANGE=0 1660FOR F%=0 TO MAXNODES:I(F%)=0:NEXT 1670FORN%=1TONTRANS 1671S%=S(N%):R%=D(N%):IFV(S%)>V(R%)S%=R%:R%=S(N%) 1672VDS=V(R%)-V(S%):BETA=K*W(N%)/L(N%):VGE=V(G(N%))-V(S%)-T(N%):IFVGE<0GOTO1680 1673IFVDS>VGE THENVDS=VGE 1674IDS=BETA*VDS*(VGE-VDS/2) 1675I(S%)=I(S%)+IDS 1676I(R%)=I(R%)-IDS 1680NEXT 1690FOR N%=V%TOMAXNODES 1691VV=V(N%):C1=LASTV(N%)+(DT*I(N%)/(C(N%)))-VV 1692IFABS(C1)>MAXCHANGE THENMAXCHANGE=ABS(C1) 1693V(N%)=VV+(OMEGA*C1) 1709NEXT 1710UNTIL MAXCHANGE<=VCRIT 1720FORN%=V%TOMAXNODES:GCOL0,N%-V%+1:PROC_PLOT(LASTT,LASTV(N%),T%,V(N%)):NEXT 1735LASTT=T% 1740T%=T%+DT 1750ENDPROC 1760REM--------------------------------------------------------------- 2000DEFFN_AN_INPUT 2010NINPUTS=NINPUTS+1 2020=NINPUTS 2030ENDPROC 2040REM-------------------------------------------------------------- 2050DEFFN_A_NODE 2060NUNKNOWN=NUNKNOWN+1 2070=MAXNODES+1-NUNKNOWN 2080ENDPROC 2090REM-------------------------------------------------------------- 2100DEFFN_NENH (W%,L%,GATE%,SOURCE%,DRAIN%) 2110NTRANS=NTRANS+1 2120C(GATE%)=C(GATE%)+(W%*L%*7*4) 2130G(NTRANS)=GATE% 2140S(NTRANS)=SOURCE% 2150D(NTRANS)=DRAIN% 2160W(NTRANS)=W% 2170 L(NTRANS)=L% 2172T(NTRANS)=1 2175=NTRANS 2180ENDPROC 2190REM-------------------------------------------------------------- 2200DEFFN_PULLUP (W%,L%,SOURCE%,DRAIN%) 2210NTRANS=NTRANS+1 2220C(SOURCE%)=C(SOURCE%)+(W%*L%*7*4) 2230G(NTRANS)=SOURCE% 2240S(NTRANS)=SOURCE% 2250D(NTRANS)=DRAIN% 2260W(NTRANS)=W% 2270L(NTRANS)=L% 2275T(NTRANS)=-4 2280IF W%>L% THEN PRINT "?? Wide pullup transistor no ";ntrans;" ??" 2290=NTRANS 2300ENDPROC 2310REM------------------------------------------------------------- 2320 DEFPROC_FANOUT (N%,NODE%) 2330C(NODE%)=C(NODE%)+(N%*2*2*7*4) 2340ENDPROC 2390REM------------------------------------------------------------- 2400DEFFN_RISING (TSTART,TEND,T) 2410LOCAL X 2415X=5*(T-TSTART)/(TEND-TSTART) 2420IF TTEND THEN X=5 2440=X 2450ENDPROC 2490REM-------------------------------------------------------------- 2500DEFPROC_INITIALISE_VOLTAGES 2510LOCAL I% 2520FOR I%=1 TO NINPUTS 2530LASTV(I%)=FN_VOLTAGE(I%,0) 2540V(I%)=LASTV(I%) 2550NEXT 2560FOR I%=MAXNODES+1-NUNKNOWN TO MAXNODES 2570LASTV(I%)=FN_VOLTAGE(I%,0):V(I%)=LASTV(I%) 2580NEXT 2590LASTT=0:T%=DT 2600ENDPROC 9000REM------------------------------------------------------------- 9005DEFPROC_DEFINE_CIRCUIT 9010REM INVERTER TRANSIENT PROBLEM 9020VDD=FN_AN_INPUT 9030GND=FN_AN_INPUT 9040IN=FN_AN_INPUT 9050OUT=FN_A_NODE 9060PULLDOWN=FN_NENH (6,2,IN,GND,OUT) 9070PULLUP=FN_PULLUP (2,6,OUT,VDD) 9072 OUT2=FN_A_NODE 9073 PULLDOWN2=FN_NENH (6,2,OUT,GND,OUT2) 9074 PULLUP2=FN_PULLUP (2,6,OUT2,VDD) 9075 OUT3=FN_A_NODE 9076 PD3=FN_NENH(6,2,OUT2,GND,OUT3) 9077PU3=FN_PULLUP(2,6,OUT3,VDD) 9084ENDPROC 9085REM--------------------------------------------------------------- 9090DEFFN_VOLTAGE (NODE%,T%) 9100LOCAL X 9102X=1 9105IF NODE%=IN THEN X=FN_RISING(5,10,T%) 9106 IF (NODE%=IN) AND (T%>50) THEN =0 9110IF NODE%=VDD THEN =5 9120IF NODE%=GND THEN =0 9135IFT%=0AND(NODE%=OUT ORNODE%=OUT3)THEN=4.8 9900REM-------------------------------------------------------------- 9991=X