Browse Source

Fix VDMOSmode dependency.

pre-master-46
dwarning 7 years ago
committed by Holger Vogt
parent
commit
25b13d9dde
  1. 13
      src/spicelib/devices/vdmos/vdmosload.c

13
src/spicelib/devices/vdmos/vdmosload.c

@ -285,7 +285,7 @@ VDMOSload(GENmodel *inModel, CKTcircuit *ckt)
vgst = (here->VDMOSmode == 1 ? vgs : vgd) - von; vgst = (here->VDMOSmode == 1 ? vgs : vgd) - von;
vdsat = MAX(vgst, 0); vdsat = MAX(vgst, 0);
if (model->VDMOSksubthresGiven) { if (model->VDMOSksubthresGiven) {
/* Alternative simple weak inversion model, according to https://www.anasoft.co.uk/MOS1Model.htm
/* Alternative simple weak inversion model, according to https://www.anasoft.co.uk/MOS1Model.htm
* Scale the voltage overdrive vgst logarithmically in weak inversion. * Scale the voltage overdrive vgst logarithmically in weak inversion.
* Best fits LTSPICE curves with shift=0 * Best fits LTSPICE curves with shift=0
* Drain current including subthreshold current */ * Drain current including subthreshold current */
@ -298,8 +298,7 @@ VDMOSload(GENmodel *inModel, CKTcircuit *ckt)
/* scale vds with mtr (except with lambda) */ /* scale vds with mtr (except with lambda) */
double vdss = vds*mtr*here->VDMOSmode; double vdss = vds*mtr*here->VDMOSmode;
double dvdssdvds = mtr*here->VDMOSmode;
double t0 = 1 + lambda*vds*here->VDMOSmode;
double t0 = 1 + lambda*vds;
double t1 = 1 + theta*vgs; double t1 = 1 + theta*vgs;
betap = Beta*t0/t1; betap = Beta*t0/t1;
double dbetapdvgs = -Beta*theta*t0/(t1*t1); double dbetapdvgs = -Beta*theta*t0/(t1*t1);
@ -314,14 +313,12 @@ VDMOSload(GENmodel *inModel, CKTcircuit *ckt)
cdrain = betap*vgst*vgst*.5; cdrain = betap*vgst*vgst*.5;
here->VDMOSgm = betap*vgst*dvgstdvgs + 0.5*dbetapdvgs*vgst*vgst; here->VDMOSgm = betap*vgst*dvgstdvgs + 0.5*dbetapdvgs*vgst*vgst;
here->VDMOSgds = .5*dbetapdvds*vgst*vgst; here->VDMOSgds = .5*dbetapdvds*vgst*vgst;
printf("s1 vds: %g vgs: %g cd: %g gds: %g gm: %g\n", vds, vgs, cdrain, here->VDMOSgds, here->VDMOSgm);
} }
else { else {
/* linear region */ /* linear region */
cdrain = betap * vdss * (vgst - .5 * vdss); cdrain = betap * vdss * (vgst - .5 * vdss);
here->VDMOSgm = betap*vdss*dvgstdvgs + vdss*dbetapdvgs*(vgst-.5*vdss); here->VDMOSgm = betap*vdss*dvgstdvgs + vdss*dbetapdvgs*(vgst-.5*vdss);
here->VDMOSgds = vdss*dbetapdvds*(vgst-.5*vdss) + betap*dvdssdvds*(vgst-.5*vdss) - .5*vdss*betap*dvdssdvds;
printf("l1 vds: %g vgs: %g cd: %g gds: %g gm: %g\n", vds, vgs, cdrain, here->VDMOSgds, here->VDMOSgm);
here->VDMOSgds = vdss*dbetapdvds*(vgst-.5*vdss) + betap*mtr*(vgst-.5*vdss) - .5*vdss*betap*mtr;
} }
} }
else if (model->VDMOSsubslGiven) { else if (model->VDMOSsubslGiven) {
@ -370,7 +367,6 @@ printf("l1 vds: %g vgs: %g cd: %g gds: %g gm: %g\n", vds, vgs, cdrain, here->VDM
cdrain = betap*vgst*vgst*.5; cdrain = betap*vgst*vgst*.5;
here->VDMOSgm = betap*vgst * fgate + dfgdvg * cdrain; here->VDMOSgm = betap*vgst * fgate + dfgdvg * cdrain;
here->VDMOSgds = model->VDMOSlambda*Betam*vgst*vgst*.5; here->VDMOSgds = model->VDMOSlambda*Betam*vgst*vgst*.5;
printf("s2 vds: %g vgs: %g cd: %g gds: %g gm: %g\n", vds, vgs, cdrain, here->VDMOSgds, here->VDMOSgm);
} else { } else {
/* /*
* linear region * linear region
@ -382,7 +378,6 @@ printf("s2 vds: %g vgs: %g cd: %g gds: %g gm: %g\n", vds, vgs, cdrain, here->VDM
model->VDMOSlambda * Betam * model->VDMOSlambda * Betam *
(vds * here->VDMOSmode) * mtr * (vds * here->VDMOSmode) * mtr *
(vgst - .5 * (vds * here->VDMOSmode) * mtr); (vgst - .5 * (vds * here->VDMOSmode) * mtr);
printf("l2 vds: %g vgs: %g cd: %g gds: %g gm: %g\n", vds, vgs, cdrain, here->VDMOSgds, here->VDMOSgm);
} }
} }
} }
@ -527,7 +522,7 @@ bypass :
double vdsn = model->VDMOStype * ( double vdsn = model->VDMOStype * (
*(ckt->CKTrhsOld + here->VDMOSdNode) - *(ckt->CKTrhsOld + here->VDMOSdNode) -
*(ckt->CKTrhsOld + here->VDMOSsNode)); *(ckt->CKTrhsOld + here->VDMOSsNode));
double rd = model->VDMOSdrainResistance + model->VDMOSqsResistance *
double rd = model->VDMOSdrainResistance + model->VDMOSqsResistance *
(vdsn / (vdsn + fabs(model->VDMOSqsVoltage))); (vdsn / (vdsn + fabs(model->VDMOSqsVoltage)));
here->VDMOSdrainConductance = 1 / rd; here->VDMOSdrainConductance = 1 / rd;
} }

Loading…
Cancel
Save