From 7e39c10bee070ba21c068670a59b58e6e56c0028 Mon Sep 17 00:00:00 2001 From: dwarning Date: Wed, 13 Mar 2024 21:55:38 +0100 Subject: [PATCH] introduce jfet gate-drain and gate-source junction emission coefficient --- src/spicelib/devices/jfet/jfet.c | 1 + src/spicelib/devices/jfet/jfetdefs.h | 3 +++ src/spicelib/devices/jfet/jfetload.c | 2 +- src/spicelib/devices/jfet/jfetmask.c | 3 +++ src/spicelib/devices/jfet/jfetmpar.c | 4 ++++ src/spicelib/devices/jfet/jfetset.c | 3 +++ src/spicelib/devices/jfet/jfettemp.c | 7 ++++--- 7 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/spicelib/devices/jfet/jfet.c b/src/spicelib/devices/jfet/jfet.c index 29fc05982..f6da2ab18 100644 --- a/src/spicelib/devices/jfet/jfet.c +++ b/src/spicelib/devices/jfet/jfet.c @@ -62,6 +62,7 @@ IFparm JFETmPTable[] = { /* model parameters */ IOPA("cgd", JFET_MOD_CGD, IF_REAL,"G-D junction cap"), IOP("pb", JFET_MOD_PB, IF_REAL,"Gate junction potential"), IOP("is", JFET_MOD_IS, IF_REAL,"Gate junction saturation current"), + IOP("n", JFET_MOD_N, IF_REAL, "Emission Coefficient for gate-drain and gate-source diodes"), IOP("fc", JFET_MOD_FC, IF_REAL,"Forward bias junction fit parm."), /* Modification for Sydney University JFET model */ IOP("b", JFET_MOD_B, IF_REAL,"Doping tail parameter"), diff --git a/src/spicelib/devices/jfet/jfetdefs.h b/src/spicelib/devices/jfet/jfetdefs.h index c37a15fbd..3f25524bc 100644 --- a/src/spicelib/devices/jfet/jfetdefs.h +++ b/src/spicelib/devices/jfet/jfetdefs.h @@ -211,6 +211,7 @@ typedef struct sJFETmodel { /* model structure for a jfet */ double JFETcapGD; double JFETgatePotential; double JFETgateSatCurrent; + double JFETemissionCoeff; double JFETdepletionCapCoeff; double JFETfNcoef; double JFETfNexp; @@ -242,6 +243,7 @@ typedef struct sJFETmodel { /* model structure for a jfet */ unsigned JFETcapGDGiven : 1; unsigned JFETgatePotentialGiven : 1; unsigned JFETgateSatCurrentGiven : 1; + unsigned JFETemissionCoeffGiven: 1; unsigned JFETdepletionCapCoeffGiven : 1; /* Modification for Sydney University JFET model */ unsigned JFETbGiven : 1; @@ -290,6 +292,7 @@ enum { JFET_MOD_CGD, JFET_MOD_PB, JFET_MOD_IS, + JFET_MOD_N, JFET_MOD_FC, JFET_MOD_NJF, JFET_MOD_PJF, diff --git a/src/spicelib/devices/jfet/jfetload.c b/src/spicelib/devices/jfet/jfetload.c index cc0fc2d28..b1e0ac106 100644 --- a/src/spicelib/devices/jfet/jfetload.c +++ b/src/spicelib/devices/jfet/jfetload.c @@ -224,7 +224,7 @@ JFETload(GENmodel *inModel, CKTcircuit *ckt) */ vds=vgs-vgd; - vt_temp=here->JFETtemp*CONSTKoverQ; + vt_temp=here->JFETtemp*CONSTKoverQ*model->JFETemissionCoeff; if (vgs < -3*vt_temp) { arg=3*vt_temp/(vgs*CONSTe); arg = arg * arg * arg; diff --git a/src/spicelib/devices/jfet/jfetmask.c b/src/spicelib/devices/jfet/jfetmask.c index cc18dbaf8..853eed21c 100644 --- a/src/spicelib/devices/jfet/jfetmask.c +++ b/src/spicelib/devices/jfet/jfetmask.c @@ -62,6 +62,9 @@ JFETmAsk(CKTcircuit *ckt, GENmodel *inModel, int which, IFvalue *value) case JFET_MOD_IS: value->rValue = model->JFETgateSatCurrent; return(OK); + case JFET_MOD_N: + value->rValue = model->JFETemissionCoeff; + return(OK); case JFET_MOD_FC: value->rValue = model->JFETdepletionCapCoeff; return(OK); diff --git a/src/spicelib/devices/jfet/jfetmpar.c b/src/spicelib/devices/jfet/jfetmpar.c index 4eac5efe0..459bc9e6f 100644 --- a/src/spicelib/devices/jfet/jfetmpar.c +++ b/src/spicelib/devices/jfet/jfetmpar.c @@ -58,6 +58,10 @@ JFETmParam(int param, IFvalue *value, GENmodel *inModels) model->JFETgateSatCurrentGiven = TRUE; model->JFETgateSatCurrent = value->rValue; break; + case JFET_MOD_N: + model->JFETemissionCoeff = value->rValue; + model->JFETemissionCoeffGiven = TRUE; + break; case JFET_MOD_FC: model->JFETdepletionCapCoeffGiven = TRUE; model->JFETdepletionCapCoeff = value->rValue; diff --git a/src/spicelib/devices/jfet/jfetset.c b/src/spicelib/devices/jfet/jfetset.c index 662549662..729b7c01d 100644 --- a/src/spicelib/devices/jfet/jfetset.c +++ b/src/spicelib/devices/jfet/jfetset.c @@ -59,6 +59,9 @@ JFETsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) if(!model->JFETgateSatCurrentGiven) { model->JFETgateSatCurrent = 1e-14; } + if(!model->JFETemissionCoeffGiven) { + model->JFETemissionCoeff = 1; + } if(!model->JFETdepletionCapCoeffGiven) { model->JFETdepletionCapCoeff = .5; } diff --git a/src/spicelib/devices/jfet/jfettemp.c b/src/spicelib/devices/jfet/jfettemp.c index ab43aaf33..a9ab5bd6c 100644 --- a/src/spicelib/devices/jfet/jfettemp.c +++ b/src/spicelib/devices/jfet/jfettemp.c @@ -22,7 +22,7 @@ JFETtemp(GENmodel *inModel, CKTcircuit *ckt) JFETmodel *model = (JFETmodel*)inModel; JFETinstance *here; double xfc; - double vt; + double vt, vtn; double vtnom; double kt,kt1; double arg,arg1; @@ -87,12 +87,13 @@ JFETtemp(GENmodel *inModel, CKTcircuit *ckt) here->JFETtemp = ckt->CKTtemp + here->JFETdtemp; } vt = here->JFETtemp * CONSTKoverQ; + vtn = vt * model->JFETemissionCoeff; fact2 = here->JFETtemp/REFTEMP; ratio1 = here->JFETtemp/model->JFETtnom -1; if (model->JFETxtiGiven) { - here->JFETtSatCur = model->JFETgateSatCurrent * exp(ratio1*model->JFETeg/vt) * pow(ratio1+1,model->JFETxti); + here->JFETtSatCur = model->JFETgateSatCurrent * exp(ratio1*model->JFETeg/vtn) * pow(ratio1+1,model->JFETxti); } else { - here->JFETtSatCur = model->JFETgateSatCurrent * exp(ratio1*model->JFETeg/vt); + here->JFETtSatCur = model->JFETgateSatCurrent * exp(ratio1*model->JFETeg/vtn); } here->JFETtCGS = model->JFETcapGS * cjfact; here->JFETtCGD = model->JFETcapGD * cjfact;