Connexion directe USB et implémentation sur FPGA

Aug 25 2020

Il y a quelques mois, j'ai fait des recherches sur le Web pour implémenter l'USB sur un FPGA, je suis tombé sur plusieurs articles qui laissaient entendre qu'il n'était pas possible d'implémenter USB complet sur un FPGA citant les préoccupations suivantes

  1. Les niveaux de tension des lignes de données USB sont dans la plage de 3,3 V tandis que le FPGA fonctionne sur 3,3 ou 1,2 niveaux logiques. (J'étais un peu sceptique à ce sujet car PIC24F qui fonctionne sur une alimentation 3.3V a implémenté du matériel USB sur puce)
  2. L'USB nécessite un logiciel intégré qui doit être implémenté sur un MCU qui fonctionnera en tandem avec la partie matérielle de l'USB.

Aujourd'hui, je suis tombé sur une carte de développement FPGA, The Orange Crab, où les broches USB étaient directement reliées au FPGA. C'est un tableau open source avec des schémas disponibles à vérifier.

Citer de cette page

Connexion USB directe au FPGA (fonctionne comme un DFU, MSC, CDC ou périphérique composite!)

J'ai commencé à me demander comment implémenteraient-ils l'USB à l'intérieur du FPGA et les ressources qui seraient nécessaires pour cela. Voudraient-ils, par exemple, instancier un cœur de processeur logiciel à l'intérieur du FPGA, puis gérer le code USB nécessaire dessus en utilisant une bibliothèque C pour le framework USB. Ne serait-ce pas un terrible gaspillage de ressources FPGA, au lieu d'utiliser simplement une puce FTDI externe pour décharger la partie USB?

Il serait intéressant de savoir si mon intuition est correcte ou est-il vraiment possible de faire de l'USB complètement dans le matériel et comment?

Réponses

2 VoltageSpike Aug 25 2020 at 05:57

Il serait intéressant de savoir si mon intuition est correcte ou est-il vraiment possible de faire de l'USB complètement dans le matériel et comment?

C'est possible, mais le FPGA aurait besoin d'émetteurs-récepteurs différentiels prenant en charge 480 MHz pour l'USB 2.0, et je suppose qu'une horloge fonctionnant à 240 MHz ou plus. Parce que cela est difficile pour de nombreuses conceptions de FPGA, la plupart des conceptions utilisent UMTI qui parallélise le flux série entrant.

Pour l'USB 1.2, je pense que les cœurs sont disponibles et que la vitesse n'est pas vraiment un problème car elle fonctionne à 12 MHz

La figure ci-dessous montre ce qui est impliqué dans la mise en œuvre de UMTI, si vous pouviez le faire (je n'ai jamais implémenté directement uniquement un noyau UMTI) sur un FPGA, alors oui, vous pouvez exécuter les broches de données directement dans le FPGA. Je ne connais aucun noyau qui fasse cela, mais cela ne veut pas dire qu'ils ne sont pas là.

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

Il s'agit d'un diagramme USB 2.0 à cœurs ouverts, le phy externe implémente l'UMTI et le noyau opencores usb 2.0 traite le flux UMTI. Dans de nombreux cas, il est préférable d'avoir les transpondeurs en dehors du FPGA ou du microprocesseur même s'il utilise plus de GPIO.


La source: https://opencores.org/projects/usb

Le crabe orange utilise un périphérique USB 12Mbit qui n'est pas difficile à mettre en œuvre car il fonctionne à 12MHz. USB pleine vitesse (12 Mbit) avec une connexion directe au FPGA

Cela ne vaudrait probablement pas la peine de faire de l'USB sur puce car cela prend beaucoup de ressources. Si vous avez dépensé 30$ 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$). À moins que vous n'ayez vraiment besoin d'économiser de l'espace, j'utiliserais un phy externe ou une clé USB vers Uart.