Conexión e implementación directa USB en FPGA

Aug 25 2020

Hace unos meses hice una investigación en la web para implementar USB en una FPGA, encontré varios artículos que insinuaban que no era posible una implementación completa de USB en una FPGA citando las siguientes preocupaciones

  1. Los niveles de voltaje de las líneas de datos USB están en un rango de 3.3V mientras que FPGA se ejecuta en niveles lógicos 3.3 o 1.2. (Estaba un poco escéptico con respecto a esto ya que PIC24F, que funciona con un suministro de 3.3V, ha implementado hardware USB en el chip)
  2. USB requiere software integrado que debe implementarse en una MCU que funcionará en conjunto con la parte de hardware de USB.

Hoy me encontré con una placa de desarrollo FPGA, The Orange Crab, donde los pines USB estaban directamente en la FPGA. Es una placa de código abierto con esquemas disponibles para comprobar.

Citando de esa página

Conexión USB directa a la FPGA (¡funciona como DFU, MSC, CDC o dispositivo compuesto!)

Comencé a preguntarme cómo estarían implementando el USB dentro de la FPGA y los recursos que serían necesarios para eso. ¿Podrían, por ejemplo, crear una instancia de un núcleo de CPU suave dentro de la FPGA y luego manejar el código USB necesario usando una biblioteca C para el marco USB? ¿No sería eso un desperdicio terrible de recursos FPGA, en lugar de simplemente usar un chip FTDI externo para descargar la parte USB?

Sería interesante saber si mi corazonada es correcta o es realmente posible hacer USB completamente en hardware y cómo.

Respuestas

2 VoltageSpike Aug 25 2020 at 05:57

Sería interesante saber si mi corazonada es correcta o es realmente posible hacer USB completamente en hardware y cómo.

Es posible, pero la FPGA necesitaría transceptores diferenciales que admitan 480MHz para USB 2.0, y supongo que un reloj que funcione a 240MHz o más. Debido a que esto es difícil para muchos FPGA, la mayoría de los diseños usan UMTI que paraleliza el flujo serial entrante.

Para USB 1.2, creo que hay núcleos disponibles y la velocidad no es un gran problema, ya que funciona a 12MHz.

La siguiente figura muestra lo que implica la implementación de UMTI, si pudiera hacer esto (nunca he implementado directamente solo un núcleo UMTI) en una FPGA, entonces sí, podría ejecutar los pines de datos directamente en la FPGA. No tengo conocimiento de ningún núcleo que haga esto, pero eso no significa que no estén disponibles.

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

Este es un diagrama USB 2.0 de núcleos abiertos, el phy externo implementa el UMTI y el núcleo USB 2.0 de núcleos abiertos procesa el flujo UMTI. En muchos casos, es mejor tener los transceptores fuera de la FPGA o del microprocesador aunque use más GPIO.


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

El cangrejo naranja usa un dispositivo USB de 12Mbit que no es difícil de implementar ya que funciona a 12MHz. USB de velocidad completa (12 Mbit) con conexión directa a la FPGA

Probablemente no valdría la pena hacer USB en chip porque requiere muchos recursos. Si gastaste 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$). A menos que realmente necesite ahorrar espacio, usaría un phy externo o USB para Uart.