Forum: FPGA, VHDL & Co. USB 2.0 High Speed (480Mbits/s) IP Core für FPGA


von User (Gast)


Lesenswert?

Hallo,

habe mal eine Frage.

Suche eine Möglichkeit mit so wenig wie möglich Hardwareaufwand (!) eine 
High Speed Schnittstelle vom PC zum FPGA Design zu implementieren.

Was ich schonmal fertig entwickelt hatte ist eine UM232H von FTDI in 
High Speed Mode zu implementieren. Erreicht hatte ich damals eine max. 
Speed von ca. 45MBytes/s. Brauche aber min. 16 Pins um das an meinem 
FPGA ranzubekommen.

Da ich nun nicht viele Pins übrig habe stellte ich mir die Frage ob es 
nicht möglich ist sich direkt mit einer USB-Schnittstelle am PC zu 
verbinden. Eine 5V to 3V3 Wandlung wird natürlich nötig sein. Aber die 
IP im FPGA muss sich halt als USB Interface ausgeben.

Frage ist, gibt es sowas schon fertig als IP-Core. Kostenlos oder auch 
gegen Aufpreis.

LG

von Gumbel (Gast)


Lesenswert?

Bei opencores könnts was geben.. Wandeln von 5 V hört sich nicht gut an, 
du müsstest direkt an die differenziellen Pins von deinem FPGA 
drangehen.

von User (Gast)


Lesenswert?

ja da findet sich was :-)

was ich noch nicht ganz verstehe.

Wenn ich jetzt so eine USB 2.0 IP Core habe, angebunden über einen 
differenziellen Eingang, verbunden am PC erkennt der PC mich dann als 
USB High Speed? Welche DLLs werden verwendet oder wie binde ich dann das 
ganze in meine Software ein?

Bei FTDI Chips hat man entsprechende DLL welches man in die software 
"wrappen" kann. Wie macht man sowas wenn man eine IP Core hätte.

von Dr. Sommer (Gast)


Lesenswert?

User schrieb:
> erkennt der PC mich dann als
> USB High Speed?

Der PC erkennt überhaupt nur etwas, wenn der Pullup an D+ dran ist. Dann 
spricht er das Device per Full Speed an, fragt die Deskriptoren ab, 
stellt fest dass das Gerät High Speed kann, und schaltet es mit den 
entsprechenden Befehlen um.

User schrieb:
> Welche DLLs werden verwendet oder wie binde ich dann das
> ganze in meine Software ein?
Es wird die VID/PID und Geräte-Klasse abgefragt und der entsprechende 
Treiber geladen, bzw. der User aufgefordert einen Treiber zu 
installieren. Du musst also einen Treiber programmieren. Alternativ 
kannst du eine Standardklasse wie USB-CDC implementieren und den PC den 
Standard-Treiber laden lassen, z.B. usbser.sys. Um auf diesen aus der 
Anwendung zuzugreifen benutzt du dann die normalen Win32-API DLL's für 
Serial-Port Zugriff. Wenn du einen eigenen Treiber baust, musst du 
eigene DLL's entwickeln bzw. aus der Anwendung anders auf den Treiber 
zugreifen. Du kannst auch den winusb.sys Treiber laden lassen, dann 
kannst du über das WinUSB API oder libusb zugreifen; dadurch entfällt 
die Treiber-Entwicklung und -Signatur (ab Win 10).

FPGA USB Cores arbeiten doch bestimmt auch mit einer CPU oder? USB 
komplett in Logik zu implementieren stelle ich mir extrem aufwendig vor.

von User (Gast)


Lesenswert?

@Dr. Sommer
Dass das ganze Aufwendig wird ist mir schon klar. Doch ich suche eine 
Lösung ohne Aufwand gegen Aufpreis (weiss nicht wieviel sowas kosten 
würde).

Im Klartext nochmal:
- Eine IP Core der alles zum USB 2.0 enthält, wo die Daten quasi nur 
noch über FIFOs gelesen und geschrieben werden können
- Software mit Treiber oder DLL sollte mit Beispielcode vorhanden sein.
- Damit will ich dann mit wenig Aufwand das ganze bei mir im FPGA und in 
meiner Testsoftware (C oder Delphi)implementieren

Oder ich muss halt auf meine Lösung mit dem UM232H Board zurückgreifen 
und Pins dafür freischaufeln :-)

von Dr. Sommer (Gast)


Lesenswert?

User schrieb:
> Doch ich suche eine
> Lösung ohne Aufwand gegen Aufpreis (weiss nicht wieviel sowas kosten
> würde).

Hä?

User schrieb:
> - Eine IP Core der alles zum USB 2.0 enthält, wo die Daten quasi nur
> noch über FIFOs gelesen und geschrieben werden können

Ich bin jetzt kein FPGA-Experte, aber ein solcher Core würde 
wahrscheinlich eine Soft-CPU enthalten/benötigen, mit passender Firmware 
natürlich.

User schrieb:
> - Software mit Treiber oder DLL sollte mit Beispielcode vorhanden sein.

Also ein Rundum-Sorglos-Paket. Glaube kaum dass jemand so etwas 
verschenkt. Wenn du keine eigenen Treiber entwickeln willst, geht so 
etwas mit WinUSB.

USB ist kompliziert, und USB-HS nochmal ganz besonders. In UM232H & 
Konsorten steckt schon einiges drin.

User schrieb:
> Oder ich muss halt auf meine Lösung mit dem UM232H Board zurückgreifen
> und Pins dafür freischaufeln :-)
Das ist wahrscheinlich sehr viel einfacher...

Ganz anderer Vorschlag: Einen uC mit integriertem USB-HS-PHY nehmen, 
z.B. einen der STM32F7x3-Reihe. Da kannst du das ganze USB-Protokoll 
drin abhandeln, und über irgendeine schnelle Schnittstelle (FSMC? SDIO?) 
zum FPGA schaufen. Wäre quasi ein UM232H-Nachbau.

von Christian R. (supachris)


Lesenswert?

Ich glaube du stellst dir das etwas zu einfach vor. Auch der USB 2.0 
Core von Open Cores benötigt einen USB 2.0 PHY. Sonst bräuchtest du 
einen Super Super FPGA, der die 480MHz an den I/Os kann. Kann vielleicht 
der Xilinx Kintex oder schneller.
Auf der Treiber-Seite kannst du einfach WinUSB oder LibUSB nehmen, aber 
eine Vendor ID müsstest du dann auch noch kaufen.
Vielleicht solltest du lieber beim FTDI Chip bleiben...

von Frank K. (fchk)


Lesenswert?

User schrieb:
> Da ich nun nicht viele Pins übrig habe stellte ich mir die Frage ob es
> nicht möglich ist sich direkt mit einer USB-Schnittstelle am PC zu
> verbinden. Eine 5V to 3V3 Wandlung wird natürlich nötig sein. Aber die
> IP im FPGA muss sich halt als USB Interface ausgeben.

Wenn das FPGA keine USB-fähigen Transceiver bereits enthält, musst Du 
einen externen anschließen. Z.B. den hier:

http://www.ti.com/lit/ds/symlink/tusb1210.pdf

Wenn Du das Datenblatt sowohl gelesen als auch verstanden hast, dann 
wird Dir klar sein, dass Du entweder ein sehr schnelles FPGA brauchst, 
oder dass Du beim Pincount nichts sparst.

Das einfachste wäre einfach ein FPGA mit mehr Pins.

fchk

von Tobias B. (Firma: www.elpra.de) (ttobsen) Benutzerseite


Lesenswert?

Christian R. schrieb:
> Sonst bräuchtest du
> einen Super Super FPGA, der die 480MHz an den I/Os kann. Kann vielleicht
> der Xilinx Kintex oder schneller.

Nope, da gehen weitaus mehr in niederigeren Preisregionen. Ausserdem 
sind es nicht 480 MHz sondern 480 MB/s

- Spartan 6/7
- Artix 7

Allein von Xilinx. Lattice MachXO2/3 und Crosslink schaffen auch die 480 
MB/s. Die Xilinx Devices gehen teilweise bis 1 GB/s und mehr (an den 
User IOs nicht MGTs!), das ist also nicht das Problem.

Ich bin kein Experte fuer USB, aber mir scheint das groesste Problem ist 
wirklich der PHY. Ich finde auch keine Anwendung die ohne auskommt. 
Evtl. ist man da mit den Zynqs besser bedient, die koennten USB schon 
komplett mitbringen, dann allerdings im PS und nicht PL System.

von Dr. Sommer (Gast)


Lesenswert?

Tobias B. schrieb:
> Nope, da gehen weitaus mehr in niederigeren Preisregionen. Ausserdem
> sind es nicht 480 MHz sondern 480 MB/s

Nein, es sind 480 MHz und 60 MByte/s (brutto) bei USB-High Speed.

Tobias B. schrieb:
> Ich bin kein Experte fuer USB, aber mir scheint das groesste Problem ist
> wirklich der PHY.
Und das ziemlich komplizierte Protokoll. Schau dir mal die ganzen total 
übersichtlichen Zustandsdiagramme in der USB-Spezifikation an... :-)

von Tobias B. (Firma: www.elpra.de) (ttobsen) Benutzerseite


Lesenswert?

Dr. Sommer schrieb:
> Nein, es sind 480 MHz und 60 MByte/s (brutto) bei USB-High Speed.

In jedem Dokument finde ich, dass USB 2.0 bis maximal 480 MB/s 
spezifiziert ist. Ich denke offizieller wie:

https://www.usb.org/document-library/usb-20-specification

wird es nicht. ;-)

Edit: Jetzt seh ich das Problem. Es sind 480 Mb/s, nicht Byte. War 
richtig gemeint von mir aber falsch geschrieben, mein Fehler. :-)

Dr. Sommer schrieb:
> Und das ziemlich komplizierte Protokoll. Schau dir mal die ganzen total
> übersichtlichen Zustandsdiagramme in der USB-Spezifikation an... :-)

Das ist erstmal kein Problem, FPGAs loesen viele komplizierte Aufgaben, 
da wird man auch das Protokoll unterbringen. Auf dem untersten Layer ist 
das auch nicht wirklich kompliziert, erst die oberen Layer sorgen fuer 
Komplexitaet wenn man wirklich jeden Teilaspekt implementieren will. In 
der Regel reichen jedoch fuer spezielle Aufgaben auch nur die benoetigte 
Teilmenge zu implementieren.

: Bearbeitet durch User
von Dr. Sommer (Gast)


Lesenswert?

Tobias B. schrieb:
> In jedem Dokument finde ich, dass USB 2.0 bis maximal 480 MB/s
> spezifiziert ist.

Auf S. 1 der Spezifikation steht:
"USB 2.0 addresses this need by adding a third transfer rate of 480 
Mb/s". Kleines "b", also Bit!

Auf S. 7 steht:
Mb/s Transmission rate expressed in megabits per second.
MB/s Transmission rate expressed in megabytes per second.

Hier steht es nochmal ganz klar:
https://de.wikipedia.org/wiki/Universal_Serial_Bus#Datenraten

Die Nutzdatenrate ohne Protokolloverhead ist 40 MB/s.

von Tobias B. (Firma: www.elpra.de) (ttobsen) Benutzerseite


Lesenswert?

Jep, habs dann auch gesehen, war aber wirklich nur ein Schreibfehler, 
hatte 480 Mb im Kopf aber ausversehen MB geschrieben. Macht aber die 
obige Aussage mit den verschiedenen FPGAs die in Frage kommen koennen, 
nicht falsch.

480 MBytes/s waeren auch voellig utopisch auf User IOs und nur mit MGTs 
zu schaffen.

: Bearbeitet durch User
von Christian R. (supachris)


Lesenswert?

Tobias B. schrieb:
> Nope, da gehen weitaus mehr in niederigeren Preisregionen. Ausserdem
> sind es nicht 480 MHz sondern 480 MB/s
>
> - Spartan 6/7
> - Artix 7

Schon, aber dann müsste man das über die SERDES hinbekommen, und da hab 
ich zumindest noch keinen Core gesehen der das kann. Im PHY Layer von 
USB stecke ich auch nicht so tief drin, kann sein dass sich das nicht so 
ohne weiteres mit den SERDES machen lässt. Da gibts ja einige 
Sonderzustände der beiden Datenleitungen und bidirektional ist auch 
alles.
USB 3.0 wiederum ist am PHY auf dem FPGA kein Thema, wenn man MGTs hat. 
Aber auch da kostet ein Core einige Tausender zzgl. DMA Core.

von Tobias B. (Firma: www.elpra.de) (ttobsen) Benutzerseite


Lesenswert?

Christian R. schrieb:
> Schon, aber dann müsste man das über die SERDES hinbekommen, und da hab
> ich zumindest noch keinen Core gesehen der das kann. Im PHY Layer von
> USB stecke ich auch nicht so tief drin, kann sein dass sich das nicht so
> ohne weiteres mit den SERDES machen lässt.

Ob SERDES verwendet werden muss oder nicht ist unerheblich. SERDES 
schraenkt in dieser Hinsicht die Funktionalitaet 0 ein. Ich muss halt 
die Daten im Vorfeld parallel prozessieren, das ist aber wirklich kein 
Problem. Wenn ich mal so ganz grob ueberblicke, dann besteht der erste 
Datenlayer hauptsaechlich aus:

- NRZI Coding
- Bit Stuffing
- CRC

Das "komplizierteste" ist dabei das Bit Stuffing, was sich jedoch mit 
einem FIFO auch relativ easy handhaben laesst.

Das Problem scheint mir das ganze drum herum zu sein auf PHY Level. USB 
ist halt mehr als einfach nur ein Bidirektionaler LVDS Channel und da 
steigt ein FPGA ohne spezielles USB PHY leider aus. :-(

von Christian R. (supachris)


Lesenswert?

Tobias B. schrieb:
> Das Problem scheint mir das ganze drum herum zu sein auf PHY Level. USB
> ist halt mehr als einfach nur ein Bidirektionaler LVDS Channel und da
> steigt ein FPGA ohne spezielles USB PHY leider aus. :-(

Allerdings. Alleine das Gemache mit den Pull Widerständen...

von Christophz (Gast)


Lesenswert?

Also wär jetzt die moderne Variante eine Kombination aus:
- Low-speed USB selber gebaut wie seit Jahren bekannt als "Virtual-USB" 
VUSB für den AVR. Dient nur dazu, damit das OS Deskriptoren auslesen 
kann.
- USB Super-speed per FPGA SERDES implementieren.

Nur mal so als Idee in den Raumgestellt :-)

Korrigiert mich, fresst mich auf, wenn ich etwas offensichtliches 
übersehen habe.

Oder ist das in USB 3 sogar vorgesehen, dass man gar keinen 
Low-speed/Full-speed Kanal brauch um sich anzumelden?

von Tobias B. (Firma: www.elpra.de) (ttobsen) Benutzerseite


Lesenswert?

Ich habe mal auf meinen ZCU106 Evalboard geschaut. Da ist USB 3.0 ueber 
die MGTs eines PS-GTRs und der USB 2.0 Teil wird via eines Microchip 
USB3320 realisiert.

Die LVDS Lanes des MGTs gehen dafuer direkt an den USB 3.0 Stecker (nur 
ein paar ESD Dioden sind mit drauf) ohne zwischen PHY.

Jetzt muesste man mal schauen ob PHY technische sich die PS-GTRs von 
denen im PL Teil eines Zynqs unterscheiden.

von Frank K. (fchk)


Lesenswert?

Christophz schrieb:

> Oder ist das in USB 3 sogar vorgesehen, dass man gar keinen
> Low-speed/Full-speed Kanal brauch um sich anzumelden?

Ja, das ist vorgesehen, funktioniert auch und ist gemäß USB-Spec 
erlaubt, sofern es eine interne Verbindung auf Leiterplattenebene ist.

Eine externe USB 3.0 Buchse muss laut Spec. hingegen auch mit Full-Speed 
(!, deswegen scheidet VUSB aus) gehen. Es wäre technisch nicht nötig, 
wenn Du damit zufrieden wärst, dass das Teil nur an USB3 enumeriert, 
aber Du darfst das dann eben nicht als "USB" bezeichnen. Damit will man 
Reklamationen von Endusern verhindern, was bei kommerziellen Produkten 
durchaus extrem sinnvoll ist. Handbücher liest ja eh niemand.

fchk

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.