diff --git a/src/spicelib/devices/jfet/jfet.c b/src/spicelib/devices/jfet/jfet.c index b09c7f131..2db17d4f7 100644 --- a/src/spicelib/devices/jfet/jfet.c +++ b/src/spicelib/devices/jfet/jfet.c @@ -70,7 +70,9 @@ IFparm JFETmPTable[] = { /* model parameters */ IOP("kf", JFET_MOD_KF, IF_REAL, "Flicker Noise Coefficient"), IOP("af", JFET_MOD_AF, IF_REAL, "Flicker Noise Exponent"), IOP("tcv", JFET_MOD_TCV, IF_REAL, "Threshold voltage temperature coefficient"), - IOP("bex", JFET_MOD_BEX, IF_REAL, "Mobility temperature exponent") + IOP("bex", JFET_MOD_BEX, IF_REAL, "Mobility temperature exponent"), + IOP("nlev",JFET_MOD_NLEV, IF_INTEGER, "Noise equation selector"), + IOP("gdsnoi", JFET_MOD_GDSNOI, IF_REAL, "Channel noise coefficient") }; diff --git a/src/spicelib/devices/jfet/jfetdefs.h b/src/spicelib/devices/jfet/jfetdefs.h index e451d1d34..90e0f7d73 100644 --- a/src/spicelib/devices/jfet/jfetdefs.h +++ b/src/spicelib/devices/jfet/jfetdefs.h @@ -188,7 +188,8 @@ typedef struct sJFETmodel { /* model structure for a jfet */ double JFETdepletionCapCoeff; double JFETfNcoef; double JFETfNexp; - + int JFETnlev; + double JFETgdsnoi; double JFETdrainConduct; double JFETsourceConduct; @@ -218,6 +219,8 @@ typedef struct sJFETmodel { /* model structure for a jfet */ unsigned JFETtnomGiven : 1; /* user specified Tnom for model */ unsigned JFETfNcoefGiven : 1; unsigned JFETfNexpGiven : 1; + unsigned JFETnlevGiven : 1; + unsigned JFETgdsnoiGiven : 1; unsigned JFETtcvGiven : 1; unsigned JFETbexGiven : 1; @@ -261,6 +264,8 @@ typedef struct sJFETmodel { /* model structure for a jfet */ /* end Sydney University mod */ #define JFET_MOD_TCV 117 #define JFET_MOD_BEX 118 +#define JFET_MOD_NLEV 119 +#define JFET_MOD_GDSNOI 120 /* device questions */ #define JFET_DRAINNODE 301 diff --git a/src/spicelib/devices/jfet/jfetmask.c b/src/spicelib/devices/jfet/jfetmask.c index 2b01d0f25..6005225d6 100644 --- a/src/spicelib/devices/jfet/jfetmask.c +++ b/src/spicelib/devices/jfet/jfetmask.c @@ -89,6 +89,12 @@ JFETmAsk(CKTcircuit *ckt, GENmodel *inModel, int which, IFvalue *value) else value->sValue = "pjf"; return(OK); + case JFET_MOD_NLEV: + value->iValue = model->JFETnlev; + return(OK); + case JFET_MOD_GDSNOI: + value->rValue = model->JFETgdsnoi; + return(OK); default: return(E_BADPARM); } diff --git a/src/spicelib/devices/jfet/jfetmpar.c b/src/spicelib/devices/jfet/jfetmpar.c index 8f8a4a83a..50f347d70 100644 --- a/src/spicelib/devices/jfet/jfetmpar.c +++ b/src/spicelib/devices/jfet/jfetmpar.c @@ -94,6 +94,14 @@ JFETmParam(int param, IFvalue *value, GENmodel *inModels) model->JFETbexGiven = TRUE; model->JFETbex = value->rValue; break; + case JFET_MOD_NLEV: + model->JFETnlevGiven = TRUE; + model->JFETnlev = value->iValue; + break; + case JFET_MOD_GDSNOI: + model->JFETgdsnoiGiven = TRUE; + model->JFETgdsnoi = value->rValue; + break; default: return(E_BADPARM); } diff --git a/src/spicelib/devices/jfet/jfetnoi.c b/src/spicelib/devices/jfet/jfetnoi.c index 291a2aa1f..72e3d8559 100644 --- a/src/spicelib/devices/jfet/jfetnoi.c +++ b/src/spicelib/devices/jfet/jfetnoi.c @@ -35,6 +35,7 @@ JFETnoise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, Ndata * double noizDens[JFETNSRCS]; double lnNdens[JFETNSRCS]; int i; + double vgs, vds, vgst, alpha, beta; /* define the names of the noise sources */ @@ -112,10 +113,26 @@ JFETnoise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, Ndata * inst->JFETsourceNode,model->JFETsourceConduct * inst->JFETarea * inst->JFETm); - NevalSrc(&noizDens[JFETIDNOIZ],&lnNdens[JFETIDNOIZ], - ckt,THERMNOISE,inst->JFETdrainPrimeNode, - inst->JFETsourcePrimeNode, - (2.0/3.0 * inst->JFETm * fabs(*(ckt->CKTstate0 + inst->JFETgm)))); + if (model->JFETnlev < 3) { + NevalSrc(&noizDens[JFETIDNOIZ],&lnNdens[JFETIDNOIZ], + ckt,THERMNOISE,inst->JFETdrainPrimeNode, + inst->JFETsourcePrimeNode, + (2.0/3.0 * inst->JFETm * fabs(*(ckt->CKTstate0 + inst->JFETgm)))); + } else { + vgs = *(ckt->CKTstate0 + inst->JFETvgs); + vds = vgs - *(ckt->CKTstate0 + inst->JFETvgd); + vgst = vgs - inst->JFETtThreshold; + if (vgst >= vds) + alpha = 1 - vds/vgst; /* linear region */ + else + alpha = 0; /* saturation region */ + beta = inst->JFETtBeta * inst->JFETarea * inst->JFETm; + + NevalSrc(&noizDens[JFETIDNOIZ],&lnNdens[JFETIDNOIZ], + ckt,THERMNOISE,inst->JFETdrainPrimeNode, + inst->JFETsourcePrimeNode, + (2.0/3.0 * beta*vgst*(1+alpha+alpha*alpha)/(1+alpha)*model->JFETgdsnoi)); + } NevalSrc(&noizDens[JFETFLNOIZ], NULL, ckt, N_GAIN,inst->JFETdrainPrimeNode, diff --git a/src/spicelib/devices/jfet/jfetset.c b/src/spicelib/devices/jfet/jfetset.c index f7c6bcb30..b23b4a8a8 100644 --- a/src/spicelib/devices/jfet/jfetset.c +++ b/src/spicelib/devices/jfet/jfetset.c @@ -81,6 +81,12 @@ JFETsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) if(!model->JFETbexGiven) { model->JFETbex = 0.0; } + if(!model->JFETnlevGiven) { + model->JFETnlev = 2; + } + if(!model->JFETgdsnoiGiven) { + model->JFETgdsnoi = 1.0; + } if(model->JFETdrainResist != 0) { model->JFETdrainConduct = 1/model->JFETdrainResist;