📄 bjt.va
字号:
Vtn = Vt * Nc;
if (Vbci > -5 * Vtn) begin
Ibc1 = IS_T * (exp_soft(Vbci / (Nr * Vt)) - 1);
Ibc2 = ISC_T * (exp_soft(Vbci / (Nc * Vt)) - 1);
end
else begin
Ibc1 = - IS_T + `SPICE_GMIN * Vbci;
Ibc2 = - ISC_T;
end
Kq1 = 1 / (1 - Vbci / vaf - Vbe / var);
Kq2 = Ibe1 / Ikf + Ibc1 / Ikr;
Kqb = Kq1 * (1 + pow(1 + 4 * Kq2, Nk)) / 2;
if (Irb == 1e9 || Irb == 0) begin
rb = (Rbm + (Rb - Rbm) / Kqb) / Area;
end
else begin
Ib = Area * (Ibe1/BF_T + Ibe2 + Ibc1/BR_T + Ibc2);
if (Ib >= 0) begin
Jrb = Area * Irb;
Ib_Jrb = Ib / Jrb;
Ib_Jrb = max(Ib_Jrb, 1e-9);
if (RbModel == 0) begin
T0 = pow(Ib_Jrb, 0.852);
T1 = 1.0+3.0*T0;
rb = Rbm + (Rb - Rbm)/sqrt(T1);
end
else begin
T0 = sqrt(1.0 + `PI_SQ_144 * Ib_Jrb);
T1 = `PI_SQ_24 * sqrt(Ib_Jrb);
x = (-1.0 + T0) / T1;
tanx = tan(x);
rb = (Rbm + 3.0 * (Rb - Rbm) * (tanx - x) /
(x * tanx * tanx)) / Area;
end
end
else
rb = Rb / Area;
end
if (rb)
i_rb = Vbi / rb;
// Base-emitter diffusion
if (Ibe1 + Itf != 0.0) begin
t0 = Ibe1 / (Ibe1 + Itf);
tff = Tf * (1 + Xtf * t0 * t0 * exp_soft(Vbci / (1.44 * vtf)));
end
else
tff = 0.0;
t3 = 1 - Fc;
// Calc base-emitter junction capacitance
Cje0 = Cje;
if (Mje == 1.0) begin
Cje_1 = Cje0 / t3;
Cje_2 = 1.0 / (Vje * t3);
Qje0 = Cje0 * Vje* (0.5 + ln(Vje * t3));
end
else begin
Cje_1 = Cje0/pow(t3, Mje);
Cje_2 = Mje / (Vje * t3);
Qje0 = Cje_1 / (2.0 * Cje_2) * (1.0 + Mje) / (1.0 - Mje);
end
fcpe = Fc * Vje;
if (Vbe <= fcpe) begin
vdiff = Vje - Vbe;
if (Mje == 1.0)
Qje = -Cje0 * Vje * ln(vdiff);
else if (Mje == 0.5)
Qje = -2.0 * vdiff * Cje0 / sqrt(vdiff / Vje);
else
Qje = -Cje0 * pow(vdiff / Vje, -Mje) * vdiff / (1.0 - Mje);
Qje = Qje + Qje0;
end
else begin
t1 = 1.0 + Cje_2 * (Vbe - fcpe);
Qje = Cje_1 * t1 * t1 / (2.0 * Cje_2);
end
Qbe = tff * Ibe1 / Kqb + Qje;
// Intrinsic base-collector junction capacitance
Cjc0 = Cjc;
if (Mjc == 1.0) begin
Cjc_1 = Cjc0 / t3;
Cjc_2 = 1.0 / (Vjc * t3);
Qjc0 = Cjc0 * Vjc * (0.5 + ln(Vjc * t3));
end
else begin
Cjc_1 = Cjc0 / pow(t3, Mjc);
Cjc_2 = Mjc / (Vjc * t3);
Qjc0 = Cjc_1 / (2.0 * Cjc_2) * (1.0 + Mjc) / (1.0 - Mjc);
end
fcpc = Fc * Vjc;
if (Vbci <= fcpc) begin
vdiff = Vjc - Vbci;
if (Mjc == 1.0)
Qjc = -ln(vdiff) * Cjc0 * Vjc;
else if (Mjc == 0.5)
Qjc = -2.0 * vdiff * Cjc0 / sqrt(vdiff / Vjc);
else
Qjc = -Cjc0 * pow(vdiff / Vjc, -Mjc) * vdiff / (1.0 - Mjc);
Qjc = Qjc + Qjc0;
end
else begin
t1 = 1.0 + Cjc_2 * (Vbci - fcpc);
Qjc = Cjc_1 * t1 * t1 / (2.0 * Cjc_2);
end
Qjc = Qjc * Xcjc;
// Calc external base-collector junction capacitance
if (Vbcx <= fcpc) begin
vdiff = Vjc - Vbcx;
if (Mjc == 1.0)
Qjcx = -Cjc0 * Vjc *ln(vdiff);
else if (Mjc == 0.5)
Qjcx = -2.0 * vdiff * Cjc0 / sqrt(vdiff / Vjc);
else
Qjcx = -Cjc0 * pow(vdiff / Vjc, -Mjc) * vdiff / (1.0 - Mjc);
Qjcx = Qjcx + Qjc0;
end
else begin
t1 = 1.0 + Cjc_2 * (Vbcx - fcpc);
Qjcx = Cjc_1 * t1 * t1 / (2.0 * Cjc_2);
end
Qjcx = Qjcx * (1.0 - Xcjc) * Area;
Qbc = Tr * Ibc1 + Qjc;
// Calc substrate junction capacitance
Cjs0 = Cjs;
Cjs_1 = 0.0;
Qjs0 = 0.0;
if (Mjs == 1.0) begin
Cjs_1 = 1.0 / Vjs;
Qjs0 = -Cjs0 * Vjs * (0.5 + ln(Vjs));
end
else if (Mjs != 0.0) begin
Cjs_1 = Mjs / Vjs;
Qjs0 = -Cjs0 / (2.0 * Cjs_1) * (1.0 + Mjs) / (1.0 - Mjs);
end
if ( Mjs == 0.0)
Qjs = Cjs0 * Vcs;
else if (Vcs >= 0.0) begin // (Rev bias)
t1 = Vjs + Vcs;
if (Mjs == 1.0) begin
t2 = Cjs0 * Vjs;
Qjs = t2 * ln(t1);
end
else if (Mjs == 0.5)
Qjs = 2.0 * t1 * Cjs0 / sqrt(t1 / Vjs);
else
Qjs = Cjs0 * pow(t1 / Vjs, -Mjs) * t1 / (1.0 - Mjs);
Qjs = Qjs + Qjs0;
end
else begin // (Fwd bias)
t1 = 1.0 - Cjs_1 * Vcs;
Qjs = -Cjs0 * t1 * t1 / (2.0 * Cjs_1);
end
Qjs = Qjs * Area;
// Branch contributions
I(bi, ei) <+ Type * Area * (Ibe1/BF_T + ddt(Qbe) + Ibe2);
I(bi, ci) <+ Type * Area * (Ibc1/BR_T + ddt(Qbc) + Ibc2);
I(b, ci) <+ Type * ddt(Qjcx);
I(ci, s) <+ Type * ddt(Qjs);
`ifdef THREE_TERMINALS
V(s) <+ 0.0;
`endif
`ifdef INCLUDE_DELAY
I(ci, ei) <+ Type * Area * ((absdelay(Ibe1, Delay) - Ibc1) / Kqb);
`else
`ifdef USE_EXCESS_PHASE
Delay = Ptf * Tf * `M_PI / 180;
I(ci, ei) <+ Type * Area * ((absdelay(Ibe1, Delay) - Ibc1) / Kqb);
`else
I(ci, ei) <+ Type * Area * ((Ibe1 - Ibc1) / Kqb);
`endif
`endif
`ifdef INCLUDE_LEAD_INDUCTANCE
V(b, bi) <+ I(b, bi) * rb + Lb * ddt(I(b,bi));
V(c, ci) <+ I(c, ci) * (Rc / Area) + Lc * ddt(I(c, ci));
V(e, ei) <+ white_noise(4 * `P_K * T * (Re / Area), "Re");
V(c, ci) <+ white_noise(4 * `P_K * T * (Rc / Area), "Rc");
V(e, ei) <+ I(e, ei) * (Re / Area) + Le * ddt(I(e, ei));
`else
V(b, bi) <+ I(b, bi) * rb;
// Formulating parasitics in this manner allows for
// automatic branch reduction if R=0:
if (Rc > 0.0) begin
I(c, ci) <+ V(c, ci) / (Rc / Area);
I(c, ci) <+ white_noise(4 * `P_K * T / (Rc / Area), "Rc");
end
else
V(c, ci) <+ 0.0;
if (Re > 0.0) begin
I(e, ei) <+ V(e, ei) / (Re / Area);
I(e, ei) <+ white_noise(4 * `P_K * T / (Re / Area), "Re");
end
else
V(e, ei) <+ 0.0;
`endif
// base noise
V(b, bi) <+ white_noise(4 * `P_K * T * rb, "Rb");
// Shot and flicker noise
if (Af > 0 && Kf > 0)
I(bi, ei) <+ flicker_noise(Kf * pow(Area * abs(i_rb), Af), 1.0,
"flicker");
I(bi,ei) <+ white_noise(2 * `P_Q * abs(i_rb), "shot");
Ic = Ibe1 / Kqb - Ibc1 / Kqb - Ibc1 / Br - Ibc2;
I(ci, ei) <+ white_noise(2 * `P_Q * Area * abs(Ic), "shot");
end
endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -