Moin,
wird langsam mal Zeit für ein Update. Liegt ja nun schon alles ein paar Wochen hier rum.
Zu allererst möchte ich mich für meine Dummheit in Post #6 entschuldigen. Die Read Access Time stimmt zwar, aber da habe ich die Rechnung ohne PLA und Co. gemacht. Dann sieht das nämlich alles schon ganz anders aus. Nämlich viel schlechter! Die notwendige Bedingung PHI2 == 1 && IO1 == 0 sind der Killer. Was für 'n mieser Fehler meinerseits.
OK, also war dem Ganzen als reine Softwarelösung nicht beizukommen. Die paar konfigurierbaren Look-Up Tables im AVR Dx haben mich nicht weitergebracht. Zu viele Einschränkungen und Verlust dringend benötigter IO Pins. Übrigens ist dieses CCL (Configurable Custom Logic) Feature kein neues, exclusives Feature der AVR Dx, ich kannte es lediglich nicht von den älteren Bausteinen. Wie auch, nie was mit den Teilen gebaut. Mein letztes Microcontroller Projekt war ein 8051 basierter GameBoy Kopierer. Das war irgendwann in den 90ern. Neueinstieg dann vor ca. einem Jahr mit dem Pi Pico.
Zurück zum Thema: Was in Software zu langsam ist, macht man halt in Hardware. Ich hatte da 'ne komische Idee. Ich verknote die Kontrollsignale derart, dass das Ergebnis mir direkt das High-Byte des Pointers des entsprechenden Handlers liefert. Mal schauen...
- phi2 io1 rw a1 a0 | x3 x2 x1 x0 | Function | Handler Start Address
- ----------------------------------------------------------------------------------------------------------
- 0 x x x x | 0 0 0 1 | idle | $0100
- x 1 x x x | 0 0 0 1 | idle | $0100
- 1 0 0 0 0 | 0 0 1 0 | write Magic Desk | $0200
- 1 0 1 0 0 | 0 0 1 0 | read Magic Desk - same as write | $0200
- 1 0 0 0 1 | 0 1 0 0 | write Flash Ctrl & LED | $0400
- 1 0 1 0 1 | 0 1 1 0 | read Flash Ctrl & LED (no need) | $0600
- 1 0 0 1 0 | 1 0 0 0 | write Save Control & Status | $0800
- 1 0 1 1 0 | 1 0 1 0 | read Save Control & Status | $0A00
- 1 0 0 1 1 | 1 1 0 0 | write Save Transfer | $0C00
- 1 0 1 1 1 | 1 1 1 0 | read Save Transfer | $0E00
Um diesen Decoder zu bauen benötigte ich jeweils einen 74HCT04, HCT08 & HCT32, also INV, AND & OR Gates. Die in der Tabelle angegebenen x3..0 gehen direkt auf den PORTC des AVR. Günstigerweise hat der nur 4bit und die MSBs werden immer als 0 gelesen. Die letzte Spalte zeigt die sich ergebenen Startadressen der Handler. $0000 ist tabu, da das der Reset-Vektor ist und tatsächlich ist auch minimales Setup notwendig.
Der Idle-Handler sieht dann so aus:
Das sind dann 1 + 2 Takte. Daraus ergibt sich eine Latency von 3..5 Takten.
Der Handler fürs Schreiben des Magic Desk Registers sieht so aus:
Der Datenbus des Cartridge ist an PORTA angeschlossen, die Address-MSBs & EXROM, also das, was beim Magic Desk aus dem Register kommt, an PORTD. Der ist nur von [7:1] ausgeführt, daher der lsl. Wichtig ist halt sofort den Datenbus zu sichern, der Rest ist unkritisch fürs Timing. Also kommt zu den Takten für den Idle Handler ein weiterer bei einem Write Handler hinzu. Macht also: 4..6 Takte.
Und jetzt kommt der kritische Read Handler, Beispiel "Flash Ctrl & LED":
Wir schalten also den Datenbus auf treibend, legen den Wet des Registers an, warten darauf, das der Decoder sagt wir sind wieder "idle" und schalten dann den Datenport wieder auf Eingang. Die Loop hatte ich erstmal so gebaut, einige NOPs wären vermutlich ausreichend, bzw. sogar genauer. Bis wir die Daten anlegen kommen also 2 weitere Takte hinzu. Macht fürs Lesen 5..7 Takte.
Auf alles kommen noch 2 Takte für die Synchronisation von PORTC hinzu. Damit intern auch alles schön ist und keine Metastabilitäten an den Registern auftreten. Also:
Schreiben: 6..8 Takte
Lesen: 7..9 Takte
Wir haben eine 24MHz Clock die auch noch ein wenig Abweichung haben kann, sagen wir mal das macht eine Cycle-Time von 42ns. Über das CLKCTRL_OSCHFTUNE Register können wir den Oscillator insgesamt um nochmal ca. 12% schneller machen. Dann landen wir rechnerisch bei 26,88 MHz also ca. 37ns
Daraus folgt:
Schreiben: 222..296ns Delay
Lesen: 259..333ns Delay
Da kommt noch ein bisschen was hinzu, denn der Decoder braucht auch noch etwas Zeit aber OK.. soweit die Theorie.
Aber jetzt erstmal was anderes. Im ersten Post habe ich ja von einem Testadapter gesprochen. Den hatte ich mir dann ungefähr so vorgestellt:
Pi Pico, Levelshifter für den Datenbus, fertig. Bevor ich mit dem Fädeln angefangen habe dann glücklicherweise doch mal in die Datenblätter geschaut. Was? Weder der AVR im 5V Betrieb noch das Flash sind 3,3V tollerant! Oh nein! Da ich dann keine Lust hatte noch weitere 2 oder 3 Levelshifter zu verfädeln habe ich mich kurzerhand entschlossen die Beardboards rauszukramen und dort dann alles zu verstöpseln:
Kann man da überhaupt was erkennen? Mitte links die drei Logikbausteine, dann der AVR und rechts das unverkabelte Flash. Es war halt noch nicht so weit. OK.. zum Testen wird es reichen. Kleines Testprogramm in MicroPython geschrieben und die komische Idee "Ich lege das High-Byte des Pointers auf 'n Port und springe direkt dahin" hat tatsächlich funktioniert! Ultrakrass! Aus der Firma 'n Oszi ausgeliehen und bisschen gemessen. Worst-Case-Latency beim Lesen 356ns. Das passt ziemlich gut mit dem theoretischen Wert überein. Ich war zufrieden. Noch. Dann habe ich am 64er die Latency von PHI2 rising zu IO1 falling gemessen. Wa? Tatsächlich um die 80ns? Im Ernst? Pfff...
Im 6510 Datenblatt ist PHI2 mit min. 420ns und max. 510 angegeben, bei 1MHz. Wir sind etwas langsamer Rechnen wir einfach mal mit 460ns. Abzüglich der 80ns IO1 Delay bleiben 380ns. Also um und bei 20ns (380-356) Setup-Time. Das wird nicht reichen. Ich vermute damit landen wir stark in der geht/geht-nicht Zone und das möchte ja nun wirklich niemand.
Fazit: Ich glaube ich suche mir einen anderen Weg. Letztendlich sind mir 4 ICs (Decoder + AVR) auch zuviel für das Vorhaben. Vielleicht kann sich jemand von den 64er Gurus dazu äussern. Es gibt doch sicherlich Erfahrungswerte bezgl. Setup-Time. Bitte entsprechende Kollegen evtl. auf diesen Beitrag stubsen. Ich bin noch nicht sooo lange dabei, könnte mir aber vorstellen, dass skoe & kinzi evtl. etwas dazu sagen können.
Einen anderen Weg habe ich, glaube ich, schon gefunden. GMod2.. gibt es ja auch erst ein paar Jahre und keiner von Euch hat bescheid gesagt!
Respekt an alle, die bis hierhin gelesen haben!
Euer,
l-z-o