⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bjt.va

📁 一个晶体管的veriloga模型,完整的模型
💻 VA
📖 第 1 页 / 共 2 页
字号:
  
        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 + -