summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author couriersud <couriersud@arcor.de>2015-07-29 23:15:26 +0200
committer couriersud <couriersud@arcor.de>2015-07-29 23:15:43 +0200
commit9526556bf80a81de44d5065630ebf1a6f751a478 (patch)
tree6802c3912beb22710f3e9c2b543bcd0ffd0e62ed
parent1c046325a5323a3c056ac8d862a6ddffd347ba01 (diff)
Improve MB3614 parameters. Changed some opamps to type "idealized" (type
1) in Congo Bongo netlist and got 50% speed improvement.
-rw-r--r--nl_examples/congo_bongo.c21
-rw-r--r--src/emu/netlist/analog/nld_opamps.c83
-rw-r--r--src/emu/netlist/macro/nlm_opamp.c3
3 files changed, 72 insertions, 35 deletions
diff --git a/nl_examples/congo_bongo.c b/nl_examples/congo_bongo.c
index 8f0a4de31e2..f3b701a8196 100644
--- a/nl_examples/congo_bongo.c
+++ b/nl_examples/congo_bongo.c
@@ -34,8 +34,8 @@ NETLIST_START(dummy)
// .END
SOLVER(Solver, 24000)
- PARAM(Solver.ACCURACY, 1e-9)
- PARAM(Solver.NR_LOOPS, 90)
+ PARAM(Solver.ACCURACY, 1e-8)
+ PARAM(Solver.NR_LOOPS, 150)
PARAM(Solver.SOR_FACTOR, 0.001)
PARAM(Solver.GS_LOOPS, 1)
//PARAM(Solver.GS_THRESHOLD, 99)
@@ -80,8 +80,21 @@ NETLIST_START(dummy)
*/
PARAM(XU16.B.MODEL, "MB3614(UGF=11k)")
PARAM(XU17.C.MODEL, "MB3614(UGF=11k)")
- //PARAM(XU16.B.MODEL, "MB3614_SLOW")
- //PARAM(XU17.C.MODEL, "MB3614_SLOW")
+
+ PARAM(XU17.A.MODEL, "MB3614(TYPE=1)")
+ PARAM(XU17.B.MODEL, "MB3614(TYPE=1)")
+ PARAM(XU17.D.MODEL, "MB3614(TYPE=1)")
+
+ //PARAM(XU16.A.MODEL, "MB3614(TYPE=1)")
+ PARAM(XU16.C.MODEL, "MB3614(TYPE=1)")
+ PARAM(XU16.D.MODEL, "MB3614(TYPE=1)")
+
+#if 0
+ PARAM(XU13.A.MODEL, "MB3614(TYPE=1)")
+ PARAM(XU13.B.MODEL, "MB3614(TYPE=1)")
+ PARAM(XU13.C.MODEL, "MB3614(TYPE=1)")
+ PARAM(XU13.D.MODEL, "MB3614(TYPE=1)")
+#endif
OPTIMIZE_FRONTIER(C51.1, RES_K(20), 50)
OPTIMIZE_FRONTIER(R77.2, RES_K(20), 50)
diff --git a/src/emu/netlist/analog/nld_opamps.c b/src/emu/netlist/analog/nld_opamps.c
index 00eb9984cc5..3aecce08b2a 100644
--- a/src/emu/netlist/analog/nld_opamps.c
+++ b/src/emu/netlist/analog/nld_opamps.c
@@ -42,7 +42,7 @@ NETLIB_NAMESPACE_DEVICES_START()
/*
* Type = 0: Impedance changer
- * 1; Ideal opamp
+ * 1; Idealized opamp
* 2; opamp with first pole
* 3: opamp with first pole + output limit
* 4: opamp with input stage, first pole + output limit
@@ -50,12 +50,9 @@ NETLIB_NAMESPACE_DEVICES_START()
NETLIB_START(OPAMP)
{
- register_sub("RP1", m_RP);
- register_sub("CP1", m_CP);
- register_sub("G1", m_G1);
- register_sub("EBUF", m_EBUF);
- register_sub("DN", m_DN);
- register_sub("DP", m_DP);
+ register_param("MODEL", m_model, "");
+
+ m_type = m_model.model_value("TYPE");
register_input("VCC", m_VCC);
register_input("GND", m_GND);
@@ -64,12 +61,27 @@ NETLIB_START(OPAMP)
register_output("VH", m_VH);
register_output("VREF", m_VREF);
- register_param("MODEL", m_model, "");
+ register_sub("G1", m_G1);
+ register_sub("RP1", m_RP);
- m_type = m_model.model_value("TYPE");
+ if (m_type == 1)
+ {
+ register_subalias("PLUS", "G1.IP");
+ register_subalias("MINUS", "G1.IN");
+ register_subalias("OUT", "G1.OP");
+
+ connect_late("G1.ON", "VREF");
+ connect_late("RP1.2", "VREF");
+ connect_late("RP1.1", "G1.OP");
- if (m_type == 3)
+ }
+ else if (m_type == 3)
{
+ register_sub("CP1", m_CP);
+ register_sub("EBUF", m_EBUF);
+ register_sub("DN", m_DN);
+ register_sub("DP", m_DP);
+
register_subalias("PLUS", "G1.IP");
register_subalias("MINUS", "G1.IN");
register_subalias("OUT", "EBUF.OP");
@@ -111,27 +123,40 @@ NETLIB_UPDATE(OPAMP)
NETLIB_RESET(OPAMP)
{
- m_EBUF.do_reset();
m_G1.do_reset();
- m_DP.do_reset();
- m_DN.do_reset();
- m_CP.do_reset();
- m_RP.do_reset();
-
- m_EBUF.m_G.setTo(1.0);
m_G1.m_RI.setTo(m_model.model_value("RI"));
- m_EBUF.m_RO.setTo(m_model.model_value("RO"));
- m_DP.m_model.setTo("D(IS=1e-15 N=1)");
- m_DN.m_model.setTo("D(IS=1e-15 N=1)");
-
- double CP = m_model.model_value("DAB") / m_model.model_value("SLEW");
- double RP = 0.5 / 3.1459 / CP / m_model.model_value("FPF");
- double G = m_model.model_value("UGF") / m_model.model_value("FPF") / RP;
-
- //printf("CP=%e RP=%f G=%f\n", CP, RP, G);
- m_CP.m_C.setTo(CP);
- m_RP.set_R(RP);
- m_G1.m_G.setTo(G);
+
+ if (m_type == 1)
+ {
+ double RO = m_model.model_value("RO");
+ double G = m_model.model_value("UGF") / m_model.model_value("FPF") / RO;
+ m_RP.set_R(RO);
+ m_G1.m_G.setTo(G);
+ }
+ else if (m_type == 3)
+ {
+ m_EBUF.do_reset();
+ m_DP.do_reset();
+ m_DN.do_reset();
+ m_CP.do_reset();
+ m_RP.do_reset();
+
+ m_EBUF.m_G.setTo(1.0);
+ m_EBUF.m_RO.setTo(m_model.model_value("RO"));
+ m_DP.m_model.setTo("D(IS=1e-15 N=1)");
+ m_DN.m_model.setTo("D(IS=1e-15 N=1)");
+
+ double CP = m_model.model_value("DAB") / m_model.model_value("SLEW");
+ double RP = 0.5 / 3.1459 / CP / m_model.model_value("FPF");
+ double G = m_model.model_value("UGF") / m_model.model_value("FPF") / RP;
+
+ //printf("CP=%e RP=%f G=%f\n", CP, RP, G);
+ m_CP.m_C.setTo(CP);
+ m_RP.set_R(RP);
+ m_G1.m_G.setTo(G);
+
+ }
+
}
diff --git a/src/emu/netlist/macro/nlm_opamp.c b/src/emu/netlist/macro/nlm_opamp.c
index bb160848b38..9d246ebb04f 100644
--- a/src/emu/netlist/macro/nlm_opamp.c
+++ b/src/emu/netlist/macro/nlm_opamp.c
@@ -73,8 +73,7 @@ NETLIST_START(OPAMP_lib)
NET_MODEL("LM324 OPAMP(TYPE=3 VLH=2.0 VLL=0.2 FPF=5 UGF=500k SLEW=0.3M RI=1000k RO=50 DAB=0.00075)")
NET_MODEL("LM358 OPAMP(TYPE=3 VLH=2.0 VLL=0.2 FPF=5 UGF=500k SLEW=0.3M RI=1000k RO=50 DAB=0.001)")
- NET_MODEL("MB3614 OPAMP(TYPE=3 VLH=2.0 VLL=0.2 FPF=5 UGF=500k SLEW=0.6M RI=1000k RO=50 DAB=0.002)")
- NET_MODEL("MB3614_SLOW OPAMP(TYPE=3 VLH=2.0 VLL=0.2 FPF=5 UGF=11k SLEW=0.6M RI=1000k RO=50 DAB=0.002)")
+ NET_MODEL("MB3614 OPAMP(TYPE=3 VLH=1.4 VLL=0.02 FPF=2 UGF=500k SLEW=0.6M RI=1000k RO=50 DAB=0.0002)")
LOCAL_LIB_ENTRY(MB3614_DIP)
LOCAL_LIB_ENTRY(LM324_DIP)