This is a CPLD (complex programmable logic device) breakout board for the Spectrum (including 128K and Amstrad models). The original idea behind this board was to provide a breakout board for the ZX Spectrum bus signals, and also level shifting of all the signals to 3.3v with a second set of breakout pins. This was to provide an interface to chips that are not 5v tolerant, such as all current in-production FPGAs.
Using a CPLD instead of simple level shifters does two things: it provides the original functionality of a breakout board with a level shifter since a 3.3v CPLD with 5v tolerant IO can be used for this purpose, and for prototyping or making the logic for other things too - in other words, make a versatile breakout board for both the ZX bus and a CPLD.
Either the Xilinx XC9572XL or the XC95144XL CPLD can be used on this board. To give a rough idea of the logic resources these CPLDs provide, Chris Smith's timing accurate ULA replacement fills an XC95144XL, that's to say this CPLD has a similiar amount of resource to the Spectrum ULA.
Errata: Due to a dumb mistake, the ROMCS circuit is incorrect for the black +2 and +3 machines. If you intend to use the ZX Breakout with one of these, a simple workaround is to just not connect pin 4 of the edge connector (top side, 4th pin from the left) or desolder it if you've already connected it. The board will not work at all with a black +2 or +3 unless you do this, even if you're not planning to use ROMCS. It works fine with all other models as-is.
The PCB features the following:
- All major ZX bus digital signals routed to the CPLD.
- Header for ZX signals, nearest the Spectrum edge connector.
- 3.3v linear power supply for the CPLD.
- JTAG header for programming the CPLD.
- Ability to control the ROMCS line.
- Clock is inverted (to be in phase with the CPU clock) by a Schmitt-trigger buffer giving sharper rising and falling edges.
- Two headers for CPLD signals - a 40 pin header with 32 CPLD general purpose IOs, and a 10 pin header with 7 general purpose IOs.
- 40 pin header laid out with ground and power pins in the same location as an IDE connector.
- 4 layer PCB with solid ground and power planes for ideal CPLD performance.
Additionally, the ZX signals and CPLD pin locations are shown in the silk screen, so you know what you're connecting to without having to reach for a datasheet.
ZX bus to CPLD
ZX bus function to CPLD function block mapping is optimized for the XC9572, being the smallest device with fewest resources. For the '72, the data bus and upper half of the address bus is grouped into function block 1, and the lower half of the address bus and control signals in function block 3. The remaining pins go to the GPIO headers.
The ZX clock is mapped to a global clock signal, and the reset signal is inverted and buffered and routed to the global system reset pin. A global clock signal is available on the GPIO header.
|ZX signal||CPLD pin||XC9572 FB||XC95144 FB||Comments|
|CLK||23||1||5||Buffered; CPLD GCK2|
|RESET||99||2||3||Buffered; CPLD GSR (active high)|
|ROMCS||61||3||7||Only when "Use ROMCS" is jumpered|
40 pin header
The 40 pin header is numbered using the ribbon cable style of numbering. Pin 1 is at the top right hand side of the connector, when looking down at the component side of the PCB, with the ZX edge connector at the bottom (in other words, as shown in the image on this page).
|Header pin||CPLD pin||XC9572 FB||XC95144 FB||Comments|
10 pin header
This header uses ribbon cable numbering, with pin 1 being the top left pin looking down on the PCB, as in the image above.
Pin 4 is the same as the ROMCS pin on the header next to the edge connector - it's just a straight connection. It is provided as an alternative site to connect a wire to ROMCS. Pin 9 is not connected to the CPLD if the "Use ROMCS" jumper is closed. When this jumper is closed, CPLD pin 61 will go to the transistor controlling the ROMCS line allowing the CPLD to page out the ZX ROM. Pin 10 routes to a global clock pin, it may also be used as general purpose IO.
|Header pin||CPLD pin||XC9572 FB||XC95144 FB||Comments|
|9||61||3||7||May be routed to ROMCS|
Xilinx UCF file for pins
Copy and paste this into your UCF text constraints file for the list of pins. Comment out the signals you aren't using with a # in front of that line (ISE will fail at the fitter stage if you have nets defined in your UCF file which don't exist in your design). Signals with "_L" at the end are active low. Note that RESET is active high (it's been inverted). This is generally what you want; the Xilinx library components all have active high reset. The clock is also in phase with the Z80 clock.
Also note that the pin used to control ROMCS can also be used as a GPIO, depending on the position of the jumper. ROMCS is active low from the point of view of the CPLD.
This file will also appear in Subversion.
GPIO pins are not listed in this file since you'll be defining them according to whatever function they may have.
net A(0) loc=p32; net A(1) loc=p35; net A(2) loc=p37; net A(3) loc=p41; net A(4) loc=p59; net A(5) loc=p58; net A(6) loc=p56; net A(7) loc=p55; net A(8) loc=p40; net A(9) loc=p39; net A(10) loc=p36; net A(11) loc=p33; net A(12) loc=p15; net A(13) loc=p16; net A(14) loc=p13; net A(15) loc=p14; net D(0) loc=p18; net D(1) loc=p20; net D(2) loc=p22; net D(3) loc=p29; net D(4) loc=p30; net D(5) loc=p28; net D(6) loc=p25; net D(7) loc=p17; net MREQ_L loc=p50; net IORQ_L loc=p52; net RD_L loc=p53; net WR_L loc=p54; net M1_L loc=p60; net INT_L loc=p42; net NMI_L loc=p49; net CLK loc=p23; net RESET loc=p99; net ROMCS_L loc=p61;
|U1||P565D2T33||D2PAK3||ON Semi||3.3v LDO regulator|
|U2||74HCT14||SOIC 14||Any||Schmitt trigger inverter, TTL compatible|
|U3||XC9572XL||TQFP 100||Xilinx||CPLD||Use XC95144XL for more logic resources|
|C1, C2||150uF||Tant B||Any||Capacitor|
|C4 to C10||0.1uF||0603||Any||Capacitor|
|Q1||BSS84P||SOT23||Infineon||P channel MOSFET|
ZX bus edge connector is an open ended 28 position 0.1 inch pitch connector, with position 5 contacts removed and replaced with a plastic key. This connector usually needs to be hand made by cutting down a larger connector (such as an old ISA bus connector).
40 pin, 10 pin and 60 pin headers are up to the board's user. It's suggested that SIL sockets are used for the headers since this allows wires to be plugged in and connected to a breadboard etc. However, if a ribbon cable is to be used, a PCB to ribbon connector is recommended.
It is suggested that normal jumper pin headers are used for the jumpers.