Hallo zusammen Ich habe es geschafft, mein SDRAM mit einzelnen Schreib und Lesezugriffen zu benutzen. Einzeln bedeutet hierbei, dass die Burstlänge BL auf 1 gesetzt ist und somit ein einzelne Word (16Bit) gelesen/geschrieben wird. nun würde ich gerne eine grössere Burstlänge ermöglichen. Wenn ich das richtig verstandan habe, läuft das so ab: Das RAM ist Spalten, Reihen und Banken eingeteilt. Pro Bank gibt es ein Row-Register. Die Bank wird über die höchsten Bits der Addresse deinifiert. Wenn ich nun Bank 1 Addressiert habe und dabei Reihe 5 und Spalte 2, so zeige ich damit auf genau ein Word. Nun Muss ich die Bank aktivieren. Nun die Bank lesen. Dabei wird die Row in das Row register geladen. Dabei geht der Inhalt im Kondensator welcher sich in der selektierten Reihe befindet, verloren. Nun arbeite ich mit dem im Register gespeicherten Wert. Wenn ich nun die Adresse erhöhe, erhöhe ich den "Zeiger" im Row Register. Ich wandere also immer weiter nach rechts. Row Reg [Word1, Word2, Word3, Word4, Word5....] Wenn ich nun am ende der Row angelangt bin, müsste ich ja nun eigentlich die aktuelle Row schliessen (Bank precharge?) und dann die nächste Row laden und dort wieder weiterlesen? Ist mein Verständnis des SD-RAMS korrekt? Danke
Ok danke. Wie würde man sowas am elegantesten in VHDL umsetzen? Der RAM inkrementiert ja intern selbst die Adresse im Burst mode. Das heisst ich muss extern auch noch die adresse mitzählen. Und dann den Burst abbrechen wenn ich eine Änderung feststelle. Das würde bedeuten ich muss einen Teil der Adresse dividieren. Wie man das wohl effizient löst? Ich frage mich, ob der Burstmode überhaupt sinn macht. Der Controller von hier: http://hamsterworks.co.nz/mediawiki/index.php/Simple_SDRAM_Controller#Version_0.1_-_minimal_controller Arbeitet z.B. wie folgt: - Kommando annehmen - Col, Row, Bank speichern - Bank, Row öffnen - Daten ausgeben. - Neue anfrage: - Prüfen ob gleiche Bank und gleiche row. Wenn ja, ist es ein back to back read oder write. Daher Öffnen der Bank und laden der row übergehen, da dies bereits von vorher gemacht wurde. Direkt daten lesen und schreiben. Offensichtlich wird kein Burst benutzt. Laut Webseite scheinen trozdem 186MB/s im Lesen machbar zu sein.
:
Bearbeitet durch User
Holger K. schrieb: > Offensichtlich wird kein Burst benutzt. Doch. Siehe das Bild am Ende des Betrages. Kurz nach 202.300 ns wird ein Write-Kommando abgesetzt mit den Daten 0x0 und 0x1. Das ist ein Burst mit der Länge 4. Hier wird die DDR-Fähigkeit des DDR-SDRAMs nicht genutzt, da sich die Daten nur an der fallenden Flanke ändern. Kurz vor 202.500 ns wird dann das Read-Kommando abgesetzt. Entsprechend der CAS-Latency von 2 Takten kommen dann die Daten 0x0 und 0x1 aus dem RAM. Grundsätzlich weichen die Bilder in dem Beitrag von dem Datenblatt ab. Im Wikiartikel ändern sich die Signale mit der fallenden Flanke. Damit verletzt man die Hold-Zeit (0,8 ns) des RAMs. Die Signale müssen sich zwischen fallender und steigender Flanke ändern. Mindestens 1,5 ns (Setup-Tine) vor der steigenden Flanke. Tom
Holger K. schrieb: > Offensichtlich wird kein Burst benutzt. > Laut Webseite scheinen trozdem 186MB/s im Lesen machbar zu sein. Burst oder kein Burst entscheidet ja iA nicht über die max. mögliche R/W-Rate. Ohne Burst bist du bzw. dein Controller für jede einzelne ROW-Address zuständig, und diese muss auch ständig übertragen werden. Ein weiterer Nachteil eines Burst-losen Ansatzes ist ja auch bezogen auf deinen ersten Beitrag die Tatsache, dass in jedem Taktzyklus ein R/W-CMD übertragen werden muss. Weiss du also schon frühzeitig, dass das letzte Datum gelesen werden wird, dann kannst du im Burst-Modus schon frühzeitig die nächste ROW aufmachen (hier folgt ja auf ein R/W-CMD z.B. 3 NOP-CMDs, von denen du einen durch ein ACTIVE-CMD ersetzen kannst) und den letzten Zugriff auf die aktuelle ROW mit AutoPrecharge ausführen. D.h. mit Burst hast du uU weniger Unterbrechungen im Datenstrom zwischen zwei verschiedenen COL-Zugriffen. Du hast ja schon Hamsterworks erwähnt: mach dir klar, wie Schritt für Schritt ein brauchbarer Controller entwickelt wird, und nimm dir als Datasheet von Micron den MT48LC4M32B2, da stehen am Ende alle grundlegenden Zugriffe inkl. aller notwendigen Timingparametern jeweils auf einer Seite. Ich fand das damals für mich extrem komfortabel.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.