jfet: new noise model selector nlev=3 for correct noise in non-saturated region
This commit is contained in:
parent
243100cc9d
commit
a6bf03382d
|
|
@ -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")
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue