Forum: FPGA, VHDL & Co. SDRAM - Burst write / read - umschalten der Bank und row?


von Holger K. (holgerkraehe)


Lesenswert?

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

von user (Gast)


Lesenswert?

Ja genau.

von Holger K. (holgerkraehe)


Lesenswert?

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
von Thomas R. (Firma: abaxor engineering) (abaxor)


Lesenswert?

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

von Sigi (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.