Dateien zu meinem Buch
Willkommen > Minimales Z80 System

Minimales Z80 System


Nach dem Z80 Tester wollte ich schon lange mal ein richtiges, minimales Z80 System (Einplatinencomputer) bauen. Ein bestimmtes Ziel sollte das System nicht verfolgen. Hauptsache Z80, Rom, Ram und I/O.
Ideal zum reinschnuppern und um ggf. mal spaeter mit Logikanalyzer dran zu arbeiten. Trotz alle dem, kann man schon ein Menge aus so einem kleinem System herausholen. Wuerfel; Mastermind; 4 gewinnt oder im Prinzip sogar ein Schachspiel sollten moeglich sein.
Pin 16,17,24,25 der Z80 CPU an +5V legen - und GND + VCC ebenfalls nicht vergessen.

In der Lektuere "Mikrocomputer selbstgebaut und programmiert" von Rolf Dieter Klein (SEHR empfehlenswert!) und verschiedenen Z80 Systemen aus dem Internet (http://www.z80.info/z80_mp.htm), habe ich mich zu folgender Startkonfiguration entschieden.
Z80 CPU (war klar ne ;-)
4093 Oszillator (R=10k; C=1nf; f=ca. 500khz)
Rom = 27C256 32k Eprom
Ram = 62256   32k SRam

4093 Oszillator:


Mit A15 kenn direkt selektiert werden, ob Rom (A15=0) oder Ram (A15=1) angesprochen werden soll. Zur Selektion habe ich /MREQ + A15 ueber 74HCT32 und einem Inverter aus 4093 wie folgt verschaltet:



Um nicht unnötige Leitungen von Z80 zu Rom UND Ram extra legen zu müssen,
bin ich bei dem SRam von altem Cache SRam in schmaler Bauform ausgegangen und konnte so das SRam innerhalb des Romsockels packen und die korrespondierenden Leitungen (D0 - D7; A0 - A13) direkt über eine Lötbrücke verbinden. Lediglich A14, /OE, /CE, /WE, VPP müssen getrennt bleiben und separat angesteuert werden.

Bild der Daten- und Adressbusverbindungen von Lötseite betrachtet!:



Aufbaubild Top 1:


Unterseite 1 - Spannungen + Takt:


Unterseite 2 - Rom/Ram Selekt:


Unterseite 3 - Datenleitungen D0 - D7:


Unterseite 4 - Adressleitungen:


Top 2 - Fertig:


Zum ersten Test habe ich ein Eprom gebrannt mit lauter 00 (NOP)  bis auf am Ende 16 x $76 (HALT). Die gruene LED zeigt +5V an. Die rote LED den /HALT Zustand. Diese sollte bei 500khz und knapp 32760 NOP's nach ca. 1-2s leuchten (Nach Reset). Aber nichts..??
Habe mir dann ein NOP Stecker gebaut mit Blink-LED an A3 und durch Parallelschaltung des 10nF mit 1,5uF den Takt auf wenige Hz stark verlangsamt.. die Blink-LED blinkte auch brav.. alle Verbindungen mehrfach kontolliert.. kein Fehler zu finden.. erstmal zur Seite gelegt fuer ein paar Tage (das ist immer genau das Richtige in so einem Fall!!).

Hatte ich die rote LED selbst geprueft und Masse unten dran gehalten.. LED leuchtete = alles ok.. dann spaeter hatte ich das Problem gefunden.. alles lief bestens, nur die LED hatte keine leitende Verbindung zum /HALT Pin der Z80!
Mist! War so direkt nicht zu sehen (und meine Augen sind leider auch nicht mehr die besten..).

Soweit so gut.. bis hierhin scheint es ersteinmal zu laufen..

Schritt 2 - SRam:

SRam bestücken und Ram Testprogramm im Eprom brennen.
Wenn Ram nicht ok, /HALT ansonsten immer wieder Ram testen (nur 1 Zelle)..
Als Lebenszeichen aktiviere ich /IORQ und zeige das ueber eine gelbe LED an.

Code:
       1/       0 :                         CPU Z80
       2/       0 :                         org 0
       3/       0 :                    
       4/       0 :                   start:
       5/       0 : 21 00 80                ld hl,8000h
       6/       3 :                        
       7/       3 : 3E 55                   ld a,55h
       8/       5 : 77                      ld (hl),a
       9/       6 : 7E                      ld a,(hl)
      10/       7 : FE 55                   cp 55h
      11/       9 : C2 1A 00                jp nz,fail
      12/       C :                    
      13/       C : 3E AA                   ld a,0aah
      14/       E : 77                      ld (hl),a
      15/       F : 7E                      ld a,(hl)
      16/      10 : FE AA                   cp 0aah
      17/      12 : C2 1A 00                jp nz,fail
      18/      15 :                    
      19/      15 : DB 00                   in a,(0)    ; show some heartbeat at /IORQ
      20/      17 :                    
      21/      17 : C3 00 00                jp start
      22/      1A :                    
      23/      1A : 76                fail: halt
      24/      1B :                    
      25/      1B :                         end

Schritt 3 - I/O - Output:


Ouput ueber 8-fach Tristate Latch 74HCT374 (74HCT373 geht auch), gesteuert ueber /IORQ + /WR. D0-D6 über 560Ohm Widerstaende an eine 7 Segment LED Anzeige mit gemeinsamer Anode. /OE des 74LS374 fest auf GND. Selektsignal an CP/CLK Pin 11.

Selektion:



7-Segment Display:


Top 3:


Bottom 5 - Stromversorgung + Selektion:


Bottom 6 - D0-D6 und Q0-Q6:

Ramtest mit Zaehler (1x Ramtest 8000h - ffffh ca. 1,x min):
       1/       0 :                         cpu z80
       2/       0 :                         org 0
       3/       0 : 01 36 00       init:    ld bc,led0    ;bc points to ledn
       4/       3 : 16 0B                   ld d,10       ;count runs 0-9 loop
       5/       5 : 0A                      ld a,(bc)
       6/       6 :                     ;    ld a,(led0)  ;11000000b
       7/       6 : D3 00                   out (0),a
       8/       8 :                start:
       9/       8 : 21 00 F0                ld hl,08000h  ;mem start
      10/       B :                ramtst:
      11/       B : 3E 55                   ld a,55h
      12/       D : 77                      ld (hl),a
      13/       E : 7E                      ld a,(hl)
      14/       F : FE 55                   cp 55h
      15/      11 : C2 35 00                jp nz,fail
      16/      14 : 3E AA                   ld a,0aah
      17/      16 : 77                      ld (hl),a
      18/      17 : 7E                      ld a,(hl)
      19/      18 : FE AA                   cp 0aah
      20/      1A : C2 35 00                jp nz,fail
      21/      1D :                    
      22/      1D : 23                      inc hl        ;mem end ffffh -> 0
      23/      1E : 7C                      ld a,h
      24/      1F : FE 00                   cp 0
      25/      21 : C2 0B 00                jp nz,ramtst
      26/      24 : 7D                      ld a,l
      27/      25 : FE 00                   cp 0
      28/      27 : C2 0B 00                jp nz,ramtst
      29/      2A :                    
      30/      2A : 15                      dec d
      31/      2B : CA 00 00                jp z,init
      32/      2E : 03                      inc bc        ;bc points no next ledn code
      33/      2F : 0A                      ld a,(bc)
      34/      30 : D3 00                   out (0),a
      35/      32 : C3 08 00                jp start
      36/      35 :                    
      37/      35 : 76              fail:   halt
      38/      36 :                    
      39/      36 :                    
      40/      36 : C0              led0:    defb  11000000b     ; 0: c0h a, b, c, d, e, f
      41/      37 : F9              led1:    defb  11111001b     ; 1: f9h b, c
      42/      38 : A4              led2:    defb  10100100b     ; 2: a4h a, b, d, e, g
      43/      39 : B0              led3:    defb  10110000b     ; 3: b0h a, b, c, d, g
      44/      3A : 99              led4:    defb  10011001b     ; 4: 99h b, c, f, g
      45/      3B : 92              led5:    defb  10010010b     ; 5: 92h a, c, d, f, g
      46/      3C : 82              led6:    defb  10000010b     ; 6: 82h a, c, d, e, f, g
      47/      3D : F8              led7:    defb  11111000b     ; 7: f8h a, b, c
      48/      3E : 80              led8:    defb  10000000b     ; 8: 80h a, b, c, d, e, f, g
      49/      3F : 90              led9:    defb  10010000b     ; 9: 90h a, b, c, d, f, g
      50/      40 :                    
      51/      40 :                         end


Video mit Zeichenausgabe ueber 7-Segment:
http://www.youtube.com/watch?v=TbLTadpb3Zg


Schritt 4 - I/O - Input:

Ueber 1/4 7432 and /RD und /IORQ an Tristate Treiber 74LS244 Pin 1+19.


Selektion:


Bild von unten: (was fuer ein Drahtverhau)


Bild von oben (nun fertiges Mini-Z80 System mit 32k Rom, 32k Ram und 8-bit Output und 8-bit Input):


I/O-Testprogramm:

       1/       0 :                         CPU Z80
       2/       0 :                         org 0
       3/       0 :                    
       4/       0 :               start:
       5/       0 : DB 00               in a,(0)
       6/       2 : D3 00               out (0),a
       7/       4 : C3 00 00          jp start
       8/       7 :                    
       9/       7 :               end


Eagle Dateien: Z80 mini eagle.zip

Test Software: Z80 mini software.zip

ACHTUNG: Die Platine enthält mehrere Fehler!!
Irgendwie meinte Eagle +5V und GND an der Z80 CPU vertauschen zu müssen.
Durch fehlenden Invoke an der CPU hatte ich die nicht explizit zugeordnet.

Korrekturen:
Z80 CPU Pin 11 (+5V) rechts oben die Bahn unterbrechen.
Z80 CPU Pin 29 (GND) links oben die Bahn unterbrechen.
+5V an Pin 11 verbinden über Litze.
GND an Pin 29 verbinden über Litze.
Q1 (2ter 560Ohm Widerstand vom Ram gesehen )und Pin 5 des 74HCT374 verbinden.
A8 und A9 sind am Ram vertauscht. Das kann aber so bleiben.

7-Segmentanzeige:
Ich habe von Conrad: Kingbright: SA36-11GWA gruen und SA36-11SRWA rot verwendet (gemeinsame Anode). Bauform ist etwas zu schmal, daher muessen die Pin's etwas nach aussen gebogen werden. Die Einzel-LED's mit der Anode zum Platinenrand.
Eagle3d Bild:


Fertige Platine von oben:


und von unten:






Pin-Belegungen:Z80 CPU
     +--()--+
A11 | 1 40| A10
A12 | 2 39| A9
A13 | 3 38| A8
A14 | 4 37| A&
A15 | 5 36| A6
(|) | 6 35| A5
D4 | 7 34| A4
D3 | 8 33| A3
D5 | 9 32| A2
D6 |10 31| A1
+5V |11 30| A0
D2 |12 29| GND
D7 |13 28| RFSH
D0 |14 27| M1
D1 |15 26| RESET
INT |16 25| BUSRQ
NMI |17 24| WAIT
HALT |18 23| BUSAK
MREQ |19 22| WR
IORQ |20 21| RD
+------+


4093
Quad 2-input NAND gates with schmitt-trigger inputs.
0.9V typical input hysteresis at VCC=+5V and 2.3V at VCC=+10V.

    +----------+             +----------------+          __
 1A |1  +--+ 14| VCC         | A | B | AB | Y |      Y = AB
 1B |2       13| 4B          |---+---+----+---|
 1Y |3       12| 4A          | 0 | 0 |  0 | 1 |
 2Y |4  4093 11| 4Y          | 0 | 1 |  0 | 1 |
 2A |5       10| 3Y          | 1 | 0 |  0 | 1 |
 2B |6        9| 3B          | 1 | 1 |  1 | 0 |
GND |7        8| 3A          +----------------+
    +----------+

200001/JvG, changed it to make it easier to understand.

[This information is part of the GIICM]

7432
Quad 2-input OR gates.
+----------+ +-----------+
1A |1 +--+ 14| VCC | A | B | Y | Y = A+B
1B |2 13| 4B |---+---+---|
1Y |3 12| 4A | 0 | 0 | 0 |
2A |4 7432 11| 4Y | 0 | 1 | 1 |
2B |5 10| 3B | 1 | 0 | 1 |
2Y |6 9| 3A | 1 | 1 | 1 |
GND |7 8| 3Y +-----------+
+----------+

74244
8-bit 3-state buffer.

+---\/---+
1 -|/OE Vcc|- 20
2 -|1A0 2/OE|- 19
3 -|2Y0 1Y0|- 18
4 -|1A1 2A0|- 17
5 -|2Y1 1Y1|- 16
6 -|1A2 2A1|- 15
7 -|2Y2 1Y2|- 14
8 -|1A3 2A2|- 13
9 -|2Y3 1Y3|- 12
10 -|gnd 2A3|- 11
+--------+


74374
8-bit 3-state D flip-flop.

+----------+ +---------------+
/OE |1 +--+ 20| VCC |/OE|CLK| D | Q |
Q1 |2 19| Q8 |---+---+---+---|
D1 |3 18| D8 | 1 | X | X | Z |
D2 |4 17| D7 | 0 | / | 0 | 0 |
Q2 |5 74 16| Q7 | 0 | / | 1 | 1 |
Q3 |6 374 15| Q6 | 0 |!/ | X | - |
D3 |7 14| D6 +---------------+
D4 |8 13| D5
Q4 |9 12| Q5
GND |10 11| CLK
+----------+


61256/62256 32Kx8 SRAM DIP28(S)
    +--()--+
A14 | 1  28| Vcc
A12 | 2  27| /WE
 A7 | 3  26| A13
 A6 | 4  25| A8
 A5 | 5  24| A9
 A4 | 6  23| A11
 A3 | 7  22| /OE
 A2 | 8  21| A10
 A1 | 9  20| /CS
 A0 |10  19| D7
 D0 |11  18| D6
 D1 |12  17| D5
 D2 |13  16| D4
Gnd |14  15| D3
    +------+


27(C)256  32kx8  EPROM.
    +------------+
VPP |1   +--+  28| VCC
A12 |2         27| A14
 A7 |3         26| A13
 A6 |4         25| A8
 A5 |5         24| A9
 A4 |6         23| A11
 A3 |7  27256  22| /OE
 A2 |8         21| A10
 A1 |9         20| /CE
 A0 |10        19| D7
 D0 |11        18| D6
 D1 |12        17| D5
 D2 |13        16| D4
GND |14        15| D3
    +------------+