Forum: Mikrocontroller und Digitale Elektronik Addressweite SDRAM - Ich versteh es gerade nicht!


von Steffen H. (avrsteffen)


Angehängte Dateien:

Lesenswert?

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
 ???


Grüße Steffen

von S. R. (svenska)


Lesenswert?

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.

von Dergute W. (derguteweka)


Lesenswert?

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

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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 ?

von Steffen H. (avrsteffen)


Lesenswert?

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.

von Steffen H. (avrsteffen)


Lesenswert?

Ich komme da auf 2^24 = 16MB Adressraum ???

von Thorsten S. (thosch)


Lesenswert?

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

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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.

von Steffen H. (avrsteffen)


Lesenswert?

Okay

Das hab ich jetzt verstanden. Danke euch beiden.

/****************************
* Bus width setting
****************************/


>           23 ......... 12     11 ....... 10      9 .........0
> sys_A  : MSB <-------------------------------------------> LSB
>
> Row    : RA_MSB <--> RA_LSB
> Bank   :                    BA_MSB <--> BA_LSB
> Column :                                       CA_MSB <--> CA_LSB

Dann müsste das ganze ja so aussehen.
Richtig?


Danke schonmal
Steffen

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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

von Steffen H. (avrsteffen)


Lesenswert?

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

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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.

von Thorsten S. (thosch)


Lesenswert?

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...

von Achim S. (Gast)


Lesenswert?

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.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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.

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.