From 9526556bf80a81de44d5065630ebf1a6f751a478 Mon Sep 17 00:00:00 2001 From: couriersud Date: Wed, 29 Jul 2015 23:15:26 +0200 Subject: [PATCH] Improve MB3614 parameters. Changed some opamps to type "idealized" (type 1) in Congo Bongo netlist and got 50% speed improvement. --- nl_examples/congo_bongo.c | 21 ++++++-- src/emu/netlist/analog/nld_opamps.c | 81 +++++++++++++++++++---------- src/emu/netlist/macro/nlm_opamp.c | 3 +- 3 files changed, 71 insertions(+), 34 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 == 3) + 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"); + + } + 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; + 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); + + } - //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)