Ich würde gerne wissen, wie man einen asynchronen DRAM-Controller ohne Knochen baut. Ich habe einige 30-polige 1-MB-SIMM-70-ns-DRAM-Module (1Mx9 mit Parität), die ich in einem Homebrew-Retro-Computerprojekt verwenden möchte. Leider gibt es kein Datenblatt dafür, also bin ich vom Siemens HYM 91000S-70 und "Understanding DRAM Operation" von IBM ausgegangen.
Die grundlegende Schnittstelle, mit der ich enden möchte, ist
Die Aktualisierung scheint ziemlich einfach zu sein, mit mehreren Möglichkeiten, es richtig zu machen. Ich sollte in der Lage sein, eine verteilte (verschachtelte) Nur-RAS-Aktualisierung (ROR) während des CPU-Takts LOW (wo in diesem bestimmten Chip kein Speicherzugriff erfolgt) unter Verwendung eines beliebigen alten Zählers für die Zeilenadressenverfolgung durchzuführen. Ich glaube, dass alle Zeilen gemäß JEDEC mindestens alle 64 ms aktualisiert werden müssen (512 pro 8 ms gemäß dem Seimens-Datenblatt, dh Standardaktualisierung von Zyklus/15,6 us), also sollte dies gut funktionieren, und wenn ich nicht weiterkomme, poste ich einfach eine andere Frage. Ich bin mehr daran interessiert, einfach und korrekt lesen und schreiben zu können und zu bestimmen, was ich in Bezug auf die Geschwindigkeit erwarten sollte.
Ich werde zuerst kurz beschreiben, wie ich denke, dass es funktioniert und welche möglichen Lösungen ich bisher gefunden habe.
Grundsätzlich teilen Sie eine 20-Bit-Adresse in zwei Hälften, wobei Sie eine Hälfte für die Spalte und die andere für die Zeile verwenden. Sie stroben die Zeilenadresse, dann die Spaltenadresse, wenn /W HIGH ist, wenn /CAS auf LOW geht, dann ist es ein Lesevorgang, andernfalls ist es ein Schreibvorgang. Wenn es sich um einen Schreibvorgang handelt, müssen sich die Daten zu diesem Zeitpunkt bereits auf dem Datenbus befinden. Wenn es sich um einen Lesevorgang handelt, sind die Daten nach einer gewissen Zeit verfügbar, oder wenn es sich um einen Schreibvorgang handelt, sind die Daten sicher geschrieben worden. Dann müssen /RAS und /CAS in der kontraintuitiv als "Vorlade"-Periode wieder HIGH gebracht werden. Damit schließt sich der Kreislauf.
Im Grunde ist es also ein Übergang durch mehrere Zustände mit ungleichmäßigen spezifischen Verzögerungen zwischen jedem Übergang. Ich habe es als "Tabelle" aufgelistet, die nach der Dauer jeder Phase der Transaktion in der Reihenfolge indiziert ist:
Die Zeiten, auf die ich mich beziehe, sind im folgenden Diagramm dargestellt.
(CA = Spaltenadresse, RA = Zeilenadresse, X = egal)
Auch wenn es nicht genau das ist, es ist so etwas und ich denke, dass die gleiche Art von Lösung funktionieren wird. Ich habe mir bisher ein paar Ideen ausgedacht, aber ich denke, nur die letzte hat Potenzial und ich suche nach besseren Ideen. Ich ignoriere hier Refreshing, Fast Page und Parity Checking/Generating.
Die einfachste Lösung besteht darin, einfach einen Zähler und ein ROM zu verwenden, wobei der Zählerausgang der ROM-Adresseneingang ist und jedes Byte den entsprechenden Zustandsausgang für die Zeitdauer hat, der die Adresse entspricht. Dies wird nicht funktionieren, da ROMs langsam sind. Selbst ein vorinstallierter SRAM scheint viel zu langsam zu sein, um sich zu lohnen.
Die zweite Idee war, einen GAL16V8 oder so etwas zu verwenden, aber ich glaube, ich verstehe sie nicht gut genug, Programmierer sind sehr teuer und die Programmiersoftware ist, soweit ich weiß, nur Closed Source und Windows.
Meine letzte Idee ist die einzige, von der ich denke, dass sie tatsächlich funktionieren könnte. Die 74ACT-Logikfamilie hat geringe Ausbreitungsverzögerungen und akzeptiert hohe Taktfrequenzen. Ich denke, das Lesen und Schreiben könnte mit einem CD74ACT164E -Schieberegister und SN74ACT573N erfolgen .
Grundsätzlich erhält jeder eindeutige Zustand seinen eigenen Latch, der unter Verwendung von 5-V- und GND-Schienen statisch programmiert wird. Jeder Ausgang des Schieberegisters geht an den /OE-Pin eines Latches. Wenn ich die Datenblätter richtig verstehe, könnte die Verzögerung zwischen den einzelnen Zuständen nur 1/SCLK betragen, aber das ist viel besser als eine PROM- oder 74HC-Lösung.
Wird der letzte Ansatz also wahrscheinlich funktionieren? Gibt es eine schnellere, kleinere oder allgemein bessere Möglichkeit, dies zu tun? Ich glaube, ich habe gesehen, dass der IBM PC/XT 7400-Chips für etwas verwendet, das mit DRAM zu tun hat, aber ich habe nur Top-Board-Fotos gesehen, daher bin ich mir nicht sicher, wie das funktioniert hat.
ps Ich möchte, dass dies in DIP machbar ist und nicht mit einem FPGA oder modernen uC "schummelt".
pps Vielleicht ist es eine bessere Idee, die Gate-Verzögerung direkt mit dem gleichen Latch-Ansatz zu verwenden. Mir ist klar, dass sowohl Schieberegister- als auch direkte Gate- / Ausbreitungsverzögerungsmethoden mit der Temperatur variieren, aber ich akzeptiere dies.
Für alle, die dies in Zukunft finden, deckt diese Diskussion zwischen Bil Herd und André Fachat mehrere der in diesem Thread erwähnten Designs ab und diskutiert andere Probleme, einschließlich DRAM-Tests.
Vollständige Schaltpläne für den IBM PC/XT finden Sie im technischen Referenzhandbuch für den IBM Personal Computer XT (Anhang D), das Sie möglicherweise online finden können.
Das Problem hierbei ist, dass Sie bei einer gegebenen Strobe-Leitung, die beim Lesen oder Schreiben des Speichers aktiviert wird, RAS, CAS und eine Steuerleitung (nennen Sie sie MUX) für den Adressmultiplexer erzeugen möchten. Der Einfachheit halber nehme ich unrealistisch an, dass Strobe, RAS und CAS alle aktiv hoch sind.
Wenn ich mir den PC/XT-Schaltplan und die Schaltpläne einiger anderer Computer aus dieser Zeit anschaue, sehe ich drei grundlegende Strategien, die ungefähr die folgenden sind:
Verwenden Sie den Blitz für RAS. Verwenden Sie eine Verzögerungsleitung (ein Teil, dessen Ausgang eine zeitverzögerte Version seines Eingangs ist) auf RAS, um MUX zu erzeugen, und verwenden Sie eine andere Verzögerungsleitung, um eine noch spätere Version von RAS zu erzeugen, die für CAS verwendet wird. Diese Strategie wird vom PC/XT und dem TRS-80 Model II verwendet.
Ein Beispiel für ein (modernes) Verzögerungsleitungsteil ist das Maxim DS1100.
Verwenden Sie das Strobe für RAS und verzögern Sie es für MUX und CAS, aber tun Sie dies mit einem Hochgeschwindigkeits-Schieberegister anstelle einer Verzögerungsleitung. Diese Strategie wird vom TRS-80 Model I und dem Apple II verwendet.
Verwenden Sie benutzerdefinierte ICs. Das ist die Strategie des Commodore 64.
Ihre Frage ist so kompliziert, dass ich nicht einmal sicher bin, was Ihr eigentliches Problem ist, aber ich werde es versuchen!
Das "sauberste" 6502-basierte DRAM-Design, das ich finden konnte, stammt vom Commodore PET 2001-N . Es hat einen 6502, der mit 1 MHz läuft, aber die DRAM-Logik wird mit 16 MHz getaktet, was wahrscheinlich alle Timings erzeugt.
Ich habe die Details nicht analysiert, aber die Hauptaktion scheint mit einem 74191 4-Bit-Zähler zu geschehen, der mit einem 74164 Schieberegister verbunden ist. Dies gibt 8 separate Leitungen aus, die in einen 74157 MUX gehen, der von der R/W-Leitung gesteuert wird. Der Ausgang des MUX geht in ein 7474-Flip-Flop und eine diskrete Logik, um die endgültigen RAS/CAS-Signale zu erzeugen. Hier ist ein Auszug, der auf die entsprechende Seite im Referenzschema verweist.
Das Auffrischen wird mit einem separaten Zähler gehandhabt, und jede Adressleitung ist mit einem Multiplexer verbunden, der entweder die "echte" Adresse oder die Auffrischadresse auswählt.
Teile dieser Logik scheinen auch Timings für das Videosubsystem zu generieren. Ich bin sicher, dass es für Ihre speziellen Bedürfnisse vereinfacht werden kann, aber ich denke, dass etwas Ähnliches nützlich sein kann: Ein Hochfrequenzzähler, Schieberegister und Multiplexer.
ps Ich möchte, dass dies in DIP machbar ist und nicht mit einem FPGA oder modernen uC "schummelt".
Obwohl ich den Geist Ihres Projekts und Ihren Wunsch, nicht ausgefallene Teile zu verwenden, vollkommen verstehe, würde ich an Ihrer Stelle definitiv den FPGA-Weg gehen .
Mehrere Gründe:
Anonym
Antonius
Anonym
user_1818839
Benutzer105652
Antonius
Antonius
Antonius
Rohr
David Tweed