Retrocomputing auf FPGA

Aus der Mikrocontroller.net Artikelsammlung, mit Beiträgen verschiedener Autoren (siehe Versionsgeschichte)
Wechseln zu: Navigation, Suche

von Benutzer:Fpgakuechle (Volker Urban)

Dieser Artikel nimmt am Artikelwettbewerb 2012/2013 teil.

"... Er war nie auf dem College gewesen, aber, Junge, er hatte Schaltungen studiert, die von anderen stammten, und wurde allein dadurch einfach unheimlich gut. .." --Steve Wozniak

Der folgende Artikel führt an Hand eines Nachbaus eines 8-bit Computers in den Bereich des Retrocomputing mit FPGAs ein. Es wird gezeigt wie durch Nutzung von FPGA-Baugruppen, Internet-Ressourcen (Handbücher, ROM-Images, open-VHDL-Sources) und üblicher Peripherie (SVGA-Monitor, PS2-Tastatur) Jahrzehntealte Computertechnik nachgebaut werden kann. Da jeder Artikel über einen FPGA-Thema schwer zur Mutation in ein hundertseitiges Buch neigt [1] gibt dieser Artikel Praxis-Erfahrungen über ein DoItYourself Projekt an Geübte wieder und verzichtet auf die Erörterung von FPGA-Grundlagen.

In diesem Projekt wird der Z1013, ein 8-bit Computer-Bausatz von 1985 aus Ostdeutschland auf einem Xilinx Spartan-3 Starterkit nachgebaut.

TinyBASIC und MemDump

Computer Bausatz Z1013

Warum Z1013?

Zum Kennenlernen der Architektur eines Computersystems ist der Z1013 wegen seiner detailierten Dokumentation ideal. Spezialchips zur Sound und Grafikausgabe gibt es nicht, man kann sich also auf den kleinsten gemeinsamen Nenner aller Computer/Controller-technik beschränken. Das Handbuch beschreibt die Interna wie Speicheraufteilung, Interruptsysten, IO-Portadressen im verständlichen Deutsch, Schaltpläne sind Bestandteil des Anhangs. Durch den geringen Speicherbedarf kann das System ohne externen Speicher auf einem LowCost-FPGA realisiert werden. Für Systeme mit einer Z80 CPU ist mit CP/M ein kommerzielles Betriebssystem und damit eine umfangreiche Nutzsoftware verfügbar. Dazu muss das Z1013 System um Massenspeicher (Emulation Diskettenlaufwerke mit 800k Speicherplatz) und Arbeitsspeicher (mindestens 64k) erweitert werden, was mit einem geeigneten FPGA-Evalboard leicht möglich ist. Homecomputer mit einer anderen CPU (6502 wie C64, Atari 800, Apple II) bieten mangels eines Betriebssystems diese Breite an Software nicht oder sind restriktiver hinsichtlich Firmware-Nutzung in Nachbauten.

Eine Z1013-FPGA System kann auch als Grundlage für den Nachbau einer ganzen Reihe von Z-80 basierenden Ost-Computer dienen. Beispielsweise des PC1715 (Quasi-Industriestandard Ostdeutschland und Russland) oder der KC-Reihe (KC-85-2/3/4) die an Hochschulen und Universitäten weit verbreitet war.

Und es gibt einen freien PC-Emulator (J1013) der bei der Entwicklung hilfreich sein kann.

  • Fotos, Beschreibung, Darstellung der vier Typen [2]
  • Der Emulator J1013 [3]

Kein Nachbau nach Schaltplan

Ein Nachbau strichgenau nach Schaltplan ist nur auf dem ersten Blick leichter umsetzbar als ein Neu-Entwurf nach den ursprünglichen Vorgaben. Das Original muss mit alter, wenn nicht gar nahezu ausgestorbener Peripherie (Kassettenrekorder als Datenspeichers, Antenneneingang an einem TV-Gerät) funktionieren. Zum Entwicklungszeitpunkt waren statische RAMs größer 2k-Byte im Entwicklungsland (ehemalige DDR) nicht verfügbar und so wurden - aus strengem Preisdiktat - asynchrone dynamischen Speicher mit einem einzelnen bidirektionalen Datenport und RAS/CAS Addressmultiplex verbaut. Aber auch beim Entwurf des Apple II entschied sich Woz für DRAM. Eine DRAM-Zelle benötigt einen Transistor, SRAM dagegen um die 6. DRAM bietet so etwa 4 mal mehr Speicher für den gleichen Preis und ihm genügt ein kleineres Netzteil. [4]

Das erfordert allerdings zusätzliche Digitallogik für das Umschalten der Busse (Refreshzyklen, Bildspeicher etc.). Bei Verwendung aktueller Peripherie (SVGA-Monitor) und Bauteilen (Embedded Dual-port SRAM im FPGA) entfallen Teile der Schaltung komplett (HF-Modulator). Dual-Port RAMS benötigen keine Umschaltung zwischen CPU und Bildgenerator und können mit weniger Logikgattern aufgebaut werden.

  • Schaltpläne nachgezeichnet [5]
  • Schaltpläne und Belegung Lötkamm für Tastatur als Scan aus der "funkamateur" [6]
  • Originalpläne (?) der ersten Bauversion Z1013.01 als grenzwertiger Scan [7]

Firmware

Die Grundsoftware für den Z1013, in PCs BIOS oder Firmware genannt, heißt hier Monitorprogramm und passt auf 2 KByte. Andere nachzuladende Software wie BASIC-Interpreter setzen auf diese Firmware auf, indem sie auf Routinen bspw. zum Auslesen der Tastatur aufsetzen, resp. diese auf vereinbarten Adressen (Sprungverteiler) aufrufen.

Erste Lebenszeichen der Firmware

Peripherie

PIO

Der Hersteller der Z80 CPU entwickelte für den Anschluss weiterer Geräte wie Tastaturen oder Tapes einen Spezialschaltkreis für parallelen In- und Output (PIO). Dieser wird wie die von Mikrocontrollern bekannten GPIOs eingesetzt und generiert und bedient Interruptanforderungen an die CPU. Die PIO stellt zwei 8bit breite Ports (PORT A und PORT B) zur Verfügung, nimmt IRQ-Anforderungen andere Peripherie-IC's in der Daisy Chain entgegen und leitet sie an die CPU weiter. Die Ports müssen zu Beginn auf eine Betriebsart (Byteweise IN, Byteweise OUT, Einzelbitbetrieb,...) konfiguriert werden. Im Z1013 wird die Matrixtastatur und das Diskettenlaufwerk über die PIO gesteuert. Daher wird die Betriebsart Einzelbit benutzt und nicht wie erwartet der Intterupt-betrieb. Dadurch genügt eine teilweiser Nachbau dieses IC.

  • Datenblatt der Zilog PIO [8]

Tastatur

Für den Z1013 ist eine Matrix-Tastatur vorgesehen, die von der Firmware aktiv abgefragt wird. Die Firmware wählt immer eine Spalte der Tastatur an und liest eine n bit-Zahl wobei jedes bit für eine andere Taste der Tastatur steht. Einige Modelle des Bausatzes unterstützen zwei verschiedene Matrix-Tastaturen, zusätzlich zu der Standard 8x4 Tastatur eine "Komforttastatur" mit einer 8x8 Matrix. So wurden die Tasten nicht übermäßig mehrfach belegt.

  • Die Original "Tastatur" [9]
  • Verbesserte Tastaturen im Eigenbau [10]

Massenspeicher

Der Z1013 lädt und speichert Anwender-programme/Daten vom Arbeitsspeicher zum einem Magnetband. Dazu werden zwei Pins der PIO benutzt. In einem FPGA-Nachbau kann man stattdessen von einem externen Speicher (Flash) direkt den RAM schreiben/speichern. Die Ansteuerung kann weiterhin über das Monitorprogramm geschehen, nur werden dabei nicht die L-oad/ S-Save Routinen benutzt. Der Flashcontroller kann als IO-Gerät an den Adressen oberhalb 0x11 eingebunden werden, die Steuerkommandos (Start/Zieladressen/Kommandos) werden mit dem Out Befehl abgesetzt. Für den Datentransfer zum Arbeitsspeicher gibt es unter anderem folgende Datenpfade:

  • Dualport
  • Memorycontroller
  • Busarbitrierung (DMA) des Z80

Die dritte Variante eröffnet die meisten Optionen, das sie unabhängig von der Speicherarchitektur ist.

Hochfahren und Programm Start

Programme werden nach dem Starten des Monitorprogramms mit dem L(oad) Kommando von Band geladen und mit J(ump) gestartet. Davor initialisiert sich die Hardware:

  1. Der Datenbus ist auf "00" gezogen, die CPU zählt den Adressbus hoch
  2. bei Erreichen des (P)ROMS Adressraums wird der Datenbus freigegeben und das Monitorprogramm startet
  3. das Monitorprogramm initialisiert die PIO zur Benutzung der Tastatur und Bandgerät
  4. der Anwender lädt vom Band das Programm (hier TinyBASIC) mit dem Kommando L-Kommando (L startadresse Endadresse) ,hier: "L 100 B0FF"
  5. das Programm wird mit einem Sprung zur Start Adresse gestartet, hier "J 100"

Auswahl FPGA-Board

FPGA-Boards gibt es zwischen rund 100 € und mehreren Tausend €uro. Fast jedes eignet sich zum Nachbau eines 8-bit Homecomputers. Die folgende Beschreibung der Hauptkomponenten soll helfen ein Board hinsichtlich seiner Eignung für Retrocomputing einzuschätzen. Das Board sollte alle nötige Hardware mitbringen.

20130218 Starterkit oben0001 kmark txt.jpg

VGA-Port

An diesem wird der Monitor angeschlossen, es gibt nur eine Bauform. Das Nachrüsten eines VGA Ports an Erweiterungsport ist möglich. Mit einem FPGA-Pin pro Grundfarbsignal wie im Spartan3-SK sind 8 Farben möglich Weiss auf Schwarz, Grün auf Schwarz, und Gelb auf Blau sind gut lesbare Kombination für Vorder- und Hintergrundfarbe. Bei eingen Evalboards sind 8 pins über Spannungsteiler mit den RGB-Leitungen, das gestattet 256 Farben. Für den Z1013 mit seiner Zeichensatzgrafik ist der VGA-Anschluss mit 3 bit Farbtiefe völlig ausreichend.

Tastaturanschluß

Ein reinrassiger USB-Anschluß ist komplexer als ein 8 Bit Computer selbst, daher sollte eine PS/2 Tastatur benutzt werden. Einige Tastaturen mit USB-Anschluß arbeiten mit einem PS/2 Adapter im sogenannten COMBO. Beim Xilinx Spartan3AN Starterkit liegen die Anschluße allerdings so beengt, das die benachtbarten RS232 Anschlüsse seitlich weggedrückt werden. Das Evalboard sollte also mit einem PS2-Anschluß ausgerüstet sein. Natürlich lässt sich eine PS2 Tastatur auch an zwei Pins und 3.3V fädeln (obwohl PS2 für 5V spezifiziert ist).

Speicher

Im Original ist der Arbeitsspeicher aus dynamischen asynchronen single Port RAM aufgebaut, der Bildspeicher aus asynchronen statischen RAM mit bidirektionalem Datenport. Der Adressbus des Bildspeichers wird über einen Multiplexer zwischen CPU und Adresszähler geteilt.

Im FPGA dagegen stehen uns mit dem BRAM synchroner statischer dual port Ram zur Verfügung, der bereits nach PowerUp initialisiert ist. Dies vereinfacht insbesonders die Beschaltung des Bildspeichers. Im Original wird der einzige Port zwischen CPU und Displaylogik mittels der Bustreiber im Adress- und Datenbus umgeschaltet. Im FPGA dagegen wird die CPU an einem Port, der nur zum Beschreiben genutzt wird angeschlossen, die Videologik an den zweiten Read-Only Port.

Zuweilen genügen die Speicherblöcke im FPGA, die 12 BRAMS Spartan3-200 sind genug für 16kB Arbeitsspeicher, 4kB ROM mit Urlader, 2kByte Zeichensatz und 1kByte Bildspeicher. Dem Betriebssystem CP/M mit typischerweise 80x24 Zeichen genügt das völlig. Dagegen benötigt Pixelgrafik schnell ein Mehrfaches, schon bei heute als grobpixelig geltenden 256 Farben.

Während Arbeitsspeicher einfach mit FPGA-externen Standard-RAM ersetzbar ist, vereinfacht interner Bildspeicher als Dual-port RAM das Systemdesign deutlich. Allerdings reicht interner RAM insbesonders der kleineren XILINX-FPGAs kaum für mehrfarbige Pixelgrafiken. Altera - FPGAs gelten hinsichtlich RAM als besser ausgestattet. Alternativ zum Embedded RAM kann ein zweiter externer SRAM eingesetzt werden. Bilddaten könnten zeilenweise zwischengespeichert und während der Blankphasen (VBlank, HBlank, Schwarzränder geschrieben werden.


Grafik + Bildspeicher
Computer Mode Bildspeicher FPGA Embedded RAM
Z1013 32x32 Zeichen 2+1 kByte Sparten3A-200 36 kByte
C64 320x200 16 Farben 2x16 kByte 16 64 kByte
VGA 320x200 256 Farben 64 kByte EP3C40 126 kByte
SVGA 800x600 HiColor 960 kByte Actel-Igloo -600 ~25 kByte

Dem Digilent BASYS2 Board fehlt leider jeder Speicherchip und der on-board Spartan-3 - 100 mit 2 BRAM's (4 kByte) ist zu klein um diesen Mangel auszugleichen.

Massenspeicher

Programme für 8bit Computer sind meist kleiner als der zur Verfügung stehende RAM, also 64 kB. Ein Eval-Board für Retrocomputing sollte also mindestens 64 kByte an nichtflüchtigen Speicher mitbringen, für Diskettenorientierte Systeme (C64 ca. 180 kByte; CP/M mit 400 - 800 kByte pro Diskette) deutlich mehr. Der ROM für das FPGA-Bitfile kann bis zu 128 kByte an Nutzerdaten aufnehmen, so das Platform-Flash XCF02S auf dem Spartan3 Starterkit und kann vom PC aus mit dem FPGA Programmiertool impact) beschrieben werden. Anderer Boards haben Flash Chips on Board (bspw S-3A SK mit ???). Speicher mit seriellen Interface genügt den geringen Geschwindigkeitsanforderungen.

Der Platform-ROM hat nur eine begrenzte Anzahl von Schreibzyklen, die für den xcf02s auf dem Startekit von Xilinx mit mindestens zwanzig Tausend angegeben wird. Das ist für die gelegentliche Nutzung ewig, bei intensiver Nutzung durch eine Person 10 Schreiben pro Arbeitstag noch normal endlich (8 Jahre), aber bei Nutzung in der Schulung oder als CP/M - Arbeitsrechner mit häufigen Zwischenspeichern Zum Beispiel von Basicprogrammen/Spielständen/Texten bedenklich. Zumal ein Austausch eine BGA-Reworkstation erfordert und nur begrenzt oft möglich ist. Eine SD-Karten Lösung wie in der ct beschrieben oder in den ZTEX Modulen realisiert ist der bessere Disk-Ersatz.

  • Datenblatt Platform Flash [12]
  • vom Ram Nutzerdaten in den FPGA lesen [13]
  • SD-Karte als Konfigurations- und Datenspeicher für FPGA-Systeme [14]
Drei FPGA-Boards, Programmer, VGA-Terminal

FPGA-Auswahl

Das dickste Ding im Computer ist die CPU, sie ist der eine Faktor der die Auswahl des FPGA bestimmt. Als Anhaltspunkt für die Auswahl dient die Anzahl der Transistoren.

Nach Erfahrung des Autors füllt eine Z80 CPU einen S3-100, dagegen passt ein Motorola 68000 knapp in einem S3-700. Alle 8-bit CPU passen also in die kleinen, aber nicht die kleinsten FPGAs. Bei 16/32 bit Maschinen dagegen muss man sich an mittleren bis großen Typen der low-cost Baureihen halten. Bei CISC-Prozessoren kommt erschwerend hinzu, das die tiefe Logik (Addressierungsarten) die maximale Taktfrequenz drückt. So sind im Widerspruch zu PC-CPU's die älteren 8-bit Architekturen um ein schneller taktbar als die 16/32 bit Architekturen. Dies gilt nicht für auf FPGA-optimierte CPU-Cores (picoblaze, microblaze) die etwa gleichauf liegen (60-90 MHz)

CPU und FPGA-Größe (circa mit Chipsatz)
CPU Transistorcount Jahr, Computer Jahr FPGA
6502 3 510 Apple II, C64 1975
Z80 8 500 CP/M-PC, Sinclair Spektrum 1976 Spartan3-200 (70%)
picoblaze 96 slices 8bit FPGA opt. Softcore ? Spartan3-50 (13%)
8086 29 000 XT 1978
68000 68 000 Amiga, Apple Mac, Sun-I 1979 Cyclone III-25, Spartan3A-1400A
286 134 000 AT / MS-DOS 1982
68020 190 000 Mac II/Sun 3 1984
386 275 000 full 32 bit, Linuxfähig 1985
microblaze 1000 slices 32bit FPGA opt. Softcore ? Spartan3-200 (50%)


  • Transistorcount vieler Prozessoren [15]
  • Abschätzungen für einen 8 bit Prozessor (6502) [16]

Interessant ist die Lösung der Sun-1 die neben dem Motorola 68000 eine Eigenbau-MMU mitbringt und so UNIX-tauglich wird. Auffallend ist der große Unterschied zwischen einem FPGA-optimierten Softcore und einem Nachbau einer PC-CPU. Die Grenze an der eine FPGA-Implementierung noch im Hobbybereich akzeptabel ist, liegt beim Motorola 68000. Bei CPU's mit höheren Transistorcount genügen die LowCost-FPGA meist nicht und es müssen FPGA's teurer als 100€ verwendet werden.

Zusammenfassung Boardauswahl

Für den Nachbau eines 8 Systems genügen fast alle FPGA-Boards, mit Einschränkungen auch die vor 10 Jahren gefertigten. Nachrüstungen sind über die Expansionports meist einfach möglich, aber oft nicht nötig.

Für den lötfreien Einstieg:

  • VGA-Port: hat mindestens 3 bit Farbcodierung (Rot, Grün, Blau) für 8 Farben, besser sind 8 bit
  • PS2 Schnittstelle (3V3 sollten OK sein, obwohl PS/2 für 5V spezifiziert)
  • 512kbit Flash/PROM
  • RAM: 24 kB intern für die allerkleinsten 8-Biter, besser 64-128kB SRAM
  • kleiner LowCost-FPGA (mindestens 200k Spartan-3)
  • RS232 für eine Terminalverbindung zum PC
  • 4 LED's, 3 Taster, 4x7 Segment zum schöner debuggen

Für 16 bit Computer (Commodore Amiga (MC68000))

  • 1-4 MB RAM
  • 4-64 MB Flash
  • mittel bis großer LowCost FPGA:
    • Xilinx Spartan3A XC3S1400A
    • Altera Cyclone-III EP3C25E144C8
    • Xilinx Spartan-6 XC6SL25

Nicetohave

  • zwei RAM-Busse
  • SRAM statt SDRAM
  • 25+ Pins für Erweiterungen bspw D-SUB über Levelshifter/RS232 Treiber

Boardübersicht

  • Bewertung einiger Xilinx und Altera Starterkits hinsichtlich Eignung für 8bit computing [17]
  • Überblick über die Digilent Boards [18]
  • Xilinx Starter Kits and Eval-Boards [19]
  • Terasics Boards (Altera) [20]
  • FPGA-Board Übersicht auf mikrocontroller.net[21]
Simulationsdetail

Geräteauswahl

Monitor

Die Grafik älterer Computer mit ihrer geringen Pixelanzahl ist auch auf kleinen Flachbildschirmen gut darstellbar. Um das lästige Umstecken zwischen Entwicklungsrechner und FPGA-Board zu vermeiden wurde ein 13 Zoll Kassenmonitor (gebraucht ca. 45 €) eingesetzt.

Tastatur

PS/2 Tastaturen sind im Vergleich zu USB-Tastaturen einfach im FPGA decodierbar und daher ideal fürs Retrocomputing. Geeignete, meist ältere Tastaturen mit USB-Anschluss können über einen PS2 zu USB Adapter genutzt werden. Nicht jede Tastatur mit USB-Anschluss arbeitet mit einem PS/2-Adapter, am besten mit einem FPGA-Referenzdesign prüfen, das den Tastencode auf der Siebensegmentanzeige ausgibt. In diesem Projekt wurde eine neue flexible (Gummi-) Tastatur mit dem beigelegten USB auf PS/2 Adapter problemlos eingesetzt.

  • Zum Unterschied zwischen PS/2- Tastatur, Tastatur mit USB-Anschluss und USB-Tastatur [22]
  • Testdesign zum Test einer PS2-Tastatur [23]

Implementierung

Arbeitsumgebung: Schaltplan, Vorlage Original Tastatur, Programmer, Editor,Programmiertool (impact),cmd-shell

Toolchain/Filestruktur

Begonnen wurde das Projekt mit einer einzigen Zielhardware - dem Xilinx Spartan3 starterkit - im Kopf. Die Dateien und der Flow sind noch für dieses Target ausgelegt, wünschenswert ist eine Trennung zwischen den Files für die unterschiedlichen Targets, wie Spartan 3-AN Evalboards, ZTEX-Spartan-6 boards, Altera DE2, Actel-FLASH FPGA's.

Die Sourcefiles wurden bereits aufgeteilt in

  • Board-spezifische Dateien (Pin-definitions, wrapper, testbench) unter /Starterkit
  • vom Autor für den Nachbau erstellte files /src/vhdl
  • kleine Hilfsmodule (LED-blinker, 7-Seg Muxer) unter /kleinkram
  • 3rd party sources aus anderen Open-Source o.ä. Projekten haben ebenfalls eigene Verzeichnisse

Dateien die sich von board zu board unterschieden wie Makefile, Pinassignments (.ucf für Xilinx) und die top-entity finden sich im Verzeichnis /board_specific. Die Dateien für das Sparta3-Starterkit liegen bspw. unter board_specific\Xilinx\Spartan-3_StarterKit.

Architekturspezifische Files wird es für das Taktsystem und den Zugriff auf den Konfig-ROM (User-Data im Platform-Flash) geben. Diese Files werden dann im Flow durch die für Altera etc ersetzt. Kleinere Unterschiede können über das generic SYSTEM ausgewählt werden und im HDL-Code ohne Dateiaustausch umgesetzt werden.

Die Steuerung über ein Makefile trägt ebenfalls zur Portierbarkeit bei. Für die Umsetzung auf Windows-pc ist das make-tool aus den GNU-tools for windows zu installieren. Mit make werden alle tools aufgerufen um aus den sourcen ein binäry für die direkte Programmierung des FPGA's zu erzeugen und ein PROM-Image für das Starterkit zu erzeugen.

  • Anleitung zum Make für Xilinx [24]
  • make for windows [25]
  • Allgemeine makeanleitung: [26]
  • Xilinx-Tools im commandline Modus [27] [28]

Synchrone BRAM ersetzen asynchrone SRAM/ROM/DRAM

Im Original sind CPU und die PIO (Parallel In/Out) mit 1 - 4 MHz getaktet, die anderen Bausteine (RAM, ROM's) arbeiten asynchron. Dagegen sind die Speicherblöcke auf dem FPGA (BRAM) synchron, müssen also mit der CPU an einem Taktnetz liegen. Um Latenzen gegenüber den originalen Taktschema zu vermeiden wird die CPU mit der entgegengesetzten (Steigend - rising) Flanke bezüglich der Speicherbausteine/PIO (Fallend - falling) betrieben.

Takt

(Source: dcm_sys.vhd [1]) Für die Erzeugung des SVGA-Timing ist ein Takt von 40 MHz nötig. Auf dem Evalboard befindet sich ein Taktgenerator mit 50 MHz. Das Originalsystem wurde je nach Qualität der verbauten Schaltkreise (sogenannte Bastlertypen) mit 1, 2 oder 4 MHz betrieben. Jedes Board konnte (auf eigenes Risiko) von 1 auf 2 MHz umgelötet werden. Auch wenn das FPGA-Design deutlich schneller getaktet werden könnte, wird ein Takt nahe am Original erzeugt. Mit den vier Digitalen Clock Manager (DCM) im Spartan 3 kann der Eingangstakt geradzahlig bis 16 geteilt werden und/oder durch Digitale Frequenzsynthese (DFS) auf eine Frequenz mit einem nicht-ganzzahlige Faktor umgewandelt werden.

Clk archw.png

Für eine Umsetzung auf andere Boards muss das Taktsystem möglichst einfach sein. Deshalb wird nur eine DCM verwendet, die DFS erzeugt aus den 50 MHz den 40 MHz für das SVGA-Module und mit dem maximal möglichen Teiler von 16 wird ein Takt von 3.125 MHz für den Computer erzeugt . Der VHDL-Code (dcm_sys.vhd) wurde mit dem "architecture wizard" (Xilinx\14.3\ISE_DS\ISE\bin\nt64\arwz.exe) erstellt.

  • Application Note - Using DCM in Spartan3: [29]
  • Anleitung Archtecture wizard im Xilinx synthesis Guide S.23 ff. [30]

Alternativ hätte man statt mehreren Takten auch einen Takt und ClockEnable verwenden können. Dann hätte man aber auch den CPU-Core umschreiben und neu testen müssen. Da FPGA's und der Designflow mit mehreren Takten umgehen können, wäre dies kein wirklicher Gewinn an Kompatibilität oder Einfachheit. Auch werden die Taktübergänge schon in der System-Architektur abgefangen, Dual-Port Video-RAM und Handshake Signale zur Peripherie haben sich seit Anbeginn der Computertechnik bewährt.

(P)ROM-Images

ROM-Images, egal ob Monitorprogramm (ROM.vhd [2] + bm204_empty_pgk.vhd [3]) oder Zeichensatz charrom.vhd [4] + bm100_pkg.vhd [5]) liegen meist als Binärdatei vor. Für das FPGA werden diese Dateien nach VHDL konvertiert, das Image wird dabei in eine Konstante vom Typ std_logic_vector überführt.

  subtype T_BM100_INDEX is integer range 0 to 2**11 - 1;

  subtype T_WORD      is integer range 255 downto 0;
  type    T_BM100_MEM is array (T_BM100_INDEX'low to T_BM100_INDEX'high) of T_word;

constant C_BM100_MEM_ARRAY_INIT : T_BM100_MEM := (

Beispiel Zeichensatz: Zuerst wird die Binärdatei zu einem lesbaren Hex-Dump umgewandelt, beispielsweise mit einem Hexeditor, dem hexlify-mode des EMACS, oder mit od (gnu-tool).

C:\Users\FPGA\ROM-Images> od -t x1 bm100.bin
0000000 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0000160 00 00 18 24 24 18 24 42 db a5 81 ff 24 24 24 42
0000200 08 34 42 81 91 69 09 31 42 7e 81 ff 00 00 00 00
0000220 18 24 42 99 bd 99 42 24 7e 42 99 e7 00 00 00 00

Am rechten und linken Rand den Text entfernen (EMACS: "kill-rectangle"), anschließend alle Leerzeichen mit "#, 16#" ersetzen.

ff#, 16#ff#, 16#ff#, 16#ff#, 16#ff#, 16#ff#, 16#ff#, 16#ff#, 16#ff#, 16#ff#, 16#ff#, 16#ff#, 16#ff#, 16#ff#, 16#ff#, 16#ff
00#, 16#00#, 16#18#, 16#24#, 16#24#, 16#18#, 16#24#, 16#42#, 16#db#, 16#a5#, 16#81#, 16#ff#, 16#24#, 16#24#, 16#24#, 16#42
08#, 16#34#, 16#42#, 16#81#, 16#91#, 16#69#, 16#09#, 16#31#, 16#42#, 16#7e#, 16#81#, 16#ff#, 16#00#, 16#00#, 16#00#, 16#00
18#, 16#24#, 16#42#, 16#99#, 16#bd#, 16#99#, 16#42#, 16#24#, 16#7e#, 16#42#, 16#99#, 16#e7#, 16#00#, 16#00#, 16#00#, 16#00

Dann an den Rändern ergänzen, die array-Grenzen an die Filelänge anpassen und den Rest zum package ergänzen - fertig.

library ieee;
use ieee.std_logic_1164.all;

package bm100_pkg is
  subtype T_BM100_INDEX is integer range 0 to 2**11 - 1;

  subtype T_WORD      is integer range 255 downto 0;
  type    T_BM100_MEM is array (T_BM100_INDEX'low to T_BM100_INDEX'high) of T_word;

constant C_BM100_MEM_ARRAY_INIT : T_BM100_MEM := (
16#ff#, 16#ff#, 16#ff#, 16#ff#, 16#ff#, 16#ff#, 16#ff#, 16#ff#, 16#ff#, 16#ff#, 16#ff#, 16#ff#, 16#ff#, 16#ff#, 16#ff#, 16#ff#,--x00|x01
--...
16#00#, 16#ff#, 16#ff#, 16#ff#, 16#ff#, 16#ff#, 16#ff#, 16#ff#, 16#ff#, 16#ff#, 16#ff#, 16#ff#, 16#ff#, 16#ff#, 16#ff#, 16#ff#);
end package bm100_pkg;
Kein Suhali Zeichensatz, sondern invers gesetzter Index integer range 2**11 - 1 downto 0

In der zugehörigen Datei (rom.vhd resp. charrom.vhd per use Anweisungen das zu nutzende ROM-Image auswählen -> fertig.

--...
use work.bm100_pkg.all;  --character ROM
--...

architecture behave of char_rom is
  signal crom_array : T_BM100_MEM := C_BM100_MEM_ARRAY_INIT;  --character rom
  signal crom_index : T_BM100_INDEX;
--...

Natürlich funktioniert diese Vorgehensweise auch für den Arbeitsspeicher und Bildwiederholspeicher. So kann auch ohne Zuarbeit der CPU ein Bild bspw. welcome-screen angezeigt werden. Der Original-Computer kann das natürlich nicht.

Adressdekoder

(Source File: addr_decode.vhd [6])

Im Adressdecoder werden die select-Leitungen für die Speicherbaugruppen (ROM mit Monitorprogramm, Bildwiederholspeicher, Arbeispeicher) und IO-Geräte (Parallel-IO Port PIO, Tastatur-Zeilen-Ansteuerung) erzeugt. Im Original ist das mit Binär zu Dezimal-Dekodern, AND-Gattern und Diodenlogik realisiert. Im Nachbau genügen VHDL-select Anweisungen. Die Unterscheidung zwischen IO-Ports und Speicher-bereichen geschieht anhand der CPU-Signale IREQ und MREQ. Die Speicheraufteilung und IO-Adressen sind im Anhang des Z1013 Handbuchs beschrieben.

  • Speicheraufteilung/IO-Adressen [31]

Ein REFRESH ist bei SRAM-Blöcken nicht nötig, daher werden die Refresh-Zyklen anhand des Refresh-Signals ausgeblendet.

Arbeitsspeicher

(Source File RAM.vhd [7]). Der Arbeitsspeicher wird als 16kx8bit array beschrieben und ist mit 8 BRAM's des FPGA realisiert. Die unscheinbare Definition von 3 Bytes an den Adressen x0000 - x0002 ersetzt die PullDowns R44-R51, das FF aus A25 und A26. Im Original wird nach dem Reset der Datenbus auf x00 gehalten, so dass die CPU NOP (No-OPeration)-Instruktionen "ausführt", also nur die Adresse auf dem Addressbus hochzählt. Erst beim Erreichen der PROM Startadresse wird der Datenbus freigegeben und das Betriebssystem wird gestartet. Im Nachbau ist an der ersten Addresse die die CPU einliest ein Sprungbefehl "gebrannt", - der Nachbau beginnt daher sofort mit der Firmware. Bei Verwendung von externen RAM ist dies nicht möglich und der datenbus muß nach dem Reset vom Speicher getrennt werden. Im Original trennt der Bustreiber A1 die CPU in zwei weiteren Fällen vom Arbeitsspeicher:

  • während eine REFRESH-Zyklus und
  • einer Busfreigabe für einen DMA (Direct Memory Access) über die CPU-Signale BUSRQ und BUSAK

Letztere Fall wird benötigt wenn der Speicher von einer anderen Quelle als der CPU genutzt wird. Beispielsweise beim Lesen schreiben durch einen HOST-PC über eine RS232 Schnittstelle o.ä..

Textausgabe

Der Bildspeicher (video_ram.vhd [8]) ist als Dual-Port-Speicher realisiert. Die CPU beschreibt und liest den 1 kB großen Speicher über den einen Port, der SVGA-Controller liest ihn über den zweiten Port aus. Zu Testzwecken kann die CPU vom Bildspeicher getrennt werden (Generic: G_READONLY). Der VGA-Controller stellt dann den Bildspeicher so dar wie er beim Laden das FPGA's initialisiert wurde. In dem Package video_ram_pkg.vhd [9] sind zwei Konstanten für die Initialisierung definiert. Mit C_VRAM_ARRAY_INIT stellt die wichtigsten Zeichen auf den oberen Zeilen dar:

Testbild aus video_ram_pkg.vhd

Somit kann die Monitorausgabe überprüft werden ohne das ein Programm von der CPU abgearbeitet wird.

Dagegen füllt die andere Konstante C_VRAM_ARRAY_SPACES_INIT den Schirm mit Leerzeichen.

Der Datenausgang des Bildspeichers ist mit den oberen 8 Adressbits des Zeichengenerators (Eingang: addr_char_i) verbunden und wählt so das zu darstellende Zeichen aus. Die unteren 3 Addressbits (addr_line_i) bestimmen die aktuell auszugebende Zeile des Zeichens. Der Zeichengenerator ist als 2KByte großer ROM realisiert (Datei: charrom.vhd [10],. Ist der PROM nicht selektiert wird eine Zeile eines Leerzeichens (alle bits 0) ausgegeben.

Der Zeichensatz selbst ist im Package bm100_pkg.vhd [11] definiert. BM100 steht für "Bitmuster 100" dem Standard-Zeichensatz des Z1013. Die Originale finden sich auf [12] als Bitmuster-Dateien (siehe Erläuterungen oben). Alternativ können Zeichensätze des C64 Homecomputers benutzt werden, bspw.: [13]. Beide Computer verwenden Zeichen aus 8 mal 8 Pixeln. Auf dem SVN Server wurde ein Package mit leeren Zeichen abgelegt. Wie es mit mittels der Binärdatei modifiziert werden kann, wurde oben beschrieben.

Für die Ausgabe über die VGA-Schnittstelle nach VESA-Standard wurde der Beispielcontroller von Digilent ohne Änderungen übernommen. Auch auf mikrocontroller.net hat es ein VGA-Projekt und Hintergrund-Infos: Projekt_VGA_Core_in_VHDL. Im Modul video.vhd [14] wird der Bildspeicher ausgelesen und als RGB Signal ausgegeben. Mit 6 Schaltern auf dem Starterkit kann Vordergrund- und Hintergrundfarbe an persönliche Sehgewohnheiten angepasst werden.

  • Timings mach Auflösung und Bildwiederholrate [32]
  • Infos zum Z1013 Zeichensatz [33]
  • Alternativer 8x8 Zeichensätze [34]

Tastatur

  • kyb_emu.vhd - Umsetzer Scancode -> 8x4 Tastenmatrix [15]
  • kyb_emu_pgk.vhd - Package für Konstanten (Scancode - Tasten) [16]
  • kb2vhdl.vhd - (altes) PS/2 Tastatur-Interface (nicht mehr verwendet)[17]
  • kb2vhdl_fk.vhd - (neues) PS/2 Tastatur-Interface [18]

Für den Anschluss der PC-Tastatur an die PIO sind zwei Module zuständig. Das erste liest über das serielle 2-Draht Interface den Code der Taste, das zweite emuliert die originale 8x4 Matrix und wie diese den Tastendruck signalisieren würde. Für das PS/2 Interface wurde zuerst ein Beispiel für das S3-Starterkit verwendet, eine nicht so gute Wahl. Das Demo setzt den Tastendruck direkt auf die 7-Segment Anzeige um und "unterschlägt" dabei die Steuercodes die anzeigen, ob die Taste gedrückt oder losgelassen wurde. Das Modul wurde daher komplett umgeschrieben, so dass der Tastencode bereits beim Drücken der Taste mit 8 bit signalisiert wird und nicht erst bei deren loslassen. Dies ist für die Erkennung einer Eingabe mit gleichzeitig gedrückter Shift-Taste unabdingbar. Tückisch ist eine Komfortfunktion der MF2-Tastatur - die automatische Tastenwiederholung (typematic). Wird eine Taste längere Zeit (typematic delay) gedrückt gehalten, wird deren scancode automatisch wiederholt (typematic rate (per second)). Daher wird die Tastatur in ein Schieberegister eingeschoben bis der Code xF0 gelesen wird. Dieser geht dem scancode voran sobald die Taste losgelassen wird. Das Zeichen wird also erst nach Loslassen der Taste angezeigt. Das neue Interface dagegen liest 8 bits nach dem Startbit und analysiert dann ob es um ein Steuerzeichen handelt (weiter Auswertung: xF0= -> Taste losgelassen, xE0 extended scancode) oder nicht (Taste gedrückt).

Prinzipskizze Tastatur-Umsetzer

Der zweite Controller (Keyboardemulator) ist an den Spaltentreiber des Z1013 und an 4 auf Eingang konfigurierten Leitungen der PIO angeschlossen. Diese 4 Leitungen sind an den einen Datenausgang eines kleinen 8x4bit Speicherblocks angeschlossen. Dieser Block emuliert das originale 8x4 Speicherfeld. Eine '0' zeigt an das die entsprechende Taste gedrückt ist. Der Tastaturemulator überprüft ob ein neuer Scancode anliegt. Liegt der Scancode der (PS/2)-Shift-Taste an wird der Status entsprechend geändert und bei der Auswertung des Scancodes herangezogen. Dazu wird intern den 7 bit unteren Bits des Scancodes eine '1' vorangestellt. Aus dem Scancode wird ermittelt:

  • ob eine der vier Z1013 Shifttasten zu emulieren ist
  • die Spalte (1 von 8, Nummer 8 ist außen rechts) der gedruckten Taste in der originalen 4x8 Tastatur
  • die One Hot Codierung der Taste auf einer der vier Zeilen ("0001" für die unterste (Shifttasten))


Die Zuordnung von Scancode zu Shift und Tastenmatrix ist in einem Record hinterlegt

CONSTANT C_ALL_KEYS : T_ALL_KEYS := (
--Index =>  Scancode   , Shift, Col,  Row
  K_0    => (16#45#,     S1,     1,   2),         --'0' 
  K_0_S  => (16#C5#,     S1,     6,   3),         --'='
  K_1    => (16#16#,     S1,     2,   2),         --'1' 
  K_A    => (16#1C#,     NONE,   2,   1),         --'A' 
  K_A_S  => (16#9C#,     S3,     2,   1),         --'a'

Die Spalten (col) werden in dem Record von 1 bis 8 nummeriert, die Zeilennummer reichen von 1 bis 4. Die Shifttasten sind mit NON,S1,S2 und S3 codiert. Im FPGA wird diese codierung in einen ROM mit 7bit breiten Datenworten umgesetzt. Von deisen 7 bit stehen 2 für den SHIFTcode, 3 für die Spaltennummer und 2 für die Zeile. Die Konvertierung vom record in die 7bit Zahl realisiert die Funktion c8x4slv. Die binär codierte Zeilennummer wird in eine 1 aus 4 Codierung umgesetzt, wobei '0' für eine gedrückte Taste der 8x4 Matrix steht. Die Spaltennummer wird als Adresse, das Bitmuster der Spalte(n) als Datum für den Dualport 8x4 bit Speicher genutzt. Dieses kleine Speicherfeld "emuliert" das Tastenfeld.

Eine Stamachine setzt das Drücken bzw. Loslassen einer Taste in zwei Phasen um. Zuerst wird in der Tastermatrix die S1|S2 oder S3 Taste nachgestellt, dann die eigentliche Taste. Für sie S1-S3 Tasten wird die Spaltenadresse ausdekodiert, die Zeilennummer ist immer "1110" (unterste Zeile). Da in den vier Spalten links zwei Tasten gedrückt sein können (bspw S1 für x) wird in der zweiten Phase die zeilennummer über den zweiten Port zurückgelesen und die Zeilennummer der eigentlichen Taste hinzugefügt.

Beim Loslassen einer Taste wird für die S1|S2|S3 und für die eigentliche Taste immer "1111" geschrieben also die gesamte Spalte als "nicht gedrückt" signalisiert.

Zwischen den vier Phasen (Shift/Taste "loslassen", eigentliche Shift/Taste "drucken) die für eine Taste der PS/2 abgearbeitet werden Pausen von zirka 10 Milisekunden eingelegt, damit die Firmware auch das "Loslassen" 4x8 Tasten erkennt. Ohne diese Pausen werden von der originalen Firmware nur ein Drittel der Tasten und diese auch noch unzuverlässig erkannt.

  • Ausführliche Darstellung eines VHDL-Interfaces und der Scancodes [35]

"Vor"-laden und Starten eines Programmes

Der Inhalt des Arbeitsspeicher kann bereits im VHDL-Code initialisert werden und so ein programm ohne den Umweg Ladebefehl des Monitorprogrammes geladen werden. Programme für den Z1013 liegen meist als *.z80 Dateien vor. Die ersten 32 byte enthalten als Header die Start-und die End adresse des Programmes, die folgenden bytessind ab der Startadresse in den RAM zu speichern. In den ersten 3 Bytes ist ein Sprungbefehl zum ROM abzulegen:

  • Speicherabbild als Konstante anlegen:
constant C_RAM_ARRAY_INIT : T_RAM := (

  16#C3#, 16#00#, 16#F0#,16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#,  --jump to prom
 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#,   --0x10
 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#,   --0x20
 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#,   --0x30
 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#,   --0x40
 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#,   --0x50
 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#,   --0x60
 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#,   --0x70
 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#,   --0x80
 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#,   --0x90
 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#,   --0xA0
 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#,   --0xB0
 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#,   --0xC0
 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#,   --0xD0
 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#,   --0xE0
 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#,   --0xF0
 16#c3#, 16#af#, 16#07#, 16#c3#, 16#bb#, 16#01#, 16#e7#, 16#00#, 16#c9#, 16#e7#, 16#01#, 16#c9#, 16#e7#, 16#08#, 16#c9#, 16#e7#,   --0x100
--....

Der (entfernte) Header für tinyBASIC ist:

--32 byte headersave header
--0000000 00 01 ff 0b 00 01 00 00 00 00 00 00 43 d3 d3 d3
--0000020 5a 31 30 31 33 20 54 69 6e 79 2d 42 61 73 69 63

Die ersten zwei Bytes nennen die Staradresse (0100 in getauschten bytes) bytes drei und vier nennen die endadresse (ebenfalls gedreht 0bFF).

  • FPGA kompilieren und laden
  • Befehl "J 100" eintippen -> das Programm starten

Das Monitorprogramm muß vor dem Anwenderprogramm gestartet werden, da es die PIO konfiguriert. Ein Sprungbefehl auf die Adresse 0100 stat auf F000 in den ersten 3 Bytes des RAM's startet daher nicht korrekt.

  • Beschreibung *.z80 Header [36]
  • Softwarearchive Z1013 [37]
  • tinyBASIC für Z1013 [38]
  • Befehlsübersicht tinyBASIC [39]

Quelltexte und Compilation

Vom Autor erstellte Quellen liegen auf dem hiesigen SVN-Server (siehe Downloads). Fürs Gesamtprojekt brauchts auch Quelltexte die auf anderen Open-Source Depots lagern:

3rd party sources
Verzeichniss Zweck Woher
t80 CPU (Z80) [19]
VGARefComp SVGA Controller 800x600 @ 60Hz [20]

Bitte die Quellen von den angegebenen Servern downladen und in die zugehörigen Verzeichnisse kopieren. Die Tastaturansteuerung wurde im Laufe des Projektes komplett neu geschrieben und liegt daher auf dem hiesigen Server.

Neben diesen VHDL-Quelltexten werden auch das ROM-Image für das Monitorprogramm benötigt. Die Originale und Hobbyisten-Varianten finden sich auf [21] als Bitmuster-Dateien (siehe Erläuterungen oben). Alternative Firmwaren gibt es dort: [22] Wie man Binärdateien nach VHDL-konvertiert wurde im Abschnitt Retrocomputing_auf_FPGA#(P)ROM-Images gezeigt.

Das Kompilieren erfolgt per make. Aufgerufen wird das make aus den GNU-Utilities for Windows [40]. Andere maketools wie nmake von microsoft sind frustrierend inkompatibel zu dem gnu-make, daher wird nur dieses unterstützt.

Sinnvolle Verwendung oder "just for fun"?

Für Steve Wozniak, den Entwickler des Apple I und II ist es keine Frage, man muss nicht studiert haben um gut in Hardware zu sein solange man Schaltungen anderer studiert und es dann selber macht.

"Wozniak: Die besten Dinge, die ich bei Apple auf die Beine gestellt habe, resultierten daraus, dass ich (a) kein Geld hatte und sie (b) noch nie zuvor gemacht hatte": ..

Livingston: Glauben Sie, dass dies das Rezept ist, um richtig gut in etwas zu sein? Wenn man es noch niemals zuvor gemacht hat und versucht, es möglichst billig hinzukriegen?

Wozniak: Yep. ... Wir hatten einen Typen, der den Macintosh entworfen hat, und der war genauso. Er war nie auf dem College gewesen, aber, Junge, er hatte Schaltungen studiert, die von anderen stammten, und wurde allein dadurch einfach unheimlich gut." [41]

Retrocomputing per Nachbau ist also eine gute Chance so gut wie der Wizard of Woz zu werden ;-) .

Debug-Module FPGA-Systeme

Viele FPGA-system nutzen Softcores (NIOS, picoblaze) zur Ansteuerung und kommunizieren mit einem Steuerrechner über RS232 (Terminalverbindung) oder Ethernet. Der Softcore parst die eingehenden Kommandos (meist in der Form RD|WR Addr data) und beschreibt/liest dann die FPGA-Register. Wie gezeigt kann auch ein komplettes (Home)-Computer system in einem FPGA generiert werden. Im Unterschied zu selbstgestrickter Softcore-Software steht eine Menge von erprobter und schlanker Software zur Verfügung z.B. BASIC. In BASIC wird mit den IN/OUT Befehlen auf Register an der Peripherie zugegriffen, mit PEEK/POKE auf Speicherbereiche. Auch kommt ein solches System ohne einen Steuerrechner aus, solange eine Tastatur und ein VGA-Display oder gar Handy-Beamer mit VGA-Eingang angeschlossen werden kann. Natürlich ist die Rechenleistung eines historischen Computersystem fern von dem eines auf FPGA's optimierten 32bit Softcores. Fürs Parametrisieren von Registern, Auslesen von Speicherbereichen und aufbereitete Ausgabe mit kurzem BASIC-Programm reicht es allemal. Und kommt ohne Megabyte an C-Compiler Umgebung und "Micro"-Linux-Cores aus.

Altrechner transportabel

Für die meisten frühen Computersysteme wurde nie eine Mobile Version entwickelt. Eine FPGA Version ist nicht nur deutlich kleiner und kann mit einer Batterie betrieben werden, da VGA-Monitore oft verfügbar sind kann der überschwere Original Monitor (meist Röhren-TV) daheim bleiben. Eine Version mit TFT Display statt Monitor wird ebenfalls möglich und bleibt wegen der Textausgabe auch bei kleinen Anzeigen lesbar.

Downloads

Foren - Diskussionen

Web Ressourcen/Einzelnachweise

  1. http://www.heise.de/ct/artikel/Loetfreies-Basteln-291660.html ct-Artikel zum Lötfreien Basteln
  2. http://www.robotron-net.de/z1013.html Übersicht auf robotron-net.de
  3. http://www.jens-mueller.org/j1013/ Emulator in Java
  4. http://www.vectronicsappleworld.com/appleii/appleitoappleii.php Details zum Apple II Entwurf
  5. http://www.z1013.de/schaltplaene.html Nachgezeichnete Schaltpläne
  6. http://hc-ddr.hucki.net/wiki/lib/exe/fetch.php/z1013:z1013-schaltung-fa.pdf Scan aus einer DDR-Zeitschrift
  7. http://hc-ddr.hucki.net/wiki/lib/exe/fetch.php/z1013:z1013.01-schaltung.pdf Scan Pläne Z1013.01
  8. http://www.z80.info/zip/z80piomn.pdf Zilog PIO
  9. http://www.z1013.de/folientastatur.html Folientastatur des Z1013
  10. http://hc-ddr.hucki.net/wiki/doku.php/z1013:erweiterungen:tastatur Tastaturalternativen
  11. http://www.z80.info/zip/um0081.pdf Beschreibung des Z80 DMA S33 ff.
  12. http://www.xilinx.com/support/documentation/data_sheets/ds123.pdf Xilinx DS123 Platform Flash In-System PROMS
  13. http://www.xilinx.com/support/documentation/application_notes/xapp694.pdf Xilinx XAPP 694 Reading User data from configuration ROMs
  14. http://www.heise.de/ct/artikel/Loetfreies-Basteln-291660.html Artikel "Lötfreies Basteln" in der ct
  15. Wikipedia: Übersicht Transistoranzahl Prozessortypen
  16. http://forum.6502.org/viewtopic.php?f=10&t=1673 Stark schwankende Angaben für einen CPU-Nachbau
  17. http://members.optushome.com.au/jekent/FPGA.htm FPGA Starterkits für 8bit Retrocomputing
  18. http://www.digilentinc.com/Products/Catalog.cfm?NavPath=2,400&Cat=10 Digilent FPGA-Boards
  19. http://www.xilinx.com/products/boards-and-kits/index.htm Xilinx FPGA-Boards
  20. http://www.terasic.com.tw/cgi-bin/page/archive.pl?Language=English&CategoryNo=163 Terasic - Boards
  21. http://www.mikrocontroller.net/articles/Liste_von_FPGA_Eval_boards FPGA-Boards Übersicht auf mikrocontroller.net
  22. http://de.wikipedia.org/wiki/PS/2-Schnittstelle Wikipedia: PS/2 Schnittstelle
  23. http://www.digilentinc.com/Data/Products/S3BOARD/S3BOARD-demo.zip Gezippte PS2 Tastatur-Beispiel kb2vhdl.vhd
  24. http://www.xess.com/appnotes/makefile.php Makefiles for Xilinx CPLD
  25. http://sourceforge.net/projects/unxutils/ Sourceforge: Unixtools for Windows
  26. http://www.ijon.de/comp/tutorials/makefile.html Einführung in Makefiles
  27. http://www.xilinx.com/support/documentation/sw_manuals/xilinx13_1/devref.pdf Xilinx UG628 Xilinx Command Line tools user Guide
  28. http://www.demandperipherals.com/docs/CmdLineFPGA.pdf Laboranleitung Xilinx command line tools
  29. http://www.xilinx.com/support/documentation/application_notes/xapp462.pdf Xilinx XAPP462
  30. http://www.xilinx.com/itp/xilinx10/books/docs/sim/sim.pdf Xiliny Synthesis and simulation design guide
  31. http://hc-ddr.hucki.net/wiki/doku.php/z1013:technische_daten Speicherbereiche und IO-Adressen
  32. http://martin.hinner.info/vga/timing.html VGA-timings
  33. http://hc-ddr.hucki.net/wiki/doku.php/z1013:erweiterungen:zeichensatz Zeichensatz Z1013
  34. http://kofler.dot.at/c64/font_01.html Mehr Zeichensätze
  35. http://read.pudn.com/downloads163/doc/project/743842/FPGA%20Prototyping%20by%20VHDL%20Examples/Chapter%208.pdf Ausführliche Beispiel-Interface
  36. http://hc-ddr.hucki.net/wiki/doku.php/z1013:kassettenformate Beschreibung Programmformat
  37. http://www.z1013.de/z1013_soft.html Softwarearchive
  38. http://www.jens-mueller.org/j1013/z1013soft.html TinyBASIC
  39. http://hc-ddr.hucki.net/wiki/doku.php/z1013:software:tinybasic Übersicht tinyBASIC
  40. http://www.heise.de/download/gnu-utilities-for-win32-117273.html GNU Utilities für Designflow und Hexdumps
  41. Jessica Livingston. "Founders at Work",978-3-8266-9109-6