Forum: FPGA, VHDL & Co. FPGA+SDRAM+PIC Fragen


von Michael S. (rbs_phoenix)


Lesenswert?

Hallo zusammen. Als Einarbeitung in die FPGA Welt wollte ich mir einen 
kleinen Logicanalyzer bauen (Standalone mit Bildschirm), Nach und nach, 
sodass ich dabei Vieles lernen kann (somit gehts Primär ums lernen, 
Sekundär ums Ergebnis). Ich hab mir da ein FPGA (Cyclone4, Testboard ist 
vorhanden), einen PIC24 (fürs Display und andere Dinge, z.B. Bedienung) 
und einen SDRAM ausgeguckt:
AS4C4M16S-6TCN (http://www.mouser.com/ds/2/12/64M-AS4C4M16S-7450.pdf)

Meine grobe Idee:
Ich will 16bit aufnehmen. Hierzu lese ich die 16 Eingänge ins FPGA ein, 
packe sie zu einem Wort und speicher sie ins RAM. Das passiert durch 
einen Zähler durchgehend und wenn es ans Ende vom RAM kommt, fängt es 
wieder von vorne an. Gleichzeitig prüft das FPGA auf die 
Triggerbedingung (z.B. D0-D15 = 0). Sollte diese Bedingung erkannt 
werden, so wird, je nach dem, wo der Triggerzeitpunkt sein soll, der 
Zählerendwert berechnet. Also soll der Triggerzeitpunkt am Anfang sein, 
so ist der Zählerendwert=Adresse_Trigger - 1. Soll er in der Mitte sein, 
so ist der Zählerendwert=Adresse_Trigger - (N/2) - 1. Dieser wird 
gespeichert. Wenn der Zähler an diese Adresse kommt, schreibt er das 
Wort in den RAM und bricht dann ab. Zudem gibt er an den PIC (durch eine 
Leitung) das Signal, dass die Daten gelesen werden können. Das Quittiert 
der PIC, indem er ein Rücksignal (auch eine Leitung), z.B. "Go", auf Low 
setzt. Nun kann der PIC auf den Speicher zugreifen, wie er will. Die 
Adresse, die der PIC sendet, wird um den Zählerendwert erhöht und zum 
RAM gegeben. Somit braucht der PIC nicht zu wissen, wo der 
Triggerzeitpunkt im RAM liegt, er fängt einfach bei 0 an. Er weiß, dass 
der Trigger z.B. am Anfang oder in der Mitte ist. Ist die Anzeige der 
Bits 1000 Pixel breit, so kann der PIC 1000 gleichverteilte Werte lesen. 
Bei einem Zoom von 2x, kann der PIC 1000 Werte aus z.B. der ersten 
Hälfte des RAMs lesen. Wenn eine neue Messung gestartet werden soll, 
setzt der PIC das "Go" Bit wieder auf High und das FPGA wartet wieder 
auf die Triggerbedingung.

Dazu hätte ich noch ein paar Fragen.

1. Ist für das Vorhaben ein SDRAM überhaupt die beste Wahl? Ich hab mal 
nach "normalen" SRAMs gesucht und die sind bei langsameren Zeiten und 
kleineren Speichergrößen deutlich teurer. Ich hab auch mal bei 
FlashSpeichern geguckt, aber die sind ja alle auch nur 10k bis 100k fach 
beschreibbar, was bei meiner Idee bestimmt nicht so viel ist, wie es 
klingt. Bei SDRAMs ist es aber nicht so, dass es eine maximale 
Schreib-/Leseanzahl gibt, oder?

2. Ist der Zugriff auf SDRAMs auch langsam möglich? Angegeben ist er ja 
bis 166MHz, aber was ist, wenn ich z.B. nur mit 100kHz schreiben will? 
Sollte doch eigentlich kein Problem sein!? Im Datenblatt steht auch 
"Auto Refresh and Self Refresh", was für mich bedeutet, ich muss mich 
nicht um das Aktualisieren der Daten kümmern.

3. Wie lege ich die Adresse an? Ich hatte gedacht, ich kann an A0-A11+B0 
und B1 (was ja ansich auch als A12 und A13 gesehen werden kann) die 
Adresse anlegen, lege die zu schreibenen Daten an DQn, lege WR# auf Low 
und gebe dann den clock aus. Ist das zu simpel gedacht? Ich habe noch 
nie was mit SDRAMs gemacht, habe immer gehört, dass die Ansteuerung 
nicht ganz trivial sein soll (was gegen meinen Gedanken spricht). 
Außerdem verunsichert mich die Tabelle 4 auf Seite 5. In der Zeile zum 
Schreiben: Wieso wird da von A0-A9+A11 nur A0-A7 und A10 garnicht für 
die Adresse verwendet? Ich will doch aber;)

4. Ist es ein Problem, wenn ich den Datenbus zwischen FPGA und RAM 
"anzapfe" und zum PIC führe? So kann ich dann die Adresse vom PIC zum 
FPGA schicken, er rechnet den Offset drauf und gibt die Adresse weiter 
zum RAM. Die Daten aus dem RAM kann ich dann somit direkt vom RAM lesen 
und müssen nicht noch durch das FPGA geschickt werden. Kann es Probleme 
geben, wenn der PIC viel langsamer läuft, als die Daten vom FPGA zum RAM 
geschickt werden? Ich werte sie da ja nicht aus, aber nicht, dass das 
den PIC durcheinander bringt. Außerdem habe ich gedacht, da die Eingänge 
vom PIC ja hochohmig sind, liegen die Leitungen ja quasi frei und sind 
doch somit gute Antennen. Zudem, sollte es irgendwann in die 
Geschwindigkeit gehen, dass die Leiterbahnen gleich lang sein müssen, 
macht es da für den hochfrequenten Teil Probleme?


Danke schonmal für alle (netten;) )Antworten

von Achim S. (Gast)


Lesenswert?

Du stellst dir die Sache tatsächlich zu einfach vor: die Ansteuerung von 
DRAM ist aufwändiger als die Ansteuerung von SRAM. Um z.B. auf eine 
bestimmte Speicherstelle zu schreiben, musst du erst die "x-Adresse" mit 
einem Activate-Kommando übergeben ("die Wordline aktivieren"). Einige 
Takte danach kannst du dann mit einem Write-Befehl die den y-Teil der 
Adresse übergeben und auf dem Datenbus einen vollen Burst von Daten 
liefern (oder das Data-Mask Signal richtig ansteuern). Wieder einige 
Takte später kannst du dann die x-Adresse wieder prechargen, so dass das 
DRAM wieder für einen Befehl auf einer anderen Adresse bereit ist. 
Google mal nach Tutorials zur DRAM-Ansteuerung oder schau bei Micron 
nach Einführungen zu dem Thema.

Die gute Nachricht ist: normalerweise musst du dich darum nicht kümmern, 
sondern du setzt einen Memory-Controller im FPGA ein. Der weiß, wie er 
das DRAM zu Beginn initialisieren muss, der kümmert sich um die 
Aufteilung der linearen Adresse in x-Adresse und y-Adresse (und 
Bank-adresse), der hält die notwendigen Timings fürs DRAM ein und der 
kümmert sich auch um den Refresh.

Solche Sachen wie ein paralleler Zugriff von µC und FPGA aufs 
DRAM-Interface klappen nicht. Brauchst du aber auch nicht: der µC greift 
über das FPGA aufs DRAM zu und sorgt dafür, dass das DRAM richtig 
betrieben wird.

Das Layout der Platine ist für moderne DRAM tatsächlich anspruchsvoll, 
aber bei 100MHz SDRAM ist es noch einigermaßen harmlos: wenn die 
Leitungen über einer Versorgungslage geroutet sind, nicht unnötig lang 
sind, nur von einem Pin zum anderen Pin gehen (keine Verzweigungen) und 
keine zu wilden Kopplungen untereinander haben, dann sollte das klappen.

von Michael S. (rbs_phoenix)


Lesenswert?

Wäre ja auch zu schön gewesen. Würdest du mir dann ein SRAM empfehlen 
oder eher DRAM mit der Steuerung via FPGA? Ich weiß ja nicht, was ich 
bei einem 166MHz DRAM dann als Speicherrate übrig habe, wenn man immer 
so umständlich drauf zugreifen muss.


Achim S. schrieb:
> Solche Sachen wie ein paralleler Zugriff von µC und FPGA aufs
> DRAM-Interface klappen nicht. Brauchst du aber auch nicht: der µC greift
> über das FPGA aufs DRAM zu und sorgt dafür, dass das DRAM richtig
> betrieben wird.

Hab ich zuerst auch gedacht, nur war mein 2ter Gedanke, dass ich 16 Pins 
vom FPGA sparen kann (würde gerne ein gut lötbares Gehäuse, sprich xPFQ 
haben). Aber dann ist es eben nicht so.

von Achim S. (Gast)


Lesenswert?

Michael Skropski schrieb:
> Würdest du mir dann ein SRAM empfehlen
> oder eher DRAM mit der Steuerung via FPGA? Ich weiß ja nicht, was ich
> bei einem 166MHz DRAM dann als Speicherrate übrig habe, wenn man immer
> so umständlich drauf zugreifen muss.

Die Komplexität sollte dir der Memory-Controller im FPGA abnehmen. Als 
Bandbreite für kontinuierliches Schreiben oder kontinuierliches Lesen 
bekommst du mit einem halbwegs vernünftigen Memory-Controller annähernd 
die 166MHz*2Byte=333MByte/s (in der Realität vielleicht ca. 280MByte/s). 
Und bei einer Logic-Analyzer Anwendung würde ich solche kontinuierliche 
Schreibzugriffe auf aufeinanderfolgende Adressen erwarten.

Die Bandbreite geht dann gehörig in den Keller, wenn du Schreib- und 
Lesezugriffe mischst und immer nur einzelne Bytes auf nicht 
aufeinanderfolgenden Adressen transferierst. Dann kann der 
Memory-Controller keine Bursts nutzen und muss für jeden Zugriff 
Prechargen und neu Aktivieren, und im schlimmsten Fall geht die 
Speicherbandbreite vielleicht auf 1Byte/120ns=8MByte/s herunter.

Ich würde dir raten erst mal zu schauen, welcher Memory-Controller für 
dein FPGA angeboten wird und wie du mit dessen Nutzung und seinen 
Application Notes klarkommst. Wenn das halbwegs läuft spricht kaum etwas 
gegen die Nutzung von SDRAM.

SRAM hätte als Vorteil kürzere Latenzen, aber für deine Logic-Analyzer 
Anwendung sollten die Latenzen keine Rolle spielen.

Anstelle von single data rate SDRAM könntest du auch etwas modernere 
DRAMs einsetzen (double data rate 1 oder double data rate 2 oder ....). 
Wenn der Memory-Controller das ebenfalls unterstützt hast du aktuelle 
Speicherchips (single data rate wird seit Jahren nicht mehr für einen 
Massenmarkt produziert), eine höhere Bandbreite und Speicherdichte. Mit 
der zunehmenden Datenrate auf dem Bus wird lediglich das Layout der 
Platine wieder kritischer.

von Strubi (Gast)


Lesenswert?

Moin,
auch wenn's etwas mehr kostet: Ich würde auch mal erst SRAM nehmen und 
klein anfangen. Mit SDRAM oder gar DDRAM hat man - auch mit hart 
eingebauten Controllern wie auf dem Spartan6 - beliebig viel 'Spass', 
mal vom Layouten abgesehen. Du könntest natürlich gleich ein fertiges 
FPGA-Core-Modul nehmen.

Anderer Ansatz: Gleich ein DMA-fähiges uC-Board nehmen, FPGA huckepack 
aufpropfen, eine sinnvolle Datenkompression implementieren und die Daten 
per DMA ins Memory des uC-Systems streamen. Nach und nach kann man dann 
alles ins FPGA verschieben. Damit hat man eher Spass, weil man vom uC 
aus immer eine einigermassen gut funktionierende Referenz hat, gegen die 
man vergleichen kann. Apropos: die günstig hackbaren Rigol-Oszis mit LA 
machen das im Prinzip auch so.

Grüsse,

- Strubi

von Fpgakuechle K. (Gast)


Lesenswert?

Michael Skropski schrieb:
> Hallo zusammen. Als Einarbeitung in die FPGA Welt wollte ich mir einen
> kleinen Logicanalyzer bauen (Standalone mit Bildschirm), Nach und nach,
> sodass ich dabei Vieles lernen kann (somit gehts Primär ums lernen,
> Sekundär ums Ergebnis). Ich hab mir da ein FPGA (Cyclone4, Testboard ist
> vorhanden),

Machs für erste ohne externen RAM, nur mit dem FPGA-internen. Das hat 
zwar nicht die Speichertiefe ist aber ein guter Einstieg in die 
FPGA-Problematik.
Siehe bspw. hier: http://www.mikrocontroller.net/articles/Durchblicker

Anderes Projekt,  ist der bithound
http://www.bastli.ethz.ch/index.php?page=BitHoundEn
dafür wird aber ein extraboard an ein "Standard FPGA-kit geklemmt und 
externe RAM als Sample-speicher benutzt.

MfG,

von ... (Gast)


Lesenswert?

Von unseren chinesischen Freunden gibt es recht preisguenstige Boards
mit einem Cyclone4 EP4CE6 oder EP4CE10 und 16 oder 32 MB SDRAM onboard.

Dazu gibt es passende Module in Quartus2 die das auch recht einfach
zugreifbar machen.

Das Auslesen der Daten per Altera-JTAG ist da schon komplizierter.

Viel Spass dabei.

von Michael S. (rbs_phoenix)


Lesenswert?

Achim S. schrieb:
> Anstelle von single data rate SDRAM könntest du auch etwas modernere
> DRAMs einsetzen (double data rate 1 oder double data rate 2 oder ....).
> Wenn der Memory-Controller das ebenfalls unterstützt hast du aktuelle
> Speicherchips (single data rate wird seit Jahren nicht mehr für einen
> Massenmarkt produziert), eine höhere Bandbreite und Speicherdichte. Mit
> der zunehmenden Datenrate auf dem Bus wird lediglich das Layout der
> Platine wieder kritischer.

Ich habe das hier gefunden :
http://www.altera.com/products/ip/iup/memory/m-alt-ddr2_sdram.html

Zudem noch ein 16Mx16bit SDRAM DDR mit 200MHz. Sollte als Kompromiss in 
Technikstand (nicht so alt wie single data rate, aber nicht so neu wie 
DDR3) und Designaufwand (kritischer als bei 166MHz, aber nicht so 
kritisch wie 1000MHz+ bei DDR3).


Strubi schrieb:
> Anderer Ansatz: Gleich ein DMA-fähiges uC-Board nehmen, FPGA huckepack
> aufpropfen, eine sinnvolle Datenkompression implementieren und die Daten
> per DMA ins Memory des uC-Systems streamen.

Klingt auch nicht schlecht, muss ich mich mal informieren.


... schrieb:
> Von unseren chinesischen Freunden gibt es recht preisguenstige
> Boards
> mit einem Cyclone4 EP4CE6 oder EP4CE10 und 16 oder 32 MB SDRAM onboard.
>
> Dazu gibt es passende Module in Quartus2 die das auch recht einfach
> zugreifbar machen.

Habe ich sogar:
Beitrag "Re: was haltet ihr von diesem Board?"

Ich werde damit rumspielen und gucken, ob ich soeinen RAM-Controller 
implementieren kann. Damit werde ich manches testen können, bevor es an 
ein eigenes Board geht. Ist zwar "nur" single data rate, aber zum testen 
und üben sollte es reichen.

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.