SFD-700 mkII Technischer Leitfaden
SFD-700 mkII Technischer Leitfaden
Dieser Leitfaden dokumentiert die Hardwarearchitektur des SFD-700 mkII, die CPLD-Funktionsbloecke, die I/O-Registerbelegung, die Speicherbelegung sowie die Build- und Programmierverfahren. Er richtet sich an Anwender, die verstehen moechten, wie die Karte funktioniert, auf Hardwareebene Fehler beheben, die Firmware aendern oder die Karte aus den bereitgestellten Quelldateien aufbauen moechten.
Fuer die Einrichtung und Installation durch den Endbenutzer siehe das Benutzerhandbuch. Fuer VHDL-Quellcode-Durchsichten und Firmware-Entwicklung siehe das Entwicklerhandbuch.
Systemarchitektur
Der SFD-700 mkII ist eine busverbundene Erweiterungskarte. Sie sitzt auf dem Z80-Adress-, Daten- und Steuerbus des Host-Sharp-MZ-Computers und praesentiert sich als ein Satz von speicherabgebildeten und I/O-abgebildeten Ressourcen. Die zentrale Intelligenz ist ein CPLD, das jeden Buszyklus dekodiert und Signale entsprechend weiterleitet.
Systemblockdiagramm
┌──────────────────────────────────────────────────────────────────┐ │ SFD-700 mkII v1.2 PCB │ │ │ │ Host Z80 Bus (A[15:0], D[7:0], MREQ, IORQ, RD, WR, RESET) │ │ ────────────────────────────┬─────────────────────────────── │ │ │ │ │ ┌───────────────┴───────────────┐ │ │ │ EPM7128SLC84-15 CPLD │ │ │ │ │ │ │ │ • I/O address decode │ │ │ │ • Memory address decode ├──► ROM_CSn │ │ │ • ROM/RAM page registers ├──► RAM_CSn │ │ │ • MZ-700/1500 mem mgmt ├──► ROM_A10 │ │ │ • Drive/motor/side/dden regs ├──► RAM_A10 │ │ │ • Data bus inversion (ID bus) ├──► FDCn │ │ │ • Clock divide (16→8 MHz) ├──► CLK_FDC │ │ │ • Interrupt gating ├──► DRVSAn/Bn/Cn/Dn│ │ │ • Mode latch (from jumper) ├──► MOTOR / SIDE1 │ │ └──────────────┬────────────────┘ DDENn │ │ │ │ │ ┌────────────────┼────────────────┐ │ │ │ │ │ │ │ ┌──────┴──────┐ ┌──────┴──────┐ ┌──────┴──────┐ │ │ │ WD1773 FDC │ │ Flash ROM │ │ SRAM │ │ │ │ (inverted │ │ 512KB │ │ 32KB │ │ │ │ data bus) │ │ (AFI + RFS) │ │ (workspace) │ │ │ └──────┬──────┘ └─────────────┘ └─────────────┘ │ │ │ │ │ ┌──────┴──────────────────────────┐ │ │ │ 34-pin floppy connector J3 │ │ │ │ (DRVSAn-Dn, MOTOR, SIDE, DDEN,│ │ │ │ STEP, DIR, WGATE, DATA lines) │ │ │ └──────────────────────────────── ┘ │ │ │ │ │ Floppy Drives A–D │ └──────────────────────────────────────────────────────────────────┘
PCB-Revisionshistorie
Der SFD-700 mkII hat drei Hardware-Revisionen durchlaufen. Die grundlegende Schaltungstopologie ist in allen Revisionen gleich; die Unterschiede liegen hauptsaechlich in der Implementierung der programmierbaren Logik.
| Version | Programmierbare Logik | Status | Hinweise |
|---|---|---|---|
| v1.0 | Zwei Lattice GALs (GAL26CV12 + GAL16V8) | Nur Referenz - nicht bauen | Funktionsfaehig auf MZ-700 innerhalb MZ-1U06. GAL-Registerzahl verhinderte gleichzeitige vollstaendige Speicherverwaltung + ROM-Paging. |
| v1.1 | Zwei Lattice GALs (GAL26CV12 + GAL16V8) | Nur Referenz - nicht bauen | Geringfuegige PCB-Korrekturen. Gleiche GAL-Einschraenkungen wie v1.0. |
| v1.2 | Einzelnes Altera EPM7128SLC84-15 CPLD | Aktuell - empfohlen | Ersetzt beide GALs. Vollstaendige MZ-700/MZ-1500-Speicherverwaltung und unabhaengiges ROM/RAM-Paging. Getestet auf MZ-80A, MZ-700, MZ-1500, MZ-2000. |
Wichtige integrierte Schaltkreise
EPM7128SLC84-15 -- CPLD (v1.2)
Der Altera MAX7000S EPM7128SLC84-15 ist ein EEPROM-basierter Complex Programmable Logic Device in einem 84-Pin-PLCC-Gehaeuse. Wichtige Eigenschaften:
WD1773 -- Floppy Disk Controller
- 128 Makrozellen - jede Makrozelle ist eine programmierbare Summe-von-Produkten-Logikzelle mit einem D-Typ-Flip-Flop-Register. 72 der 128 werden von diesem Design verwendet.
- 15 ns maximale Ausbreitungsverzoegerung - schnell genug, um Buszyklen zu dekodieren und innerhalb der Z80-Setup/Hold-Fenster zu antworten.
- 5V-tolerante Eingaenge - die MAX7000S-Familie kann 5V-Signale direkt vom Sharp-MZ-Bus akzeptieren, sodass keine Pegelwandlung erforderlich ist.
- EEPROM-Konfigurationsspeicher - die programmierte Logik wird unbegrenzt im On-Chip-EEPROM gespeichert. Kein externer Konfigurationsspeicher oder Boot-Verzoegerung.
- In-System programmierbar ueber JTAG - das CPLD kann ohne Entfernung von der Platine ueber den 10-Pin-JTAG-Header und einen USB-Blaster neu programmiert werden.
- 68 Benutzer-I/O-Pins - 65 von 68 verfuegbaren I/O-Pins werden verwendet (96% Auslastung).
Der Western Digital WD1773 ist ein Ein-Chip-Floppy-Disk-Controller, der die vollstaendige Lese-/Schreib-Datentrennung, Spurformatierung und Sektorzugriffslogik in Hardware implementiert. Er ist ein direkter Nachkomme der WD1771/WD1772-Familie und ist buskompatibel mit der WD179x-Serie.
Wichtige WD1773-Eigenschaften fuer dieses Design:
SST39SF040 (oder kompatibel) -- 512 KB Flash-ROM
- Invertierter Datenbus - der WD1773 erfordert, dass alle 8 Datenbusbits invertiert werden (logisch High wird logisch Low und umgekehrt). Das CPLD handhabt dies transparent ueber einen dedizierten invertierten Datenbus (ID[7:0]).
- DRQ (Data Request) - der WD1773 aktiviert DRQ, wenn er ein Byte zum Lesen bereit hat (oder ein Byte zum Schreiben benoetigt) waehrend einer Datenuebertragung. Beim MZ-80A (MODE 0) leitet das CPLD DRQ auf Flash-ROM-Adressbit A10, sodass die 2-MHz-CPU Uebertragungen durch Ausfuehrung verschiedener ROM-Code-Pfade bedienen kann, anstatt zu pollen.
- INTRQ (Interrupt Request) - wird aktiviert, wenn ein Befehl abgeschlossen ist. Das CPLD steuert dieses Signal durch ein softwaregesteuertes Enable-Bit und leitet es nur bei Aktivierung durch Schreiben auf Port 0xDF an die Z80-INT-Leitung.
- 8 MHz Takt erforderlich - der WD1773 benoetigt einen 8-MHz-Eingangstakt fuer Standard-MFM-(Doppeldichte)-Betrieb. Das CPLD erzeugt diesen durch Division des 16-MHz-Quarzoszillators durch zwei.
Das Flash-ROM speichert die Maschinen-Boot-Firmware (AFI ROM) und das ROM Filing System. Es ist als 128 x 4 KB-Seiten organisiert, adressierbar ueber die beiden gepagten Speicherfenster des CPLD (EXXX und FXXX). Das CPLD steuert die oberen Adressbits (A10 und darueber ueber den ID-Bus) zur Auswahl der aktiven Seite. Der Baustein wird im eingebauten Zustand oder extern mit einem Standard-Flash-Programmer programmiert.
Taktarchitektur
Ein 16-MHz-Quarzoszillator (X1) liefert den primaeren Takt. Dieser treibt den dedizierten globalen Takteingang des CPLD (
CLK_16M). Innerhalb des CPLD teilt ein einzelnes Toggle-Flip-Flop (der FDCCLK-Prozess) diesen durch zwei und erzeugt einen 8-MHz-Takt (CLK_8Mi), der am Pin CLK_FDC direkt an den WD1773-Chip-Clock-Pin ausgegeben wird.
Alle registrierten Prozesse im CPLD (die Seitenregister, Laufwerksregister, Interrupt-Enable und Speicherverwaltungsstatus) werden mit dem 16-MHz-Takt getaktet - dies ergibt eine 62,5-ns-Taktperiode, die gut innerhalb der Setup-und-Hold-Anforderungen der Z80-Buszyklen auf allen unterstuetzten Host-Maschinen liegt (die langsamste, der MZ-80A, laeuft mit 2 MHz = 500 ns Taktperiode).
Der Host-Z80-Takt (CLK_BUS0) ist mit einem CPLD-Eingangspin verbunden, wird aber in der aktuellen Logik nicht verwendet - die Buszyklus-Dekodierung ist vollstaendig kombinatorisch (Adress- und Steuersignale werden asynchron dekodiert). Der Pin ist fuer zukuenftige Verwendung reserviert.
I/O-Adressdekodierung
Das CPLD ueberwacht die IORQn-, RDn-, WRn- und A[7:0]-Leitungen des Z80 und erzeugt interne Auswahlsignale, wenn ein I/O-Buszyklus innerhalb einer erkannten Portadresse faellt. Die gesamte Dekodierung ist rein kombinatorisch - Ergebnisse stehen innerhalb einer CPLD-Ausbreitungsverzoegerung (maximal 15 ns) nach Gueltigwerden der Bussignale zur Verfuegung.
Drei Adressbloecke werden dekodiert:
- 0xD8-0xDB - WD1773-FDC-Register (Status/Command, Track, Sector, Data). Das CPLD aktiviert FDCn (WD1773 Chip Select) sowohl fuer Lese- als auch Schreibzugriffe und steuert gleichzeitig die ID-Datenbusrichtung fuer die Dateninvertierung.
- 0xDC-0xDF - FDC-Steuerregister (Laufwerk/Motor, Kopfseite, Datendichte, Interrupt-Enable). Dies sind Nur-Schreib-Register (ausser 0xDF, das auch gelesen wird, um Interrupts zu deaktivieren), implementiert als Flip-Flops im CPLD.
- 0x60-0x63 - ROM/RAM-Paging-Register (EXXX-Seite, FXXX-Seite, ROM/RAM-Auswahl, MODE-Ruecklesen). Diese sind les- und beschreibbar.
- 0xE0-0xE6 - Host-Speicherverwaltungsports. Schreibzugriffe werden vom CPLD abgefangen, um den Paging-Status des Hosts zu verfolgen und die eigenen ROM/RAM-Chip-Selects des SFD-700 entsprechend zu unterdruecken.
Speicher-Adressdekodierung
Das CPLD ueberwacht auch Z80-Speicherzyklen (MREQn aktiviert mit RDn oder WRn) und erzeugt Chip-Select-Ausgaenge fuer das Flash-ROM und SRAM:
- EXXX-Fenster (E300h-EFFFh) - ausgewaehlt, wenn MREQn Low ist und die Z80-Adresse im Bereich 0xE3xx-0xEFxx liegt. Die untere Grenze ist 0xE300 statt 0xE000, da E000h-E2FFh fuer speicherabgebildete I/O des MZ-700/MZ-1500 reserviert ist und nicht von der Erweiterungskarte belegt werden darf.
- FXXX-Fenster (F000h-FFFFh) - ausgewaehlt, wenn MREQn Low ist und die Z80-Adresse im Bereich 0xF0xx-0xFFxx liegt.
Datenbus-Invertierung
Der WD1773 verwendet eine historische Konvention, bei der alle Datenbusbits invertiert werden: eine logische '1' auf dem Z80-Datenbus erscheint als logische '0' auf dem WD1773-Datenbus und umgekehrt. Anstatt diskrete Inverter-ICs zu verwenden (die Bauteilzahl und Ausbreitungsverzoegerung erhoehen wuerden), handhabt das CPLD dies inline.
Das CPLD verbindet sich mit zwei bidirektionalen 8-Bit-Bussen:
- Z80_DATA[7:0] - der Host-Z80-Datenbus (nicht invertiert).
- ID[7:0] - der invertierte Datenbus, verbunden mit den WD1773-Datenpins und ebenfalls verwendet als obere Adressbits zum Flash-ROM und SRAM.
- Z80 liest von FDC (0xD8-0xDB): Der WD1773 treibt ID[7:0] mit invertierten Daten. Das CPLD liest ID und re-invertiert es, bevor es Z80_DATA treibt, sodass der Host korrekte (nicht invertierte) Daten sieht.
- Z80 schreibt an FDC (0xD8-0xDB): Das CPLD nimmt Z80_DATA, invertiert jedes Bit und treibt das Ergebnis auf ID[7:0], sodass der WD1773 die erwartete invertierte Darstellung erhaelt.
- Speicherzugriffe (EXXX/FXXX-Fenster): Wenn ein Speicher-Chip-Select aktiv ist, dient der ID-Bus doppelt als obere Adressleitungen zum Flash-ROM und SRAM. Das CPLD treibt ID[7:0] mit {page_register[6:0], Z80_ADDR[11]} - bietet 7 Seitenbits und die natuerliche A11-Leitung zum Speicherbaustein.
ROM / RAM Paging
Der SFD-700 mkII bildet 4-KB-Seiten des 512-KB-Flash-ROMs oder 32-KB-SRAMs in zwei Fenster im Z80-Adressraum ab. Beide Fenster werden unabhaengig durch softwarebeschreibbare Seitenregister im CPLD gesteuert.
| Fenster | Adressbereich | Seitenregister (I/O-Port) | Seitenbreite | Max. Speicher |
|---|---|---|---|---|
| EXXX | E300h-EFFFh | 0x60 (D7=ROM/RAM-Auswahl, Bits [6:0]=Seite) | 4 KB | 128 x 4 KB = 512 KB |
| FXXX | F000h-FFFFh | 0x61 (D7=ROM/RAM-Auswahl, Bits [6:0]=Seite) | 4 KB | 128 x 4 KB = 512 KB |
Bit 7 (D7) jedes Seitenregisters waehlt unabhaengig, ob Flash-ROM oder SRAM fuer dieses Fenster aktiv ist (D7=0 -> Flash-ROM; D7=1 -> SRAM). Bits [6:0] enthalten die Seitenadresse.
Bei Reset:
- Das EXXX-Seitenregister wird auf Seite 2 (dezimal) initialisiert - "Angepasstes UROM mit RFS-Startbank".
- Das FXXX-Seitenregister wird auf Seite 0 fuer MZ-80A/MZ-1200 (AFI ROM fuer MZ-80A) oder Seite 1 fuer MZ-700 (AFI ROM fuer MZ-700) initialisiert.
- Beide Seitenregister werden mit D7=0 zurueckgesetzt - Flash-ROM ist standardmaessig aktiv.
MZ-700 / MZ-1500 Speicherverwaltung
Der MZ-700 und MZ-1500 enthalten einen Hardware-Speicherverwaltungscontroller, der den internen 64-KB-DRAM und das Zeichengenerator-ROM in den oberen Adressraum ein- und ausblendet. Dies betrifft die Adressen D000h-FFFFh - genau den Bereich, der von den ROM- und RAM-Fenstern des SFD-700 mkII verwendet wird.
Das Host-Betriebssystem steuert die Zuordnung durch Schreiben auf I/O-Ports 0xE0-0xE6. Das CPLD ueberwacht diese Schreibzugriffe und verwaltet zwei interne Statusflags:
| Port | Aktion | Auswirkung auf SFD-700 mkII |
|---|---|---|
| 0xE1 | Host bildet DRAM auf D000h-FFFFh ab | Setzt REG_ROMDIS - SFD-700 ROM/RAM wird deaktiviert |
| 0xE3 | Host bildet speicherabgebildete I/O auf D000h ab | Loescht REG_ROMDIS - SFD-700 ROM/RAM wieder aktiviert |
| 0xE4 | Host bildet Monitor-ROM + DRAM ab | Loescht REG_ROMDIS - SFD-700 ROM/RAM wieder aktiviert |
| 0xE5 | Host sperrt alle D000h-FFFFh-Zugriffe | Setzt REG_ROMINH - SFD-700 ROM/RAM wird deaktiviert |
| 0xE6 | Zurueck zur Standardzuordnung | Loescht REG_ROMINH - SFD-700 ROM/RAM wieder aktiviert |
REG_ROMINH hat Vorrang vor REG_ROMDIS. Wenn REG_ROMINH gesetzt ist, werden die Chip-Selects des SFD-700 mkII unterdrueckt, unabhaengig vom REG_ROMDIS-Status. Beide Flags werden durch einen Z80 RESET geloescht.
Dieses Design ermoeglicht es dem SFD-700 mkII, korrekt mit jeder MZ-700- und MZ-1500-Software zu koexistieren, die Speicherverwaltungsoperationen durchfuehrt, einschliesslich CP/M, BASIC und dem Betriebssystem selbst - kein spezieller Softwaretreiber ist auf der Host-Seite erforderlich.
MZ-80A DRQ-zu-Adressleitung-Trick
Der Sharp MZ-80A (und MZ-1200) betreibt seine Z80-CPU mit 2 MHz. Eine Floppy-Disk im Standard-MFM-Doppeldichte-Modus erzeugt alle 32 us ein neues Datenbyte vom WD1773. Bei 2 MHz kann der Z80 ungefaehr 16 Instruktionen in 32 us ausfuehren - was fuer eine Polling-Schleife im schnellen RAM ausreicht, aber der originale K&P SFD-700 speicherte seinen Boot-Code im ROM, und der zusaetzliche ROM-Zugriffs-Overhead reduzierte die effektive Instruktionsrate unter das, was benoetigt wurde, um das Datenregister des WD1773 zuverlaessig zu entleeren, bevor ein Ueberlauf auftrat.
Sharps Loesung (hier uebernommen) besteht darin, den WD1773-DRQ-Ausgang mit Flash-ROM-Adressbit A10 zu verbinden. Dies funktioniert wie folgt:
- Das Boot-ROM enthaelt zwei Kopien der Sektor-Leseroutine in alternierenden 1-KB-Segmenten. Beide Kopien sind funktionell identisch, ausser dass eine sofort das WD1773-Datenregister liest (genommen wenn DRQ = 1, d.h. Daten sind bereit), und die andere zurueck zur Warteschleife springt (genommen wenn DRQ = 0, d.h. Daten sind noch nicht bereit).
- DRQ ist High, wenn ein Byte verfuegbar ist. Mit DRQ auf A10 verdrahtet, fuehrt die CPU natuerlich den "Daten lesen"-Pfad des ROMs aus, wenn Daten bereit sind, und den "Warten"-Pfad, wenn sie es nicht sind - keine Polling-Instruktion wird benoetigt, und die CPU verschwendet null Zyklen mit der Pruefung eines Flags.
- Das CPLD implementiert dies nur in MODE 0:
ROM_A10 <= '1' when (MODE = MZ-80A) and DRQ = '1', else Z80_ADDR(10). Fuer alle anderen Modi folgt ROM_A10 dem natuerlichen Z80-Adressbit 10.
Interrupt-Steuerung
Der WD1773 aktiviert INTRQ, wenn ein Befehl abgeschlossen ist (Typ-I-, II- und III-Befehle) und wenn ein Force Interrupt-Befehl (Typ IV) ausgegeben wird. Das CPLD steuert dieses Signal durch ein registriertes Enable-Bit (REG_INT):
- Schreiben auf 0xDF: setzt REG_INT = 1 - INTRQ wird jetzt an die Z80-INT-Leitung geleitet.
- Lesen von 0xDF: loescht REG_INT = 0 - die Z80-INT-Leitung wird deaktiviert.
- RESET: REG_INT wird asynchron geloescht.
Automatisiertes Setup und Build
Sowohl die alte CUPL/GAL-Logik (v1.0 / v1.1) als auch der aktuelle CPLD/VHDL-Bitstream (v1.2) koennen mit einem einzigen, in sich geschlossenen Setup-Skript fuer Ihre Plattform gebaut werden. Das Skript installiert die benoetigten Toolchains - DOSBox fuer die CUPL-Logik und Altera Quartus II 13.0sp1 fuer das CPLD -, klont das Repository und kann einen oder beide Builds ausfuehren, alles interaktiv mit sinnvollen Standardwerten, die Sie durch Druecken von Enter uebernehmen koennen. Dies ist der empfohlene Weg zum Bauen; die nachfolgenden manuellen GAL- und CPLD-Abschnitte bleiben als Detail fuer fortgeschrittene Benutzer und Teil-Builds erhalten.
macOS / Linux — setup_SFD700.sh
chmod +x setup_SFD700.sh
./setup_SFD700.sh
Dies installiert
git, curl/wget und DOSBox (fuer die CUPL-Toolchain) und richtet Quartus II 13.0sp1 fuer das CPLD ein. Unter Linux wird Quartus nativ ueber eine unbeaufsichtigte Installation nach ~/altera/13.0sp1 installiert (~1,6 GB Download). Unter macOS - wo kein natives Quartus existiert - laeuft die CPLD-Toolchain stattdessen aus einem Docker-Image (sfd700-quartus:13.0sp1). In beiden Faellen wird das MAX7000S-Geraetefamilien-Paket automatisch geholt.
Windows 10 / 11 — setup_SFD700_windows_native.ps1 (natives Git Bash, kein WSL). In PowerShell:
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
.\setup_SFD700_windows_native.ps1
Dies verwendet winget, um Git for Windows (das
bash bereitstellt) und DOSBox zu installieren, und installiert dann Quartus II 13.0sp1 nativ nach C:\altera\13.0sp1 (streamender, fortsetzbarer Download) zusammen mit dem MAX7000S-Paket. Die Build-Skripte laufen unter Git Bash. Um Docker fuer die CPLD-Toolchain anstelle des nativen Quartus zu verwenden, setzen Sie $env:SFD700_CPLD_METHOD = "docker", bevor Sie das Skript ausfuehren.
Fragen, die das Setup stellt, und was zu tun ist. Jede Eingabeaufforderung hat einen sicheren Standardwert in Klammern - der Grossbuchstabe ist der Standard, sodass Druecken von Enter ihn uebernimmt.
macOS / Linux (setup_SFD700.sh):
| Eingabeaufforderung | Standard | Was zu tun ist |
|---|---|---|
Install now? [Y/n] (Basiswerkzeuge + DOSBox) |
Ja | Enter - installiert git, curl/wget und DOSBox; fragt evtl. nach sudo. |
Repo URL [https://git.eaw.app/eaw/SFD700.git] |
oeffentliches Repo | Enter fuer das oeffentliche Repo oder eine andere (z. B. private) URL einfuegen. |
Install directory [~/SFD700] |
~/SFD700 |
Enter fuer ~/SFD700 oder einen Pfad eingeben. |
Choose [N/d] (Linux CPLD-Toolchain) |
Nativ | N - natives Quartus (unter Linux empfohlen); d fuer Docker. |
Build the CUPL/GAL logic now (./build_cupl.sh)? [Y/n] |
Ja | Enter, um die GAL-Logik sofort zu bauen. |
Build the CPLD/VHDL bitstream now (./build_cpld.sh)? [Y/n] |
Ja | Enter, um den CPLD-Bitstream sofort zu bauen. |
Windows (setup_SFD700_windows_native.ps1):
| Eingabeaufforderung | Standard | Was zu tun ist |
|---|---|---|
Repo URL [https://git.eaw.app/eaw/SFD700.git] |
oeffentliches Repo | Enter fuer das oeffentliche Repo oder eine andere URL einfuegen. |
SFD700 checkout directory [%USERPROFILE%\SFD700] |
%USERPROFILE%\SFD700 |
Enter fuer den Standard oder einen Pfad eingeben. |
Install Quartus / MAX7000S support now? [Y/n] |
Ja | Enter, um Quartus II 13.0sp1 und das MAX7000S-Paket zu installieren. |
Build the CUPL/GAL logic now (build_cupl.sh)? [Y/n] |
Ja | Enter, um die GAL-Logik sofort zu bauen. |
Build the CPLD/VHDL bitstream now (build_cpld.sh)? [Y/n] |
Ja | Enter, um den CPLD-Bitstream sofort zu bauen. |
Ausgabe und Programmierung. Der CUPL-Build schreibt JEDEC-Dateien nach
CUPL/ - SFD700_1.JED und SFD700_2.JED -, die ein GAL mit einem TL866- / XGecu-Programmiergeraet programmieren. Der CPLD-Build schreibt CPLD/v1.2/build/output_files/sfd700.pof, das den EPM7128 ueber JTAG mit einem USB-Blaster programmiert:
quartus_pgm -c "USB-Blaster" -m JTAG \ -o "p;CPLD/v1.2/build/output_files/sfd700.pof"
Siehe GAL-Logik (v1.0 / v1.1), Bauen des CPLD-Bitstreams und Programmieren des CPLD unten fuer die zugrundeliegenden manuellen Schritte.
GAL-Logik (v1.0 / v1.1)
Die Versionen 1.0 und 1.1 des SFD-700 mkII verwendeten zwei Lattice GAL-Bausteine anstelle des CPLD. Diese sind hier der Vollstaendigkeit halber und fuer diejenigen dokumentiert, die eine v1.0- oder v1.1-Platine besitzen.
GAL26CV12 (U1, GAL1) - I/O-Dekoder und Speicherverwaltung
Der primaere Logikbaustein. Er dekodierte den Z80-I/O-Adressbus fuer alle FDC-Zugriffe, erzeugte das Bustreiber-Richtungssignal, verfolgte den MZ-700-Speicher-Paging-Status mithilfe seiner registrierten Ausgaenge und steuerte das Interrupt-Enable-Flag. GAL16V8 (U2, GAL2) - ROM-Dekoder
Uebernahm die speicherseitige Adressdekodierung, erzeugte den ROM-Chip-Select fuer das F000h-FFFFh-Fenster, multiplexte das DRQ-Signal auf Flash-ROM-Adressbit A10 (fuer MZ-80A) und waehlte die Firmware-Seite ueber den MODESEL-Jumper aus. Erstellen der GAL-Dateien
Die CUPL-Quelldateien befinden sich im Verzeichnis
Der primaere Logikbaustein. Er dekodierte den Z80-I/O-Adressbus fuer alle FDC-Zugriffe, erzeugte das Bustreiber-Richtungssignal, verfolgte den MZ-700-Speicher-Paging-Status mithilfe seiner registrierten Ausgaenge und steuerte das Interrupt-Enable-Flag. GAL16V8 (U2, GAL2) - ROM-Dekoder
Uebernahm die speicherseitige Adressdekodierung, erzeugte den ROM-Chip-Select fuer das F000h-FFFFh-Fenster, multiplexte das DRQ-Signal auf Flash-ROM-Adressbit A10 (fuer MZ-80A) und waehlte die Firmware-Seite ueber den MODESEL-Jumper aus. Erstellen der GAL-Dateien
Die CUPL-Quelldateien befinden sich im Verzeichnis
CUPL/. Die Kompilierung erfordert Logical Devices CUPL v4.0 (DOS-Aera), da WinCUPL den Lattice GAL26CV12 nicht unterstuetzt. Unter DOSBox ausfuehren:
cupl -j -f -a g26cv12 SFD700_1 # GAL1 (GAL26CV12) kompilieren cupl -j -f -a g16v8 SFD700_2 # GAL2 (GAL16V8) kompilieren
Programmierung der GALs
Der GAL16V8 (GAL2) wird direkt von allen modernen Programmern einschliesslich des TL-866 II+ unterstuetzt:
Der GAL16V8 (GAL2) wird direkt von allen modernen Programmern einschliesslich des TL-866 II+ unterstuetzt:
minipro -p GAL16V8 -w SFD700_2.JED
Der GAL26CV12 (GAL1) erfordert einen PLCC-28-zu-DIP-28-Adapter und einen benutzerdefinierten
infoic.xml-Bausteindatenbankeintrag (im Verzeichnis CUPL/ bereitgestellt):
minipro -p GAL26CV12 -w SFD700_1.JED
CPLD-Architektur (v1.2)
Das v1.2-CPLD-Design verwendet 72 von 128 verfuegbaren Makrozellen (56%), mit 37 Registern und 65 I/O-Pins. Beide globalen Taktressourcen werden verwendet: CLK_16M fuer alle registrierten Prozesse und Z80_RESETn fuer synchronen/asynchronen Reset. Die 72 Makrozellen sind logisch in die folgenden funktionalen Bloecke unterteilt:
| Block | Makrozellen | Beschreibung |
|---|---|---|
| Taktteiler | 1 | Toggle-Flip-Flop: 16 MHz -> 8 MHz fuer WD1773 |
| I/O-Adressdekoder | ~15 | Kombinatorische Dekodierung aller I/O-Port-Auswahlsignale |
| Speicher-Adressdekoder | ~4 | Kombinatorische Dekodierung der EXXX- und FXXX-Fensterauswahl |
| Modusregister | 3 | 3-Bit registrierter Latch des MODE-Jumpers, abgetastet bei RESET |
| Laufwerks-/Motor-Register | 5 | 4 Laufwerks-Select-Bits + Motor-Enable-Bit (Port 0xDC) |
| Seitenregister | 1 | Kopfseiten-Auswahl (Port 0xDD) |
| Doppeldichte-Register | 1 | DDEN-Steuerung (Port 0xDE) |
| Interrupt-Enable | 1 | WD1773 INTRQ Gate (Port 0xDF) |
| EXXX-Seitenregister | 8 | 8-Bit-Register: D7=ROM/RAM-Auswahl, Bits [6:0]=Seitenadresse fuer EXXX-Fenster (Port 0x60) |
| FXXX-Seitenregister | 8 | 8-Bit-Register: D7=ROM/RAM-Auswahl, Bits [6:0]=Seitenadresse fuer FXXX-Fenster (Port 0x61) |
| MZ-700-Speicherverwaltung | 2 | ROMINH- und ROMDIS-Statusbits (Ports 0xE1-0xE6) |
| Datenbus / Ausgangs-Mux | ~25 | ID-Bus-Treiber, Z80_DATA-Mux, Chip-Select-Ausgaenge |
Alle I/O sind LVTTL; die MAX7000S-Familie ist 5V-eingangstolerant und damit direkt kompatibel mit dem 5V-Sharp-MZ-Bus ohne Pegelwandlung.
| Signal | Pin | Richtung | Beschreibung |
|---|---|---|---|
| CLK_16M | 83 | In | 16-MHz-Quarzoszillator - Globaler Takt |
| CLK_FDC | 81 | Out | 8-MHz-Takt zum WD1773 |
| CLK_BUS0 | 2 | In | Host-Z80-Bustakt (reserviert) |
| Z80_RESETn | – | In | Active-Low-Reset - Globale Ressource |
| A[15:0] | 4-25 | In | Z80-Adressbus |
| D[7:0] | 27-35 | Bidir | Z80-Datenbus |
| ID[7:0] | 64-74 | Bidir | Invertierter Datenbus (WD1773) / ROM-RAM obere Adresse |
| M1n | 36 | In | Z80 Maschinenzyklus 1 Anzeige |
| RDn | 37 | In | Z80 Read Strobe |
| WRn | 39 | In | Z80 Write Strobe |
| IORQn | 40 | In | Z80 I/O Request |
| MREQn | 41 | In | Z80 Memory Request |
| Z80_INT | 44 | Out | Interrupt zum Z80 (gegatedetes INTRQ) |
| Z80_EXWAITn | 45 | Out | Externer Wait (permanent inaktiv) |
| FDCn | 63 | Out | WD1773 Chip Select (Active Low) |
| INTRQ | 61 | In | WD1773 Interrupt Request |
| DRQ | 60 | In | WD1773 Data Request |
| DDENn | 58 | Out | Doppeldichte-Enable zum WD1773 |
| SIDE1 | 57 | Out | Kopfseiten-Auswahl |
| MOTOR | 56 | Out | Spindelmotor-Enable |
| DRVSAn | 55 | Out | Laufwerk A Select (Active Low) |
| DRVSBn | 54 | Out | Laufwerk B Select (Active Low) |
| DRVSCn | 52 | Out | Laufwerk C Select (Active Low) |
| DRVSDn | 51 | Out | Laufwerk D Select (Active Low) |
| ROM_CSn | 77 | Out | Flash-ROM Chip Select (Active Low) |
| RAM_CSn | 76 | Out | Statisches RAM Chip Select (Active Low) |
| ROM_A10 | 80 | Out | ROM-Seitenbit / DRQ Mux (MZ-80A MODE) |
| RAM_A10 | 79 | Out | RAM-Seitenbit |
| MODE[2:0] | 49,48,50 | In | Host-Maschinen-Modus-Jumper |
I/O-Registerbelegung
Vollstaendige I/O-Registerbelegung, wie vom CPLD dekodiert. Alle Adressen sind 8-Bit-Z80-I/O-Portadressen. Der WD1773 verwendet invertierte Daten - das CPLD handhabt die Invertierung transparent, sodass Software Daten in normaler (nicht invertierter) Form liest und schreibt.
| Port | R/W | Register | Beschreibung |
|---|---|---|---|
| 0xD8 | R/W | WD1773 Status/Command | Lesen: Statusregister. Schreiben: Befehlsregister. |
| 0xD9 | R/W | WD1773 Track | Aktuelles Spurnummerregister. |
| 0xDA | R/W | WD1773 Sector | Aktuelles Sektornummerregister. |
| 0xDB | R/W | WD1773 Data | Datenregister - Lesen/Schreiben waehrend Sektoruebertragungen. |
| 0xDC | W | Drive & Motor | Bits [2:0]: Laufwerksauswahl (4=A, 5=B, 6=C, 7=D, 0=keines). Bit [7]: Motor-Enable. |
| 0xDD | W | Head Side | D0=0 -> Seite 1, D0=1 -> Seite 0 |
| 0xDE | W | Data Density | D0=0 -> Doppeldichte (MFM), D0=1 -> Einzeldichte (FM) |
| 0xDF | W/R | Interrupt Enable | Schreiben: WD1773 INTRQ -> Z80 INT aktivieren. Lesen: deaktivieren. |
| 0x60 | R/W | EXXX Page | D7 -> Speicherauswahl (0=Flash ROM, 1=SRAM) fuer EXXX-Bereich. Bits [6:0] -> Seitenadresse fuer E300h-EFFFh-Fenster. |
| 0x61 | R/W | FXXX Page | D7 -> Speicherauswahl (0=Flash ROM, 1=SRAM) fuer FXXX-Bereich. Bits [6:0] -> Seitenadresse fuer F000h-FFFFh-Fenster. |
| 0x63 | R | Mode Register | Liest den gespeicherten MODE-Jumper-Wert zurueck (0-6) |
| 0xE1 | W | MZ-700/1500 ROMDIS set | Host bildet DRAM auf D000h-FFFFh ab - SFD-700 ROM/RAM deaktiviert |
| 0xE3 | W | MZ-700/1500 ROMDIS clear | Host bildet speicherabgebildete I/O ab - SFD-700 ROM/RAM wieder aktiviert |
| 0xE4 | W | MZ-700/1500 ROMDIS clear | Host bildet Monitor + DRAM ab - SFD-700 ROM/RAM wieder aktiviert |
| 0xE5 | W | MZ-700/1500 ROMINH set | Host sperrt gesamten oberen Speicher - SFD-700 ROM/RAM deaktiviert |
| 0xE6 | W | MZ-700/1500 ROMINH clear | Zurueck zur Standardzuordnung - SFD-700 ROM/RAM wieder aktiviert |
Speicherbelegung
Der SFD-700 mkII belegt zwei Fenster im oberen Z80-Adressraum, beide unabhaengig vom 512-KB-Flash-ROM oder 32-KB-SRAM gepagged.
| Fenster | Z80-Adressbereich | Seitenregister | Effektive Groesse | Hinweise |
|---|---|---|---|---|
| EXXX | E300h-EFFFh | 0x60 | 3,75 KB pro Seite | E000h-E2FFh ist speicherabgebildete I/O des MZ-700/MZ-1500 - nicht von der Erweiterungskarte adressierbar |
| FXXX | F000h-FFFFh | 0x61 | 4 KB pro Seite | Volles 4-KB-Fenster. Seite 0 = MZ-80A AFI ROM. Seite 1 = MZ-700 AFI ROM. |
Jedes Fenster kann unabhaengig zwischen Flash-ROM und SRAM ueber Bit 7 (D7) seines Seitenregisters umschalten - D7=0 waehlt Flash-ROM, D7=1 waehlt SRAM. Die Seitenadresse in Bits [6:0] bleibt bei Speichermodus-Umschaltungen erhalten - das Schreiben eines neuen Werts auf 0x60 oder 0x61 bildet das entsprechende Fenster sofort neu ab.
Erstellen des CPLD-Bitstreams
Der CPLD-Bitstream wird mit Quartus II 13.0.1 SP1 Web Edition kompiliert. Diese spezifische Version ist erforderlich - spaetere Versionen haben die Unterstuetzung fuer die MAX7000S-(EPM7128)-Geratefamilie entfernt. Die Web Edition ist kostenlos im Intel FPGA Software Archive erhaeltlich.
Navigieren Sie zum Build-Verzeichnis und kompilieren Sie von der Kommandozeile:
cd /dvlp/Projects/SFD700/CPLD/v1.2/build quartus_map --read_settings_files=on sfd700 # Analyse & Synthese quartus_fit --read_settings_files=on sfd700 # Fitter (Platzierung & Routing) quartus_asm --read_settings_files=on sfd700 # Assembler - erzeugt sfd700.pof quartus_sta sfd700 # Timing-Analyse (optional)
Oder oeffnen Sie
CPLD/v1.2/build/sfd700.qpf in der Quartus-II-GUI und fuehren Sie Processing -> Start Compilation aus.
Erwartete Ressourcenauslastung nach einem erfolgreichen Build:
| Ressource | Verwendet | Verfuegbar | Auslastung |
|---|---|---|---|
| Macrocells | 72 | 128 | 56% |
| Registers | 37 | 128 | 29% |
| I/O pins | 65 | 68 | 96% |
| Product terms | 179 | – | – |
| Global clocks | 2 | 2 | 100% |
Jede signifikante Abweichung von diesen Zahlen weist auf eine Syntheseeinstellungsdiskrepanz hin. Bestaetigen Sie, dass der Zielbaustein in den Quartus-Projekteinstellungen auf EPM7128SLC84-15 (MAX7000S-Familie) eingestellt ist, bevor Sie neu kompilieren.
Programmierung des CPLD
Der EPM7128SLC84-15 wird ueber den Vier-Pin-JTAG-Port (TDI, TDO, TMS, TCK), zugaenglich am 10-Pin-JTAG-Header (J2), mit einem Altera USB-Blaster oder kompatiblen Klon programmiert.
Von der Kommandozeile:
quartus_pgm -c "USB-Blaster" -m JTAG \ -o "p;CPLD/v1.2/build/output_files/sfd700.pof"
Oder verwenden Sie die Quartus II Programmer GUI:
- Oeffnen Sie Tools -> Programmer.
- Klicken Sie Hardware Setup und waehlen Sie USB-Blaster.
- Klicken Sie Add File und waehlen Sie
output_files/sfd700.pof. - Setzen Sie ein Haekchen bei Program/Configure und optional Verify.
- Klicken Sie Start. Die Programmierung ist in wenigen Sekunden abgeschlossen.
Referenzseiten
| Ressource | Link |
|---|---|
| SFD-700 mkII Projektseite | /de/sfd700/ |
| SFD-700 mkII Benutzerhandbuch | /de/sfd700-usermanual/ |
| SFD-700 mkII Entwicklerhandbuch | /de/sfd700-developersguide/ |
| SFD-800 (Begleitkarte fuer MZ-800) | /sfd800/ |
| Altera MAX7000S Datenblatt | Intel FPGA Produktseiten |
| Quartus II 13.0.1 SP1 Web Edition | Intel FPGA Software Archive |
| WD1773 Application Note | Western Digital / Historisches Archiv |