jfet: new noise model selector nlev=3 for correct noise in non-saturated region

This commit is contained in:
dwarning 2013-01-26 21:37:30 +01:00
parent 243100cc9d
commit a6bf03382d
6 changed files with 50 additions and 6 deletions

View File

@ -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")
};

View File

@ -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

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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,

View File

@ -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;