L’Usb entra nell’Fpga

FPGA –

Come integrare la funzionalità Usb High Speed nei progetti basati su Asic e Fpga di oscilloscopi digitali, apparecchiature Ecg, videocamere e sistemi di acquisizione dati.

Alla base della popolarità di cui gode lo standard Usb (Universal Serial Bus) sono principalmente facilità d’uso, supporto della funzionalità plug- and-play e affidabilità. Questo standard è stato adottato su larga scala nelle periferiche per computer che in precedenza ospitavano Uart o porte parallele come interfacce verso l’host: oggigiorno, per qualsiasi prodotto che richiede un’interfaccia verso un host computer Usb rappresenta l’opzione principale. Le diverse ampiezze di banda -- Low, Full, High e ora Super speed – soddisfano le esigenze di una vasta gamma di periferiche per computer, nonché di apparecchiature industriali e medicali. Il throughput offerto da Usb risulta sufficiente anche per applicazioni che richiedono un’estesa ampiezza di banda come hard disk drive e scanner. Per la maggior parte delle periferiche per computer – tastiera e mouse, Pda, gamepad, joystick, scanner, telecamere digitali e stampanti – Usb è oggigiorno il metodo di connessione standard. A parte le semplici periferiche per computer, esiste un’ampia gamma di applicazioni basate su Fpga che possono trarre significativi vantaggi dall’aggiunta di un’interfaccia Usb a elevate velocità. Oscilloscopi digitali, apparecchiature Ecg, videocamere e sistemi di acquisizione dati sono solo alcuni tra gli innumerevoli esempi. L’aggiunta di un’interfaccia Usb a un dispositivo contribuisce ad aumentarne sensibilmente le potenzialità. Si consideri ad esempio i sistemi per la registrazione dei dati, come ad esempio oscilloscopi ed Ecg: i dati acquisiti possono essere trasferiti in tempo reale a un’apparecchiatura host in tempo reale che a sua volta può trasmettere questi dati su Internet. In applicazioni quali acquisizioni dati remota, il collegamento di un data logger a un’apparecchiatura host mediante Usb consente anche il controllo remote da parte del sistema di supervisione centrale (master) che può essere posizionato molto distante ma è connesso all’host Usb tramite Internet. In questo articolo vengono analizzate le possibili metodologie di progetto da utilizzare per realizzare un’interfaccia Usb 2.0 ad alta velocità in un sistema basato su Fpga o Asic. Al fine di analizzare le diverse modalità di integrazione di un’interfaccia Usb in un sistema basato su Fpga o Asic, è necessario in primo luogo comprendere la modalità di funzionamento di un tipico sistema Usb. Quest’ultimo risulta composto da transceiver, un engine di interfaccia seriali e un controllore di interfaccia. Il transceiver implementa il livello fisico del protocollo Usb. Esso rappresenta i due terminali del trasferimento dati tra l’host e il dispositivo. I transceiver Usb avranno uscite sia differenziali sia a terminazione singola (single ended). L’engine Sie effettua le operazioni di codifica e decodifica dei dati seriali, bit stuffing (inserimento di zeri aggiuntivi), correzione dell’errore e altri compiti ausiliari a livello di segnale. Questo engine si occupa anche della conversione dei dati paralleli in seriali e viceversa. Il Sie dovrebbe essere interfacciato a un “master” intelligente che implementa il protocollo Usb di alto livello rispondendo alle richieste dell’host sull’endpoint (sorgente o destinazione dei dati trasmessi sul cavo Usb) di controllo. Il master è anche preposto all’esecuzione dei compiti (task) del livello applicativo come richiesto dalle funzionalità del dispositivo. Di seguito verranno discusse le tre differenti metodologie che possono essere utilizzate per aggiungere un’interfaccia Usb a un sistema basato su Fpga o Asic.

Utilizzo di IP per lo stack del protocollo Usb
Nel caso si volesse sfruttare questo metodo, è possibile implementare l’engine Sie all’interno dell’Fpga o dell’Asic. Le principali funzioni che il Sie è tenuto a svolgere sono le seguenti: codifica e decodifica dei dati, generazione del codice di controllo Crc (Cyclic Redundancy Check) e correzione dell’errore, bit stuffing, generazione dell’ID del pacchetto, conversioni seriale parallela e parallela seriale. Il blocco di proprietà intellettuale può essere sviluppato internamente o essere acquistato da terze parti. L’Fpga deve anche occuparsi dell’implementazione del protocollo Usb ad alto livello. In una realizzazione di questo tipo è previsto un transceiver esterno, che potrebbe essere il chip TX2UL di Cypress Semiconductor: si tratta di un transceiver certificato Usb 2.0 e conforme alle specifiche Tranceiver Macrocell Interface. Tutte le terminazioni richieste, compreso il resistore di pull-up da 1,5 Kohm, sono interne al chip. Il vantaggio di questo approccio è senza dubbio il minimo numero di componenti hardware esterni richiesto. Lo svantaggio è invece legato al tempo e alle risorse ingegneristiche necessarie per lo sviluppo dell’IP per lo stack Usb. L’implementazione dell’IP per il Sie, il protocollo di livello più alto e le funzioni applicative richiedono una quantità significativa delle “preziose” risorse dell’Fpga. L’adozione di un IP fornito da terze parti può invece rivelarsi costoso.

Utilizzo di un bridge Usb con Sie e transceiver integrati
Un secondo modo per integrare un’interfaccia Usb in un progetto basato Fpga prevede invece l’interfacciamento di un engine SIE e di un transceiver esterni. In questo caso l’Fpga deve solamente implementare il livello del protocollo Usb di alto livello. Ogni comando ricevuto dall’host Usb dovrebbe essere ritrasmesso dal Sie all’Fpga. Quest’ultimo dovrebbe quindi contenere la logica necessaria per rispondere in modo appropriato a questi comandi. Per esempio, nel processo di enumerazione, il dispositivo Usb riceve un comando dall’host che richiede i suoi descrittori. In un’implementazione di questo tipo l’hardware esterno, ovvero il transceiver e il Sie, ricevono il pacchetto e notificano alla Fpga attraverso un interrupt che il comando è stato ricevuto. L’Fpga a questo punto deve leggere un registro presente nella Sie in modo da capire che il dispositivo ha ricevuto il comando “Get descriptor” dall’host. Esso inoltre deve inviare i corretti descrittori al Sie. Invece di utilizzare un Sie con un transceiver esterno, è possibile ricorrere a un bridge come ad esempio l’integrato Mobl-Usb di Cypress Semiconductor che integra sia l’engine Sie che il transceiver. Il controllore dispone di due endpoint high speed a doppio buffer che condividono uno spazio Fifo da 2 kb per garantire i più alti livelli di flessibilità e throughput, così come l’endpoint di controllo 0. Il principale vantaggio di un’implementazione di questo tipo e che una buona parte della complessità (ovvero la gestione del protocollo a livello di segnale) è stata trasferita all’esterno dell’Fpga. Anche in una situazione di questo tipo, una certa quantità di risorse dell’Fpga vengono utilizzate per l’implementazione dei livelli più alti del protocollo Usb. A questo punto è necessario prendere una decisione confrontando il costo dell’hardware esterno richiesto e con la quantità delle risorse dell’Fpga risparmiate.

Utilizzo di un controllore Usb con un Fpga
La terza metodologia che viene presa in considerazione prevede invece l’interfacciamento di un controllore Usb completo con un Fpga. In questo caso, l’intera gestione dei livelli del protocollo Usb si svolge all’esterno dell’Fpga. Un controllore Usb dedicato contiene il livello fisico, il SIE e la logica per il controllo del protocollo. I controllori offrono inoltre un alto grado di flessibilità, dando la possibilità di configurare il numero di endpoint e le dimensioni della Fifo, oltre a integrare un microcontrollore per la gestione del protocollo Usb di alto livello. Controllori di periferiche di questo tipo possono anche integrare le risorse necessarie per la gestione di alcune funzioni a livello applicativo, esonerando in tal modo l’Fpga o l’Asic dall’espletamento di tali compiti. Se essi contengono un’architettura basata su Ram, gli sviluppatori possono anche sfruttare il vantaggio di poter effettuare gli aggiornamenti firmware sul campo. L’Fpga a questo punto deve solamente integrare la logica richiesta per l’interfacciamento con questo chip. Per l’interfacciamento tra il controllore Usb e l’Fpga è possibile utilizzare interfacce standard come Spi, I2C, o Hpi, come pure interfacce specifiche in funzione del particolare controllore Usb scelto. L’FX2LP di Cypress Semiconductor è un controllore di periferiche dedicato la cui adozione può ridurre il tempo di sviluppo necessario per l’integrazione delle funzionalità Usb in un sistema basato su Asic o Fpga. Esso dispone dell’interfaccia Fifo slave che consente una semplice interconnessione con un sistema basato su Fpga. L’interfaccia Fifo slave funziona con semplici segnali di “Slave Read” e “Slave Write” che possono leggere o scriver i dati nello spazio Fifo di 4K di FX2LP. Per l’interfacciamento con un sistema basato su Asic, FX2LP mette a disposizione la logica per un’interfaccia Gpif (General Programmable Interface) in grado di generare forme d’onda per qualsiasi interfaccia standard destinata alle comunicazioni presente nel circuito Asic. L’interfaccia Gpif dà anche la possibilità di configurare l’Fpga sull’interfaccia Usb eliminando in tal modo il ricorso a un chip di configurazione separato come una Prom o un processore. La configurazione dell’Fpga su Usb può anche consentire l’eliminazione degli header Jtag dalla scheda. Come si evince da quanto appena detto, un controllore Usb dedicato può essere utilizzato non solo come un canale per i dati ma contribuire a ridurre dimensioni e costi della scheda. Tutte le tre metodologie illustrate, ovviamente, hanno pregi e difetti. La scelta quindi deve essere effettuata sulla base di un’attenta analisi tra i diversi compromessi possibili in termini di costi, ingombri sulla schede e utilizzo di risorse dell’Fpga
.

Pubblica i tuoi commenti