Conexão direta USB e implementação em FPGA
Alguns meses atrás eu fiz algumas pesquisas na web para a implementação de USB em um FPGA, encontrei vários artigos que sugeriam que não era possível para a implementação completa de USB em um FPGA, citando as seguintes questões
- Os níveis de tensão das linhas de dados USB estão na faixa de 3,3 V, enquanto o FPGA funciona em 3,3 ou 1,2 níveis lógicos. (eu estava um pouco cético em relação a isso, já que o PIC24F que funciona com alimentação de 3,3 V implementou hardware USB no chip)
- O USB requer software embutido que precisa ser implementado em um MCU que funcionará em conjunto com a parte de hardware do USB.
Hoje me deparei com uma placa de desenvolvimento FPGA, The Orange Crab, onde os pinos USB estavam diretamente para o FPGA. É uma placa de código aberto com esquemas disponíveis para verificação.
Citando daquela página
Conexão USB direta ao FPGA (operar como DFU, MSC, CDC ou dispositivo composto!)
Comecei a me perguntar como eles estariam implementando o USB dentro do FPGA e os recursos que seriam necessários para isso. Eles, por exemplo, instanciariam um núcleo de CPU soft dentro do FPGA e, em seguida, manipulariam o código USB necessário usando uma biblioteca C para a estrutura USB? Isso não seria um desperdício terrível de recursos do FPGA, em vez de apenas usar um chip externo FTDI para descarregar a parte USB?
Seria interessante saber se o meu palpite está correto ou é mesmo possível fazer USB totalmente em hardware e como?
Respostas
Seria interessante saber se o meu palpite está correto ou é mesmo possível fazer USB totalmente em hardware e como?
É possível, mas o FPGA precisaria de transceptores diferenciais que suportem 480 MHz para USB 2.0, e suponho que um clock rodando a 240 MHz ou mais. Por ser difícil para muitos FPGAs, a maioria dos projetos usa UMTI, que paraleliza o fluxo serial de entrada.
Para USB 1.2 eu acho que os núcleos estão disponíveis e a velocidade não é um grande problema, já que funciona a 12MHz
A figura abaixo mostra o que está envolvido na implementação do UMTI, se você pudesse fazer isso (eu nunca implementei diretamente apenas em um núcleo UMTI) em um FPGA, então sim, você poderia executar os pinos de dados direto no FPGA. Não estou ciente de nenhum núcleo que faça isso, mas isso não significa que eles não existam.
Este é um diagrama USB 2.0 de núcleos abertos, o phy externo implementa o UMTI e o núcleo usb 2.0 opencores processa o fluxo UMTI. Em muitos casos, é melhor ter os trancievers fora do FPGA ou do microprocessador, embora ele use mais GPIO.
Fonte: https://opencores.org/projects/usb
O caranguejo laranja usa um dispositivo USB de 12Mbit que não é difícil de implementar, pois funciona a 12MHz. USB de velocidade total (12Mbit) com conexão direta ao FPGA
Provavelmente não valeria a pena fazer o USB no chip porque requer muitos recursos. Se você gastou 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 você realmente precise economizar espaço, eu usaria um phy externo ou USB para Uart.