mirror of
https://github.com/holub/mame
synced 2025-04-23 00:39:36 +03:00
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")
This commit is contained in:
parent
4dde812af8
commit
fb2839ba10
@ -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)
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
// -----------------------------------------------------------------------------
|
||||
@ -489,6 +508,37 @@ namespace analog
|
||||
generic_diode<diode_e::BIPOLAR> m_D;
|
||||
};
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// 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
|
||||
//
|
||||
|
@ -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)
|
||||
|
@ -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());
|
||||
|
45
src/lib/netlist/examples/zdiode.cpp
Normal file
45
src/lib/netlist/examples/zdiode.cpp
Normal file
@ -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]
|
@ -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!
|
||||
|
Loading…
Reference in New Issue
Block a user