Forum: Mikrocontroller und Digitale Elektronik DDR3 RAM Datenleitung beliebig anschliessen


von Holger K. (holgerkraehe)


Angehängte Dateien:

Lesenswert?

Hallo zusammen

Ich bin gerade dabei ein DDR3 Ram an einen Allwinner A20 anzuschliesen.
Dabei stellt sich mir die Frage, ob ich denn nun die Datenleitungen 
beliebig auf den zwei Chips schieben kann, um das Routing optimaler zu 
gestalten.

Die Adressen sind für beide Chips identisch.

Daher gehe ich mal davon aus, dass es keinen Unterschied macht, wo ich 
die Datenleitung anhänge, denn das ausgelesene ist ja immer so 
ausgerichtet, wie ich die Datenleitungen angeschlossen habe. Oder 
übersehe ich da etwas?

Danke!

von Der Hocko (Gast)


Lesenswert?

Auswendig weiss ich es nicht, aber es gibt bei den Addressen eine 
Beschränkung, weil die mehrfunktional benutzt werden. Bei den Daten 
sollte es egal sein, weil die ja nicht deterministisch sind. Hast halt 
dann physikalisch Datensalat in den RAMs, der aber nicht relevant ist.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Holger K. schrieb:
> Dabei stellt sich mir die Frage, ob ich denn nun die Datenleitungen
> beliebig auf den zwei Chips schieben kann,

Sollte gehen. Nur bei den Adressleitungen darfst Du das auf keinen Fall, 
denn über die werden nicht nur die Speicheradressen, sondern auch 
weitere Steuerinformationen (für verschiedene Mode-Register) 
transportiert.

von Falk B. (falk)


Lesenswert?

@ Holger Krähenbühl (holgerkraehe)

>Dabei stellt sich mir die Frage, ob ich denn nun die Datenleitungen
>beliebig auf den zwei Chips schieben kann, um das Routing optimaler zu
>gestalten.

Superlative kann man nicht steigern.

>Daher gehe ich mal davon aus, dass es keinen Unterschied macht, wo ich
>die Datenleitung anhänge, denn das ausgelesene ist ja immer so
>ausgerichtet, wie ich die Datenleitungen angeschlossen habe. Oder
>übersehe ich da etwas?

Ja, das tust du. Bei DDR3 sind je 4 oder 8 Bit als sog. Lanes an ein 
Taktsignal angebunden. Man darf also bestenfalls innerhalb einer Lane 
die Bits vertauschen.
Moderne RAMs haben mit dem guten, alten SRAM nur noch wenig gemein, dort 
konnte man nach Herzenslust Adressen und Datenleitungen vertauschen.

von Der Hocko (Gast)


Lesenswert?

Falk B. schrieb:
> a, das tust du. Bei DDR3 sind je 4 oder 8 Bit als sog. Lanes an ein
> Taktsignal angebunden.
Das ist aber ein rein physikalisches Problem, oder?

Die Bits werden nur ja nur "falsch" einsortiert und beim Auslesen wieder 
sortiert.

?

von Achim S. (Gast)


Lesenswert?

Der Hocko schrieb:
> Das ist aber ein rein physikalisches Problem, oder?

Das ist ein Timing-Problem: das DRAM schickt beim Lesen zusammen mit den 
Daten das DQS-Signal, das vom Speichercontroller zum Eintakten der Daten 
genommen wird.

Wenn du das DQS-Signal von DRAM zum Eintakten der Daten von DRAM 
verwendest, dann taktest du die Daten im falschen Zeitpunkt ein. Je 
nachdem, mit welcher Frequenz die Daten übertragen werden (und wie 
identisch die DLLs in beiden DRAMs laufen) sind damit Lesefehler 
vorprogrammiert.

von Achim S. (Gast)


Lesenswert?

oh man:

Achim S. schrieb:
> Wenn du das DQS-Signal von DRAM zum Eintakten der Daten von DRAM
> verwendest,

sollte heißen:

Wenn du das DQS-Signal von ersten DRAM zum Eintakten der Daten vom 
zweiten DRAM verwendest...

von Der Hocko (Gast)


Lesenswert?

Stimmt - kurze Denkblockade meinerseits - der Controller kann es ja 
nicht kompensieren. Ich hatte hier wohl meine Lösung im Kopf (Pin-swap 
am FPGA).

von Der Hocko (Gast)


Lesenswert?

Ich sehe gerade noch was:

Die "CPU-REF", die manuell mit Spannungsteiler hergestellt werden, sind 
hoffentlich nicht die benötigten 0.75-Ref, oder?

Oder doch?

Macht man das neuerdings wieder mit RR, statt mit einem Regler?

von Holger K. (holgerkraehe)


Angehängte Dateien:

Lesenswert?

Danke für die Antworten.
Also ich darf die Bits innerhalb einer Lane tauschen.

Das wäre also zb:

LaneA: D0 D1 D2 D3
LaneB: D4 D5 D6 D7
LaneC: ...

Dan dürfte ich nun also wiel folgt anschliessen:

RAM: D0 D1 D2 D3
CPU: D2 D0 D3 D1

Was ich vermutlich nicht darf ist:

RAM: D0 D1 D2 D3
CPU: D5 D7 D2 D0



Ich habe das folgende RAM: K4B4G1646D
Anbei das Datenblatt.
Wo sehe ich nun, wie viele Lanes ich habe und wie breit eine solche ist?

Danke!

von Holger K. (holgerkraehe)


Angehängte Dateien:

Lesenswert?

Der Hocko schrieb:
> Ich sehe gerade noch was:
>
> Die "CPU-REF", die manuell mit Spannungsteiler hergestellt werden, sind
> hoffentlich nicht die benötigten 0.75-Ref, oder?
>
> Oder doch?
>
> Macht man das neuerdings wieder mit RR, statt mit einem Regler?

Ich muss gestehen, ich habe das Schmea zum grössten Teil vom BananaPi 
kopiert. Deshalb kommen auch entsprechende "Basic" Fragen.

Dort war das halt so drinn... BananaPi im Anhang.

von Der Hocko (Gast)


Lesenswert?

>BananaPi

Sieht ziemlich "Banane" aus ... :-)

von Holger K. (holgerkraehe)


Lesenswert?

Der Hocko schrieb:
>>BananaPi
>
> Sieht ziemlich "Banane" aus ... :-)

Ja, das Schema von denen ist echt schlimm.
Es war nicht gerade leicht, die Zusammenhänge zu sehen.

von (prx) A. K. (prx)


Lesenswert?

Falk B. schrieb:
> Superlative kann man nicht steigern.

Nur ist "optimal" grammatikalisch kein Superlativ. ;-)

: Bearbeitet durch User
von Achim S. (Gast)


Lesenswert?

Holger K. schrieb:
> Ich habe das folgende RAM: K4B4G1646D
> Anbei das Datenblatt.
> Wo sehe ich nun, wie viele Lanes ich habe und wie breit eine solche ist?

Alle Bits, die zu einem DQS-Signal gehören, gehören zu einer Lane. Dein 
DRAM hat 16 IOs und zwei (jeweils differentielle) DQS-Signale (DQSU und 
DQSL). DQSL gehört zu den "L"ower bits - also DQ0..7
DSQU gehört zu den "U"pper bits - also DQ8..15
Innerhalb der Bytes kannst du die IOs also tatsächlich vertauschen, über 
die Bytegrenzen weg aber nicht.

Neben dem Timing Problem (Zuordnung zum richtigen DQS) gäbe es dann 
nämlich sogar noch ein funktionales Problem: dein DRAM hat auch zwei 
Data-Mask Signale (DMU und DML), mit denen das Schreiben für die eine 
oder andere Hälfte der IOs geblockt werden kann. Wenn dein System auch 
mal byteweise auf den Speicher schreiben mag (also die Schreibzugriffe 
nicht immer mit voller Breite durchführt), dann muss die Zuordnung der 
DM zu den DQ stimmen, sonst werden die falschen Bits geschrieben. Also 
auch deswegen: kein Tausch der DQs über die Grenzen der Bytelanes.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

A. K. schrieb:
> Nur ist "optimal" grammatikalisch kein Superlativ. ;-)

"Kein" auch nicht, und trotzdem ... "in keinster Weise", also quasi am 
keinzigsten.

von Falk B. (falk)


Lesenswert?

@A. K. (prx)

>> Superlative kann man nicht steigern.

>Nur ist "optimal" grammatikalisch kein Superlativ. ;-)

https://de.wikipedia.org/wiki/Komparation#Desuperlativum

von mh (Gast)


Lesenswert?

Achim S. schrieb:
> Innerhalb der Bytes kannst du die IOs also tatsächlich vertauschen, über
> die Bytegrenzen weg aber nicht.

Fast volle Zustimmung. Bei manchen DDR3-Controller gibt es da aber 
Einschränkungen. Beim i.MX6 muss das erste Bit eines Bytes (also 0 und 
8) "richtig" angeschlossen werden, die anderen dürfen munter vertauscht 
werden.

Hier der Auszug aus dem Manual:
The rules are as follows:
• Hardware write leveling – lowest order bit within byte lane must 
remain on lowest order bit of lane by JEDEC compliance (see the “Write 
Leveling” section in JESD79-3E)
  — D0, D8, D16, D24, D32, D40, D48, and D56 are fixed
  — Other data lines free to swap within byte lane
• JEDEC DDR3 memory restrictions are:
  – No restrictions for complete byte lane swapping
  – DQS and DQM must follow lanes

Ob die Allwinners auch so ein tolles Manual haben, weiß ich allerdings 
nicht.

von Der Hocko (Gast)


Lesenswert?

Auch interessant! Was macht denn das erste Bit so besonders? Das mit den 
der lane-Zuordnung ist eigentlich vollkommen klar und kann nicht nur 
timing-Fehler machen, sondern wird Fehler machen. Aber das 
Bit-Null-Thema ist mir jetzt vollkommen unklar.

?

von Achim S. (Gast)


Lesenswert?

stimmt, DQ0 ist besonders, das hatte ich schon wieder verdrängt ;-)

https://www.micron.com/products/datasheets/%7BE39E9941-4D9E-426A-9ACA-D65A25A01794%7D?page=8

Um das Timing sauber einzutrainieren kann man das Mode-Register so 
programmieren, dass über DQ0 eine Toggle-Sequenz läuft, die anderen DQs 
halten währenddessen still....

von Holger K. (holgerkraehe)


Angehängte Dateien:

Lesenswert?

UiUiUi...

Da gibt es ja viele Stolperfallen.

mh schrieb:
> Fast volle Zustimmung. Bei manchen DDR3-Controller gibt es da aber
> Einschränkungen. Beim i.MX6 muss das erste Bit eines Bytes (also 0 und
> 8) "richtig" angeschlossen werden, die anderen dürfen munter vertauscht
> werden.

Ob das auch für den Allwinner A20 gilt weiss ich nicht.
Da die Chinesen das im Schema jedoch nicht entsprechend umgesetzt haben, 
gehe ich mal nicht davon aus. (Siehe Bild im Anhang)

Ich hoffe das Design wird erfolgreich.
Falls noch jemand Stolperfallen kennt, bitte anmerken.

Danke!

von ich (Gast)


Lesenswert?

Ein weiterer Stolperstein ist das length-matching.
Alle CA Signale müssen gleich lang sein und möglichst identische 
Impedanzen aufweisen. Das selbe gilt für die Daten lanes. Diese müssen 
in sich die gleiche Länge haben.
Zu einer Daten-lane gehören 8 Datenbits, DQM und das DQS Pärchen.

Die 5 Gruppen können unterschiedlich lang sein, das wird durch das 
leveling ausgeglichen.

D0, D8, D16, D24 sollten 1:1 aufgelegt werden, das ist normalerweise der 
"Feedback" Kanal für das write leveling, sofern der Controller write 
leveling überhaupt hardwareseitig unterstützt. Das tun nämlich nicht 
alle.

Die Generierung der Referenzspannung kann man über Regler oder RR 
machen, mit RR habe ich gute Erfahrung. Allerdings erscheint mir dein 
Spannungsteiler etwas hochohmig.

Der ZQ Widerstand ist normalerweise 50Ohm, 1k habe ich noch nie 
gesehen...

von mh (Gast)


Lesenswert?

ich schrieb:
> Der ZQ Widerstand ist normalerweise 50Ohm, 1k habe ich noch nie
> gesehen...

50 Ohm habe ich da aber auch noch nie gesehen. Ich kenne da 240 Ohm...

von Holger K. (holgerkraehe)


Lesenswert?

mh schrieb:
> ich schrieb:
>> Der ZQ Widerstand ist normalerweise 50Ohm, 1k habe ich noch nie
>> gesehen...
>
> 50 Ohm habe ich da aber auch noch nie gesehen. Ich kenne da 240 Ohm...

Ja da habt ihr recht. Ich habe das noch nicht korrekt übernommen.
Es werden 240 Ohm sein.

ich schrieb:
> D0, D8, D16, D24 sollten 1:1 aufgelegt werden, das ist normalerweise der
> "Feedback" Kanal für das write leveling, sofern der Controller write
> leveling überhaupt hardwareseitig unterstützt. Das tun nämlich nicht
> alle.

Interessant, was meinst du mit 1:1? Also dass D0 und D8 gleich lang sind 
und D16 und D24? Oder alle vier zusammen gleich lang?

ich schrieb:
> Die Generierung der Referenzspannung kann man über Regler oder RR
> machen, mit RR habe ich gute Erfahrung. Allerdings erscheint mir dein
> Spannungsteiler etwas hochohmig.

Hmm im Original sind es zwei 2k Widerstände welche mittig nach CPU_REF 
gehen und zum DRAM. gespiesen wird der Teiler von DRAM_VCC.
Ich vermute die CPU braucht den Spannungspegel intern?

von ich (Gast)


Lesenswert?

Korrektur: ZQ Widerstand=240Ohm

Deine Clockterminierung ist auch etwas seltsam. Hast du 2x 1k längs und 
100p am Eingang des Taktsignals? Das wird so nicht funktionieren. Zeig 
doch mal die Anbindung an den Prozessor.

Bei unterminierten Systemen, wie deinem, habe ich gute Erfahrung mit 
100R zwischen dem CLK-Paar.

von ich (Gast)


Lesenswert?

mit 1:1 meine ich:

D0 Controller an D0 RAM1
D8 Controller an D8 RAM1
D16 Controller an D0 RAM2
D24 Controller an D8 RAM2

Ja, Vcc/2 ist ein Referenzwert der intern benötigt wird. Wenn der Teiler 
allerdings zu hochohmig ist, ist das störanfälliger. Schau dir mal an 
welche Genauigkeit an der Referenz benötigt wird.

von Holger K. (holgerkraehe)


Angehängte Dateien:

Lesenswert?

Vielen Dank für die vielen Antworten!

Habe das Schema nun korrigiert.
Dieses ist nun im Anhang.

ich schrieb:
> Deine Clockterminierung ist auch etwas seltsam. Hast du 2x 1k längs und
> 100p am Eingang des Taktsignals? Das wird so nicht funktionieren. Zeig
> doch mal die Anbindung an den Prozessor.

Habe nun 22 Ohm eingefügt. Die 1k waren Copy Paste werte.

Was meinst du nun zum Schema?

von ich (Gast)


Lesenswert?

Die Bit0 Geschichte ist noch falsch.

Die Clockterminierung würde ich anders machen. Was erhoffst du dir von 
den 22Ohm und den 10p? Ein DDR Controller hat bereits eine definierte 
Ausgangsimpedanz, das macht dir nur Ärger.
In dem Referenzschaltplan haben die 0 Ohm bestückt und den Kondensator 
nicht. Dann kann man das auch weg lassen, der Sprung deiner Impedanz 
durch die Pads der Bauteile kann zum Problem führen.
Mach einfach einen 100 Ohm Widerstand zwischen das CLK Paar.

Welche Frequenz willst du verwenden?
Wie soll die Topologie aussehen?
http://www.icd.com.au/articles/DDR3-4_Topology_PCBD_Apr2016.pdf

von Holger K. (holgerkraehe)


Lesenswert?

ich schrieb:
> Dann kann man das auch weg lassen, der Sprung deiner Impedanz
> durch die Pads der Bauteile kann zum Problem führen.
> Mach einfach einen 100 Ohm Widerstand zwischen das CLK Paar.

Danke für den Input. Werde ich anpassen.
Den 100 Ohm eher am ende der Leitung?

ich schrieb:
> Welche Frequenz willst du verwenden?

Der DDR3 Ram soll mit 800MHz getaktet werden.

ich schrieb:
> Wie soll die Topologie aussehen?

Ich dachte an Fly by.
Spricht da etwas gegen?

ich schrieb:
> Die Bit0 Geschichte ist noch falsch.

Jain, die banana Pi original Schemas haben da ja auch nicht drauf 
geachtet. Daher gehe ich mal davon aus, dass dies bei diesem Controller 
nicht relevant zu sein scheint.

: Bearbeitet durch User
von Gu. F. (mitleser)


Lesenswert?

Achim S. schrieb:
> stimmt, DQ0 ist besonders, das hatte ich schon wieder verdrängt ;-)
>
> 
https://www.micron.com/products/datasheets/%7BE39E9941-4D9E-426A-9ACA-D65A25A01794%7D?page=8
>
> Um das Timing sauber einzutrainieren kann man das Mode-Register so
> programmieren, dass über DQ0 eine Toggle-Sequenz läuft, die anderen DQs
> halten währenddessen still....

Hmm, aber deswegen kann doch DQ0 trotzdem an jedem beliebigen DQx 
innerhalb der lane liegen?

von Hurra (Gast)


Lesenswert?

Rufus Τ. F. schrieb:
> Holger K. schrieb:
>> Dabei stellt sich mir die Frage, ob ich denn nun die Datenleitungen
>> beliebig auf den zwei Chips schieben kann,
>
> Sollte gehen. Nur bei den Adressleitungen darfst Du das auf keinen Fall,
> denn über die werden nicht nur die Speicheradressen, sondern auch
> weitere Steuerinformationen (für verschiedene Mode-Register)
> transportiert.

Ich würde das so pauschal nicht sagen.

Da gibt es etwas, das ZQ-Kalibrierung heißt. Bei einigen Prozessoren 
erfordert das, dass man bestimmte Datenleitungen an bestimmte Ports des 
Speichercontrollers und des RAMs anschließen muss.

Ich kann nur zum genauen (!) prüfen des Datenblattes raten.

von Holger K. (holgerkraehe)


Angehängte Dateien:

Lesenswert?

Hurra schrieb:
> Ich kann nur zum genauen (!) prüfen des Datenblattes raten.

Danke für die Antwort.
Anbei das Datenblatt des A20

Leider ist der DDRC Teil sehr spärlich.


Hier steht mehr: http://linux-sunxi.org/A10_DRAM_Controller_Calibration

: Bearbeitet durch User
von Hurra (Gast)


Lesenswert?

Holger K. schrieb:
> Danke für die Antwort.
> Anbei das Datenblatt des A20
>
> Leider ist der DDRC Teil sehr spärlich.

Das ist kein Datenblatt, sondern ein Sparwitz. Möglicherweisee hast du 
aber auch nur das falsche erwischt. Da sollte es zumindest ein 
"Reference Manual" geben. Das vom i.MX6 hat zum Beisiel 5800 Seiten, so 
um den Dreh müsste das hier auch aussehen.
Mit DEM Ding wird da kein funktionisfähiges Board herauskommen :-(

Wenn du bezüglich des SOC keine Wahl hast, wirst du dich an bestehenden 
(funktionsfähigen) Designs orientieren müssen. Die einfachste Lösung 
ist, die DDR3-Schaltung des Referenzdesigns 1:1 zu übernehmen. Inklusive 
Layout, das ist nicht ganz unkritisch. Vorsichtig ausgedrückt.
Falls es keines gibt, nimm wenigstens eine funktionsfähige Schaltung, 
welche frei verfügbar ist.
Nichts ist schlimmer, als ein SOC der nicht hochfährt. DDR3 mit dem Oszi 
debuggen ist fast unmöglich - man kommt an die Leitungen schon gar nicht 
ran.

Es gibt übrigens von Freescale ordentliche Prozessoren mit richtiger 
Dokumentation. Möglicherweise wäre das was?

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.