summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
author couriersud <couriersud@gmx.org>2020-05-02 18:00:32 +0200
committer couriersud <couriersud@gmx.org>2020-05-02 18:00:32 +0200
commitfb2839ba10e89f58d26011b46ba436b7e2bd953d (patch)
treec630b5de162d66aa455458505593cf4d8034ac30 /src
parent4dde812af80708b6c1df6d77c46941ca2fab9aad (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.h4
-rw-r--r--src/lib/netlist/analog/nlid_twoterm.cpp34
-rw-r--r--src/lib/netlist/analog/nlid_twoterm.h54
-rw-r--r--src/lib/netlist/devices/net_lib.cpp1
-rw-r--r--src/lib/netlist/devices/nlid_proxy.cpp2
-rw-r--r--src/lib/netlist/examples/zdiode.cpp45
-rw-r--r--src/lib/netlist/macro/nlm_base.cpp2
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!