domenica 16 febbraio 2014

FPGA: Comunicazione ad alta velocità tramite USB 2.0 (prima parte)

Uno dei principali problemi in sistemi composti da FPGA e PC è stabilire una comunicazione semplice, veloce ed affidabile. Vediamo in questo articolo come aggiungere alla scheda di sviluppo DE0-Nano il supporto USB Hi-Speed (fino a 480 MBit/s teorici) per aprire nuovi scenari di sviluppo come l’acquisizione ed elaborazione di dati ad alta velocità.

pin1

La scheda di sviluppo DE0-Nano dispone di due pin header superiori da 40 pin (2x20) che permettono l’espansione della scheda.

um232

Utilizzeremo l’header GPIO-1 per collegare la scheda di sviluppo UM232H basata sull’IC FT232H di FTDI che offre una comunicazione USB 2.0 tramite un’interfaccia FIFO sincrona ad 8 bit di semplice utilizzo che offre trasferimenti fino a 40 MBytes/s. Da prove pratiche in alcuni casi, sfruttando vari buffer, si sono misurate velocità di trasferimento addirittura superiori.

ft232h

Sopra il diagramma a blocchi del chip FT232H, tra le altre funzionalità è possibile notare un buffer di 1K Bytes in ricezione e trasmissione

Lo schema del modulo di espansione è abbastanza semplice, non contiene elementi aggiuntivi e collega la scheda FPGA a quella USB 2.0 impostando tramite i collegamenti l’alimentazione del modulo UM232H in modalità self-powered, ovvero alimentata tramite la scheda DE0-Nano e non dalla porta USB.

schematic

Il consumo del modulo UM232H è molto contenuto, circa 60mA ma solamente quando collegato tramite USB al PC, rendendolo appetibile anche in applicazioni alimentate a batteria. A PC scollegato il consumo del modulo è non rilevante in quanto in stand-by grazie al pin PWRSAV#.

Sotto un’immagine del prototipo del modulo USB 2.0, realizzato tramite Toner Transfer, collegato alla scheda di sviluppo.

16022014228

Configuriamo il modulo UM232H

Una volta realizzato il modulo di espansione e collegato al PC tramite il programma FT Prog è possibile configurare la EEPROM a bordo dell’UM232H contenente le configurazioni del modulo.

ftprog

In particolar modo impostiamo nella pagina USB Config Desciptor il dispositivo come Self Powered, selezioniamo inoltre il canale come 245 FIFO ed il Driver come D2XX Direct come mostrato nelle seguenti immagini:

ftprog_fifo

ftprog_driver

Il driver Virtual COM Port seppur permetta di sostituire senza sforzo vecchie porte seriali nei software dove previste non permette di raggiungere velocità elevate. D2XX offre un’API semplice ed efficiente, disponibile sia in C/C++ sia in linguaggi come C#.

Prossimamente vedremo come realizzare il software lato PC e come programmare la FPGA per realizzare una semplice applicazione di LoopBack (es. un file inviato alla FPGA e ritrasmesso al PC) al fine di verificare il funzionamento del tutto.

Vi lascio per il momento solamente un’altra immagine..

sw

A presto

sabato 15 febbraio 2014

Introduzione ad ASF (ottava parte) – SPI

Al livello più basso nei microcontrollori XMega per utilizzare il supporto hardware ad SPI abbiamo a disposizione per ogni porta SPI i seguenti registri: Control (CTRL), Interrupt Control (INTCTRL), STATUS e DATA, tutti adeguatamente documentati nel datasheet del microcontrollore.

Possiamo accedere ad esempio ai registri della porta SPI C tramite SPIC_CTRL, SPIC_INTCTRL, SPIC_STATUS ed SPIC_DATA o tramite la comoda struttura SPIC (il suffisso C indica la porta SPI) che espone i registri come membri della struttura (es. SPIC.CTRL). Mantenendo un puntatore alla struttura la sintassi diventa (&SPIC)->CTRL.

Come operazione preliminare configuriamo i pin che utilizzeremo tramite SPI (dove nel codice i vari *_PIN sono pin creati ad esempio con l’istruzione IOPORT_CREATE_PIN come visto negli articoli precedenti).

config pin

Nella modalità Master è necessario mantenere il pin SS ad un livello logico alto per evitare che il modulo pensi che un altro master voglia prendere il controllo del bus (bus contention).

Se lavorassimo a basso livello come prima cosa dovremmo configurare il registro CTRL del modulo SPI.

ASF per la sua configurazione ci mette a disposizione diverse funzioni: spi_master_init, spi_master_setup_device ed spi_enable.

config code

spi_master_init abilita il clock al modulo SPI e imposta la modalità SPI a Master Mode

spi_master_setup_device imposta la modalità SPI scelta (convenzioni di comunicazione come ad esempio MODE_0 elencate nel datasheet) e la velocità di clock della comunicazione (nell’esempio 1 MHz).

Nota Bene: Da notare che nell’XMega utilizzato la struttura spi_device_conf passata per riferimento non viene di fatto utilizzata, così come l’ultimo parametro select_id che viene semplicemente impostato a zero, probabilmente per compatibilità con versioni precedenti della libreria la funzione ha mantenuto questi parametri.

spi_enable abilita il modulo SPI, è il passaggio finale della configurazione.

Attenzione: Inizialmente avere tre metodi diversi per configurare un solo registro (CTRL), con tanto di parametri inutilizzati, può rendere difficile comprendere l’utilizzo del modulo SPI di ASF.

Una volta configurato il modulo è possibile inviare dei dati al dispositivo slave con le funzioni: spi_select_device, spi_write_packet e spi_deselect_device

write

Dove spi_device_conf è la struttura creata in precedenza, che ha come unico scopo il mantenimento del pin di abilitazione del dispositivo slave.

spi_select_device porta a low tale pin per abilitare l’effettiva ricezione da parte del dispositivo slave

spi_write_packet invia una sequenza di bytes (nell’esempio 3 bytes: 1, 2 e 3) occupandosi di attendere il completamento della trasmissione di ogni byte prima di procedere all’invio del successivo (a differenza di spi_write_single che invia un singolo byte ma non attende il completamento dell’invio). Sostanzialmente l’invio di un byte corrisponde alla scrittura del registro DATA del modulo SPI e l’attesa nel controllo del registro STATUS.

spi_deselect_device porta ad high il pin di abilitazione del dispositivo slave per la sua disabilitazione.

Oltre alla sola istruzione spi_write_packet possono essere inserite anche ulteriori letture o scritture prima di deselezionare il dispositivo. Nel datasheet del dispositivo slave è in genere possibile trovare i dettagli richiesti per l’utilizzo delle sue funzionalità.

Analogamente la lettura di dati dal dispositivo slave avviene tramite la funzione spi_read_packet

read

Dove nell’esempio vengono letti 3 byte dal dispositivo slave, come abbiamo visto scrivendo in effetti dei dati fittizi sul dispositivo slave e attendendo la completa scrittura del byte prima della presentazione del byte successivo. La lettura di un byte comporta la lettura del registro DATA del modulo SPI.

Oltre alla documentazione anche per questo articolo è stato analizzato il codice sorgente del modulo ASF per trarre maggiori informazioni sul funzionamento del modulo di cui sono state riportate le più rilevanti per sopperire alle mancanze della documentazione.

Spero che in questi due articoli si siano chiariti alcuni dubbi, senza la pretesa però di spiegare tutto nei minimi dettagli.

martedì 4 febbraio 2014

Logiche Programmabili: Un possibile percorso per semplici appassionati

Per gli appassionati di elettronica iniziare ad utilizzare le logiche programmabili può essere un passo impegnativo.

Le schede di sviluppo FPGA più recenti offrono molte funzionalità ma necessitano la lettura di centinaia di pagine di documentazione tecnica, la conoscenza di un linguaggio di descrizione dell’hardware come VHDL o Verilog e sono in genere molto delicate. Sono spesso pensate per i professionisti del settore.

Chi non è deciso o non ha molto tempo a disposizione difficilmente farà il passo.

Con questo articolo voglio proporre un possibile percorso per gli appassionati non professionisti dell’elettronica, particolarmente amanti del DIY (Do It Yourself), per scoprire gradualmente le logiche programmabili.

Da dove partire

Prima di iniziare da un potente e costoso FPGA il consiglio è quello di può iniziare da un più semplice CPLD come l’EPM3064 della serie MAX 3000A di Altera. Sebbene un po’ datato e non permetta di realizzare veri e propri sistemi completi può aiutare all’apprendimento del workflow base di sviluppo con lo logiche programmabili.

04022014217

Ecco gli svantaggi / vantaggi principali in una possibile ottica per non professionisti:

Svantaggi:

- Non compatibile con l’ultimissima versione del programma di sviluppo per logiche programmabili Quartus (gratuito nella web-edition), è possibile però utilizzare fino alla versione 13.0 SP1 installabile anche side-by-side con l’ultima versione

- Funzionalità limitate, si realizza in genere solamente semplice logica di contorno

- Programmabilità della memoria interna della CPLD limitata, garantite 100 scritture

Vantaggi:

- Datasheet di meno di 50 pagine: http://www.altera.com/literature/ds/m3000a.pdf

- Tensione di sistema compatibile coi 3.3V ed I/O compatibile coi 5V, tensioni ancora molto diffuse tra gli hobbisty

- Package disponibile in formato PLCC-44, abbinato ad un socket permette la sostituzione immediata del chip in caso di rottura, aspetto importante per chi non è professionista del settore e non vuole comprare una nuova scheda in casi mal fortuiti o di negligenza.

- Non necessita di memoria esterna

- Costo contenuto, all’incirca come un microcontrollore ad 8 bit.

Applicazioni

Alcuni possibili utilizzi della CPLD sono: sostituzione di più IC discreti di logica come ad esempio la serie 7400 con un singolo IC, microcontroller I/O expander, led driver, crosspoint switch matrices, level translator e tanti altri ancora.

Per utilizzare la CPLD non è obbligatoriamente necessario imparare un linguaggio di descrizione dell’hardware, Quartus offre un editor visuale in cui è possibile inserire e collegare virtualmente dei componenti per sostituire velocemente ad esempio porte logiche discrete o IC della serie 7400 di cui si trova già inclusa nel programma una vasta libreria.

schematic editor

Per iniziare a prendere confidenza col programma partire dall’editor visuale può essere una buona idea.

E’ inoltre possibile scegliere arbitrariamente i pin di I/O del proprio design tramite il Pin Planner di Quartus, un enorme vantaggio rispetto agli IC logici discreti tradizionali che può semplificare la realizzazione del PCB nel caso di schede specifiche per la propria applicazione

pin planner

La scheda di sviluppo

Il mercato purtroppo non offre molte schede di sviluppo a basso costo e semplici per questa CPLD in involucro PLCC ed un ostacolo iniziale per gli amanti del DIY può essere progettare una scheda di sviluppo funzionante su cui imparare e poter basare successivamente i propri progetti.

Voglio proporre in questo articolo una scheda realizzabile da appassionati con la tecnica del Toner Transfer, un reference design che permette, assieme ad un programmatore JTAG compatibile con logiche programmabili Altera reperibile su internet per pochi euro, di iniziare a sperimentare.

schematic small

Lo schematico assieme al PCB, scaricabile alla fine dell’articolo, è disponibile nel formato Eagle, particolarmente amico degli hobbisty e gratuito in versione Light.

Lo schema è molto semplice, di facile comprensione a chi ha progettato anche semplici schede con microcontrollori:

- Tutti i pin della CPLD vengono esposti tramite pin header per la prototipazione rapida

- E’ presente un connettore IDC-10 per la programmazione del dispositivo tramite JTAG (come detto precedentemente è necessario il programmatore)

- Il regolatore di tensione (es. un semplice NCP1117LPST33T3G o similare in base alle necessità) fornisce una tensione stabilizzata di 3.3V, il diodo D2 è opzionale e necessario solamente se il carico capacitivo totale alimentato (CPLD + eventuali circuiti collegati alimentati) è superiore ai 50uF, nell’incertezza e visto il costo esiguo del componente è possibile aggiungerlo in ogni caso senza grossi problemi.

- Il cristallo oscillatore, montabile su socket per la sostituzione veloce, permette di realizzare successivamente design sincroni tramite la programmazione del CPLD. E’ importante che il modello scelto sia compatibile coi 3.3V, un cristallo da 50 MHz è in genere adatto per la maggior parte delle applicazioni.

- Il pulsante di Reset (opzionale) fornisce il segnale Global Clear per azzerare i flip-flop all’interno dei propri design

- E’ possibile montare sul socket indistintamente la versione PLCC dell’EPM3064A o della EPM3032A che si distingue solamente per la presenza di minori risorse logiche.

La scheda, non professionale, è pensata dando priorità alla semplicità e al basso costo.

Ecco il rendering 3D della scheda, realizzato col gratuito Eagle3Dcpld dev board

Per semplificare l’autocostruzione la scheda è stata progettata con saldature e connessioni su singola faccia, è necessario solamente realizzare tre ponticelli (collegamenti in rosso nella prima immagine) ed il collegamento sotto il socket tassativamente prima di saldare il socket stesso, altrimenti diventerà poi difficile procedere alla saldatura del ponticello.

A sinistra del pulsante di reset è presente un’aria non densamente occupata, dove in origine era presente un circuito di Pierce per permettere l’utilizzo della scheda con un più economico e facilmente disponibile quarzo. Nel rilasciare la scheda sul blog ho deciso di eliminare questa opzione in quanto non adeguatamente testata e per semplificare il tutto. E’ possibile spostare il connettore JTAG accanto al pulsante e rendere la scheda più compatta o inserire qualche componente utile in tale posizione in base alle esigenze.

Le piste sono larghe anche 10 mils, è quindi necessario utilizzare correttamente la tecnica del toner transfer per creare la scheda senza errori e frustrazioni, stampare tramite laser ad una risoluzione di almeno 1200 DPI su un supporto adeguato ed utilizzare un laminatore (o plastificatore) se non si ottengono buoni risultati con altri metodi.

E’ stato fatto uso di diversi componenti SMD (resistenze e condensatori 1206 e 0805) di semplice saldatura anche con attrezzature non professionali, c’è da porre solamente un pochino di attenzione laddove le piste passino sotto tali componenti per evitare corti circuiti.

Nota: Il PCB necessita di parecchi fori (131), è possibile però modificare senza grandissimi sforzi la scheda sostituendo tutti i componenti foro passante con equivalenti SMD, il socket PLCC smd necessita però di attrezzature in genere non alla portata dell’hobbista.

Il regolatore di tensione può necessitare di un dissipatore o di una maggiore area di dissipazione su PCB, in base alla tensione di ingresso e al consumo totale del circuito. Una stima del consumo precisa può essere fatta tramite lo strumento PowerPlay di Quartus in base al proprio design, dal datasheet il grafico del consumo tipico della CPLD è il seguente:

power

Dove è possibile notare come a frequenze maggiori corrispondano consumi maggiori.

Alternative

Oltre ad Altera esistono anche altri produttori di CPLD tra cui i principali Xilinx e Lattice Semiconductor.

 

Un ringraziamento infine all’amico Pelletta per aver collaborato allo sbroglio del PCB, realizzato e testato la scheda.

Scarica lo schema e la board

Buon divertimento con le logiche programmabili