CPU-Tester

Von einigen Projekten habe ich noch unbestückte Platinen vorrätig. Bei Interesse gebe ich diese gerne zum Selbstkostenpreis ab (⇒Kontaktformular).

Z80 CPU-Tester und Analyzer

Vor einiger Zeit stolperte ich über Goran Devics Website. Goran beschriebt dort eine Möglichkeit mit einem Arduino eine Z80 CPU zu steuern. Die Idee fand ich so interessant, dass ich ein Arduino-Shield für den Mega 2560 entwarf, seine Software entsprechend anpasste und um einige Funktionen erweiterte, z.B. kann die Länge des Taktzyklus eingestellt werden und vorgegebene Testprogramme können geladen werden. Damit auch ein Betrieb ohne serielle Konsole möglich ist, kann zusätzlich ein LCD Display angeschlossen werden.

Wer den Z80 CPU-Tester nachbauen möchte findet unten die Gerber-Daten und den Quellcode zum Download. Benötigt werden nur ein paar wenige Bauteile:

Stückliste / BOM
Ref Qnty Value Remark
C1 1 100uF
D1 1 LED 3mm
J1 1 1×16 Socket (*)
J2 1 40 Pin ZIF oder alternativ ein Präzisionssockel
P1,P2,P5,P6,P7 3 1×08 Header P3 nicht bestückt
P4 1 2×18 Header oder alternativ zwei 1×18 Header
Q1 1 BC548 oder alternativer NPN Transistor
R1 1 220 Ω (*)
R2 1 4.7 kΩ
R3,R4,R6-R9 6 10 kΩ
RV1 1 10 kΩ Potentiometer RM-065 (*)
SW1-SW3 3 Switch 6mm

(*) Derzeit nicht notwendig, da das Display nicht verwendet wird.

Anstelle eines teuren ZIF-Sockels kann auch ein Präzisionssockel verwendet werden. Die Bauteilkosten liegen jeweils bei ca. 5-6 EUR zzgl. Platine.

Die ursprüngliche Software wurde bisher um folgende Features erweitert:

  • Die Länge eines Taktzyklus lässt sich über die Variable 13 festlegen (in msec jeweils gültig für H-Pegel und L-Pegel).
  • Mit „l #num“ lässt sich ein Programm in den RAM laden (aktuell sind zwei Beispielprogramme vorhanden).

Der Sketch funktioniert nicht mehr mit dem im Original beschriebenen Aufbau! Eine kurze Anleitung ist hier zu finden.

Mehr dazu in diesem Bericht.

YouTube: Vorstellung Z80 CPU Tester (Teil 1)

YouTube: Vorstellung Z80 CPU Tester (Teil 2)

Gerber-Dateien für Z80 CPU Tester

Historie:

  • v2.1 – LCD2004 und Unterstützung, Switches können abgefragt werden, Arduino Ports können mit dem Z80 IN Kommando angefragt werden
  • v2.0 – Angepasste Software mit ROM, Einstellung der Länge eines Taktzyklus möglich
  • v1.0 – Original Software
Arduino-Dateien für Z80 CPU Tester

Z80 NOP-Generator

In einem Z80 NOP-Generator eingesetzt führt eine Z80 CPU nur NOP-Kommandos (No Operation) aus. Mit Hilfe von acht LEDs können die Adressleitungen beobachtet werden. Führt die CPU die NOPs aus, sollten die Adressen permanent hochgezählt werden. Damit ist zwar kein vollständiger Test der CPU Möglich, aber zumindest ein Quick-n-Dirty-Check.

Der hier vorgestellte NOP-Generator funktioniert nur mit Z80 CPUs. Da die CPU sehr langsam getaktet wird, weit außerhalb der Spezifikation, ist es durchaus möglich, dass auch eine eigentlich funktionsfähige CPU nicht mit dem NOP-Generator funktioniert. Die Funktionsweise ist sehr einfach: Die Datenleitungen werden durch Pull-Down-Widerstände auf Masse gezogen, so dass die CPU bei einem lesenden Speicherzugriff ein NOP (Opcode 0x00) liest. Nach einem Reset fängt die CPU an diese Kommandos ab Adresse 0 auszuführen.

YouTube: NOP Generatoren für Z80 und 6502 Prozessoren

Wer den Z80 CPU NOP-Generator nachbauen möchte findet unten die Gerber-Daten zum Download. Benötigt werden nur ein paar wenige Bauteile:

Stückliste / BOM
Ref Qnty Value Remark
C1 1 1uF
C2 1 10nF
C3 1 10uF
D1-D8 8 LED 5mm
J1,J2 1 USB_B 2pol. Micro-USB Buchse, z.B. AliExpress oder USB-B Buchse
R1-R5 5 10K
R6 1 1K
R7 1 3.3K
RN1 1 4,7K SIP 9 oder SIP 10 (letzter Widerstand wird nicht benötigt)
RN2 1 470 SIP 9 oder SIP 10 (letzter Widerstand wird nicht benötigt)
RV1 1 10K Potentiometer RM-065
SW1 1 RESET 6mm Push Button
U1 1 Sockel DIP40 ZIF oder Präzisionssockel
U2 1 NE555

Anstelle eines teuren ZIF-Sockels kann auch ein Präzisionssockel verwendet werden. Die Bauteilkosten liegen jeweils bei ca. 5-6 EUR zzgl. Platine. Die Platine kann wahlweise mit einer Micro-USB Buchse oder Standard USB-Buchse bestückt werden.

Der NOP-Generator ist hier in Aktion zu sehen.

Gerber-Dateien für Z80 CPU

Ein technischer Hinweis zum Z80 CPU NOP-Generator:

Ich wurde gefragt, warum nach einiger Zeit die A7-LED doppelt so schnell blinkt wie A0, A0-A6 aber normal hoch zählen. Die Antwort ist einfach: Es liegt an den Refresh-Zyklen. Die CPU macht in jedem T3/T4-Zyklus einen Refresh, indem an A0-A6 eine Adresse angelegt wird (128 Zeilen). Wird die CPU gestartet liest die CPU ein NOP von Adresse 0 und führt einen Refresh für Zeile 0 aus, danach folgt Adresse 1 und Zeile 1 usw. bis Adresse 127 und Zeile 127. Ab jetzt beginnt das doppelt so schnelle blinken der A7-LED: Die CPU liest von Adresse 128 (A0-A6=Low, A7=High), danach folgt der Refresh für Zeile 0 (A0-A6=Low, A7=Low). Damit sieht es so aus, als ob die A7-LED doppelt so schnell blinkt. Es liegt einfach daran, dass die Speicherzugriffe und das Anlegen der Refresh-Zeilen synchron laufen. Das würde sich erst nach einem Sprungbefehl ändern.

A technical note on the Z80 CPU NOP generator:

After a while the A7-LED flashes twice as fast as A0, but A0-A6 counts normally high. The answer is simple: it’s because of the refresh cycles. The CPU makes a memory refresh in every T3/T4 cycle by applying an address to A0-A6 (128 rows). When the CPU is started, the CPU reads a NOP from address 0 and does a refresh for row 0, followed by address 1 and row 1, etc. up to address 127 and row 127. From now on, the A7-LED starts to flash twice as fast: the CPU reads from address 128 (A0-A6 = Low, A7 = High), followed by the memory refresh for row 0 (A0-A6 = Low, A7 = Low). So it looks like the A7-LED is blinking twice as fast. It is simply because memory access and memory refresh run synchronously. That will only change after a jump command.


6502 NOP-Generator

In einem 6502 NOP-Generator eingesetzt führt eine 6502 CPU nur NOP-Kommandos (No Operation) aus. Mit Hilfe von acht LEDs können die Adressleitungen beobachtet werden. Führt die CPU die NOPs aus, sollten die Adressen permanent hochgezählt werden. Damit ist zwar kein vollständiger Test der CPU Möglich, aber zumindest ein Quick-n-Dirty-Check.

Der 6502 NOP Generator liefert den Opcode 0xEA, welches einem NOP beim 6502 entspricht. Nach einem Reset beginnt der 6502 NOP-Generator ab Adresse 0xEAEA zu zählen (nach einem Reset liest die CPU aus den Adressen 0xFFFC-0xFFFD die reale Startadresse ab und da diese immer 0xEA liest, ist dieses die 0xEAEA). Die LEDs sollten somit bei 11101010‬ beginnen zu zählen.

Wer den 6502 CPU NOP-Generator nachbauen möchte findet am Ende des Beitrags die Gerber-Daten zum Download. Benötigt werden nur ein paar wenige Bauteile:

Stückliste / BOM
Ref Qnty Value Remark
C1 1 10nF
C2 1 10uF
C3 1 1uF
D1-D8 8 LED 5mm
J1,J2 1 USB_B 2pol. Micro-USB Buchse, z.B. AliExpress oder USB-B Buchse
R1 1 1K
R2 1 3.3K
R3-R16 5 10K
RN1 1 470 SIP 9 oder SIP 10 (letzter Widerstand wird nicht benötigt)
RV1 1 10K Potentiometer RM-065
SW1 1 RESET 6mm Push Button
U1 1 NE555
U2 1 Sockel DIP40 ZIF oder Präzisionssockel
JP1 1 1×02 Pin Header

Anstelle eines teuren ZIF-Sockels kann auch ein Präzisionssockel verwendet werden. Die Bauteilkosten liegen jeweils bei ca. 5-6 EUR zzgl. Platine. Die Platine kann wahlweise mit einer Micro-USB Buchse oder Standard USB-Buchse bestückt werden.

Hinweis: Der Prozessor ist nur über Pin 21 mit GND verbunden, Pin 1 ist offen. Das wurde gemacht, um auch einen WDC62C02 mit VPB, Vector Pull, an Pin 1 testen zu können. Zusätzlich ist Pin 36 (BE, Bus Enable, mit 10k auf Vcc gelegt). Beim „normalen“ 6502 ist dieser Anschluss nicht belegt. Sollte wider erwartend ein „normaler“ 6502 Prozessor an Pin 1 GND benötigen, kann Jumper JP1 gesetzt werden.

Der NOP-Generator ist hier in Aktion zu sehen.

Gerber-Dateien für 6502 CPU

6510 NOP-Generator

In einem 6510 NOP-Generator eingesetzt führt eine 6510 CPU nur NOP-Kommandos (No Operation) aus. Mit Hilfe von acht LEDs können die Adressleitungen beobachtet werden. Führt die CPU die NOPs aus, sollten die Adressen permanent hochgezählt werden. Damit ist zwar kein vollständiger Test der CPU Möglich, aber zumindest ein Quick-n-Dirty-Check.

Der 6510 NOP Generator liefert den Opcode 0xEA, welches einem NOP beim 6510 entspricht. Nach einem Reset beginnt der 6510 NOP-Generator ab Adresse 0xEAEA zu zählen (nach einem Reset liest die CPU aus den Adressen 0xFFFC-0xFFFD die reale Startadresse ab und da diese immer 0xEA liest, ist dieses die 0xEAEA). Die LEDs sollten somit bei 11101010‬ beginnen zu zählen.

Wer den 6510 CPU NOP-Generator nachbauen möchte findet am Ende des Beitrags die Gerber-Daten zum Download. Benötigt werden nur ein paar wenige Bauteile:

Stückliste / BOM
Ref Qnty Value Remark
C1 1 10nF
C2 1 10uF
C3 1 1uF
D1-D8 8 LED 5mm
J1,J2 1 USB_B 2pol. Micro-USB Buchse, z.B. AliExpress oder USB-B Buchse
R1 1 1K
R2 1 3.3K
R3-R15 5 10K
RN1 1 470 SIP 9 oder SIP 10 (letzter Widerstand wird nicht benötigt)
RV1 1 10K Potentiometer RM-065
SW1 1 RESET 6mm Push Button
U1 1 NE555
U2 1 Sockel DIP40 ZIF oder Präzisionssockel

Anstelle eines teuren ZIF-Sockels kann auch ein Präzisionssockel verwendet werden. Die Bauteilkosten liegen jeweils bei ca. 5-6 EUR zzgl. Platine. Die Platine kann wahlweise mit einer Micro-USB Buchse oder Standard USB-Buchse bestückt werden.

Der NOP-Generator ist hier in Aktion zu sehen.

Gerber-Dateien für 6510 CPU

8 Antworten auf “Hardware Projekte – CPU-Tester”

  1. Markus

    Ich habe das jetzt mal zusammengebaut. Die LED´s zählen fleißig hoch, aber die Startbedingung :
    „nach einem Reset liest die CPU aus den Adressen 0xFFFC-0xFFFD die reale Startadresse ab und da diese immer 0xEA liest, ist dieses die 0xEAEA). Die LEDs sollten somit bei 11101010‬ beginnen zu zählen.“

    konnte ich bisher noch nicht sehen. Die CPU startet immer mit 11101001, also E9.

    Antwort
    • Stephan Author des Beitrags

      Du siehst zuerst (FF)FD (11111101), (FF)FC (11111100), FF, FB, FF, FC, FD, (EA)EA, (EA)EB, (EA)EC… Die dazwischen anliegenden Werte kann ich auf die schnelle auch nicht zuordnen. Es sind aber eine „fake“ Operationen noch im Gange, siehe https://www.pagetable.com/?p=410. Da ich den Takt jetzt nicht dagegen legen kann, kann es sein, dass ich hier die LEDs nur falsch abgelesen habe und es kein eigener Zyklus ist. Filme den Startvorgang einmal und siehe dir die Ausgabe Bild für Bild an.

      Antwort
    • Stephan Author des Beitrags

      Also ich sehe dort jeweils ein Widerstandsnetzwerk. Die sind in Zeiten von SMD evtl. etwas aus der Mode gekommen, es gibt sie aber noch ;) Die LEDs werden also alle mit Vorwiderstand betrieben (steht als RN in der Stückliste).

      Antwort
        • Stephan Author des Beitrags

          Die Adressleitungen sind sicherlich nicht dafür gedacht LEDs dauerhaft zu betreiben. Das Datenblatt schweigt sich über den maximal möglichen Strom an den Adressleistungen aus (150mA-200mA für den gesamten Chip ist angegeben), garantiert aber mindestens 2V bei 250uA für Ioh und maximal 0.4V bei 2mA für Iol. Allerdings sollte man davon ausgehen können, dass jeder Ausgang mindestens eine „TTL Load“ ca. 2-3 mA) dauerhaft ohne Probleme treiben kann (in der Praxis hängen da auch schon einmal drei oder vier TTL ICs dran; beim ZX80 sind es sechs(!), beim ZX81 immer noch vier Bausteine). Für den beschriebenen Einsatz sind die 470 Ohm i.O. Wer ängstlich ist, kann auf Low Power LEDs (2mA) ausweichen und 2.2 kOhm als Vorwiderstand wählen.

          Antwort

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.