Forum: FPGA, VHDL & Co. Initialisierung von SDRAM


von Christian H. (cavorca)


Lesenswert?

Hallo,

In den Datenblättern von SDRAM steht ja, dass man beim einschalten eine 
ganz bestimmte Prozedur einhalten muss. Wenn man das nicht befolgt kann 
sich der RAM in einem undefinierten Zustand befinden.
(z.B.Seite 11 von 
http://download.micron.com/pdf/datasheets/dram/sdram/64MSDRAMx32.pdf )

Jetzt steht da:
1. Simultaneously apply power to VDD and VDDQ.
2. Assert and hold CKE at a LVTTL logic LOW since all inputs and outputs 
are LVTTL-compatible.
...

Jetzt stellt sich mir die Frage wie man das bewerkstelligen soll. Den 
ersten Punkt finde ich schonmal ziemlich ungeschickt. Es ist halt die 
frage was mit "Simultaneously" gemeint ist. Gleichzeitig innerhalb einer 
us? inerhalb einer ns? OK, ns sicher nicht mehr (da sind die 
Anstiegszeiten der Spannung ja auch viel langsamer). Welche 
Anforderungen ich jetzt wirklich erfüllen muss weiß ich nicht.
Naja aber lieber zu meinem eigentichen Problem nämlich Punkt 2. 
Eigentlich hatte ich vor den SDRAM direkt an einem FPGA zu betreiben. 
Wenn CKE aber von Anfang an LOW sein muss wird das schwierig. Das 
Programmieren von FPGAs dauert ja so seine Zeit egal ob man es über JTAG 
oder einen Boot-EEPROM macht. Und so weit ich weiß sind die Ausgänge 
während des Programmierens ja alle zumindest mit einem Pull-Up versehen.
Was mache ich also? Irgend einen Baustein zwischen FPGA und SDRAM? 
Separate Spannungsversorgung für den SDRAM? Wobei die Möglichkeit ja 
eigentlich auch weg fällt, da in dem Fall an den Eingängen der SDRAMS ja 
sogar Spannungan anliegen würden die außerhalb der Versorgungsspannung 
liegen. Also solange die Versorgungsspannung des SDRAMS noch nicht 
aktiviert ist.
Oder ist es nicht so kritisch und ich kann FPGA und SDRAM gleichzeitig 
mit Spannung versorgen und nach der Programmierprozedur des FPGAs normal 
die Initialisierung durchführen?
Meine Sorge ist an der Stelle halt, dass sich der SDRAM in einem 
undefiniertem Zustand befindet und mit Pech derart, dass auf den 
Datenausgängen etwas ausgibt und damit sich FPGA und SDRAM gegenseitig 
grillen.

Viele Grüße,
Christian

von Andreas K. (a-k)


Lesenswert?

Christian H. wrote:

> 1. Simultaneously apply power to VDD and VDDQ.

Das heisst, dass du dafür keine getrennten Stromversorgungen verwenden 
solltest sondern beide an die gleiche hängst. Und damit du trotzdem die 
Pins für bessere Signalqualität und passenderes Layout auseinanderhalten 
kann.

von Christian H. (cavorca)


Lesenswert?

OK.
Was ist beim Platinenlayout denn der Unterschied zwischen VDD und VDDQ? 
Muss man unterschiedliche Sachen z.B. bei Abblock-Kondensatoren 
beachten?

von Achim (Gast)


Lesenswert?

Hallo,

auf allen üblichen SDRAM-Speichermodulen wurde im Platinenlayout nicht 
zwischen VDD- und VDDQ-Netz unterschieden. Beide werden als eine 
Versorgungsspannung und auf einer Versorgungslage ans SDRAM 
herangeführt. Erst beim Package des DRAMs und Package-intern auf dem die 
werden werden beide Netze unterschieden.

Abblockkondensatoren nahe an allen Versorgungs-Pins des SDRAM empfehlen 
sich auf jeden Fall, und die sind dann sozusagen aufgrund ihrer Position 
(Nähe VDD-Pin oder Nähe VDDQ-Pin) dediziert für VDD bzw. VDDQ tätig.

Der eventuell undefinierte Zustand der Datentreiber am DRAM wurde 
tatsächlich in der Vergangenheit schon manchmal zum Problem, vor allem 
bei größeren Systemen. Denn das Problem eines definierten Power Up hast 
nicht nur du mit deinem FPGA, das haben auch PCs und Server. Dort hängen 
dann ggf. mehrere DRAMs parallel an den selben Datenleitungen und 
treiben gegeneinander. Bei den Treiberstärken von single data rate 
SDRAMs wird zwar noch nichts gegrillt, aber durch die große Menge von 
DRAM-chips im System wird die Spannungsversorgung überlastet und das 
System gar nicht erst bis zur Speicherinitialisierung.

Dieses Problem sollte bei einzelnen DRAMs an einem FPGA keine zu große 
Rolle spielen. Lass zur Not halt das DRAM ein paar Sekunden lang gegen 
die Pullups treiben, die Stromstärken dürften sich im ungefährlichen 
Rahmen halten. Wenn du ganz sicher gehen willst, dann spendiere dem CKE 
einen externen Pulldown. Er muss bis zur vollständigen Programmierung 
des FPGA die Leitung auf 0 halten, danach muss das FPGA in der Lage sein 
ihn problemlos zu übertreiben. Ein paar hundert Ohm sollten passen.

Ach ja, noch ein Punkt: auf SDR SDRAM-DIMMs hatten die Datenleitungen 
jeweils einen Längswiderstand mit drinnen (27 Ohm wenn ich mich recht 
erinnere) um eine vernünftige Signal-Integrity auf den ggf. recht 
komplexen Bustopologien zu erlauben. Ich gehe mal davon aus, dass du 
eine kurze Point-to-Point Verbindung zwischen FPGA und DRAM haben wirst, 
und dass nicht mehrere DRAMs an der selben Datenleitung betrieben 
werden, oder? Ich weiß nicht, ob du diese Verbindung auf ihr 
Signalling-Verhalten hin simulieren wirst/kannst. Aus dem Bauch raus 
würde ich vermuten, dass auch bei deiner Schaltung ein Längswiderstand 
in jeder Leitung von Vorteil sein könnte (aber ohne konkrete Simulation 
oder Messung lässt sich schwer sagen, ob er wirklich nötig ist und 
welchen Wert er haben sollte). Diese externen Widerstände würden in 
jedem Fall auch eine Begrenzung des Stroms bei undefiniertem 
Einschaltverhalten garantieren.

schöne Grüße

Achim

von Christian H. (cavorca)


Lesenswert?

Hallo Achim,

> herangeführt. Erst beim Package des DRAMs und Package-intern auf dem die
> werden werden beide Netze unterschieden.
OK

> sich auf jeden Fall, und die sind dann sozusagen aufgrund ihrer Position
> (Nähe VDD-Pin oder Nähe VDDQ-Pin) dediziert für VDD bzw. VDDQ tätig.
OK.
>


> Dieses Problem sollte bei einzelnen DRAMs an einem FPGA keine zu große
> Rolle spielen. Lass zur Not halt das DRAM ein paar Sekunden lang gegen
> die Pullups treiben, die Stromstärken dürften sich im ungefährlichen
> Rahmen halten. Wenn du ganz sicher gehen willst, dann spendiere dem CKE
> einen externen Pulldown. Er muss bis zur vollständigen Programmierung
> des FPGA die Leitung auf 0 halten, danach muss das FPGA in der Lage sein
> ihn problemlos zu übertreiben. Ein paar hundert Ohm sollten passen.
>
Warum so wenig? Ich meine selbst bei 500R fließen noch 6,6mA. Aber 
anderseits ist laut Datenblatt bei 3,3V der minimale Wert für den 
internen Pull-Up 2,4k. 1k als Pull-Down bringt da ja nicht viel. Aber 
wenn du meinst, dass das sowieso vermutlich nicht das Problem ist kann 
ich den ja mal nur als optionales Bauteil vorsehen.

> Ach ja, noch ein Punkt: auf SDR SDRAM-DIMMs hatten die Datenleitungen
> jeweils einen Längswiderstand mit drinnen (27 Ohm wenn ich mich recht
> erinnere) um eine vernünftige Signal-Integrity auf den ggf. recht
> komplexen Bustopologien zu erlauben. Ich gehe mal davon aus, dass du
> eine kurze Point-to-Point Verbindung zwischen FPGA und DRAM haben wirst,
> und dass nicht mehrere DRAMs an der selben Datenleitung betrieben
> werden, oder? Ich weiß nicht, ob du diese Verbindung auf ihr
> Signalling-Verhalten hin simulieren wirst/kannst. Aus dem Bauch raus
> würde ich vermuten, dass auch bei deiner Schaltung ein Längswiderstand
> in jeder Leitung von Vorteil sein könnte (aber ohne konkrete Simulation
> oder Messung lässt sich schwer sagen, ob er wirklich nötig ist und
> welchen Wert er haben sollte). Diese externen Widerstände würden in
> jedem Fall auch eine Begrenzung des Stroms bei undefiniertem
> Einschaltverhalten garantieren.
>
Simuliert habe ich schon mal. Das war aber noch für ein anderes Board. 
Die Terminierung machte schon so einiges aus. Damals waren die Leitungen 
(in der Simulation 20 cm lang. Ich denke ich werde aber mit deutlich 
weniger auskommen. Geplant ist auch nur einen Ram-Stein einzusetzen. 
SDRAM ist für meine Anwendung eigentlich auch schon überdimensioniert, 
aber ich wollte schon immer mal lernen wie man damit umgeht.
So oder so ist die Serienterminierung sicher eine gute Idee. Wie kommt 
man eigentilch grade auf die 27 Ohm? sind die gleich der 
Leitungsimpednaz? Ich weiß nicht wie gut ich die definieren können 
werde.
Der SDRAM soll mit 60MHz laufen. Da langsamere Typen als die für 143MHz 
kaum zu bekommen sind wollte ich so einen dafür nehmen. Im Datenblatt 
kann ich keine untere Beschränkung für doe Taktrate finden. Mal 
abgesehen von Refreh und maximaler Zeit zwischen Active und Precharge. 
Aber die Zeiten sind ja so lang, dass 60MHz noch kein Problem sein 
sollten.
Ist es überhaupt sinnvoll 143Mhz Bausteine anstelle von 166MHz zu 
verwenden? Dass es sinnvoll ist langsame Komponenten zu verwenden ist 
klar. Aber sind die Flanken hier überhaupt langsamer? Das einzige was 
ich dazu im Datasheet finden konnte sind die Transition-Times und die 
sind für alle Speedgrades gleich.
Es ist ja so, dass die langsamen ja sogar teurer sind.
Und zu der Topologie: Dank der Flexibilität der FPGAs hoffe ich die 
Leitungen vollkommen entflechtet zu bekommen. Kontrolliert habe ich das 
noch nicht, aber ich wüsste nicht warum das nicht gehen sollte.

Viele Grüße und Danke
Christian

von Achim (Gast)


Lesenswert?

Hi Christian,

die paar hundert Ohm für den externen CKE-Pulldown hätte ich ich gewählt 
um einen potentiellen Pull-Up im FGPA sicher zu übersteuern. Ich hatte 
dich so verstanden, dass dein FPGA während der Konfigurierung die 
Leitung nach oben zieht (wobei ich eher erwartet hätte, dass die IOs des 
FPGA während dieser Zeit hochohmig sind). Dimensioniere den Pulldown so 
hochohmig, dass er ausreicht, um CKE unter 1V zu ziehen. Wenn ein paar 
kOhm reichen ist's auch gut.

Die 27 Ohm auf den DIMMs entsprachen nicht der Leitungsimpedanz - die 
lag auf dem DIMM und auf dem Motherboard irgendwo um 50-60 Ohm. 
Tatsächlich dienten sie auch nicht als einfache Längsterminierung 
sondern mussten mit diversen, unterschiedlichen Schaltsituationen 
klarkommen. SDR Systeme hatten bis zu 4 Speicherslots pro Kanal (d.h. 
die Datenleitung von bis zu DIMMs waren parallel geschaltet). Wenn z.B. 
der am weitest entfernte DIMM ein Signal in Richtung Controller treiben 
soll muss sein Widerstand noch genügend Signal durchlassen. Auf den 
vorderen DIMMs, an denen das Signal vorbeiläuft, müssen die Widerstände 
das einlaufende Signal hinreichend stark dämpfen, damit die Reflektionen 
aus diesen Stubs nicht zu groß werden. Sie hätten ansonsten die 
unangenehme Eigenschaft sich wieder phasenrichtig zu überlagern und das 
Signal am Controller zu killen.

Warum es dann gerade 27 Ohm geworden sind ist schwer zu sagen. 
Wahrscheinlich haben 2 Jahre vor der Markteinführung von SDRAM Dutzende 
Simulanten von Intel, AMD, Via, ..., diversen Boardmachern und 
DRAM-Herstellern solange bei Jedec miteinander diskutiert, bis es ihnen 
zu langweilig wurde. Und dann haben sie sich auf den Mittelwert ihrer 
jeweiligen Vorschläge geeinigt. Kann natürlich auch sein, dass es aus 
physikalischen Grundgesetzen heraus unbedingt genau 27 Ohm sein müssen, 
glaube ich aber nicht.

Ich glaube kaum, dass der Speed-Sort des DRAM eine große Rolle für dich 
spielt (da du das Teil am unteren Ende seiner Speedbereichs betreiben 
willst). Er ist im wesentlichen durch DRAM interne Beschränkungen 
limitiert, die du alle nicht ausreizen willst. Langsamer sollte immer 
gehen. Ich würde an deiner Stelle den Speed nehmen, der am 
einfachsten/billigsten zu besorgen ist.

Zum Signalling: wahrscheinlich dürften auch die langsameren Speedsorts 
die gleiche Flankensteilheit haben wie die schnellen. Wenn nicht, sind 
die Unterschiede gering. Ein SDRAM über 20 cm lange Anschlüsse bei 143 
MHz hätte sportlich werden können. Wenn du wie von dir geplant die 
Leitungen nett entflechtest, auf einige cm beschränkst, mit einem 
Längswiderstand versiehst und dich auf 60MHz beschränkst, dann traue ich 
dir schon eine funktionierede Schaltung zu. Es wird zwar ggf. immer noch 
nett zu Reflektionen kommen, aber das Signal hat viele Roundtrips Zeit 
um sich einzupendeln ehe es mit der nächsten Taktflanke übernommen wird. 
Entweder aussagekräftig simulieren (liefert Micron auf der Webpage 
Treibermodelle?) oder im fertigen PCB mal mit einem Widerstandswert 
loslegen und mit einem ausreichend guten Scope nachmessen und 
optimieren. Ich hätte sowas in meiner Bastelecke zwar nicht zur 
Verfügung, aber vielleicht hast du am Arbeitsplatz/an der Hochschule 
oder wo auch immer ja mal leihweise Zugriff auf passendes Messequipment.

Ansonsten muss man halt schon sagen, dass DRAMs nicht unbedingt die 
angenehmsten Teile zum Basteln sind. Es gibt zwar nicht ein einzelnes, 
unlösbares Problem, aber man muss sicher erst durch die tausend 
Kleinigkeiten kämpfen, die's beim SRAM nicht gibt: die Initialisierung, 
den Split der Adresse in RAS/CAS/BS, die Statemachine zum Ansteuern der 
verschiedenen SDRAM-Bänke, der Refresh, .... Beim Einsatz im PC werden 
diese Problemchen natürlich durch Preis- und Dichtevorteil völlig 
überwogen. Aber beim Einsatz eines einzelnes Bausteins als Bastler sieht 
die Sache anders aus...

Aber andererseits bin ich auch der Meinung, dass man sich zwischendurch 
das Leben ruhig mal absichtlich unnötig schwer machen darf, damit man 
was dazu lernt.

viel Spaß bei deinem Projekt

Achim

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

>... ich eher erwartet hätte, dass die IOs des FPGA während
>der Konfigurierung hochohmig sind ...

Zumindest bei Xilinx lässt sich das einstellen (Bild)...

von Christian H. (cavorca)


Lesenswert?

Achim wrote:
> hochohmig, dass er ausreicht, um CKE unter 1V zu ziehen. Wenn ein paar
> kOhm reichen ist's auch gut.
>
Laut Datenblatt des Spartan 3 liegt der effektive Pull-Up Widerstand im 
Bereich 2,4k -10,8k. Hochohmig würde ich das noch nicht so richtig 
nennen, aber hohe Ströme treten da ja auch nicht grade auf.

> ...
> vorderen DIMMs, an denen das Signal vorbeiläuft, müssen die Widerstände
> das einlaufende Signal hinreichend stark dämpfen, damit die Reflektionen
> aus diesen Stubs nicht zu groß werden. Sie hätten ansonsten die
> unangenehme Eigenschaft sich wieder phasenrichtig zu überlagern und das
> Signal am Controller zu killen.
Bin ich froh, dass ich nur einen Chip verwenden will ;-)
>
> Warum es dann gerade 27 Ohm geworden sind ist schwer zu sagen.
> Wahrscheinlich haben 2 Jahre vor der Markteinführung von SDRAM Dutzende
> Simulanten von Intel, AMD, Via, ..., diversen Boardmachern und
> DRAM-Herstellern solange bei Jedec miteinander diskutiert, bis es ihnen
> zu langweilig wurde. Und dann haben sie sich auf den Mittelwert ihrer
> jeweiligen Vorschläge geeinigt. Kann natürlich auch sein, dass es aus
> physikalischen Grundgesetzen heraus unbedingt genau 27 Ohm sein müssen,
> glaube ich aber nicht.
>
Ok. Dann werde ich mal in einer Ibis Simulation ein paar Werte 
ausprobieren.

> limitiert, die du alle nicht ausreizen willst. Langsamer sollte immer
> gehen. Ich würde an deiner Stelle den Speed nehmen, der am
> einfachsten/billigsten zu besorgen ist.
Mir ging es drum, dass die ja evtl langsamere flanken haben und dadurch 
einfacher zu handhaben sind. Aber wenn dem eh nicht so ist.


> Entweder aussagekräftig simulieren (liefert Micron auf der Webpage
> Treibermodelle?) oder im fertigen PCB mal mit einem Widerstandswert
Wenn du damit ibis-Modelle meinst: ja.
> loslegen und mit einem ausreichend guten Scope nachmessen und
> optimieren. Ich hätte sowas in meiner Bastelecke zwar nicht zur
> Verfügung, aber vielleicht hast du am Arbeitsplatz/an der Hochschule
> oder wo auch immer ja mal leihweise Zugriff auf passendes Messequipment.
>
In der Uni habe ich ausreichend schnelle Oszilloskope zur Verfügung.

> Ansonsten muss man halt schon sagen, dass DRAMs nicht unbedingt die
> angenehmsten Teile zum Basteln sind. Es gibt zwar nicht ein einzelnes,
> unlösbares Problem, aber man muss sicher erst durch die tausend
> Kleinigkeiten kämpfen, die's beim SRAM nicht gibt: die Initialisierung,
> den Split der Adresse in RAS/CAS/BS, die Statemachine zum Ansteuern der
> verschiedenen SDRAM-Bänke, der Refresh, .... Beim Einsatz im PC werden
> diese Problemchen natürlich durch Preis- und Dichtevorteil völlig
> überwogen. Aber beim Einsatz eines einzelnes Bausteins als Bastler sieht
> die Sache anders aus...
Ja, wird sicher Komplizierter. Aber ich will es nicht überbewerten. 
Einzige Aufgabe ist nur viele Daten im Burst Modus reinzuschreiben und 
anschließend alles wieder auszulesen. Gewissermaßen ein riesiges Fifo. 
Daher will ich auch lieber nicht einen fertigen Controller Core nehmen 
sondern einen selber schreiben. Bei den wenigen aufgaben die zu erfüllen 
sind könnte ich mir vorstellen, dass es schwieriger ist den fertigen 
Controller anzusteuern als selber einen zu schreiben der zwar weniger 
kann, aber genau das was ich brauche. Und wenn es doch mehr Arbeit ist 
habe ich eben was dabei gelernt. Auch gut.

>
> Aber andererseits bin ich auch der Meinung, dass man sich zwischendurch
> das Leben ruhig mal absichtlich unnötig schwer machen darf, damit man
> was dazu lernt.
Ja. Ist bei mir ja auch ein Hobby. Wenn ich mir das Leben nicht schwer 
machen wollte sollte ich es lieber ganz bleiben lassen ;-)

>
> viel Spaß bei deinem Projekt
>
Danke und vielen dank für die Hilfe!



Lothar Miller wrote:
>>... ich eher erwartet hätte, dass die IOs des FPGA während
>>der Konfigurierung hochohmig sind ...
>
> Zumindest bei Xilinx lässt sich das einstellen (Bild)...

Bist du sicher, dass es da um die IOs WÄHREND der Konfiguration geht? 
Ich hätte jetzt gedacht, da stellt man ein was man mit den Pins macht, 
die das Design nicht verwendet.

Viele Grüße,
Christian

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.