Hallo,
ich habe das Cypress USB 3.0 Demo Board an einen Spartan 6
angeschlossen. Als nächstes wollte ich ein kleines FPGA Demoprogramm
schreiben. Was erst mal nur Daten in Richtung PC sendet.
Dabei stellen sich folgende Fragen. Wie viel Zwischenspeicher benötigt
man bei USB 3.0? Reicht 1 Block RAM im FPGA oder benötigt man sogar
einen externen DDR2 oder DDR3 Speicher?
Ich habe schon vor so viele Daten wie möglich (zwischen 300 und
350MByte/s) über USB 3.0 zu übertragen. Es sollen natürlich keine Daten
verloren gehen.
Ist der Datenstrom bei USB 3.0 konstant oder schwank dieser recht stark
zwischen 300 und 350MByte?
Kann ich eigentlich USB 2.0 und USB 3.0 gleichzeitig verwenden?
Johann schrieb:> Dabei stellen sich folgende Fragen. Wie viel Zwischenspeicher benötigt> man bei USB 3.0? Reicht 1 Block RAM im FPGA oder benötigt man sogar> einen externen DDR2 oder DDR3 Speicher?
Kommt ganz drauf an, wie kontinuierlich deine Datenübertragungsrate sein
muss. Das Betriebssystem macht bei USB mitunter lange Pausen, das musst
du wegpuffern können, wenn die Daten am FPGA kontinuierlich kommen. Wir
haben im Idle-Windows selbst schon 50ms und mehr Pause zwischen zwei USB
Transfers gemessen.
> Ich habe schon vor so viele Daten wie möglich (zwischen 300 und> 350MByte/s) über USB 3.0 zu übertragen. Es sollen natürlich keine Daten> verloren gehen.
Naja, da brauchst du schon mehr als 1k Puffer. Aber der FX3 hat ja recht
ordentliche Puffer integriert. Wenn du 1024 Byte Paketgröße und 16
Packets per Burst im SuperSpeed Modus einstellst und dann noch 2 DMA
Buffer, hast du schon 32kByte internen FIFO.
> Ist der Datenstrom bei USB 3.0 konstant oder schwank dieser recht stark> zwischen 300 und 350MByte?
Über 300MB/s hab ich bisher nur an einem Intel Z77 Laptop erreicht und
das auch nur mit großen Puffern und Anforderung von riesen Blöcken.
Außerdem musst du dann auf 100MHZ PCLK gehen, was extreme
Timing-Anforderungen an den FPGA stellt, denn die Zeit zwischen max.
Flag-Setup vom FX3 und minimalem Setup der Steuerleitungen beträgt dann
genau 0ns. Im FPGA hast du dann nur noch 2ns Zeit, den Datentransfer zu
stoppen, wenn der FX3 voll meldet. Bis 80MHz hab ich´s hier mit dem
AC701 Board sauber laufen.
> Kann ich eigentlich USB 2.0 und USB 3.0 gleichzeitig verwenden?
Nö, ent oder weder. Der FX3 handelt mit dem Host beim Verbinden die
Geschwindigkeit aus.
Achja, ein weiteres Problem ist die VIO am GPIF II Interface. Bei 2,5V
oder gar 3,3V produziert der FX3 intern so viel Störungen bzw. Rauschen,
dass der Quarzoszillator und damit die PLL aus dem Tritt kommt und die
SuperSpeed Verbindung abbricht. Siehe
http://www.cypress.com/?app=forum&id=167&rID=74739, nicht dass du dann
auch auf das Problem stößt.
Christian R. schrieb:> Im FPGA hast du dann nur noch 2ns Zeit, den Datentransfer zu> stoppen, wenn der FX3 voll meldet. Bis 80MHz hab ich´s hier mit dem> AC701 Board sauber laufen.
Wie soll dass funktionieren? Die Signallaufzeit durch Input und Output
ist doch eher im Bereich von > 6 ns.
Ich wuerde mit wuenschen, der Baustein meldet sich schon, wenn nur noch
x ( X>0) Plaetze im Fifo frei sind. Dann wuerde der naechste
Schreibvorgang immer nocj klappen, und man haette geneugend Zeit zur
Reaktion...
Uwe Bonnes schrieb:> Christian R. schrieb:>> Im FPGA hast du dann nur noch 2ns Zeit, den Datentransfer zu>> stoppen, wenn der FX3 voll meldet. Bis 80MHz hab ich´s hier mit dem>> AC701 Board sauber laufen.>> Wie soll dass funktionieren? Die Signallaufzeit durch Input und Output> ist doch eher im Bereich von > 6 ns.>> Ich wuerde mit wuenschen, der Baustein meldet sich schon, wenn nur noch> x ( X>0) Plaetze im Fifo frei sind. Dann wuerde der naechste> Schreibvorgang immer nocj klappen, und man haette geneugend Zeit zur> Reaktion...
Das hätte ich mir auch gewünscht, so ein "ALMOST FULL" anstatt nur
"FULL". Aber es geht auch so...
Cihan
Hat man bei USB 3.0 immer noch diese 50ms Aussetzer?
Ich dachte das ist bei USB 3.0 deutlich weniger geworden, so das man
kaum noch einen Zwischnepuffer benötigt.
Ich habe mal gelesen das Host eine Anfrage an das Device stellt (hast Du
Daten für mich) wenn keine Daten vorhanden sind, dann kannst Du sofort
Daten an mich senden wenn diese dann vorhanden sind.
Das sollte ja der große Vorteil von USB 3 sein. Es gibt ja auch eine
seperate TX und RX Leitung.
Der FX3 hat auch konfigurierbare Flags, die braucht man sowieso
zwingend, weil nämlich alle Flags eine Latenz von 2 Takten haben. Also
darf man nur kontinuierlich Schreiben, solange das Partial Full nicht
gesetzt ist. Danach nur alle paar Takte schreiben und das richtige
Full-Flag beachten. Damit klappts zuverlässig. Damit gehts dann
wahrscheinlich auch bei 100MHz. Man hat ja dann ein paar Takte Zeit, das
richtige Full Flag zu sampeln. Hab ich aber bei mir (Original Cypress
Board mit Kabel an SP605/AC701) noch nicht hinbekommen. Und unser
eigenes Board steigt immer mal aus, weil VIO an 3.3V hängt. Da muss erst
das Redesign gemacht werden. Bei Cypress gibts auch eine App-Note für
Slave FIFO mit Spartan 6 und 100MHz in Verilog, müsste man sich mal
angucken.
Edit: Die 50ms Aussetzer müsste ich mal messen. Mit 50MHz PCLK erreiche
ich an einem TI XHCI Controller an meiner Z620 hier 182MB/s IN und
155MB/s OUT.
Uwe Bonnes schrieb:> Cihan Kalayci schrieb:>> Aber es geht auch so...>> Erklär doch bitte wie das geht...>>> Danke
Das Problem war ja, das voll werden des FIFOs vom Cypress FX und
sofortige Erkennen im FPGA. In dem Moment wo das voll werden erkannt
wird, wird warscheinlich auch ein Byte ins FIFO geschoben (des FX) und
das Schreiben in den FX wird natürlich im nächsten CLK-Zyklus auch
unterbrochen. Das letzte Byte aber wird nicht aufgenommen da der FIFO
kürzlich sich voll gemeldet hatte. Deswegen habe ich immer wenn der FIFO
dann wieder bereit war, das letzte Byte erneut gesendet und erst dann
den nächsten der dran wäre. Also quasi eine Abhilfe.
Cihan
@Christian
Wenn ich einen 100MHz Takt benutze und das Interface 32Bit breit ist
(4Bytes) dann sind das maximal 400MByte pro Sekunde Bandbreite. In
Videos von Cypress wird gezeigt das angeblich 381MByte Bandbreite
möglich sind.
Das erreicht man aber nicht indem man 32Bit mit einem Takt schreibt,
dann wieder eine gewisse Anzahl an Takten nichts macht und dann prüft ob
der Cypress Fifo voll ist und dann wieder die nächsten 32 Bit schreibt.
Dadurch kann reduziere ich den Datendurchsatz ja enorm. Oder ich habe da
gerade ein Denkfehler.
Johann schrieb:> Bei welchem Fifo Füllstand wird dann das Partial Full Flag gesetzt?
Kannst du selber konfigurieren. Sehr praktische Sache. Ich verwende
übrigens den DDR2 Speicher auf dem FPGA Module um den Stream zu puffern.
Ansonsten hatte ich ständig überläufe. Ich habe Pausen von einigen (ich
glaube es waren so 3ms) gemessen.
Dieses langsame Schreiben machen ich ja auch nur wenn das Partial Full
bereits angeschlagen hat. Das kann man einstellen, ich hab es momentan
auf einem Watermark Level von 4 Words stehen, also 4 Worte bevor ganz
voll ist, geht das PF auf low. Da ist die Einbuße sehr gering.
Wenn ich es vor der Elternzeit noch schaffe, probiere ich mal noch bissl
um die 100MHz zu erreichen. Momentan stoppe ich die Steuersignale des
FX3 kombinatorisch mit den Flags, ich denke, wenn ich da nochmal alle
Flags und Daten in IFF packe, könnte das gehen. Allerdings wird dann die
Latenz-Geschichte noch verrückter, und ich weiß nicht, was der FX3
macht, wenn man den leeren FIFO weiter ausliest. Mal sehen, irgendwie
muss man ja die 100MHz schaffen, die hatten auch mal den Verilog
Quelltext von der Test-Applikation irgendwo veröffentlicht.
Auf jedenfall finde ich schön das schon einige den Chip benutzen und man
Erfahrungen austauschne kann. Wie schon gesagt ich werde dann mal über
das Board berichten.
@Christian
Wie lange nimmst Du denn Elternzeit? Ich hatte 2 Monate genommen. Ist
schon Weltuntergangsstimmung auf Arbeit? :-)
Erst mal einen Monat direkt ab der Geburt, weil es das 2. Kind ist. Nee,
bei Fraunhofer ist das recht entspannt, da geht die Welt nicht so
schnell unter. Aber ich bin schon der einzige FPGA Designer am Institut,
also geht auch nix voran dann.
Naja, ich schau mal, ob und wie man die 100MHz erreichen kann, das stört
mich schon lange. Fraglich ist dann allerdings, ob das eine
industrietaugliche Lösung wird, die unter allen Bedingungen fehlerfrei
funktioniert. Ich fürchte, das wird man mit den Timings aus dem FX3
Datenblatt schwer hinbekommen.
So, ich hab jetzt die 3 Flags und die Daten über IFF in den FPGA geholt
und damit läuft die Sache erst mal auch bei 100MHz PCLK. Allerdings
schafft mein TI xHCI in der Z620 hier dann nur 288MB/s IN und OUT ist
bei 152MB/s geblieben. Ich teste dann mal mit den Z77 Laptop.
So noch ein Update:
Z77 Laptop: 310MB/s IN und 123MB/s OUT.
Asus Board mit Renesas Controller: 308MB/s IN und 167MB/s OUT.
Hmm....seltsam. Muss mir mal die Pausen auf dem Oszi anschauen. Liegt
vielleicht auch bissl an meiner Logik, ich warte nach jedem FIFO Full
erst mal ein paar Takte, ob eventuell im OUT Buffer wieder was liegt,
weil der bei uns Vorrang haben muss. Aber 16 Takte nach einem Transfer
von 32kiByte in den FX3 machen keine 70MB/s Unterschied. Vielleicht
wieder so eine Kabel-Geschichte, das geht auch massiv ein in die
Übertragungsrate.
Wieder ein Update:
Der FX3 braucht bei mir irgendwie ziemlich lange zum Weiterschalten der
DMA-Buffer. Nachdem ich 4096 Worte reingeschrieben habe und der Buffer
voll meldet, braucht der meistens um die 12µs bis der Buffer wieder
verfügbar ist. Mit 12µs Pause und 41µs Übertragung komm ich ziemlich
genau auf die 309MB/s. Laut Cypress sollte das im AUTO_MODE allerdings
nur knapp 1µs dauern: http://www.cypress.com/?app=forum&id=167&rID=60783
Wer weiß, was das aktuelle SDK da wieder für Schwierigkeiten hat.
Mein Board ist leider noch nicht da. Auf dem Board soll ja eine
Demofirmware drauf sein diese kann ich dann ja bereitstellen. Ich weis
allerdings auch nicht ob das Board diese Woche noch kommt. Ich will den
Einkauf diesmal auch nicht nervern :-)
Hi,
I am interested in fx3 fpga code example and following URL is not
accessible currently.
http://www.nuvation.com/fx3-demo-firmware-fpga-code
Can someone who has access to the source code send it to me please?.
Thanks,
LA