USB-Direktanschluss und Implementierung auf FPGA

Aug 25 2020

Vor einigen Monaten habe ich im Internet nachgeforscht, um USB auf einem FPGA zu implementieren. Dabei bin ich auf mehrere Artikel gestoßen, die darauf hinwiesen, dass eine vollständige USB-Implementierung auf einem FPGA nicht möglich ist, wobei die folgenden Bedenken angeführt wurden

  1. Die Spannungspegel von USB-Datenleitungen liegen im Bereich von 3,3 V, während FPGA mit Logikpegeln von 3,3 oder 1,2 betrieben wird. (Ich war diesbezüglich etwas skeptisch, da PIC24F, die mit einer 3,3-V-Versorgung arbeiten, USB-Hardware auf dem Chip implementiert haben.)
  2. USB erfordert eingebettete Software, die auf einer MCU implementiert werden muss, die mit dem Hardwareteil von USB zusammenarbeitet.

Heute bin ich auf ein FPGA-Entwicklungsboard gestoßen, The Orange Crab, bei dem die USB-Pins direkt mit dem FPGA verbunden waren. Es ist eine Open-Source-Karte mit Schaltplänen zum Auschecken.

Zitieren von dieser Seite

Direkte USB-Verbindung zum FPGA (Betrieb als DFU-, MSC-, CDC- oder Composite-Gerät!)

Ich begann mich zu fragen, wie sie den USB im FPGA implementieren würden und welche Ressourcen dafür notwendig wären. Würden sie zum Beispiel einen weichen CPU-Kern im FPGA instanziieren und dann den erforderlichen USB-Code mithilfe einer C-Bibliothek für das USB-Framework verarbeiten? Wäre das nicht eine schreckliche Verschwendung von FPGA-Ressourcen, anstatt nur einen externen FTDI-Chip zum Auslagern des USB-Teils zu verwenden?

Es wäre interessant zu wissen, ob meine Vermutung richtig ist oder ob es wirklich möglich ist, USB vollständig in Hardware zu machen und wie?

Antworten

2 VoltageSpike Aug 25 2020 at 05:57

Es wäre interessant zu wissen, ob meine Vermutung richtig ist oder ob es wirklich möglich ist, USB vollständig in Hardware zu machen und wie?

Es ist möglich, aber das FPGA würde differentielle Transceiver benötigen, die 480 MHz für USB 2.0 unterstützen, und ich nehme an, dass ein Takt mit 240 MHz oder mehr läuft. Da dies für viele FPGAs schwierig ist, verwenden die meisten Designs UMTI, das den eingehenden seriellen Stream parallelisiert.

Für USB 1.2 würde ich denken, dass Kerne verfügbar sind und die Geschwindigkeit kein so großes Problem darstellt, da sie mit 12 MHz läuft

Die folgende Abbildung zeigt, was bei der Implementierung von UMTI erforderlich ist. Wenn Sie dies auf einem FPGA tun könnten (ich habe es nie direkt auf einem UMTI-Kern implementiert), dann könnten Sie die Datenpins direkt in das FPGA einführen. Mir sind keine Kerne bekannt, die dies tun, aber das bedeutet nicht, dass sie nicht da draußen sind.

Quelle: https://www.intel.com/content/dam/www/public/us/en/documents/technical-specifications/usb2-transceiver-macrocell-interface-specifications.pdf

Dies ist ein USB 2.0-Diagramm mit offenen Kernen. Der externe Phy implementiert die UMTI und der OpenCores USB 2.0-Kern verarbeitet den UMTI-Stream. In vielen Fällen ist es besser, die Tranciever außerhalb des FPGA oder Mikroprozessors zu haben, obwohl mehr GPIO verwendet wird.


Quelle: https://opencores.org/projects/usb

Die orangefarbene Krabbe verwendet ein 12-Mbit-USB-Gerät, das nicht schwer zu implementieren ist, da es mit 12 MHz betrieben wird. Full-Speed ​​(12Mbit) USB mit direkter Verbindung zum FPGA

Es würde sich wahrscheinlich nicht lohnen, USB on Chip zu machen, da dies viele Ressourcen erfordert. Wenn Sie 30 ausgegeben haben$ or more for an FPGA and implementing USB uses 5 or 10% of resources, then it doesn't justify the cost of adding an external phy or USB to UART (which can be found for 1-2$). Wenn Sie nicht wirklich Platz sparen müssen, würde ich ein externes Telefon oder USB für Uart verwenden.