Perché gli FPGA vengono utilizzati così spesso per progetti video HDMI?


24

Se guardi attraverso progetti hdmi su un sito come l'hackaday , scoprirai che quasi tutti implicano un FPGA. Non credo di aver visto alcun progetto fai-da-te con uscita HDMI che non abbia usato un FPGA.

Ma perché? Per quanto ne so, gli FPGA sono costosi, circa $ 70- $ 100. Confrontalo con un Raspberry Pi per $ 35, che può fare cose molto più complesse e genera HDMI. Perché non viene utilizzato un ARM? O un microcontrollore ancora più economico?

Nel caso dell'aggiornamento del video su vecchi sistemi di gioco, la logica non dovrebbe essere più complicata da gestire con un microcontrollore economico , ma continuo a vedere l'HDMI come un ostacolo impossibile affrontato solo dagli FPGA.


Puoi trovare anche G PUS economico (come su RPi). Il problema è che non faranno cose che violano la licenza HDMI o sono assolutamente illegali in alcuni paesi (DMCA). Questo è ciò che la maggior parte dei progetti che colleghi a fare. Puoi acquistare una GPU core IP e modificarla per fare cose del genere ... Ma chi la favolerà per te? FPGA è favoloso uomo povero (o pirata).
Fizz,

Risposte:


66

Fondamentalmente, nessun microcontrollore, nemmeno il lampone pi, è abbastanza veloce. Il raspberry pi ha una GPU integrata che genera l'uscita HDMI. Inoltre, la funzionalità I / O di raspberry pi è incredibilmente limitata: l'interfaccia con la larghezza di banda più alta oltre a HDMI è USB. Molti dei progetti di conversione HDMI implicano il passaggio di un altro flusso video in uno strano formato e la rielaborazione in qualcosa che può essere inviato a un HDTV standard su HDMI. Ciò richiede una logica di interfaccia personalizzata per leggere il segnale video, la logica di elaborazione del segnale per riformattarlo, la logica di codifica HDMI TMDS e quindi i serializzatori ad alta velocità per guidare effettivamente la porta HDMI.

Lavorare con streaming, video non compresso e ad alta definizione richiede l'elaborazione di un'enorme quantità di dati, cosa che non è fattibile su una CPU di uso generale. Un segnale video 1080p a 30 fotogrammi al secondo ha circa 62 milioni di pixel al secondo. Il raspberry pi funziona a 700 MHz, quindi hai, oh, 11 istruzioni per pixel. E queste sono 11 istruzioni per leggere in formato video dispari in tempo reale, ridimensionarlo, ecc. Ecc. Non possibile. Periodo.

Su un FPGA, è possibile generare una lunga pipeline di elaborazione in grado di elaborare uno o più pixel per ciclo di clock e farlo in modo altamente deterministico (senza interruzioni o commutazione di attività!) In modo che i dati dei pixel siano pronti per la trasmissione su HDMI esattamente al momento giusto. Se hai lavorato a lungo con CPU per scopi generici che eseguono qualsiasi tipo di sistema operativo, saprai che ottenere tempi precisi a livello di millisecondi è più o meno fattibile, ma a livello di microsecondi è praticamente impossibile. Per HDMI, è necessaria una precisione in scala dei nanosecondi. Non realizzabile su una CPU per scopi generici. Inoltre, dai un'occhiata al progetto audio / video HDMI per il neo geo. Questo non solo deve ridimensionare il video, ma deve anche ricampionare l'audio e inserirlo nel flusso video HDMI.

E questo non sta ancora considerando la logica personalizzata richiesta per leggere in qualunque formato di dati di input tu abbia. Avrai bisogno di hardware personalizzato per interpretarlo. Il software non è abbastanza veloce o abbastanza deterministico. Potresti essere in grado, per esempio, di riformattarlo in una sorta di flusso basato su USB, ma ciò richiederà comunque una logica digitale personalizzata, quindi potresti anche solo emettere HDMI direttamente.

Per implementare tutto ciò, la logica digitale è davvero l'unica soluzione possibile. E se stai facendo la logica digitale, gli FPGA sono l'unica soluzione fattibile, poiché è troppo veloce e troppo complesso per la logica discreta 7400 e gli ASIC sono, beh, molti ordini di grandezza più costosi.

Un altro componente richiesto sono gli attuali serializzatori ad alta velocità e driver differenziali per generare flussi di dati seriali paralleli che vengono inviati lungo il cavo. Non è possibile eseguire il bit-bang dei dati seriali nell'ordine di un gigabit al secondo da una CPU generica, ciò richiede hardware specializzato. Il raspberry pi ha una GPU integrata che lo fa, ma è limitato in termini di capacità della GPU, per non parlare di ciò che è documentato. La maggior parte degli FPGA contiene almeno i driver differenziali necessari e le infradito DDR sufficienti per supportare video a bassa risoluzione e ci sono alcuni FPGA che contengono anche i serializzatori necessari (cioè i blocchi OSERDES Xilinx) per generare flussi Full HD. Non dimenticare che il flusso seriale non è "baseband" come una normale porta seriale in cui i dati effettivi vengono inviati alla lettera con alcune informazioni sull'inquadramento, ma i dati sono effettivamente codificati con TMDS (segnalazione differenziale minimizzata in transizione) per dare al segnale determinate caratteristiche elettriche. Un po 'di logica è necessaria per implementare questo oltre agli attuali serializzatori ad alta velocità. Tutto ciò è relativamente semplice da fare nella pura logica digitale (beh, la codifica comunque - i serializzatori sono probabilmente analogici, o almeno segnali misti) su un ASIC o un FPGA.

In realtà è una parte molto importante del processo complessivo di progettazione di sistemi digitali / integrati per capire quali parti di un sistema possono essere implementate nel software e quali richiedono hardware, sia sotto forma di chip specializzati pronti all'uso, FPGA, personalizzati ASIC, IP hard o soft (HDL, netlist, GDSII), ecc. In questo caso è chiaro: la generazione di segnali video richiede hardware specializzato, sia una GPU accoppiata con una CPU per uso generale, un FPGA con un hard integrale o core della CPU soft o associato a una CPU esterna o qualcosa di più specializzato.

Modifica: mi sono appena reso conto che il sito fpga4fun e il progetto video neo geo funzionano entrambi a 640x480 invece che in full HD. Tuttavia, ciò non rende questo processo molto più semplice. Il pixel clock minimo è di 25 MHz, con un bit clock di 250 MHz. Ciò significa che l'FPGA in realtà non richiede serializzatori per trasmettere HDMI, ma solo infradito DDR. Tuttavia, ciò non allevia il problema della lettura dei dati video. Se vuoi farlo sul raspberry pi senza assistenza hardware, dovresti leggere continuamente da GPIO a 25 MHz. Che è uno letto ogni 175 istruzioni. Entrando nel regno della possibilità, ma l'unico modo per farlo funzionare è su bare metal (no Linux) con assembly codificato a mano.


2
Ora che ho citato la logica 7400 ... Mi chiedo se sia possibile generare un segnale HDMI con logica discreta. Il sito fpga4fun ha un esempio di video 640x480 con un orologio HDMI da 25 MHz per un bit rate di 250 Mbit / sec o DDR 125 MHz. Non è così elevato che potrebbe essere fattibile con chip logici discreti. Potrebbe essere un progetto interessante per qualcuno.
alex.forencich,

11 istruzioni per pixel - come hai calcolato quel numero? Stai assumendo un'istruzione per ogni tick dell'orologio?
Gronostaj,

700 MHz / 62 Mpps = 11.3. Presupposto Ballpark di 1 CPU per ciclo di clock per una CPU single core.
alex.forencich,

E l'altro presupposto che suppongo di non aver menzionato è che il segnale video in ingresso verrebbe bit-bangato nei pin GPIO senza assistenza hardware, quindi le istruzioni per ciò dovrebbero essere intercalate in qualche modo con il tempismo corretto.
alex.forencich,

15
TL; DR: deve essere eseguito in hardware. Il software è troppo lento.
JS.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.