Added CD4020 device.

This commit is contained in:
Couriersud 2014-06-21 20:54:41 +00:00
parent 11a4fd5a2d
commit 8680c7905d
9 changed files with 241 additions and 22 deletions

3
.gitattributes vendored
View File

@ -2937,6 +2937,8 @@ src/emu/netlist/analog/nld_twoterm.c svneol=native#text/plain
src/emu/netlist/analog/nld_twoterm.h svneol=native#text/plain src/emu/netlist/analog/nld_twoterm.h svneol=native#text/plain
src/emu/netlist/devices/net_lib.c svneol=native#text/plain src/emu/netlist/devices/net_lib.c svneol=native#text/plain
src/emu/netlist/devices/net_lib.h svneol=native#text/plain src/emu/netlist/devices/net_lib.h svneol=native#text/plain
src/emu/netlist/devices/nld_4020.c svneol=native#text/plain
src/emu/netlist/devices/nld_4020.h svneol=native#text/plain
src/emu/netlist/devices/nld_4066.c svneol=native#text/plain src/emu/netlist/devices/nld_4066.c svneol=native#text/plain
src/emu/netlist/devices/nld_4066.h svneol=native#text/plain src/emu/netlist/devices/nld_4066.h svneol=native#text/plain
src/emu/netlist/devices/nld_7400.c svneol=native#text/plain src/emu/netlist/devices/nld_7400.c svneol=native#text/plain
@ -2987,6 +2989,7 @@ src/emu/netlist/devices/nld_74ls629.c svneol=native#text/plain
src/emu/netlist/devices/nld_74ls629.h svneol=native#text/plain src/emu/netlist/devices/nld_74ls629.h svneol=native#text/plain
src/emu/netlist/devices/nld_9316.c svneol=native#text/plain src/emu/netlist/devices/nld_9316.c svneol=native#text/plain
src/emu/netlist/devices/nld_9316.h svneol=native#text/plain src/emu/netlist/devices/nld_9316.h svneol=native#text/plain
src/emu/netlist/devices/nld_cmos.h svneol=native#text/plain
src/emu/netlist/devices/nld_legacy.c svneol=native#text/plain src/emu/netlist/devices/nld_legacy.c svneol=native#text/plain
src/emu/netlist/devices/nld_legacy.h svneol=native#text/plain src/emu/netlist/devices/nld_legacy.h svneol=native#text/plain
src/emu/netlist/devices/nld_log.c svneol=native#text/plain src/emu/netlist/devices/nld_log.c svneol=native#text/plain

View File

@ -101,6 +101,8 @@ void netlist_factory_t::initialize()
ENTRY(gnd, GND, "-") ENTRY(gnd, GND, "-")
ENTRY(switch2, SWITCH2, "-") ENTRY(switch2, SWITCH2, "-")
ENTRY(nicRSFF, NETDEV_RSFF, "+S,R") ENTRY(nicRSFF, NETDEV_RSFF, "+S,R")
ENTRY(4020, CD_4020, "+IP,RESET,VDD,VSS")
//ENTRY(4066, CD_4066, "+A,B")
ENTRY(7400, TTL_7400_NAND, "+A,B") ENTRY(7400, TTL_7400_NAND, "+A,B")
ENTRY(7402, TTL_7402_NOR, "+A,B") ENTRY(7402, TTL_7402_NOR, "+A,B")
ENTRY(7404, TTL_7404_INVERT, "+A") ENTRY(7404, TTL_7404_INVERT, "+A")
@ -127,7 +129,8 @@ void netlist_factory_t::initialize()
ENTRY(SN74LS629, SN74LS629, "CAP") ENTRY(SN74LS629, SN74LS629, "CAP")
ENTRY(9316, TTL_9316, "+CLK,ENP,ENT,CLRQ,LOADQ,A,B,C,D") ENTRY(9316, TTL_9316, "+CLK,ENP,ENT,CLRQ,LOADQ,A,B,C,D")
ENTRY(NE555, NE555, "-") ENTRY(NE555, NE555, "-")
ENTRY(4066_dip, CD_4066_DIP, "-") ENTRY(4020_dip, CD_4020_DIP, "-")
ENTRY(4066_dip, CD_4066_DIP, "-")
ENTRY(7400_dip, TTL_7400_DIP, "-") ENTRY(7400_dip, TTL_7400_DIP, "-")
ENTRY(7402_dip, TTL_7402_DIP, "-") ENTRY(7402_dip, TTL_7402_DIP, "-")
ENTRY(7404_dip, TTL_7404_DIP, "-") ENTRY(7404_dip, TTL_7404_DIP, "-")

View File

@ -54,6 +54,7 @@
#include "nld_signal.h" #include "nld_signal.h"
#include "nld_system.h" #include "nld_system.h"
#include "nld_4020.h"
#include "nld_4066.h" #include "nld_4066.h"
#include "nld_7400.h" #include "nld_7400.h"
#include "nld_7402.h" #include "nld_7402.h"

View File

@ -0,0 +1,137 @@
/*
* nld_4020.c
*
*/
#include "nld_4020.h"
NETLIB_START(4020)
{
register_sub(sub, "sub");
register_input("RESET", m_RESET);
register_subalias("IP", sub.m_IP);
register_subalias("Q1", sub.m_Q[0]);
register_subalias("Q4", sub.m_Q[3]);
register_subalias("Q5", sub.m_Q[4]);
register_subalias("Q6", sub.m_Q[5]);
register_subalias("Q7", sub.m_Q[6]);
register_subalias("Q8", sub.m_Q[7]);
register_subalias("Q9", sub.m_Q[8]);
register_subalias("Q10", sub.m_Q[9]);
register_subalias("Q11", sub.m_Q[10]);
register_subalias("Q12", sub.m_Q[11]);
register_subalias("Q13", sub.m_Q[12]);
register_subalias("Q14", sub.m_Q[13]);
register_subalias("VDD", m_supply.m_vdd);
register_subalias("VSS", m_supply.m_vss);
}
NETLIB_RESET(4020)
{
sub.do_reset();
}
NETLIB_START(4020_sub)
{
register_input("IP", m_IP);
register_output("Q1", m_Q[0]);
register_output("Q4", m_Q[3]);
register_output("Q5", m_Q[4]);
register_output("Q6", m_Q[5]);
register_output("Q7", m_Q[6]);
register_output("Q8", m_Q[8]);
register_output("Q9", m_Q[8]);
register_output("Q10", m_Q[9]);
register_output("Q11", m_Q[10]);
register_output("Q12", m_Q[11]);
register_output("Q13", m_Q[12]);
register_output("Q14", m_Q[13]);
save(NAME(m_cnt));
}
NETLIB_RESET(4020_sub)
{
m_IP.set_state(netlist_input_t::STATE_INP_HL);
m_cnt = 0;
}
NETLIB_UPDATE(4020_sub)
{
UINT8 cnt = m_cnt;
cnt = ( cnt + 1) & 0x3fff;
update_outputs(cnt);
m_cnt = cnt;
}
NETLIB_UPDATE(4020)
{
if (INPLOGIC(m_RESET))
{
sub.m_cnt = 0;
static const netlist_time reset_time = netlist_time::from_nsec(140);
OUTLOGIC(sub.m_Q[0], 0, reset_time);
for (int i=3; i<14; i++)
OUTLOGIC(sub.m_Q[i], 0, reset_time);
}
}
inline NETLIB_FUNC_VOID(4020_sub, update_outputs, (const UINT16 cnt))
{
const netlist_time out_delayQ1 = netlist_time::from_nsec(180);
const netlist_time out_delayQn = netlist_time::from_nsec(100);
OUTLOGIC(m_Q[0], 0, out_delayQ1);
for (int i=3; i<14; i++)
OUTLOGIC(m_Q[i], (cnt >> i) & 1, out_delayQn);
}
NETLIB_START(4020_dip)
{
NETLIB_NAME(4020)::start();
/* +--------------+
* Q12 |1 ++ 16| VDD
* Q13 |2 15| Q11
* Q14 |3 14| Q10
* Q6 |4 4020 13| Q8
* Q5 |5 12| Q9
* Q7 |6 11| RESET
* Q4 |7 10| IP (Input pulses)
* VSS |8 9| Q1
* +--------------+
*/
register_subalias("1", sub.m_Q[11]);
register_subalias("2", sub.m_Q[12]);
register_subalias("3", sub.m_Q[13]);
register_subalias("4", sub.m_Q[5]);
register_subalias("5", sub.m_Q[4]);
register_subalias("6", sub.m_Q[6]);
register_subalias("7", sub.m_Q[3]);
register_subalias("8", m_supply.m_vss);
register_subalias("9", sub.m_Q[1]);
register_subalias("10", sub.m_IP);
register_subalias("11", m_RESET);
register_subalias("12", sub.m_Q[8]);
register_subalias("13", sub.m_Q[7]);
register_subalias("14", sub.m_Q[9]);
register_subalias("15", sub.m_Q[10]);
register_subalias("16", m_supply.m_vdd);
}
NETLIB_UPDATE(4020_dip)
{
NETLIB_NAME(4020)::update();
}
NETLIB_RESET(4020_dip)
{
NETLIB_NAME(4020)::reset();
}

View File

@ -0,0 +1,62 @@
// license:GPL-2.0+
// copyright-holders:Couriersud
/*
* nld_4020.h
*
* CD4020: CMOS Ripple-Carry Binary Counters/Dividers
*
* +--------------+
* Q12 |1 ++ 16| VDD
* Q13 |2 15| Q11
* Q14 |3 14| Q10
* Q6 |4 4020 13| Q8
* Q5 |5 12| Q9
* Q7 |6 11| RESET
* Q4 |7 10| IP (Input pulses)
* VSS |8 9| Q1
* +--------------+
*
*
* Naming conventions follow Texas Instruments datasheet
*
* FIXME: Timing depends on VDD-VSS
* This needs a cmos d-a/a-d proxy implementation.
*
*/
#ifndef NLD_4020_H_
#define NLD_4020_H_
#include "../nl_base.h"
#include "nld_cmos.h"
#define CD_4020(_name, _IP, _RESET, _VDD, _VSS) \
NET_REGISTER_DEV(4020, _name) \
NET_CONNECT(_name, IP, _IP) \
NET_CONNECT(_name, RESET, _RESET) \
NET_CONNECT(_name, VDD, _VDD) \
NET_CONNECT(_name, VSS, _VSS)
#define CD_4020_DIP(_name) \
NET_REGISTER_DEV(4020_dip, _name)
NETLIB_SUBDEVICE(4020_sub,
ATTR_HOT void update_outputs(const UINT16 cnt);
netlist_ttl_input_t m_IP;
netlist_state_t<UINT16> m_cnt;
netlist_ttl_output_t m_Q[14];
);
NETLIB_DEVICE(4020,
NETLIB_NAME(4020_sub) sub;
NETLIB_NAME(vdd_vss) m_supply;
netlist_ttl_input_t m_RESET;
);
NETLIB_DEVICE_DERIVED(4020_dip, 4020,
);
#endif /* NLD_4020_H_ */

View File

@ -5,17 +5,6 @@
#include "nld_4066.h" #include "nld_4066.h"
NETLIB_START(vdd_vss)
{
}
NETLIB_RESET(vdd_vss)
{
}
NETLIB_UPDATE(vdd_vss)
{
}
NETLIB_START(4066) NETLIB_START(4066)
{ {

View File

@ -25,20 +25,11 @@
#define NLD_4066_H_ #define NLD_4066_H_
#include "../nl_base.h" #include "../nl_base.h"
#include "../analog/nld_twoterm.h" #include "nld_cmos.h"
#define CD_4066_DIP(_name) \ #define CD_4066_DIP(_name) \
NET_REGISTER_DEV(4066_dip, _name) NET_REGISTER_DEV(4066_dip, _name)
NETLIB_SUBDEVICE(vdd_vss,
netlist_analog_input_t m_vdd;
netlist_analog_input_t m_vss;
public:
ATTR_HOT inline double vdd() { return INPANALOG(m_vdd); }
ATTR_HOT inline double vss() { return INPANALOG(m_vss); }
);
NETLIB_SUBDEVICE(4066, NETLIB_SUBDEVICE(4066,
public: public:

View File

@ -0,0 +1,32 @@
/*
* nld_cmos.h
*
*/
#ifndef NLD_CMOS_H_
#define NLD_CMOS_H_
#include "../nl_base.h"
#include "../analog/nld_twoterm.h"
class nld_vdd_vss : public netlist_device_t
{
public:
nld_vdd_vss ()
: netlist_device_t()
{ }
netlist_analog_input_t m_vdd;
netlist_analog_input_t m_vss;
protected:
ATTR_HOT void update() {};
ATTR_HOT void start() {};
ATTR_HOT void reset() {};
public:
ATTR_HOT inline double vdd() { return INPANALOG(m_vdd); }
ATTR_HOT inline double vss() { return INPANALOG(m_vss); }
};
#endif /* NLD_CMOS_H_ */

View File

@ -33,6 +33,7 @@ NETLISTOBJS+= \
$(NETLISTOBJ)/analog/nld_solver.o \ $(NETLISTOBJ)/analog/nld_solver.o \
$(NETLISTOBJ)/analog/nld_switches.o \ $(NETLISTOBJ)/analog/nld_switches.o \
$(NETLISTOBJ)/analog/nld_twoterm.o \ $(NETLISTOBJ)/analog/nld_twoterm.o \
$(NETLISTOBJ)/devices/nld_4020.o \
$(NETLISTOBJ)/devices/nld_4066.o \ $(NETLISTOBJ)/devices/nld_4066.o \
$(NETLISTOBJ)/devices/nld_7400.o \ $(NETLISTOBJ)/devices/nld_7400.o \
$(NETLISTOBJ)/devices/nld_7402.o \ $(NETLISTOBJ)/devices/nld_7402.o \