Forum: FPGA, VHDL & Co. Cypress FX 3 USB 3.0


von Johann (Gast)


Lesenswert?

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?

von Christian R. (supachris)


Lesenswert?

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.

von Johann (Gast)


Lesenswert?

Ich habe diese Kit gekauft

http://www.enclustra.com/en/products/quick-start-kits/mars-pm3-usb3-kit/

Dort steht das auch über 350Mbyte pro Sekunde möglich sind. Es soll 
zudem auch der FPGA Quellcode für einen Spartan 6 beiliegen. Vielleicht 
bekomme ich diese Woche noch das Board.

von Uwe B. (Firma: TU Darmstadt) (uwebonnes)


Lesenswert?

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...

von Johann (Gast)


Lesenswert?

Genau schön wäre ein Signal bin gleich voll und ein zusätzliches Sigal 
für Overrun.

von Cihan K. (lazoboy61)


Lesenswert?

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

von Uwe B. (Firma: TU Darmstadt) (uwebonnes)


Lesenswert?

Cihan Kalayci schrieb:
> Aber es geht auch so...

Erklär doch bitte wie das geht...


Danke

von Johann (Gast)


Lesenswert?

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.

von Christian R. (supachris)


Lesenswert?

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.

von Cihan K. (lazoboy61)


Lesenswert?

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

von Johann (Gast)


Lesenswert?

@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.

von Johann (Gast)


Lesenswert?

Bei welchem Fifo Füllstand wird dann das Partial Full Flag gesetzt?

von Uwe B. (Firma: TU Darmstadt) (uwebonnes)


Lesenswert?

Johann schrieb:
> Bei welchem Fifo Füllstand wird dann das Partial Full Flag gesetzt?

Sollte das nicht im Datenblatt oder User manual stehen?

von Erik (Gast)


Lesenswert?

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.

von Christian R. (supachris)


Lesenswert?

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.

von Christian R. (supachris)


Lesenswert?

Hier gibts übrigens auch Sample Code: 
http://www.nuvation.com/fx3-demo-firmware-fpga-code

von Johann (Gast)


Lesenswert?

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? :-)

von Christian R. (supachris)


Lesenswert?

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.

von Christian R. (supachris)


Lesenswert?

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.

von Christian R. (supachris)


Lesenswert?

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.

von Christian R. (supachris)


Lesenswert?

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.

von Johann (Gast)


Lesenswert?

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 :-)

von LAiyer (Gast)


Lesenswert?

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

von Thomas R. (tinman) Benutzerseite


Lesenswert?

sure, send me PM

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.