Forum: FPGA, VHDL & Co. High Speed Capturing (10MByte/sec)


von Günter (. (dl4mea)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe jetzt eine Problemstellung, die es erfordert, daß ich zu 
Debugging-Zwecken aus meinem FPGA mit ca. 10MByte/sec Daten an den PC 
sende. Die Daten brauche ich hernach als Binärfile auf dem PC. Ein 
kurzer Snapshot, 1sec ist nötig, 5sec wären schon top. Dauerbetrieb 
nicht nötig.

Leider steht mir kein kommerzielles Equipment zur Verfügung, so daß ich 
derzeit über eine eigene Lösung nachdenke.

Das ganze hat sich jetzt allerdings als mehr Aufwand herausgestellt als 
ich dachte, und deshalb habe ich beschlossen, es hier einmal 
vorzustellen. Entweder zeigt mir jemand eine bereits existierende 
Lösung, oder es lohnt sich auch für andere, weil es dort auch benötigt 
werden würde.

Ob ein USB-LA das vielleicht könnte? Frage an die Allgemeinheit! Da habe 
ich irgendwelche Bedenken daß synchrones Samplen und Binäroutput dann 
irgendwelche Low-Cost-Lösungen eventuell überfordern.

Ich habe als Interface zum PC USB2.0 High Speed beschlossen, und auf 
PC-Seite soll eine CDC-Device einen COM-Port aufbauen. Damit erübrigt 
sich dort die Programmierung von properitärer Software, ein kleines 
DOS-Programm kann die Daten aufzeichnen.
Das ganze in der Hoffnung daß der PC-seitige Treiber die 10MByte auch 
verarbeiten kann.

Nun gibt es zwei Devices: Zum einen Cypress FX2LP, zum anderen FTDI 
FT2232HL.

Über den Cypress FX2 findet man viel Information im Netz, aber eine 
Schritt-für-Schritt-Anleitung ist nirgends dabei. Ich habe hier ein 
Eval-Board und mir ist es noch nicht einmal gelungen ein Programm ins 
EEPROM zu schreiben. Zudem die Applikation für das Problem zu entwickeln 
auch nicht gerade einfach ist. Liest man hier im Forum auch so zwischen 
den Zeilen... Oder irre ich mich gewaltig und jemand hat das gemacht?

Also bin ich auf den FT2232 gegangen, und dieser hat ein sogenanntes 
"Asynchronous FIFO", 8 Bit parallel plus Write-Strobe. Für diesen Chip 
bin ich gerade dabei eine kleine Leiterplatte zu machen, 8 davon würden 
auf eine Eurokarte passen, es wäre also ein wirklich kleines, billiges 
Board. Außerdem hoffe ich daß der FTDI-Treiber, wenn die schon wissen 
daß ihr Device für USB2.0 High Speed gebaut ist das dann auch wenigstens 
zu 25% verarbeiten kann.

Frage ans Forum: Was haltet ihr davon? Erfinde ich das Rad ein zweites 
Mal oder soll ich das zuende bringen? Wenn letzteres, gibt es 
irgendwelche Ideen für Verbesserungen?

Danke, Günter

von Purzel H. (hacky)


Lesenswert?

Ich wuerd den Puffer im FPGA haben wollen, und die Daten nachher ueber 
den normalen Weg abzuegeln.

von ... (Gast)


Lesenswert?

Um Daten aus einem FPGA zu bekommen erschiene mir Ethernet irgendwie 
sinvoller als USB.  Wenn die SW auf dem PC gut geschrieben ist kannst du 
locker Gbit Ehternet in echzeit speichern (Wir machen zusätzlich noch 
komplexe Bildverarbeitung) 10MBit sollten keine Probleme machen...

von Anonymous (Gast)


Lesenswert?

10 MBit/s an den PC? Über USB?

Und 50 MBit (5s) im FPGA speichern?

Was ist das für ein FPGÀ?

von Günter (. (dl4mea)


Lesenswert?

Hallo,

also zum einen: Im FPGA soll das möglichst wenig Aufwand sein. So simpel 
wie 8 Bit anlegen und einen Strobe ausgeben. Gleich Ethernet einbauen 
oder sowas, das ist viel zuviel Aufwand.

Darunter fällt auch Zwischenspeichern. Das vorhandene serielle Interface 
hätte max. 2MBit/sec, gegenüber 10MByte/sec ist das ein Faktor 40, also 
wie speichere ich in einem etwas kleinen FPGA 10MByte Daten zwischen, 
ohne externes RAM?

FPGA ist ein kleines Altera Cyclone oder Cyclone II.

Ciao, Günter

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


Lesenswert?

Günter (dl4mea) schrieb:
> also wie speichere ich in einem etwas kleinen FPGA 10MByte Daten
> zwischen, ohne externes RAM?
Kein Chance. Ein FPGA mit soviel internem Speicher gibts nicht... :-(
Nicht mal das aktuelle Flaggschiff von Xilinx (Virtex 6) kommt mit 38 
MBit an deinen Wunsch heran: 
http://www.xilinx.com/products/virtex6/lxt.htm
Und klein ist der dann garantiert nicht mehr...

Und falls du doch eines findest, dann poste das hier mal, ich suche 
sowas auch... ;-)

von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

Daten über eine Ethernetverbindung zu jagen ist nicht schwer. Was den 
Aufwand macht, sind die IP Pakete zu bauen und das Timing, wenn mehrere 
Teilnehmer senden wollen. Für deine Anwendung kannst du eine Spezialfall 
bauen. Wenn du nur eine Ethernetverbindung mit nur zwei Teilnehmern 
baust, dein PC und auf der anderen Seite der FPGA. Die Daten ohne 
Ethernetframe versenden, dann kannst du sicherstellen wer zur welchen 
Zeit sendet. Auf der PC-Seite musst du auch ein Programm schreiben, die 
vorgefertigen Sockets gibt es auch nicht. Es ist keine 
Ethernetverbindung mehr. Das ist nur physikalisch die Ethernetverbindung 
mit eigenem Protokoll. Dann könnte es mit viel Ideenreichtum gehen. Doch 
mit der Datenmenge muss auch dein PC klar kommen.

Du willst 10Myte/s das sind 80Mbit/s. Dazu kommt noch ein Overhead durch 
das Synchronisationsmuster und das Coding. Kurz gesagt 100Mbit Ethernet 
reicht nicht aus.

Da brauchst du 1Gbit Ethernet.

von Christian R. (supachris)


Lesenswert?

Mit dem Cypress FX2 im Slave FIFO Modus und einem kleinen FIFO im FPGA 
erreichst du locker konstante 10MB/s. Kannst auch einen isochronen 
Endpoint einbauen, da bekommst du vom Host eine konstante Bandbreite von 
max. 24MB/s zugesichert. Wäre sicherlich sinnvoll bei dir.

von Günter (. (dl4mea)


Lesenswert?

Christian R. schrieb:
> Mit dem Cypress FX2 im Slave FIFO Modus und einem kleinen FIFO im FPGA
> erreichst du locker konstante 10MB/s. Kannst auch einen isochronen
> Endpoint einbauen, da bekommst du vom Host eine konstante Bandbreite von
> max. 24MB/s zugesichert. Wäre sicherlich sinnvoll bei dir.

Hallo Christian,

ja, das das habe ich oben auch als Möglichkeit erwähnt. Genau so dachte 
ich mir die Lösung mit dem FX2. Nur die Frage: Gibt es das bereits 
irgendwo beschrieben? Es sagt sich nämlich leicht, aber wenn ich mich 
dahin jetzt einarbeite, dann wird das ein eigenes Projekt und nicht nur 
ein Debugging-Tool...

Ciao, Günter

von hallo (Gast)


Lesenswert?

René D. schrieb:
> Was den
> Aufwand macht, sind die IP Pakete zu bauen und das Timing

Warum soll es denn jetzt gleich IP sein? Wenn ein Ethernet Interface da 
ist kann man einfach diese aussenden und mit wireshark alle Pakete 
aufzeichnen. Da gehen locker 10Mbyte/s.

von Günter (. (dl4mea)


Lesenswert?

Hallo,

nun, prinzipiell wäre Ethernet und Capturing mit Wireshark denkbar, die 
Daten kann man aus dem Trace dann mit erträglichem Aufwand extrahieren. 
Ok, also.

Nur, was brauch ich auf der FPGA-Seite dazu? Das einzige, das ich dazu 
bislang kenne, ist das hier:
http://www.fpga4fun.com/10BASE-T2.html

Einen PHY anzuschließen würde ich mir auch noch zutrauen ;-) und wäre 
vom Aufwand her durchaus machbar.

Ciao, Günter

von Christian R. (supachris)


Lesenswert?

Günter (dl4mea) schrieb:

> ja, das das habe ich oben auch als Möglichkeit erwähnt. Genau so dachte
> ich mir die Lösung mit dem FX2. Nur die Frage: Gibt es das bereits
> irgendwo beschrieben? Es sagt sich nämlich leicht, aber wenn ich mich
> dahin jetzt einarbeite, dann wird das ein eigenes Projekt und nicht nur
> ein Debugging-Tool...

Naja, beim Entwicklungspaket sind einige Beispiel-Firmware Sachen dabei. 
Ansonsten gibts noch so ein FX2 Board von Brain Technology, die haben 
auch eine Firmware, gleich so benutzbar. Allerdings nicht mit CDC, wie 
du oben schriebst. Muss man schon die DLL einbinden. Einarbeiten musst 
du dich immer, egal ob USB, Ethernet oder sonstwas.
Am einfachsten dürfte die Sache noch mit dem neuen FT2232H sein, der 
kann die Datenrate locker und benötigt keine Firmware-Programmierung.

von Günter (. (dl4mea)


Lesenswert?

Christian R. schrieb:
> Am einfachsten dürfte die Sache noch mit dem neuen FT2232H sein, der
> kann die Datenrate locker und benötigt keine Firmware-Programmierung.

Danke. Also doch das, was ich oben bereits als Platine vorstelle?

Ciao, Günter

von Digi Thal (Gast)


Lesenswert?

Günter (dl4mea) schrieb:
> Christian R. schrieb:
>> Am einfachsten dürfte die Sache noch mit dem neuen FT2232H sein, der
>> kann die Datenrate locker und benötigt keine Firmware-Programmierung.
>
> Danke. Also doch das, was ich oben bereits als Platine vorstelle?

Gibt es auch fertig als "FT2232H Mini Module". Damit sollten bis zu 
41MB/s drin sein.

von Günter (. (dl4mea)


Lesenswert?

Digi Thal schrieb:
> Gibt es auch fertig als "FT2232H Mini Module". Damit sollten bis zu
> 41MB/s drin sein.

D A N K E !!!

Das wars, auf was ich gewartet habe...

Danke nochmal, die Diskussion hier hat sich gelohnt! Sobalds läuft werde 
ich es mal ergänzen.

Ciao, Günter

von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

hallo schrieb:
> René D. schrieb:
>> Was den
>> Aufwand macht, sind die IP Pakete zu bauen und das Timing
>
> Warum soll es denn jetzt gleich IP sein? Wenn ein Ethernet Interface da
> ist kann man einfach diese aussenden und mit wireshark alle Pakete
> aufzeichnen. Da gehen locker 10Mbyte/s.


Genauso meine ich es.

Ich hatte da auch schon meine Vorstellung das Ethernet als Debbug tool 
zu nutzen.



Dazu noch ein Programm zum Steuern für den PC. Das wäre  so etwas wie 
Chipscope.

Ethernet pur ist einfach. Phy intialisieren. Die Phy ist dafür sehr 
schlau.

Dann Synchronisationsstring+ Daten auf den Bus  paketweise legen.

von Johann (Gast)


Lesenswert?

Ich habe mir auch das Mini-Modul von Farnell gekauft (kostet ca. 28,30€)

http://de.farnell.com/ftdi/ft2232hq-mini-module/modul-usb-2-port-ft2232h-basiert/dp/1697465

Dies habe ich an den PC angeschlossen um erst einmal zu testen ob ich 
die Softwareseite am PC in den Griff bekomme. Hierzu habe ich den 
Sendeleitung vom FTDI-Chip (WR#) auf GND gezogen.

Anschließend habe ich den FFT2232H mit dem FTDI-Tool auf sync FIFO Modus 
umgestellt (dadurch erreiche ich eine konstante TRansferrate von 
41MByte) Bitte die PDFs durchlesen dort steht beschrieben welche 
Funktionen man benutzen muss, damit der FT2232H im sync FIFO MOdus 
läuft.

Anschließend habe ich meine eigene Platine mit einem Spartan 3A400 
erstellt. Mit meiner eigenen Platine konnte ich die Datentransferrate 
sogar auf 45MByte pro Sekunde erhöhen (ic denke dies liegt am besseren 
Routen der Datenleitung).

Ich habe auch schon bereits 2 Themen dazu im µC und FPGA Forum 
veröffentlicht, wo ich meine Erfahrungen mit diesem Chip gepostet habe.

Ich den Spartan 6 XC6SLX25 benutzen. Dieser besitzt 936MBit BlockRam. 
Damit kann man schon eine ganze menge überbrücken. und ist zudem noch 
sehr bezahlbar.

von Johann (Gast)


Lesenswert?

Blos nicht anfangen den TCP/IP Stack im FPGA selber zu implementieren. 
Ich gibt ICs wie den W5300 von WIZnet die alles für Dich erledigen. (Ist 
wie der FTDI-USB-Chip)

Der W5300 enthält einen Hardwired TCP/IP Stack so das man die Daten nur 
noch wie in einen FIFO schreiben muss.

von Bingo (Gast)


Lesenswert?

Hier steht auch etvas

http://www.actel.com/documents/A2F_AC356_AN.pdf

mfg
Bingo Dänemark

von Edding400 (Gast)


Lesenswert?

Ich finde die Idee mit dem FT2232 sehr gut!

Ihr habt irgendwie vergessen, dass das Live-Capturen der Daten nur für's 
Debugging ist. Wieso sollte man dann den FPGA rausrippen und ein 
Ultra-Dings für 2k$ einbauen, damit man 50MBit Daten im FPGA 
zwischenspeichern kann.

Wieso sollte man einen kompletten TCP/IP-Stack einbauen?

Ihr seid doch verrückt ;-)

Seine vorgeschlagene Lösung ist schon das Beste, was einem hierzu 
einfallen kann.

Schnell und einfach umzusetzen.

Die FX mag ich persönlich garnicht, weil man dann wieder einen weiteren 
µC (8051er) zum Programmieren hat, der Rotz schon ausgestorben ist und 
die Tools total verbuggt. Ich hab z.B. den FX-USB-Programmer nie zum 
Laufen bekommen ...

Grüße,
Edding400

von Günter (. (dl4mea)


Lesenswert?

Hallo,

so, meine zwei Module habe ich bekommen, und ich will jetzt mit dem 
FT_prog den FIFO-Mode einschalten.

Was mich aber jetzt wundert, und vielleicht weiß hier jemand die 
Antwort: Ich sehe im FT_prog (Version 1.10) nur einen generellen 
245-FIFO-Mode, nicht aber die Unterscheidung zw. synchron und asynchron, 
und ich sehe beispielsweise auch die SPI, JTAG und I2C-Modis dort nicht 
aufgeführt, von denen das Datenblatt spricht.

Kann das jemand beantworten?

(Sollte es woanders schon erwähnt sein, dann reich ja auch ein Link, 
dann hat es wenigstens den Sinn daß das hier ein vollständiger Artikel 
wird)

Danke, Günter

von Johann (Gast)


Lesenswert?

Ja man schaltet dort nur in den FIFO MODE um.

Es gibt die Application Node AN_130

http://www.ftdichip.com/Support/Documents/AppNotes/AN_130_FT2232H_Used_In_FT245%20Synchronous%20FIFO%20Mode.pdf

Hier steht genau beschrieben was man alles machen muss. Du must ein 
kleines Programm schreiben, das den syn. FIFO Mode aktiviert.

Wenn Du in den sync. FIFO Mode geschaltet hast, kann kann man den 
CLK_OUTPUT vom FTDI-Chip überprüfen. Hier muss ein CLK von 60MHz 
herauskommen. Dann hast Du es erfolgreich geschaft

von Günter (. (dl4mea)


Lesenswert?

Hallo Johann,

ich hatte es befürchtet... Es läuft ja schon, zumindest mit 
asynchron-seriellem Interface ausgangsseitig. Tiny-C ist wirklich gut.

Dieses Dokument sollte man auch erwähnen:

AN2232-02 Bit Mode Functions for the FT2232
http://www.ftdichip.com/Support/Documents/AppNotes/AN2232C-02_FT2232CBitMode.pdf

Ciao und danke, Günter

von Johann (Gast)


Lesenswert?

Ich arbeite mit Labview. Dort habe ich innerhalb von einer halben ein 
kleines Programm geschrieben, mit dem ich dann ich den sync. FIFO Modus 
umgeschaltet habe. Zudem kann ich mit diesem Programm die Daten 
empfangen und darstellen.

von Backe back Kuchen (Gast)


Lesenswert?

Hallo,

heute morgen habe ich es mit 10MByte/sec zum Laufen gebracht. Eigentlich 
ist es einfach, aber um die Daten zusammensuchen und alle Quellen 
auszuwerten war dieser Thread und die Hilfe hier im Forum sehr gut.

Beschreibung folgt.

Ciao, Günter

von Günter (. (dl4mea)


Angehängte Dateien:

Lesenswert?

Hallo,

ich hatte zugesagt meine Lösung zu präsentieren:

Anbei drei Bilder:
- das FT2232 Mini Module, mit Fädeldrähten ans FPGA angeschlossen (der 
dicke, grüne und ein Fädeldraht sind GND)
- ein Screenshot des DOS-Tools "sshot_fifo", bei der Aufnahme von 1Mio 
Samples
- ein Screenshot von Cooledit96, welches rohe Binärdateien als Waveform 
darstellen kann (*1)

Als Dokumente habe ich verwendet:
(1) FT2232H Datenblatt
http://www.ftdichip.com/Products/ICs/FT2232H.htm
(2) FT2232H Mini Module Datenblatt
http://www.ftdichip.com/Support/Documents/DataSheets/Modules/DS_FT2232H_Mini_Module.pdf
(3) FTDI Application Note AN_130 "FT2232H Used In An FT245 Style 
Synchrounous FIFO Mode"
http://www.ftdichip.com/Support/Documents/AppNotes/AN_130_FT2232H_Used_In_FT245%20Synchronous%20FIFO%20Mode.pdf
(4) Software Application Development D2XX Programmer's Guide
http://www.ftdichip.com/Support/Documents/ProgramGuides/D2XX_Programmer%27s_Guide%28FT_000071%29.pdf

Softwareseitig verwende ich so ziemlich genau das Beispiel 4.1 aus (3), 
welches ich aber um eine Suche nach der richigen Device ID ergänzt habe.

Ich verwende den "Asynchronous FIFO Mode", weil dieser nur 8 
Datensignale plus einen Strobe verlangt, und mir geschwindigkeitsmäßig 
ausreicht. Dieser ist in (1) Kapitel 4.5 beschrieben. Die Daten werden 
angelegt, und 20ns später das WR#-Signal für 40ns auf '0' geschaltet. 
Das reicht. Also gerade mal 9 Verbindungen plus GND. Pullups oder 
sonstiges habe ich nicht verwendet.

Den oft erwähnten 60MHz-Takt am Taktausgang CLKOUT habe ich gesehen, 
aber offenbar verschwindet er sobald der FT2232H in den asynchronous 
Modus schaltet. Mir ist auch jetzt noch nicht klar wie dieser zwischen 
asynchronous und synchronous unterscheidet, denn es gibt nur einen 
Mode=0x40 zum Einstellen des FIFO-Mode. Es sei denn der asynchronous ist 
eigentlich ein synchronous, der nur den Takt ignoriert.

Ich habe für TinyC ein kleines Tool geschrieben, welches den gewünschten 
FT2232 sucht, dann die entsprechende Datenmenge empfängt und in ein File 
schreibt. Wenn mir jemand sagt wie ich das hier auf mikrocontroller.net 
hochladen kann, dann gerne.

Die Daten stammen von einem mit 10MSamples laufenden AD-Wandler. 
Weiterführende Informationen entweder hier
http://www.mikrocontroller.net/articles/1090_MHz-ADS-B-Receiver
oder auf meiner Webseite
http://www.qsl.net/dl4mea/fpgaadsb/fpgaadsb.htm

Somit also danke an alle, die hier mitdisuktiert haben, für die 
entstandenen Kosten (ca. EUR 35,- für das Modul) ist hier eine wirklich 
professionell brauchbare Lösung entstanden. Mögen andere damit auch noch 
Freude haben!

Ciao, Günter (dl4mea)

(*1): Bitte die Überschwinger ignorieren, die kommen von Cooledit, 
wirklich im Signal enthalten sind die als Punkte dargestellten Samples

von Johann (Gast)


Lesenswert?

Im async Modus soll man so 10MByte pro Sekunde übertragen können. Im 
Sync. FIFO MOde sind dann so 41 bis 45MByte möglich.

Im sync. FIFO Mode werden auch nur 8 Datenleitungen plus dem 60MHz 
Clock, den der FT2232 zur Verfügung stellt verwendet. Zusätzlich kommt 
noch die WR# RD# OE# Leitung hinzu. Die sind notwendig damit man auf den 
Bus lesen oder schreiben kann und den Bus zwischen lesen und schreiben 
umschalten kann.

Jedoch muss man sagen das mit Hilfe des FT2232 in wenigen Studen in 
funktionierende High Speed Lösung erarbeitet werden kann und das ist 
durchaus erfreulich.

von Christian R. (supachris)


Lesenswert?

Johann: Da du dich ja offenbar mit dem FT2232H beschäftigt hast: Kann 
man im Sync FIFO Modus auch das SIWU benutzen und dem Treiber sagen, er 
soll solage warten, bis der FPGA das Paket mit dem Signal abschließt? Im 
Datenblatt steht nur, dass das vor Ablauf des Latency Timers gestzt 
werden kann. Die Frage ist, ob man den Latency Timer auch auf unendlich 
setzen kann, dass der Transfer solange wartet, bis der FPGA alle Daten 
reingekleckert und mit SIWU abgeschlossen hat? Hast du in der Richtung 
mal was probiert?

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.