Hallo,
das sieht auf jeden Fall so aus, als ob es funktionieren könnte. Ein paar Anmerkungen:
- Wofür steht DME?
- Warum hast du einen eigenen Instruktionsbus? Instruktionen sind doch auch nur Daten.
- Framepointer und Stackpointer sind genau zwei Pointer, die brauchen also auch zwei Register, um gespeichert zu werden. Außerdem kann man die auch in die CPU einbauen und muss sie dann nicht an den Bus anschließen.
- Register sind Teil der CPU, brauchen also keine (Bus-)Adressen besitzen. Innerhalb der CPU natürlich schon, aber da hast du natürlich andere Adressen.
Die Systemstruktur kannst du auch deutlich einfacher gestalten, ich häng unten mal ein schnell gekliertes Bild ran. Erklärung: A=Adressleitungen, D=Datenleitungen, Clk=Taktleitung, R/W=Read/Write (0=Read, 1=Write) und I/O ist mit MMIO angebundene Hardware. Die Busbreiten (24-Bit-Adressbus, 8-Bit-Datenbus) sind nur ein (unpraktisches) Beispiel.
Ein 24-Bit Adressbus erlaubt 16M verschiedene Adressen, bei 8-Bit-Daten ist das dann ein Adressraum von 16 MB. Wie du den aufteilst, ist deine Sache, eine Möglichkeit ist:
- 00xxxxxx xxxxxxxx xxxxxxxx (unteres Viertel, 0 bis 4M): ROM (max. 4 MB)
- 01xxxxxx xxxxxxxx xxxxxxxx (4M bis 8M): Hardware-Register für MMIO (max. 4 MB)
- 1xxxxxxx xxxxxxxx xxxxxxxx (obere Hälfte, 8M bis 16M): RAM
Die CPU ist in diesem Beispiel der einzige Busmaster (ansonsten bräuchtest du noch BUSREQ/BUSACK, wie oben beschrieben). Um Code oder Daten zu lesen, macht die CPU nun beispielsweise folgendes:
- CPU legt Adresse auf die Adressleitungen
- CPU legt R/W-Leitung auf Low (CPU will lesen)
- CPU legt Taktleitung auf High (Adressen sind jetzt gültig)
- alle Geräte am Bus dekodieren die Adresse (prüfen, ob sie die Adresse besitzen)
- das angesprochene Gerät legt die gewünschten Daten auf den Datenbus
- CPU legt Taktleitung auf Low und liest die Daten ein
Der Takt muss natürlich langsam genug sein, dass die Geräte schnell genug reagieren können.
Nachtrag: Kann man eigentlich Bilder ins Forum hochladen?
Gruß,
Svenska