wieso geht /WR nicht low waehrend eines memory refresh?

Für alle Bastler
zilog
Beiträge: 12
Registriert: 6. Feb 2020, 22:57

wieso geht /WR nicht low waehrend eines memory refresh?

Beitrag von zilog » 7. Feb 2020, 18:46

hallo Leute

ich habe eine Frage

ich habe ein Diagramm eines M1 opcode fetch cycle einer Z80 CPU.

Z80 M1 cycle.gif
Z80 M1 cycle.gif (5.11 KiB) 155 mal betrachtet

waehrend T3 und T4 eines M1 cycle gehen /RFSH und /MREQ low um das dynamische RAM zu 'refreshen'.

Dabei liegt auf dem Adressbus die Adresse des zu 'refreshenden' RAMs an.

wieso geht das /WR signal nicht low waehrend eines /RFSH?

ist das kein Schreibzugriff?

Vielen Dank fuer Eure Hilfe.

mtx500
Beiträge: 5
Registriert: 15. Jun 2019, 18:38

Re: wieso geht /WR nicht low waehrend eines memory refresh?

Beitrag von mtx500 » 8. Feb 2020, 00:19

Nein, aus Sicht der CPU wird hier nichts geschrieben. Der Refresh passiert nur intern im DRAM. Die CPU gibt dem DRAM nur die Gelegenheit dazu.
Aus Rodnay Zaks, Programmierung des Z80: "WR ist das Schreibsignal. Es zeigt an, dass auf dem Bus gültige Daten liegen, die in den ausgewählten Baustein geschrieben werden können." Das ist hier aber nicht der Fall. Der Datenbus ist "don't care".
Noch ein Hinweis: Bei größeren Systemen, z.B. man hat ein Z80 System aufgebaut mit einer Backplane und ECB Einsteckkarten, kam man nicht umhin, den Adress- und Datenbus über Buffer zu führen (z.B. 74LS244 oder 74LS245), weil die Treiber-Leistung des Z80 dann nicht mehr ausreicht. Hier braucht man RD und WR nicht nur um die Richtung festzulegen, sondern auch wann der Bus überhaupt getrieben werden soll. Daher: RD nur wenn was rein muss und WR nur wenn was raus muss. Wenn keine Daten transportiert werden, dann weder RD noch WR.

zilog
Beiträge: 12
Registriert: 6. Feb 2020, 22:57

Re: wieso geht /WR nicht low waehrend eines memory refresh?

Beitrag von zilog » 8. Feb 2020, 22:29

vielen Dank! Jetzt verstehe ich das.

zilog
Beiträge: 12
Registriert: 6. Feb 2020, 22:57

Re: wieso geht /WR nicht low waehrend eines memory refresh?

Beitrag von zilog » 8. Feb 2020, 22:34

noch eine Frage: haben Speicherbausteine einen /RFSH input pin?

oder wie weiss der Speicherbaustein, dass er jetzt seinen refresh machen soll?

mtx500
Beiträge: 5
Registriert: 15. Jun 2019, 18:38

Re: wieso geht /WR nicht low waehrend eines memory refresh?

Beitrag von mtx500 » 12. Feb 2020, 22:54

Oh je, das ist lange her. Kram, kram ...
Also, die DRAM-Bausteine haben neben WE (Write Enable, das gibt die Richtung Lesen oder Schreiben vor) noch RAS (Row Address Strobe) und CAS (Column Address Strobe). Um Pins zu sparen, haben DRAMs nämlich nur halb so viele Adress-Anschlüsse, und bekommen zunächst bei RAS die Row-Address (die höherwertigen Bits) und erst später mit CAS die Column-Address (die niederwertigen Bits).
Refresh geht nun auf zwei Arten:
1) RAS only Refresh - da geht RAS runter, die Row-Address bestimmt, welche Reihe zu refreshen ist, und dann geht RAS wieder hoch.
2) CAS-before-RAS-Refresh - erst geht CAS runter. Das passiert normalerweise nie, daher kann der Chip daran gut diese Methode erkennen. Dann erst geht RAS runter und löst den Refresh einer Reihe aus. Unterschied zu Methode 1 ist: Dem Chip sind dabei die Adressbeinchen völlig egal. Er verwendet ein internes Zählregister in passender Breite, um sukzessive alle Reihen zu refreshen. Er hat also sozusagen das R-Register eingebaut.
Die zweite Methode ist zu bevorzugen, weil man dann völlig unabhängig von der Struktur des Speichers ist. Verwendet man große DRAM-Speicher, dann reicht u.U. das 8-Bit R-Register im Z80 nämlich gar nicht aus um alle Reihen zu adressieren, und dann muss man außerhalb der CPU das 9-te Refresh-Bit nachbauen über ein Flip-Flop. Sehr unschön.

zilog
Beiträge: 12
Registriert: 6. Feb 2020, 22:57

Re: wieso geht /WR nicht low waehrend eines memory refresh?

Beitrag von zilog » 13. Feb 2020, 23:10

Okay, dann ist das in meinem obigen Diagramm wohl ein RAS only refresh, denn CAS geht NICHT runter waehrend T3 T4...

zilog
Beiträge: 12
Registriert: 6. Feb 2020, 22:57

Re: wieso geht /WR nicht low waehrend eines memory refresh?

Beitrag von zilog » 13. Feb 2020, 23:17

Allerdings schreibst Du erst dass im ersten Absatz von der Moeglichkeit, dass erst RAS runtergeht und dann CAS runtergeht.

Das entspraeche allerdings weder einem 'RAS only refresh', weil ja CAS auch runtergeht, noch entspraeche es einem 'CAS before RAS refresh', weil ja im ersten Absatz RAS erst runtergeht und dann erst CAS runtergeht.

Verstehe ich das jetzt falsch?

mtx500
Beiträge: 5
Registriert: 15. Jun 2019, 18:38

Re: wieso geht /WR nicht low waehrend eines memory refresh?

Beitrag von mtx500 » 17. Feb 2020, 00:54

Nein, alles richtig. Wenn erst RAS runter geht und danach CAS, dann ist das ein ganz normaler Zugriff, also entweder Lesen oder Schreiben.

Wobei man auch wissen muss, dass jeder normale Zugriff auch immer gleich die adressierte Reihe mit-refresht. Wenn man also garantieren kann, dass man innerhalb bestimmter Zeit mal auf alle Reihen zugreift, dann kann man sich extra Refresh-Zyklen sparen. Ein Kandidat war z.B. Video-RAM, wo der Speicher zyklisch ausgelesen wird für die Bild-Erzeugung. Aber beim normalen Hauptspeicher einer CPU, die ja ein beliebiges Programm abarbeiten kann, kann man das nicht garantieren, und muss daher zusätzliche Refresh-Zyklen vorsehen. Andererseits erklärt das auch, dass Mikroprozessor-Schaltungen mit DRAM, wo die Refresh-Zyklen nicht sauber funktionieren, tatsächlich relativ lange laufen können ohne dass das auffällt.

zilog
Beiträge: 12
Registriert: 6. Feb 2020, 22:57

Re: wieso geht /WR nicht low waehrend eines memory refresh?

Beitrag von zilog » 19. Feb 2020, 20:07

hallo vielen Dank fuer die ganzen Erklaerungen.

ich habe gerade einmal das Schaltbild eingefuegt, uber das ich die ganze Zeit bruete. (Z80 User's manual 1980 von Joseph Carr)
refresh.png
refresh.png (88.49 KiB) 60 mal betrachtet
In dem Kapitel geht es um den refresh des DRAM und nicht um normale Schreib- oder Lesezyklen.

Du kannst im Schaltbild erkennen, dass erst der /RAS pin des RAM Baustein angesprochen wird und dann erst der /CAS pin; weil das /MREQ Signal fuer den /CAS pin zweimal verzoegert wird, waehrend der /RAS pin ohne Verzoegerung angesprochen wird.

Demnach gibt es also sehr wohl einen refresh, wo der /RAS pin VOR dem /CAS pin angesprochen wird!

????

Ferner frage ich mich wieso das /WR Signal mit dem R/W Eingang des DRAM verbunden ist, wo doch /WR in einem refresh Zugriff ueberhaupt nicht runter geht.

mtx500
Beiträge: 5
Registriert: 15. Jun 2019, 18:38

Re: wieso geht /WR nicht low waehrend eines memory refresh?

Beitrag von mtx500 » 22. Feb 2020, 15:23

/RAS wird in dieser Schaltung *immer* als erstes aktiv, egal, ob das durch /RFSH oder durch /MREQ ausgelöst wird, also sowohl bei einem Refresh-Zyklus als auch bei einem Lese- oder Schreibzyklus.
/CAS wird verzögert *nur dann* ausgelöst, wenn /MREQ low geht, also nur bei einem Lese- oder Schreibzyklus.
D.h. wir haben hier ganz klassisch RAS-only Refresh. (CAS-before-RAS Refresh gab es bei DRAM-Chips nicht von Anfang an, das kam erst ein wenig später.)
Zu /WR: Ich verstehe Deine Frage nicht ganz. Das ist doch genau richtig so! Bei /RFSH gibt es doch auch nichts zu schreiben auf dem Datenbus. Den Refresh erledigt der DRAM-Chip doch ganz alleine und rein intern. Und bei /RAS low macht der DRAM-Chip auch überhaupt nichts mit dem Datenbus. Der bleibt tri-state (hochohmig, wird in keine Richtung getrieben). Erst wenn /CAS low geht, also ein Datenzugriff gewünscht ist, was ja bei /RFSH nicht der Fall ist, würde der DRAM-Chip entweder Daten übernehmen (R/W low) oder aber Daten auf den Bus legen (R/W high). Vor /CAS low ist dem Chip das R/W aber piepegal.
/RAS low übernimmt nur die obere Hälfte der Adresse und löst einen Refresh aus. Mehr nicht. Erst das /CAS löst einen Lese- oder Schreibzugriff aus. Man kann sogar bei allen DRAM-Chips die ich kenne, sogenannten Page Mode Zugriff machen: /RAS geht low und bleibt nun low. Nun kann man fast beliebig oft(*) /CAS low und wieder high machen und dabei jedesmal eine andere Column Address übergeben und sich auch jedesmal neu überlegen, ob man lesen oder schreiben will. Typischerweise nutzt man das, um eine größere Menge Daten auf einmal sequenziell zu lesen oder zu schreiben. Am Ende geht das /RAS high und dann kann man eine andere Page adressieren durch neue Adresse und /RAS wieder low.
(*) Fast beliebig oft, weil man ja nicht beliebig lange in einer Page zumhängen kann, ohne die anderen zu refreshen.

Antworten