diff options
author | 2020-05-02 18:00:32 +0200 | |
---|---|---|
committer | 2020-05-02 18:00:32 +0200 | |
commit | fb2839ba10e89f58d26011b46ba436b7e2bd953d (patch) | |
tree | c630b5de162d66aa455458505593cf4d8034ac30 /src | |
parent | 4dde812af80708b6c1df6d77c46941ca2fab9aad (diff) |
netlist: Add simple ZDIODE model. [Couriersud]
The model is driven by three additional model parameters: NBV, IBV, BV.
Example code how to define a typical 7.5V Zener diode:
ZDIODE(ZD, "D(BV=7.5 IBV=0.01 NBV=3)")
or
NET_MODEL("A1234 D(BV=7.5 IBV=0.01 NBV=3)")
ZDIODE(ZD, "A1234")
Diffstat (limited to 'src')
-rw-r--r-- | src/lib/netlist/analog/nld_twoterm.h | 4 | ||||
-rw-r--r-- | src/lib/netlist/analog/nlid_twoterm.cpp | 34 | ||||
-rw-r--r-- | src/lib/netlist/analog/nlid_twoterm.h | 54 | ||||
-rw-r--r-- | src/lib/netlist/devices/net_lib.cpp | 1 | ||||
-rw-r--r-- | src/lib/netlist/devices/nlid_proxy.cpp | 2 | ||||
-rw-r--r-- | src/lib/netlist/examples/zdiode.cpp | 45 | ||||
-rw-r--r-- | src/lib/netlist/macro/nlm_base.cpp | 2 |
7 files changed, 137 insertions, 5 deletions
diff --git a/src/lib/netlist/analog/nld_twoterm.h b/src/lib/netlist/analog/nld_twoterm.h index 1ed284a9e59..c90e29b5a93 100644 --- a/src/lib/netlist/analog/nld_twoterm.h +++ b/src/lib/netlist/analog/nld_twoterm.h @@ -34,6 +34,10 @@ #define DIODE(name, model) \ NET_REGISTER_DEVEXT(DIODE, name, model) +// Generic Zener Diode +#define ZDIODE(name, model) \ + NET_REGISTER_DEVEXT(ZDIODE, name, model) + #define VS(name, pV) \ NET_REGISTER_DEVEXT(VS, name, pV) diff --git a/src/lib/netlist/analog/nlid_twoterm.cpp b/src/lib/netlist/analog/nlid_twoterm.cpp index e60f39ea202..82fdf0f5691 100644 --- a/src/lib/netlist/analog/nlid_twoterm.cpp +++ b/src/lib/netlist/analog/nlid_twoterm.cpp @@ -170,6 +170,39 @@ namespace analog //set(m_D.G(), 0.0, m_D.Ieq()); } + // ---------------------------------------------------------------------------------------- + // nld_Z + // ---------------------------------------------------------------------------------------- + + NETLIB_RESET(Z) + { + nl_fptype IsBV = m_model.m_IBV / (plib::exp(m_model.m_BV / nlconst::np_VT(m_model.m_NBV)) - nlconst::one()); + + m_D.set_param(m_model.m_IS, m_model.m_N, exec().gmin(), nlconst::T0()); + m_R.set_param(IsBV, m_model.m_NBV, exec().gmin(), nlconst::T0()); + set_G_V_I(m_D.G(), nlconst::zero(), m_D.Ieq()); + } + + NETLIB_UPDATE_PARAM(Z) + { + nl_fptype IsBV = m_model.m_IBV / (plib::exp(m_model.m_BV / nlconst::np_VT(m_model.m_NBV)) - nlconst::one()); + + m_D.set_param(m_model.m_IS, m_model.m_N, exec().gmin(), nlconst::T0()); + m_R.set_param(IsBV, m_model.m_NBV, exec().gmin(), nlconst::T0()); + set_G_V_I(m_D.G(), nlconst::zero(), m_D.Ieq()); + } + + NETLIB_UPDATE_TERMINALS(Z) + { + m_D.update_diode(deltaV()); + m_R.update_diode(-deltaV()); + const nl_fptype G(m_D.G() + m_R.G()); + const nl_fptype I(m_D.Ieq() - m_R.Ieq()); + set_mat( G, -G, -I, + -G, G, I); + } + + } //namespace analog @@ -180,6 +213,7 @@ namespace devices { NETLIB_DEVICE_IMPL_NS(analog, C, "CAP", "C") NETLIB_DEVICE_IMPL_NS(analog, L, "IND", "L") NETLIB_DEVICE_IMPL_NS(analog, D, "DIODE", "MODEL") + NETLIB_DEVICE_IMPL_NS(analog, Z, "ZDIODE", "MODEL") NETLIB_DEVICE_IMPL_NS(analog, VS, "VS", "V") NETLIB_DEVICE_IMPL_NS(analog, CS, "CS", "I") } // namespace devices diff --git a/src/lib/netlist/analog/nlid_twoterm.h b/src/lib/netlist/analog/nlid_twoterm.h index 58e68a298b6..c815c2c4b3f 100644 --- a/src/lib/netlist/analog/nlid_twoterm.h +++ b/src/lib/netlist/analog/nlid_twoterm.h @@ -430,6 +430,9 @@ namespace analog /// the following parameters. A "Y" in the first column indicates that the /// parameter is actually used in netlist. /// + /// NBV, BV and IBV are only used in the ZDIODE model. It is assumed + /// that DIODEs are not modeled up to their breakdown voltage. + /// /// |NL? |name |parameter |units|default| example|area | /// |:--:|:-----|:--------------------------------|:----|------:|-------:|:----:| /// | Y |IS |saturation current |A |1.0e-14| 1.0e-14| * | @@ -444,8 +447,9 @@ namespace analog /// | |KF |flicker noise coefficient |- | 0| | | /// | |AF |flicker noise exponent |- | 1| | | /// | |FC |coefficient for forward-bias depletion capacitance formula|-|0.5|| | - /// | |BV |reverse breakdown voltage |V |infinite| 40| | - /// | |IBV |current at breakdown voltage |V | 0.001| | | + /// | Y |NBV |reverse emission coefficient |- | 3| 1| | + /// | Y |BV |reverse breakdown voltage |V |infinite| 40| | + /// | Y |IBV |current at breakdown voltage |A | 0.001| | | /// | |TNOM |parameter measurement temperature|deg C| 27| 50| | /// class diode_model_t : public param_model_t @@ -461,6 +465,21 @@ namespace analog value_t m_N; //!< emission coefficient. }; + class zdiode_model_t : public diode_model_t + { + public: + zdiode_model_t(device_t &device, const pstring &name, const pstring &val) + : diode_model_t(device, name, val) + , m_NBV(*this, "NBV") + , m_BV(*this, "BV") + , m_IBV(*this, "IBV") + {} + + value_t m_NBV; //!< reverse emission coefficient. + value_t m_BV; //!< reverse breakdown voltage. + value_t m_IBV; //!< current at breakdown voltage. + }; + // ----------------------------------------------------------------------------- // nld_D // ----------------------------------------------------------------------------- @@ -490,6 +509,37 @@ namespace analog }; // ----------------------------------------------------------------------------- + // nld_Z - Zener Diode + // ----------------------------------------------------------------------------- + + NETLIB_OBJECT_DERIVED(Z, twoterm) + { + public: + NETLIB_CONSTRUCTOR_DERIVED_EX(Z, twoterm, const pstring &model = "D") + , m_model(*this, "MODEL", model) + , m_D(*this, "m_D") + , m_R(*this, "m_R") + { + register_subalias("A", P()); + register_subalias("K", N()); + } + + NETLIB_IS_DYNAMIC(true) + NETLIB_UPDATE_TERMINALSI(); + NETLIB_RESETI(); + + protected: + //NETLIB_UPDATEI(); + NETLIB_UPDATE_PARAMI(); + + private: + zdiode_model_t m_model; + generic_diode<diode_e::BIPOLAR> m_D; + // REVERSE diode + generic_diode<diode_e::BIPOLAR> m_R; + }; + + // ----------------------------------------------------------------------------- // nld_VS - Voltage source // // netlist voltage source must have inner resistance diff --git a/src/lib/netlist/devices/net_lib.cpp b/src/lib/netlist/devices/net_lib.cpp index 1baf8bf33cb..7e23ecfa2f6 100644 --- a/src/lib/netlist/devices/net_lib.cpp +++ b/src/lib/netlist/devices/net_lib.cpp @@ -33,6 +33,7 @@ namespace devices LIB_ENTRY(C) LIB_ENTRY(L) LIB_ENTRY(D) + LIB_ENTRY(Z) LIB_ENTRY(VS) LIB_ENTRY(CS) LIB_ENTRY(VCVS) diff --git a/src/lib/netlist/devices/nlid_proxy.cpp b/src/lib/netlist/devices/nlid_proxy.cpp index 7f76a0049a2..159b36407ac 100644 --- a/src/lib/netlist/devices/nlid_proxy.cpp +++ b/src/lib/netlist/devices/nlid_proxy.cpp @@ -134,7 +134,6 @@ namespace netlist connect(m_RP.P(), *m_tp); } connect(m_RN.P(), m_RP.N()); - //printf("vcc: %f\n", logic_family()->fixed_V()); } @@ -161,7 +160,6 @@ namespace netlist { if (state) { - m_RN.set_G_V_I(G_OFF, nlconst::zero(), nlconst::zero()); diff --git a/src/lib/netlist/examples/zdiode.cpp b/src/lib/netlist/examples/zdiode.cpp new file mode 100644 index 00000000000..644f813d78c --- /dev/null +++ b/src/lib/netlist/examples/zdiode.cpp @@ -0,0 +1,45 @@ +// license:CC0 +// copyright-holders:Couriersud + +/* + * zdiode.cpp + * + */ + +//! [zdiode_example] +#include "netlist/devices/net_lib.h" + +// ./nltool -t 1 -l clk.Q -l ZD.K -v --extended src/lib/netlist/examples/zdiode.cpp +// ./plot_nl.sh clk.Q ZD.K +// clk.Q: clock output +// ZD.K: voltage at Zener + +NETLIST_START(zdiode) + + SOLVER(Solver, 48000) + PARAM(Solver.DYNAMIC_TS, 1) + PARAM(Solver.VNTOL, 1e-7) + PARAM(Solver.RELTOL, 1e-4) + + ANALOG_INPUT(V12, 12.0) + ANALOG_INPUT(V4, 4.0) + + CLOCK(clk, 100) + ZDIODE(ZD, "D(BV=7.5 IBV=0.01 NBV=3)") + RES(R, 20) + RES(Rclk, 200) + CAP(C, 1e-6) + + NET_C(V4, clk.GND) // make clock between 4 and 12 V + NET_C(V12, clk.VCC, R.1) + + NET_C(GND, ZD.A, C.2) + NET_C(clk.Q, Rclk.1) + NET_C(Rclk.2, R.2, ZD.K, C.1) + + RES(RL, 1000) + NET_C(RL.1, ZD.K) + NET_C(RL.2, GND) + +NETLIST_END() +//! [zdiode_example] diff --git a/src/lib/netlist/macro/nlm_base.cpp b/src/lib/netlist/macro/nlm_base.cpp index 1c7c81fd839..88fe75a9bc2 100644 --- a/src/lib/netlist/macro/nlm_base.cpp +++ b/src/lib/netlist/macro/nlm_base.cpp @@ -9,7 +9,7 @@ * ---------------------------------------------------------------------------*/ static NETLIST_START(diode_models) - NET_MODEL("D _(IS=1e-15 N=1)") + NET_MODEL("D _(IS=1e-15 N=1 NBV=3 IBV=0.001 BV=1E9)") NET_MODEL("1N914 D(Is=2.52n Rs=.568 N=1.752 Cjo=4p M=.4 tt=20n Iave=200m Vpk=75 mfg=OnSemi type=silicon)") // FIXME: 1N916 currently only a copy of 1N914! |