Hallo Leute
Also ich habe gerade ein Verständnis Problem über den Adressraum eines
SDRAM's.
Folgendes:
Ich habe hier einen MT48LC16A8 -> 128MB gesamt Speicher
Dieser ist organisiert zu 16Meg x8bit x4Bänke
Das heißt bei diesem hier: 4 Bänke haben jeweils 4096 x 1024x8 Bits =
32Meg ???
Wenn ich das jetzt x4Bänke rechne komme ich wieder auf 128MB!
Wo ist da mein Denkfehler?
Oder stimmen die Angaben im Datasheet nicht?
Das nächste wäre mein Verständnis zur Adressierung/Adressraumweite:
Wenn ich 128MB Gesamtspeicher habe, das :8 macht ja 16Meg!
Habe ich dann
Steffen H. schrieb:> Dieser ist organisiert zu 16Meg x8bit x4Bänke
Das sind in meiner Welt 64 MB, oder 1024 MBit. Du meinst vermutlich 32M
x 4 Banks x 8 Bit, also 128 MB == 2048 MBit.
Um 128 MB byteweise adressieren zu können, brauchst du insgesamt 27
Adressbits.
Moin,
Ich glaub' hier liegt der Hund begraben:
Steffen H. schrieb:> Dieser ist organisiert zu 16Meg x8bit x4Bänke
Da wuerd' ich sagen - neee, der ist organisiert zu:
4Meg x8bit x4Baenke.
Fuer die 4Meg sprechen auch die 10bit Column- und die 12bit
Rowadressbreite.
Macht zusammen 22bit 2^22=4Meg
Gruss
WK
Steffen H. schrieb:> Das heißt bei diesem hier: 4 Bänke haben jeweils 4096 x 1024x8 Bits => 32Meg ???
Nein.
Das heisst, es sind 4 Bänke mit 32MBit und es sind immer 4 Bänke,
immer 32MBit, nur die Busbreite ändert sich.
Also:
4096 x 2048 x 4 = 32MBit
4096 x 1024 x 8 = 32MBit
4096 x 512 x 16 = 32MBit
Klar ?
Hallo
@Marc
>Nein.> Das heisst, es sind 4 Bänke mit 32MBit und es sind immer 4 Bänke,> immer 32MBit, nur die Busbreite ändert sich.>> Also:>> 4096 x 2048 x 4 = 32MBit> 4096 x 1024 x 8 = 32MBit> 4096 x 512 x 16 = 32MBit>> Klar ?>
Ja, das hab ich jetzt verstanden. Danke Marc
@Weka
>Da wuerd' ich sagen - neee, der ist organisiert zu:>4Meg x8bit x4Baenke.>>Fuer die 4Meg sprechen auch die 10bit Column- und die 12bit>Rowadressbreite.>Macht zusammen 22bit 2^22=4Meg
Danke auch dir. Dann stimmen die Angaben in der VHDL Parametrierung
also.
Wie kann ich dann jetzt noch alle Bänke ausnutzen?
Denn die 22bit 2^22 sind ja nur 4Meg x8 = 32Meg -> eine Bank (Page?)
Muss ich da nicht noch weitere Adressierungsbits hinzu fügen, um auf
alle Adressbereiche zu kommen?
Ich mein, ich versuche gerade einen SDRAM Controller in VHDL an meinen
SDRAM anzupassen. Es war vorher ein 4096 x 2048 x 4bit Controller
imlementiert.
Ich habe nun einen 4096 x 1024 x8bit SDRAM.
Steffen H. schrieb:> Also ich habe gerade ein Verständnis Problem über den Adressraum eines> SDRAM's.
Offenbar herrscht hier große Verwirrung...
> Folgendes:> Ich habe hier einen MT48LC16A8 -> 128MB gesamt Speicher
Zeit, mal sauber aufzutrennen zwischen Bit und Byte...
Dein Speicher hat 128 Mebibit (siehe z.B. Wikipedia), umgangssprachlich
(auch von den Herstellern und sogar von der JEDEC) meist inkorrekt als
128 Megabit bezeichnet.
Das entspricht also 16 MiB (16 Mebibyte, umgangssprachlich 16 Megabyte).
> Dieser ist organisiert zu 16Meg x8bit x4Bänke
Halt, NEIN!
Da liegt offensichtlich Dein Denkfehler:
Da steht im Datenblatt nix von x4 Bänke dahinter!
Dies ist die Angabe der Gesamtkapazität: 16.777.216 x 8 Bit
Also 134.217.728 Bit = 128 Mebibit (vom Hersteller 128 Mb genannt)
Zur Organisation:
Dem Blockschaltbild ist zu entnehmen:
4096 rows x 1024 columns x 8 Bit x 4 Bänke.
Also 12 Bit ROW-Adresse, 10 Bit COL-Addresse und 2 Bit Bank-Adresse
für 8 Bit breite Daten.
> Das heißt bei diesem hier: 4 Bänke haben jeweils 4096 x 1024x8 Bits => 32Meg ???
Ja, 32 Mebibit pro Bank. Das hast Du völlig richtig erkannt. Was ist
daran unklar?
> Wenn ich das jetzt x4Bänke rechne komme ich wieder auf 128MB!
Stimmt. 32 Mebibit x 4 Bänke macht 128 Mebibit.
> Wo ist da mein Denkfehler?
Ich denke, das konnte ich oben aufzeigen:
Deine Fehldeutung der Gesamtkapazitätsangabe,
wo Du nochmal ein "mal 4 Bänke" ergänzt hast.
> Oder stimmen die Angaben im Datasheet nicht?
Doch, die stimmen.
> Das nächste wäre mein Verständnis zur Adressierung/Adressraumweite:> Wenn ich 128MB Gesamtspeicher habe, das :8 macht ja 16Meg!>> Habe ich dann224=A0..23=16777216Bit 2^{24} = A_\text{0..23} = 16777216> Bit ???
Wie ich weiter oben auseinandergedröselt habe, hast Du folgende
Adressbits:
ROW: 12
COL: 10
Bank: 2
Macht zusammen 24 Bit. Damit kannst Du 2^24 = 16.777.216 Speicherstellen
adressieren. Da dieses RAM 8 Bit breit ist, entspricht eine
adressierbare Speicherstelle genau einem Byte, damit hast Du also
16.777.216 Byte, das sind 16 MiB.
Das RAM is nicht Bit-Adressierbar, die kleinste adressierbare Einheit
ist die Wortbreite des RAMs.
Würdest Du die x16 Variante des gleichen RAMs nutzen, hättest Du ein
Adressbit weniger, aber die gleiche Kapazität, nur eben in halbsovielen
Speicheradressen à 16 Bit organisiert.
Ich hoffe, damit ist die ganze Sache klargeworden...
Gruß,
Thorsten
Thorsten S. schrieb:> Ich hoffe, damit ist die ganze Sache klargeworden...
Eher nicht.
@Steffen H:
Ein bit wird mit "b" bezeichnet und normalerweise kleingeschrieben.
Ein Byte wird mit "B" bezeichnet und normalerweise grossgeschrieben,
also bit und Byte.
Ein Byte bezeichnet immer 8bits.
Deswegen unterscheiden sich 128Mb und 128MB.
Ein Word kann dagegen zwischen 4 und 64bits breit sein, auch mehr.
In deinem konkretem Fall hast du entweder:
4096 Rows x 2048 Columns x 4bit [Word = 4bit]
oder:
4096 Rows x 1024 Columns x 8bit [Byte = 8bit]
oder:
4096 Rows x 512 Columns x 16bit [Word = 16bit]
4096 Rows kann man mit 12 Adressleitungen dekodieren, aber damit
alles (auch die Columns) adressiert werden können, brauchst du
noch die Signale RAS (für Rows) und CAS (für Columns) und ein paar
Commands dazu.
Also Command ACTIVE adressiert Rows, READ oder WRITE danach adressiert
die Columns. Es wird die ausgewählte Breite (4-16bit) reingeschrieben
oder rausgelesen.
Es gibt aber genügend Artikel darüber im Net, da must du selber durch.
Steffen H. schrieb:> Dann müsste das ganze ja so aussehen.
???
Verstehe ich nicht, aber wenn schon, dann eher so:
23 ......... 22 21 ....... 10 9 .............0
: MSB <---------------------------------------------> LSB
Bank : BA_MSB <--> BA_LSB
Row : RA_MSB <--> RA_LSB
Column : CA_MSB <--> CA_LSB
Okay, Danke
Dann werde ich das jetzt mal so anpassen.
Wie sieht das denn mit dem zählen der Adresse des SDRAM aus wenn ich im
2-Burst Modus arbeite?
Wenn ich das Datasheet richtig verstanden habe, dann muss ich die auch
um 2 für einen Lesezugriff erhöhen?
also..
rd_addr = rd_addr +2 -> für 2-Burst Mode ???
rd_addr = rd_addr +4 -> für 4-Burst Mode ???
rd_addr = rd_addr +8 -> für 8-Burst Mode ???
Steffen
Steffen H. schrieb:> Wie sieht das denn mit dem zählen der Adresse des SDRAM aus wenn ich im> 2-Burst Modus arbeite?
Jetzt kann ich dir nicht weiter helfen. Das letzte mal als ich etwas
mit SDRAM zu tun hatte, war es noch mit DDR1-133.
Auf jeden Fall wird in 2-Burst Mode die angelegte Adresse nur als
gerade Adresse benutzt.
D.h. Adresse 0 und Adresse 1 startet immer bei Adresse 0, Adresse 2
und Adresse 3 startet immer ab Adresse 2 usw.
Solange es nicht mehr als 2 ist, braucht man sich keine Sorgen zu
machen, bei mehr muss man aufpassen, da die Adresse wrappen kann.
Je nachdem, wie die Struktur der Zugriffe aufs RAM aussieht, kann die
Bank-Adresse in der Mitte schon sinnvoll sein, da man pro Bank eine Row
offen halten kann, man kann so ggf. zwischen Bänken umschalten und muß
nicht erst ein Precharge Command absetzen...
Thorsten S. schrieb:> Je nachdem, wie die Struktur der Zugriffe aufs RAM aussieht, kann die> Bank-Adresse in der Mitte schon sinnvoll sein
Sehe ich genau so: ich würde auch eher den Adress-Split wählen, den
Steffen zunächst vorgeschlagen hat. Bei "wilden" Adresssprüngen macht es
keinen Unterschied, aber beim Lesen größerer Blöcke (die über eine
Column hinaus gehen) ist es besser, wenn man am Ende der Column die Bank
wechseln kann.
Steffen H. schrieb:> Wie sieht das denn mit dem zählen der Adresse des SDRAM aus wenn ich im> 2-Burst Modus arbeite?
Du erhältst mit jedem Burst den Inhalt von 2 Column-Adressen.
Dementsprechend kannst du deine Adresse für den nächsten Zugriff in
Zweierschritten hochzählen.
Marc V. schrieb:> Auf jeden Fall wird in 2-Burst Mode die angelegte Adresse nur als> gerade Adresse benutzt.
Nein: bei diesem SDRAM startet der Burst noch genau mit der
Column-Adresse, die man beim Read-Kommando anlegt (sei sie gerade oder
ungerade). Bei späteren Speichergenerationen ist das nicht mehr
unbedingt so.
> D.h. Adresse 0 und Adresse 1 startet immer bei Adresse 0, Adresse 2> und Adresse 3 startet immer ab Adresse 2 usw.
Es ist die naheliegende Herangehensweise, nur mit geraden CAS-Adressen
zu arbeiten. Aber man kann es aber natürlich auch anders machen. Wenn
der Burst auf Adresse 3 gestartet wird, dann erhält man erst den Inhalt
von Adresse 3, im zweiten Schritt des Bursts dann den Inhalt von Adresse
2.
Achim S. schrieb:> Marc V. schrieb:>> Auf jeden Fall wird in 2-Burst Mode die angelegte Adresse nur als>> gerade Adresse benutzt.>> Nein: bei diesem SDRAM startet der Burst noch genau mit der> Column-Adresse, die man beim Read-Kommando anlegt (sei sie gerade oder> ungerade). Bei späteren Speichergenerationen ist das nicht mehr> unbedingt so.
Da war ich mir später selbst nicht mehr sicher ob es stimmt, wie
gesagt, lange her...
Thorsten S. schrieb:> Je nachdem, wie die Struktur der Zugriffe aufs RAM aussieht, kann die> Bank-Adresse in der Mitte schon sinnvoll sein, da man pro Bank eine Row> offen halten kann, man kann so ggf. zwischen Bänken umschalten und muß> nicht erst ein Precharge Command absetzen...
Ja, da hast du Recht.
Ich hatte damals nur Blöcke mit 256Byt und Geschwindigkeit stand
nicht im Vordergrund.