- No category
advertisement
▼
Scroll to page 2
of 52
Università degli Studi di Padova Facoltà di Ingegneria Corso di laurea triennale in Ingegneria Elettronica TESI DI LAUREA Modulatore di polarizzazione ottico tramite tecnologia LCD in trasmissione STUDENTE Nicolò Zogno RELATORE Prof. Gaudenzio Meneghesso Progetto realizzato presso Adaptica S.r.l Sviluppo di un modulatore di polarizzazione ottica tramite tecnologia LCD in trasmissione INDICE 1 Introduzione 2 Componenti 2.1 Spartan 3A Evaluation Board 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.2 XC3S700A Oscillatore al quarzo Switch meccanici Rotary knob Sitronix ST7066U LCD controller Supertex HV892 3 Progetto Verilog 3.1 Mappa della struttura 3.2 Acquisizione degli input 3.2.1 3.2.2 3.2.3 Progettazione dell'antirimbalzo Decodifica dei segnali fisici Generazione del valore di AMP 3.3 Approfondimento: Wishbone Bus 3.4 Approfondimento: I2C Bus 3.5 Controller I2C 3.5.1 3.5.2 OpenCores I2C Controller (Wishbone Slave) Wishbone Master 3.6 Visualizzazione su display 3.7 Risorse utilizzate 4 Polarizzatore 4.1 Polarizzazione 4.1.1 4.1.2 Classificazione delle onde Onde polarizzate 4.2 Cristalli liquidi 4.3 Cella LCD 5 Test 6 Conclusioni 7 Riferimenti 2 Sviluppo di un modulatore di polarizzazione ottica tramite tecnologia LCD in trasmissione Capitolo 1 INTRODUZIONE L'AZIENDA Il lavoro è stato svolto all'interno dell'azienda Adaptica Srl nell'ambito dello stage formativo previsto nel piano di studi. L'azienda nasce nel febbraio 2009 all’interno di M31, incubatore privato di aziende innovative operante nel settore delle tecnologie dell'informazione. Adaptica raccoglie le scoperte e le tecnologie innovative sviluppate da un gruppo di ricercatori dell'Università di Padova nel campo dell'ottica e dell'optoelettronica. Durante il percorso accademico di ricerca e progettazione, il team si è specializzato nell'integrazione di sistemi di ottica adattiva, in particolare nelle comunicazioni a singolo fotone ottimizzate con specchi deformabili, gli effetti non lineari e gli impulsi ultrabrevi. Adaptica progetta e produce specchi deformabili e dispositivi opto-elettronici per l'ottimizzazione e il miglioramento di sistemi ottici. I componenti ed i sistemi di ottica adattiva di Adaptica rappresentano una soluzione in tutti quei settori in cui l’immagine, ottenuta dai sistemi ottici, deve mantenere nitidezza, fuoco e fedeltà, anche nei dettagli. La tecnologia ed il sistema di lenti sviluppate da Adaptica riducono infatti le distorsioni e le aberrazioni, garantendo immagini più definite e nitide. Questi componenti non solo potenziano le capacità del sistema ottico in cui vengono inseriti, ma risultano essere anche la soluzione di ottica adattiva che, per dimensioni e costi ridotti, meglio si integra in sistemi ottici in via di progettazione, aumentandone così le prestazioni. Le tecnologie utilizzate, la metodologia di assemblaggio ed il costante controllo di produzione garantiscono qualità ed alte perfomance di tutti i prodotti. Attraverso le più moderne tecnologie ottiche, elettroniche e meccaniche Adaptica realizza soluzioni opto-elettroniche all'avanguardia che trovano applicazione nel campo ottico, astronomico, dell'imaging, dell'automazione e delle misure e delle lavorazioni laser. Alcuni dei prodotti di Adaptica 3 Sviluppo di un modulatore di polarizzazione ottica tramite tecnologia LCD in trasmissione IDEA Il sistema complessivo realizza un polarizzatore ottico: nel corso del tirocinio, tuttavia, coerentemente con le competenze del corso di studi, l'attenzione primaria è stata rivolta alla parte di controllo elettronico, che rappresenta il driver al quale viene connesso successivamente l'elemento ottico, ossia la cella LCD che fa da polarizzatore vero e proprio. Una delle possibili applicazioni del prodotto finale potrebbe essere nell'ambito della fotografia, in quanto questo polarizzatore potrebbe essere facilmente integrato nelle fotocamere compatte e controllato attraverso il software interno, ad esempio tramite un menù a video. Il progetto è stato sviluppato come prototipo, allo scopo di validare l'idea di base del polarizzatore elettronico: questo coincide con la prima fase di progetto del prodotto commerciale, che è solo uno studio di fattibilità, ma che non tiene conto di alcuni vincoli che dovranno invece essere rispettati nella versione definitiva. In primo luogo non è stata rispettata alcuna particolare specifica riguardo alle dimensioni, essendo irrilevante qualora si stia analizzando solo la funzionalità complessiva del sistema. Per questo motivo si è potuta utilizzare una scheda di sviluppo per FPGA Spartan 3A senza alcun problema. PROGETTO Per poter mettere in pratica questa idea, si è costruito un driver elettronico costituito dalle seguenti componenti: Scheda di sviluppo Xilinx Spartan 3A Circuito integrato Supertex HV892 alloggiato su un opportuno stampato mentre il polarizzatore ottico in senso stretto è dato da una cella a cristalli liquidi connessa a tale elettronica di controllo. Il chip Supertex HV892 costituisce già di per sé il driver della LCD, tuttavia l'FPGA è necessaria in quanto, una volta programmata, funziona da “ambiente di prova”. Quindi, l'HV892 viene connesso alla Spartan, e da questa viene comandato mediante i vari switch a disposizione dell'utente. In questo modo, la scheda di sviluppo Spartan simula un possibile ambiente di utilizzo, ad esempio una fotocamera, e funziona da interfaccia per l'utente. 4 Sviluppo di un modulatore di polarizzazione ottica tramite tecnologia LCD in trasmissione OBIETTIVI CONSEGUITI Nel corso del tirocinio, sono stati approfondite ed ampliate le conoscenze derivanti dal corso di laurea, riviste naturalmente sotto un profilo più pratico e commerciale; nel corso del progetto infatti si sono utilizzate componenti di vari produttori, pertanto si è dovuto effettuare uno studio delle relative specifiche tecniche allo scopo di garantirne la compatibilità con il resto del sistema. Le competenze conseguite oppure approfondite nel corso del tirocinio sono sostanzialmente: Ambito PROGETTAZIONE ELETTRONICA • Linguaggio di descrizione dell’hardware Verilog al termine del tirocinio ho raggiunto una buona dimestichezza con l’utilizzo di tale linguaggio, prima completamente sconosciuto. Questo studio mi ha permesso di estendere le conoscenze già introdotte nel corso di Laboratorio di Elettronica Digitale, in cui si trattava il linguaggio VHDL • Introduzione allo standard Wishone la conoscenza di questo standard per l’integrazione di blocchi logici è stata fondamentale per potermi servire dei progetti resi disponibili dalla community OpenCores, che si occupa di promuovere l’hardware open source • Introduzione al bus I2C il funzionamento di questo standard di comunicazione estremamente diffuso è stato studiato servendomi del documento ufficiale rilasciato dalla Philips Semiconductors, azienda ideatrice e promotrice di tale bus Ambito ECONOMICO – GESTIONALE • Analisi della concorrenza come attività extra rispetto al progetto del polarizzatore elettronico, e vista la mia curiosità anche verso la parte commerciale della produzione, l’azienda mi ha proposto la redazione di un documento, incluso nel business plan, con lo scopo di confrontare i maggiori concorrenti di Adaptica e fornire una veloce panoramica sulla tecnologia proposta dai diversi produttori di strumenti per l’ottica adattiva (specchi deformabili, correttori di fronte d’onda ecc..). 5 Sviluppo di un modulatore di polarizzazione ottica tramite tecnologia LCD in trasmissione Capitolo 2 COMPONENTI Introduzione Il progetto completo è costituito fondamentalmente da una parte elettronica e da una parte ottica: la parte ottica è data dalla singola cella a cristalli liquidi, mentre la parte elettronica è un insieme di più componenti. Per il pilotaggio della cella ci si è avvalsi di un circuito integrato prodotto dall'azienda americana Supertex, interfacciato mediante bus I2C alla scheda di sviluppo Xilinx Spartan 3A. Di quest'ultima, in particolare modo, sono stati sfruttati i dispositivi di input meccanici (switch, pulsanti, ruote..) e il display integrato, il tutto gestito dall'FPGA Spartan XC3S700A che, una volta programmato, costituisce il blocco logico del progetto. 2.1 - Scheda di sviluppo Xilinx Spartan 3A Trattandosi di un prototipo per studiare la validità del progetto, si è scelta l'implementazione mediante una scheda di sviluppo basata su FPGA: infatti, l'intero progetto, una volta terminate tutte le procedure di test ed ottimizzazione, può essere completamente contenuto in un pcb di dimensioni molto ridotte, grazie all'utilizzo di un microcontrollore in luogo dell'FPGA. Tuttavia, in questa prima fase di progetto, l'utilizzo di una evaluation board come quella della Xilinx è risultata molto più conveniente data la flessibilità offerta: infatti, per prima cosa, l'operazione di programmazione della FPGA tramite USB è molto veloce agevolando quindi le operazioni di debug. Come ulteriore vantaggio, tutto il restante hardware necessario, ad esempio gli switch e il display, è già presente direttamente sulla board. Fig. 2.1 – Xilinx Spartan 3A Porte e componenti della Spartan 3A utilizzate FPGA XC3S700A-FG484 Oscillatore al quarzo a 50 MHz Porta di download JTAG USB LED Switch a ruota Switch a scorrimento Switch a pulsante Display LCD a 16 caratteri x 2 linee Di seguito vengono analizzate alcune di queste componenti, evidenziando le caratteristiche fondamentali, i principi di funzionamento, i loro limiti e gli accorgimenti che sono stati presi in fase di programmazione per consentirne un uso corretto. 6 Sviluppo di un modulatore di polarizzazione ottica tramite tecnologia LCD in trasmissione 2.1.1 – XC3S700A modello package Informazioni su data e lotto di livello di velocità Fig. 2.2 – Xilinx Spartan 3A XC3S700A FPGA 2.1.2 – Oscillatore al quarzo La board include un oscillatore al quarzo che opera alla frequenza di 50MHz, con un margine d'errore di circa 2500Hz. L'uscita di questo componente è un'onda quadra di periodo 20ns, con la quale si sincronizzano la gran parte dei processi dell'FPGA. La frequenza di questo oscillatore è sufficiente a soddisfare tutti i requisiti di velocità dei vari blocchi logici sincroni presenti nel progetto; anzi, in molti casi il problema è stato contrario: infatti si è dovuti ricorrere a dei divisori per ottenere un clock rallentato che si potesse adattare ai limiti di velocità imposti da certe componenti. 2.1.3 – Switch meccanici Gli switch a scorrimento e i pulsanti sono idealmente molto semplici come funzionamento: infatti forniscono in uscita un segnale logico (1bit) che assume valore logico basso quando sono nella condizione di riposo, e diventa valore logico alto quando sono attivi. STATO VALORE LOGICO Inattivo Basso ('0') Attivo Alto ('1') Il problema dei rimbalzi Tuttavia, a causa della non idealità dei componenti, e dei tempi di transizione finiti rappresentati dalla pressione dei tasti da parte dell'utente, tale segnale non è pulito e non si comporta come un gradino. Nel tempo in cui lo switch si trova in una posizione intermedia tra due livelli logici stabili, questo inizierà ad oscillare rendendo i fronti instabili: questa caratteristica può creare problemi qualora vi sia della logica sensibile ai fronti o ai livelli dello switch; ad esempio, se voglio che una determinata variabilie incrementi di uno ad ogni pressione di un pulsante, la presenza dei rimbalzi farà si che ad ogni singola pressione si verifichino molti più incrementi rispetto a quelli desiderati, rendendo impreciso ed imprevedibile il comportamento logico del circuito. 7 Sviluppo di un modulatore di polarizzazione ottica tramite tecnologia LCD in trasmissione transizione ideale transizione reale 0→1 1→0 Fig. 2.3 – Transizioni logiche negli switch senza e con rimbalzo Questo problema può essere ignorato nel caso in cui le aziende produttrici degli switch abbiano già previsto l'inserimento di un antirimbalzo hardware. Tuttavia, i componenti presenti sulla evaluation board non sono dotati di questo sistema, pertanto è compito del progettista introdurre nella FPGA della logica aggiuntiva che corregga questo problema. La soluzione adottata nel progetto viene presentata successivamente nella sezione dedicata ai moduli Verilog. 2.1.4 – Rotary knob (Manopola) Un po' più complesso è il funzionamento della manopola a rotazione: questa è costituita da una una camma che va ad agire su due pulsanti distinti. Il principio fondamentale è che questi pulsanti si attiveranno necessariamente in due momenti distinti, ed a seconda dell'ordine con cui vengono azionati si riesce a dedurre se la rotazione da parte dell'utente sia oraria o antioraria. Dal punto di vista elettronico, questa periferica restituisce due segnali, detti 'A' e 'B', mappati su degli appositi pin della FPGA, che si comportano come nella figura seguente: Fig. 2.4 – Andamento dei segnali A e B durante la rotazione Ognuno di questi segnali indica lo stato di ciascuno dei due pulsanti, ad attivazione sfasata. La figura evidenzia innanzitutto come sia presente anche qui il fenomeno dei rimbalzi. Le due condizioni critiche sono evidenziate in verde e in rosso, e si individua una rotazione di tipo: 8 Sviluppo di un modulatore di polarizzazione ottica tramite tecnologia LCD in trasmissione 1. ORARIO quando il segnale 'A' compie una transizione '0' → '1' mentre il segnale 'B' è stabile a '0' 2. ANTIORARIO quando il segnale 'B' compie una transizione '0' → '1' mentre il segnale 'A' è stabile a '0' 2.1.5 – Sitronix display controller La board include un semplice display a cristalli liquidi che può visualizzare fino ad un massimo di 16 caratteri per ciascuna delle 2 linee. Si tratta di un prodotto economico ed a basse prestazioni, sia per la risoluzione che per il comportamento dinamico, che presenta una frequenza di refresh molto limitata se paragonata a quella dell'oscillatore al quarzo. Tuttavia risulta perfetto per gli scopi del progetto, in quanto viene utilizzato soltanto per dare un breve riscontro scritto sullo stato del sistema. L'interfaccia con il display è costituita da 4 segnali: • • • • LCD_E : è il segnale di enable, che abilita o disabilita il display LCD_DB : è il bus a 8 bit nel quale viaggiano i dati da o verso il display. Può essere anche utilizzato come bus a 4 bit semplicemente agganciando i 4 bit meno significativi a un valore logico alto. LCD_RS : indica se attraverso il bus a 8 bit stanno passando dati o istruzioni di registro LCD_RW : permette di selezionare se si intende effettuare una lettura o una scrittura Prima di poter utilizzare il display è necessario eseguire una sequenza di operazioni con lo scopo di stabilire il protocollo di comunicazione. Il processo richiede alcune decine di millisecondi e va eseguito una volta sola dopo l'accensione della evaluation board. Sequenza di inizializzazione del display 1. Attendere 15 ms dopo la configurazione dell'FPGA. (circa 750.000 cicli di clock a 50Mhz) 2. Scrivere LCD_DB<7:4>=0x3, e LCD_E = '1' per 12 cicli di clock. 3. Attendere almeno 4.1 ms (circa 205.000 cicli di clock) 4. Scrivere LCD_DB<7:4>=0x3, e LCD_E = '1' per 12 cicli di clock. 5. Attendere almeno 100 μs (circa 5.000 cicli di clock) 6. Scrivere LCD_DB<7:4>=0x3, e LCD_E = '1' per 12 cicli di clock. 7. Attendere almeno 40 μs (circa 2.000 cicli di clock) 8. Scrivere LCD_DB<7:4>=0x3, e LCD_E = '1' per 12 cicli di clock. 9. Attendere almeno 40 μs (circa 2.000 cicli di clock) All'interno del controller Sitronix sono presenti 3 regioni di memoria, alle quali si può accedere soltanto ad inizializzazione compiuta: • • • DD RAM CG ROM CG RAM 9 Sviluppo di un modulatore di polarizzazione ottica tramite tecnologia LCD in trasmissione DD RAM (Display Data Ram) Questa memoria contiene 80 locazioni individuate ciascuna da un indirizzo esadecimale; ognuna di esse contiene un carattere del display, tuttavia soltanto 32 degli 80 totali vengono visualizzati. Gli altri vengono tenuti in memoria e possono comparire, ad esempio, qualora si effettui uno scorrimento del testo; in particolare, la prima linea del display visualizza i caratteri contenuti nelle locazioni da 00 a 0F, mentre la seconda da 40 a 4F. 10 ... 27 2 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 ... 67 ... 40 1 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 A B C D E F 9 10 11 12 13 14 15 16 17 CG ROM (Character Generator Rom) Si tratta di una memoria in sola lettura che contiene la mappatura di tutti i possibili caratteri visualizzabili a display. Come mostrato in figura, quando si vuole visualizzare un determinato carattere nel display, non occorre far altro che eseguire l'algoritmo di scrittura caricando il codice binario a 8 bit del simbolo nella locazione di memoria DDRAM desiderata. Ad esempio, se voglio visualizzare il simbolo “@” in basso a destra nel display, vado a scrivere l'indirizzo relativo a tale simbolo, cioè “01000000”, nella locazione di memoria DDRAM “4F”. Fig. 2.5 – Mappatura dei simboli visualizzabili CG RAM (Character Generator Ram) Questa porzione di memoria non è stata utilizzata nel progetto. Consente all'utente di memorizzare 8 simboli aggiuntivi (custom), identificandoli con una matrice di 8x5 che corrisponde graficamente alla matrice di pixel che costituiscono un carattere. Per ogni posizione, viene scritto un '1' dove si vuole che il corrispondente pixel sia acceso, e uno '0' dove lo si vuole spento. 10 Sviluppo di un modulatore di polarizzazione ottica tramite tecnologia LCD in trasmissione 2.2 – Supertex HV892 (Liquid lens driver) Per realizzare la parte relativa al pilotaggio della cella LCD, il progetto si avvale del chip HV892 prodotto dalla Supertex. Questo dispositivo è stato originariamente concepito come driver per lenti liquide: il suo scopo sarebbe dunque quello di regolare la forma di una lente agendo sulla sua concavità (menisco). Tuttavia è lecito utilizzare tale dispositivo anche per i nostri scopi: infatti, sia la lente liquida che la cella LCD si comportano come un carico capacitivo, al quale vogliamo applicare una differenza di potenziale tra le armature per modificare il campo elettrico. L'unico accorgimento da tenere presente è quello che la capacità dell'LCD deve rientrare nel range fornito dalle specifiche, vale a dire al massimo 200pF. Fig. 2.6 – Equivalenza tra le strutture capacitive dei due dispositivi Un primo approccio a scatola chiusa del dispositivo consente di capire meglio come sia stato integrato all'interno del sistema. Di seguito vengono descritti i pin presenti sull'integrato: VIN Tensione di ingresso VDD Tensione esterna di riferimento per il bus I C SCL Bus I C : linea di clock SDA Bus I C : linea dati GND1 Massa per il convertitore DC-DC GND2 Massa per il resto del circuito HV Alta tensione in uscita dal boost integrato OUT1 Uscite del driver: vanno connesse alle due armature della capacità di carico OUT2 2 2 2 Senza considerare alimentazioni e masse, e tenendo solo i segnali di dati il funzionamento del chip è il seguente: il dispositivo che fa da host pilota l'HV892 tramite l'interfaccia I2C (ingressi SDA, SCL) trasmettendogli un codice univoco che corrisponde ad una tensione ben precisa ai capi della capacità di uscita, che è poi la cella LCD. L'interfaccia I2C del chip può funzionare a 3 livelli di velocità: • Normal: 100Kbps • Fast: 400Kbps • High speed: 3.5Mbps 11 Sviluppo di un modulatore di polarizzazione ottica tramite tecnologia LCD in trasmissione Vista la ridotta mole di dati che deve essere trasmessa nel presente progetto, si è deciso di predisporre l'integrato per il funzionamento a 100Kbps. SCHEMA A BLOCCHI Fig.2.7 - Schema a blocchi del circuito integrato Supertex HV892. Nello schema precedente il blocco host controller comprende il pcb su cui è alloggiato il chip e l'evaluation board stessa. Il dispositivo host invia un comando, preventivamente codificato secondo il protocollo I2C, tramite le due linee SDA e SCL, e viene ricevuto dal blocco control. Questo si occupa di decodificarlo e trasformarlo da segnale seriale ad array di 8 bit: tale codice, che viene contrassegnato come AMP, è quello che mi consente di regolare l'ampiezza dell'onda quadra in uscita. Poiché si tratta di un vettore ad 8 bit, ci permette di tarare l'uscita in 28 = 256 stati differenti secondo la seguente tabella: Codice AMP (esadecimale) Descrizione 00H Modalità STANDBY (risparmio energetico) L'intero dispositivo si porta ad uno stato di basso consumo, in cui il convertitore boost, il ponte H e l'oscillatore sono spenti, mentre i pin di uscita vengono connessi a massa. 01H ÷ FFH Entro questo range di valori del vettore AMP l'ampiezza dell'uscita viene modulata. La ricezione di uno qualsiasi tra questi 255 valori comporta automaticamente l'interruzione dalla modalità di risparmio energetico. 12 Sviluppo di un modulatore di polarizzazione ottica tramite tecnologia LCD in trasmissione La modulazione dell'ampiezza di uscita avviene in 255 differenti livelli con passo costante, secondo l'equazione VOUT = 9.8 V + AMP · 205 mV (RMS) dove VOUT è l'uscita del convertitore DAC, ottenuta combinando il segnale AMP con l'uscita del convertitore boost DC/DC. Come si può notare, tale VOUT va direttamente sul carico poiché rappresenta il valore logico alto del ponte H all'ultimo stadio, realizzato il logica CMOS statica. PONTE H Ridisegnando il ponte H presente nello schema a blocchi precedente in una forma più chiara ottengo il seguente circuito: VOUT IN OUT1 OUT2 IN Fig. 2.8 – Ponte H realizzato in logica CMOS Ciò non è altro che una coppia di inverter con gli ingressi complementari, le cui uscite sono collegate ai capi opposti della capacità di carico, che nello specifico del progetto è la cella LCD. É fondamentale notare, prima di tutto, che il source dei pMOS è collegato alla VOUT, cioè la tensione fornita dal convertitore DAC: questo significa che, quando VOUT viene portata ad una delle due uscite OUT1 oppure OUT2 per l'accensione del relativo pMOS, in essa è inclusa automaticamente anche l'informazione che originariamente era stata ricevuta dal bus I2C (cioè il valore AMP che rappresenta l'ampiezza dell'onda quadra generata). Tale circuito può assumere solamente due stati (Fig. a pagina seguente). Quando IN assume valore logico basso, il pMOS di sinistra si accende aprendo un cammino conduttivo tra OUT1 e VOUT : in questo modo, dopo un tempo finito e non nullo richiesto per caricare/scaricare le capacità parassite, l'uscita si porterà al valore VOUT. Allo stesso modo, si accende anche l'nMOS di destra che, sempre dopo aver caricato o scaricato le capacità parassite, porta OUT2 a massa. Quando al contrario, IN assume valore logico alto, si verifica la situazione complementare rappresentata in figura B. 13 Sviluppo di un modulatore di polarizzazione ottica tramite tecnologia LCD in trasmissione IN = 0 , IN = 1 OUT1 – OUT2 = VOUT IN = 1 , IN = 0 OUT1 – OUT2 = -VOUT Fig. A Fig. B L'utilità di questo circuito si può intuire proprio da questo fatto: partendo da una tensione VOUT, positiva, e avendo a disposizione l'ingresso IN, che può assumere due valori alto e basso ma comunque anch'essi positivi, si è in grado di applicare al carico una tensione con il segno voluto, cioè ± VOUT. Nel caso specifico del chip Supertex HV892, il ponte H è collegato ad un oscillatore con frequenza fOUT nel range 1÷2 kHz, che genera un'onda quadra di ampiezza 2·VOUT picco-picco. Fig.2.9 – Forma d'onda generata in uscita del chip, ai capi del carico. 14 Sviluppo di un modulatore di polarizzazione ottica tramite tecnologia LCD in trasmissione Capitolo 3 PROGETTO VERILOG Introduzione In questa sezione verrà analizzata tutta la logica interna all'FPGA, che è stata descritta e sviluppata mediante linguaggio HDL. La scelta del linguaggio è ricaduta sul Verilog, soprattutto per coerenza ed omogeneità con i precedenti progetti sviluppati da Adaptica. Questa fase di progettazione è stata assistita dal software Xilinx ISE 11 Webpack, in dotazione con la evaluation board. Si tratta di un ambiente di sviluppo integrato che funziona da: editor di testo, tool di simulazione, sintetizzatore di linguaggio ed interfaccia con la board. 3.1 – Mappa della struttura La logica del progetto è suddivisa in diversi blocchi interconnessi secondo una gerarchia: questi blocchi sono detti entities, poichè ciascuno di essi realizza in maniera indipendente una precisa funzionalità. Questo sistema si rivela molto produttivo ai fini della progettazione, semplificandola e rendendola più chiara, dal momento che consente di lavorare in maniera compartimentata, concentrandosi volta per volta nello sviluppo di una singola porzione della funzionalità complessiva. Ciò che si ottiene è un progetto che include al suo interno diversi sotto-progetti fusi insieme tra loro. Questa suddivisione è puramente concettuale, nel senso che al momento della sintesi il software della FPGA Xilinx provvede a tradurre queste strutture astratte in un insieme di interconnessioni e porte logiche elementari, perdendo le informazioni sulle varie entities che si erano create in fase di realizzazione. La struttura tipica prevede la presenza di un modulo principale, detto top; questo viene posto al livello gerarchico più alto, caratteristica che gli conferisce due importanti funzioni: 1. i suoi ingressi e uscite sono quelli diretti all'esterno, pertanto possono essere mappati sui pin fisici dell'FPGA 2. il top è quel modulo che si occupa di richiamare e interconnettere le varie entities a livello gerarchico inferiore: tale operazione viene detta istanza 15 Sviluppo di un modulatore di polarizzazione ottica tramite tecnologia LCD in trasmissione Nello specifico, il progetto di Nix è così strutturato: core_logic_top.v (TOP) ▪ LCD_top.v (DISPLAY) − LCDEncoder.v − Bin2BCD.v − clock_slower2.v − LCDDisplay.v − LCDInterface.v ▪ · LCDcntrl.v · LCDDriver.v knob_interface.v (INTERFACCIA) − clock_slower.v − debounce.v − knob.v − ampgen.v ▪ controller_top.v (WISHBONE MASTER) ▪ i2c_master_top.v (WISHBONE SLAVE) − i2c_master_byte_ctrl.v − i2c_master_bit_ctrl.v Nella seguente tabella viene riportato un rapido riassunto della funzione svolta dai blocchi più importanti: ENTITIES PRINCIPALI TOP (core_logic_top.v) DISPLAY (LCD_top.v) DESCRIZIONE Si trova al livello gerarchico più elevato: la sua funzione principale è quella di connettere i vari blocchi inferiori e di interfacciarsi con i pin fisici. A tale scopo gli viene associato un file con lo stesso nome ma di estensione “.ucf” , che permette di specificare a quali pin della FPGA debbano essere associati gli ingressi e le uscite del progetto. In questo caso il modulo top è praticamente vuoto, cioè non contiene alcuna logica aggiuntiva oltre alle consuete istanze dei moduli e a 2 buffer tristate che pilotano le linee SDA e SCL. Questa entity si occupa della proiezione sul display delle informazioni sullo stato del sistema. Ѐ più articolata perchè contiene a sua volta diversi moduli: • un driver che provvede ad inizializzare e pilotare il display • un rallentatore di clock specifico per il display • un codificatore di stringhe. Il driver è il nucleo di questa entity, quello che (continua..) 16 Sviluppo di un modulatore di polarizzazione ottica tramite tecnologia LCD in trasmissione effettivamente comunica con il display; il rallentatore di clock è necessario poiché si tratta di un LCD economico a basse prestazioni, e non sarebbe in grado di funzionare ad una frequenza elevata come quella dell'oscillatore interno alla board, che lavora a 50MHz. Il codificatore di stringhe è la entity che si occupa di tradurre il dato che voglio visualizzare in una forma compatibile con l'input del driver: per svolgere questa operazione ci si serve anche di un convertitore binario → BCD, che consente di gestire agevolmente le singole cifre di un numero decimale. INTERFACCIA (knob_interface.v) WISHBONE MASTER (controller_top.v) WISHBONE SLAVE (i2c_master_top.v) Questa sezione del codice è adibita alla decodifica e alla corretta interpretazione dei segnali di input provenienti dai pin fisici dello switch a ruota. In aggiunta al modulo principale, che deve rilevare le rotazioni e stabilire se siano orarie, antiorarie, oppure se la ruota sia stata premuta al centro, sono presenti altre caratteristiche: prima di tutto è di fondamentale importanza il sistema antirimbalzo, che limita i danni provocati dalle transizioni non ideali dei segnali fisici provenienti dai sistemi di input meccanici. Oltre a questo, nella entity interfaccia è inglobato anche un blocco logico che genera il valore di AMP, inviato successivamente al dispositivo slave tramite I2C. Il blocco Wishbone Master coordina il rispettivo Slave comunicandoli quali operazioni effettuare: nel caso specifico del nostro progetto, lo Slave deve solo effettuare scritture nell'I2C bus ogni volta che si aggiorna il valore di AMP. Pertando questa entity è stata implementata con una macchina a stati finiti che esegue un ciclo di scrittura sullo slave ogni volta che AMP cambia. Questo modulo, pur essendo lo slave rispetto all'interfaccia Wishbone, si comporta da master rispetto al protocollo I2C. Ѐ stato fornito pronto all'uso da OpenCores, community con lo scopo di condividere hardware open source, e promotore del bus Wishbone. Fig. 3.1 – Schema riassuntivo delle varie entities 17 Sviluppo di un modulatore di polarizzazione ottica tramite tecnologia LCD in trasmissione 3.2 – Acquisizione degli input Il blocco gerarchico più elevato di questa sezione è “knob_interface.v”: analizzandolo per prima cosa a scatola chiusa è possibile farsi un'idea del suo compito e del comportamento che ha: //Dichiarazione Verilog module knob_interface( input ROTA, input ROTB, input ROTC, input MODE, input RESET, input CLOCK, output [7:0] AMP, output REFRESH ); Il modulo knob_interface riceve in ingresso 4 input provenienti da pin dell'FPGA associati a switch meccanici: MODE = corrisponde allo switch a scorrimento SW0, che consente di selezionare tra la modalità di funzionamento continua oppure a 2 livelli, come verrà successivamente spiegato ROTA, ROTB = sono i segnali provenienti dalla manopola girevole, e sono direttamente dipendenti dalla rotazione della stessa ROTC = proviene anch'esso dalla ruota, e indica se questa è stata premuta al centro oppure no mentre all'uscita ci sono soltanto 2 segnali: AMP = è un bus ad 8 bit che può variare da 0 a 255, vale a dire gli stati che può assumere il polarizzatore REFRESH = tale segnale vale normalmente '0', ad eccezione di quando viene azionato uno degli switch meccanici, poiché si genera un impulso (strobe) che viene poi propagato a tutti i blocchi logici successivi affinchè possano aggiornare il proprio stato (ad esempio, ogni volta che si rinnova il valore di AMP, si genera uno strobe che permette al display di aggiornare il valore visualizzato) Scendendo di un livello gerarchico si trovano tutte le altre sotto-entity che costituiscono questo blocco, e che combinati insieme ne vanno a costruire la funzionalità complessiva. Si è utilizzata la entity di tipo debounce per realizzare il sistema antirimbalzo dei pulsanti: poiché il rimbalzo riguarda ogni switch meccanico, è stato necessario istanziare una copia del modulo per ogni dispositivo (4 copie). Poi ancora si trova clock_slower, che fornisce una versione rallentata del clock di sistema, utilizzata dall'antirimbalzo. 18 Sviluppo di un modulatore di polarizzazione ottica tramite tecnologia LCD in trasmissione L'entity knob invece è quella che realizza la decodifica effettiva dei segnali verificando se l'utente stia compiendo una rotazione della manopola in senso orario oppure antiorario. Il blocco ampgen svolge una funzione che non rientra propriamente nella categoria dell'interfaccia, tuttavia si è scelto di inserirlo qui per evitare di creare un ulteriore blocco a sé stante che avrebbe frammentato eccessivamente il progetto. Fig. 3.2 – Rappresentazione “esplosa” della entity “knob_interface” 3.2.1 – Progettazione dell'antirimbalzo La soluzione più semplice, veloce e funzionale per implementare un antirimbalzo è stata quella di sintetizzare un latch che campioni il segnale di ingresso (contaminato dai rimbalzi) all'uscita soltanto sul fronte di salita di un clock rallentato, restituendo così un segnale praticamente pulito. Il codice Verilog che realizza questo blocco, estremamente compatto, è riportato di seguito: module debounce( input in, input slowclock, output reg out ); always @ (posedge slowclock) out <= in; endmodule 19 Sviluppo di un modulatore di polarizzazione ottica tramite tecnologia LCD in trasmissione La generazione della versione di clock rallentata slowclock è avvenuta nel blocco clock_slower precedentemente citato, tramite il seguente codice: module clock_slower( input clk, input reset, output slow_clk ); reg[15:0] contatore; assign slow_clk = contatore[15]; always @ (posedge clk or posedge reset) if (reset) contatore <= 0; else contatore <= contatore + 1; endmodule Il principio di funzionamento è molto semplice: il vettore a 16 bit contatore viene incrementato di un unità ad ogni fronte positivo del clock di sistema. L'uscita slow_clock non è altro che il bit più significativo di contatore, tant'è che viene effettuata un'assegnazione in continua. Infatti, per un generico vettore n-dimensionale, che consente 2n combinazioni, il bit più significativo vale '0' per i primi 2n-1 incrementi, mentre vale '1' per i successivi 2n-1. Il settaggio critico per il corretto funzionamento del sistema antirimbalzo (blocco slowclock + blocco debounce) è dato appunto dalla scelta del numero corretto di bit per il vettore contatore. Dopo alcune prove pratiche, si è scelto come valore migliore 16 bit. Questo si è rivelato il compromesso migliore tra affidabilità e prontezza, dal momento che • scegliendo valori minori di 16 il sistema presentava ancora problemi di rimbalzo • scegliendo valori maggiori, il sistema non era in grado di catturare tutti gli input costringendo l'utente a ripremere più volte gli switch. 3.2.2 – Decodifica dei segnali fisici In questo blocco logico vengono analizzati i segnali rota e rotb provenienti dalla manopola girevole, determinando se si tratta di una rotazione oraria oppure antioraria. Questa informazione viene poi conservata e portata all'uscita tramite il registro direction, che vale '0' se si tratta di una rotazione oraria oppure '1' se la rotazione è antioraria. A livello di linguaggio Verilog la soluzione è stata la seguente: 1 2 3 4 5 6 7 module knob( input clock, input reset, input rota, input rotb, output reg next, output reg direction 20 Sviluppo di un modulatore di polarizzazione ottica tramite tecnologia LCD in trasmissione 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 ); reg oldmerged; assign merged = rota | rotb; always @ (posedge clock) if (reset) begin oldmerged <= 0; next <= 0; direction <= 0; end else begin oldmerged <= merged; if (oldmerged == 0 && merged == 1) begin next <= 1; if (rota == 1 && rotb == 0) direction <= 0; if (rota == 0 && rotb == 1) direction <= 1; end else next <= 0; end endmodule Il primo passo è stato quello di assegnare a merged la funzione logica OR tra i due segnali rota e rotb. oraria antioraria A B A+B Fig. 3.3 – OR logico tra A e B NB: il grafico va letto da sinistra a destra nel caso di rotazione oraria, mentre da destra a sinistra nel caso di rotazione antioraria: questo spiega perchè ciascuno scatto della ruota sia associato ad un fronte positivo del segnale A OR B. Come visibile nella figura 3.3, questo segnale ausiliario risulta essere molto utile, poiché ogni suo fronte di salita corrisponde ad uno scatto della manopola girevole (anche se non ci informa in alcun modo sulla direzione della rotazione!). Sulla base di questa osservazione, il passo successivo è stato quello di inserire un costrutto logico che vada a verificare lo stato di rota e rotb ad ogni fronte positivo di merged. Quest'operazione è situata tra le righe 28 e 31 del codice presentato, e la sua validità può essere facilmente verificata riferendosi nuovamente alla figura 3.3. 21 Sviluppo di un modulatore di polarizzazione ottica tramite tecnologia LCD in trasmissione In sintesi, le uscite di questo blocco sono: • next, un segnale impulsivo che si attiva ad ogni scatto della manopola • direction, che vale '0' quando la rotazione è oraria e '1' quando antioraria 3.2.3 – Generazione del valore di AMP Come già detto in precedenza, questo modulo non rientra propriamente nel blocco di acquisizione degli input: il suo compito è quello di mandare in uscita un valore binario a 8 bit, aggiornandolo in accordo con gli input ricevuti. Di default, all'inizializzazione, il valore AMP è pari a 00xH, e corrisponde allo stato di basso consumo energetico dell'integrato Supertex HV892. La entity ampgen è stata programmata in modo che il valore AMP di uscita risponda agli input con il seguente criterio: • cresce ruotando la manopola in senso orario • diminuisce ruotando in senso antiorario • ritorna al valore di default premendo la ruota al centro • il passo di incremento/decremento viene cambiato a seconda dello stato dello switch a scorrimento La parte di codice è molto semplice da interpretare dal momento che fa uso esclusivamente di costrutti condizionali. 1 module ampgen( 2 input clock, 3 input next, 4 input reset, 5 input mode, 6 input left, 7 input rotc, 8 output reg [7:0] AMP_value, 9 output reg refresh 10 ); 11 12 reg [7:0] temp_amp; 13 reg mode_copy; 14 15 always @ (posedge clock or posedge reset) 16 if (reset) 17 begin 18 temp_amp[7:0] <= 8'h00; 19 AMP_value <= 8'h00; 20 refresh <= 0; 21 end 22 else 23 begin 24 refresh <= 0; 25 26 //Non appena attivo il modo 1 mi porto in standby 27 mode_copy <= mode; 28 if (mode_copy == 0 && mode == 1) 29 begin 30 temp_amp[7:0] <= 8'h00; 31 AMP_value <= 8'h00; 32 refresh <= 1; 33 end 34 if (mode_copy == 1 && mode == 0) 35 begin 36 refresh <= 1; 22 Sviluppo di un modulatore di polarizzazione ottica tramite tecnologia LCD in trasmissione 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 end 95 endmodule end //MODE 0 = modalità continua if (next == 1 && mode == 0) begin refresh <= 1; if (left == 0 && temp_amp != 8'hFF) begin temp_amp <= temp_amp + 1; AMP_value <= temp_amp + 1; end if (left == 1 && temp_amp != 8'h00) begin temp_amp <= temp_amp - 1; AMP_value <= temp_amp - 1; end end else begin if (rotc) begin refresh <= 1; temp_amp[7:0] <= 8'h00; AMP_value <= 8'h00; end end //MODE 1 = modalità 2 livelli if (next == 1 && mode == 1) begin refresh <= 1; if (left == 0 && temp_amp == 8'h00) begin temp_amp <= `STEP1; AMP_value <= `STEP1; end if (left == 0 && temp_amp == `STEP1) begin temp_amp <= `STEP2; AMP_value <= `STEP2; end if (left == 1 && temp_amp == `STEP2) begin temp_amp <= `STEP1; AMP_value <= `STEP1; end end else begin if (rotc) begin refresh <= 1; temp_amp[7:0] <= 8'h00; AMP_value <= 8'h00; end end 23 Sviluppo di un modulatore di polarizzazione ottica tramite tecnologia LCD in trasmissione 3.3 – Approfondimento: Wishbone Bus Wishbone è un sistema di interconnessione tra più moduli funzionali (detti core) appartenenti a uno stesso circuito integrato: la sua ideazione risponde all'esigenza dei vari progettisti di poter condividere porzioni di descrizione hardware senza difficoltà di integrazione e compatibilità. La sua applicazione trova particolare utilità nel campo dei dispositivi logici programmabili (PLD), dove l'hardware può essere condiviso sotto forma di linguaggio descrittivo dell'hardware (HDL), anziché sotto forma di schematici. Infatti, mentre uno schematico descrive un dispositivo già a livello fisico e realizzativo, un codice HDL (Verilog, VHDL..) è solo una descrizione comportamentale della funzione che il circuito andrà a svolgere, e può essere reso specifico per una determinata architettura soltanto dopo un processo di sintesi: quindi il codice HDL gode di un'elevatissima portabilità e riutilizzabilità. Il Wishbone nasce per rendere più semplice l'inserimento dei core di terza parte nei propri circuiti integrati, rendendosi particolarmente attraente in ambito open source. Si dice pertanto che Wishbone è uno standard per l'integrazione System-On-Chip (SOC). Il concetto del Wishbone non va confuso con quello dell'I2C Bus: mentre l'I2C è uno standard di comunicazione tra circuiti distinti, il Wishbone riguarda moduli funzionali nello stesso circuito. PRECISAZIONE • Wishbone = bus interno ad uno stesso circuito stabilisce delle convenzioni su nomi e funzioni dei segnali in uscita e in ingresso dai vari moduli funzionali in modo da poterli “agganciare” facilmente al resto del progetto • I2C = bus di comunicazione tra integrati distinti si tratta di un protocollo di comunicazione che impone un linguaggio preciso da rispettare per il trasferimento di dati tra più integrati: in questo modo si possono interfacciare componenti di produttori diversi Fig. 3.4 – Interfaccia Wishbone tra due Core 24 Sviluppo di un modulatore di polarizzazione ottica tramite tecnologia LCD in trasmissione I vantaggi più importanti derivanti dall'impiego dell'interfaccia Wishbone sono: 1. Diffusione l'utente può integrare direttamente blocchi logici sviluppati da altri progettisti 2. Ottimizzazione non c'è bisogno di logica collante (glue logic) per rendere compatibile l'hardware esterno 3. Tempo si possono riutilizzare moduli funzionali di terza parte con un approccio a “scatola chiusa”, senza dover spendere tempo ad addentrarsi nei loro dettagli realizzativi Nella pratica il Wishbone si traduce in un insieme di regole e convenzioni riguardanti il modo in cui un core si deve interfacciare con il resto della logica che lo circonda. Questo comprende: • nomenclatura unificata dei segnali esterni: tutte le connessioni del modulo devono attenersi a un preciso formato; ad esempio il nome wb_rst_i sta ad indicare 1. che si tratta di un segnale compatibile con il Wishbone (prefisso wb_), 2. che ha la funzione di reset sincrono(nome rst), 3. che si tratta di un segnale in ingresso (suffisso _i) • documentazione: in essa è viene descritto il modulo, con particolare attenzione sulla sua funzionalità, impiego e sulle dimensioni dei vari bus; questo per favorire la condivisione e il riutilizzo del core stesso, scopo primario del Wishbone Nel caso specifico di questo progetto, si è potuto riscontrare in termini pratici l'utilità del protocollo Wishbone. Infatti, per la gestione della linea I2C, si è fatto uso di una entity di terza parte già sviluppata e testata. Il fatto che aderisse alla convenzione Wishbone (“Wishbone Compliant”) ha reso il processo di integrazione molto più agevole dato che, anche con una scarsa comprensione del suo funzionamento interno, è stato sufficiente considerare gli ingressi e le uscite verificandone il comportamento attraverso il documento delle specifiche Wishbone. 25 Sviluppo di un modulatore di polarizzazione ottica tramite tecnologia LCD in trasmissione 3.4 – Approfondimento: I2C Bus 3.4.1 - Introduzione L' I2C è uno standard di trasmissione dati seriale tra circuiti integrati: questo permette di fare interagire tra loro dispositivi allocati nello stesso circuito stampato, anche se provenienti da diversi produttori, purché siano omologati a questo standard. Intuitivamente, l'idea è quella che i vari produttori insegnino ad ogni dispositivo a parlare la stessa lingua, in modo che una volta collegati possano dialogare nativamente, senza nessun interprete. I principali vantaggi di questa soluzione sono: • • interconnessioni semplificate maggiore flessibilità INTERCONNESSION SEMPLIFICATE L'I2C è un sistema di trasmissione seriale a 2 canali: un canale dati e un canale clock. Questa caratteristica ha diversi vantaggi a livello di complessità strutturale: prima di tutto per quanto riguarda l'occupazione fisica, poiché il numero di pin nei circuiti integrati e di piste nei circuiti stampati risulta minimizzato. Inoltre si guadagnano ulteriori spazio e risorse dall'eliminazione della cosiddetta glue logic, letteralmente logica collante, che si occupa di coordinare e gestire la comunicazione tra dispositivi con interfacce non unificate; ne sono un esempio tutti i decodificatori di indirizzo. Integrato (Produttore A) Integrato (Produttore B) I 2C BUS Circuito stampato 2 Fig. 3.5 – Universalità dell'I C Bus MAGGIORE FLESSIBILITÀ L'adozione dello standard I2C nei propri sistemi garantisce oltretutto più semplicità per aggiornamenti e modifiche futuri: infatti se voglio sostituire un integrato più recente non sarà necessario riprogettare l'intero sistema. Questo è possibile perché tutti i dispositivi I2C hanno sempre gli stessi due canali e pertanto se voglio aggiornare un determinato dispositivo non è necessario riprogettare tutto il sistema ma basta sostituirlo direttamente. Supponiamo, ad esempio, di voler aggiornare un dispositivo integrato in un sistema che non adotti la convenzione I2C: nel caso in cui il numero o la funzionalità dei pin nel package sia variato non c'è più compatibilità con il resto del circuito, e va rivisto integralmente. Si dice pertanto che un sistema basato su interfaccia I2C è indipendente dai dispositivi connessi. 26 Sviluppo di un modulatore di polarizzazione ottica tramite tecnologia LCD in trasmissione Fig. 3.6 – Indipendenza dai dispositivi connessi 3.4.2 - Funzionamento Il bus I2C è costituito fisicamente da due linee, SDA e SCL: i dati effettivi passano attraverso la linea SDA (serial data line) in successione temporale scandita dai fronti del clock presente nella linea SCL (serial clock line). Come regola generale la linea SDA viene considerata valida solamente durante il livello HIGH (valore logico 1) della linea SCL, e di conseguenza eventuali commutazioni del suo valore devono verificarsi solo durante lo stato LOW di SCL. Clock alto '1' (dato stabile) Clock basso '0' (commutazione dato consentita) Fig. 3.7 – Comportamento della linea SDA in funzione della SCL CONDIZIONI DI INIZIO E FINE TRASMISSIONE Per delimitare una ben precisa sessione di trasmissione dati, il protocollo I2C prevede l'utilizzo di due condizioni univoche di inizio e fine (START e STOP) così definite: • START se SDA ha una transizione 1 → 0 mentre SCL è stabile a 1 • STOP se SDA ha una transizione 0 → 1 mentre SCL è stabile a 1 Queste due condizioni rappresentano le uniche eccezioni consentite alla regola sulla validità dei segnali in quanto prevedono commutazioni di SDA quando SCL è alto. 27 Sviluppo di un modulatore di polarizzazione ottica tramite tecnologia LCD in trasmissione START STOP Fig. 3.8 – Condizioni di start e stop della trasmissione NB In alternativa è possibile anche la condizione di repeated START, ossia uno start ripetuto, qualora il master voglia comunicare nuovamente con lo slave; a questo scopo è sufficiente che il master, in luogo dello STOP, invii un altro segnale di START. TRASMISSIONE DEL DATO Il protocollo I2C trasmette pacchetti di dati a dimensione variabile, racchiusi entro le due condizioni di START e STOP; i pacchetti, seppur non abbiano limite di lunghezza, sono sempre costituiti dalla successione di uno o più byte. Trasmissione di un byte (8 bit) Acknowledge bit (bit diavvenuta ricezione) Fig. 3.9 – Trasmissione completa di un byte Per ogni byte che viene trasmesso, deve seguire uno speciale bit detto acknowledge bit, che ha lo scopo di confermare l'accettazione del dato da parte del dispositivo: la verifica ha successo se, mentre il dispositivo trasmittente (master) genera la 9° scansione di clock nella linea SCL, il dispositivo ricevente (slave) mantiene la linea dati SDA a livello logico basso. Nel caso di una trasmissione non corretta, è compito del master decidere se annullare completamente l'invio o se ripetere l'operazione. 28 Sviluppo di un modulatore di polarizzazione ottica tramite tecnologia LCD in trasmissione TRASFERIMENTI DI DATI Il primo byte dopo la condizione di start ha generalmente la funzione di specificare quale dispositivo slave sarà coinvolto nella prossima trasmissione dati. In esso sono infatti contenute informazioni riguardo a: • • L'indirizzo del dispositivo slave che si vuole contattare Il tipo di trasferimento da eseguire: lettura oppure scrittura Questa indicazione avviene nel protocollo I2C tramite l'invio di un byte speciale così strutturato: LSB MSB 1 2 3 4 5 6 7 8 Indirizzo di destinazione R/W 0 = scrittura 1 = lettura Molto spesso capita di dover inserire nel medesimo sistema più dispositivi identici, tuttavia non si può accettare che questi presentino lo stesso indirizzo identificativo per evitare ovvi problemi di conflitto. Questa esigenza può essere soddisfatta componendo gli indirizzi con una parte fissa, che indichi il tipo di dispositivo, e una parte variabile, per poter comunicare univocamente a quale delle diverse copie si sta facendo riferimento. Ad esempio se considero il seguente indirizzamento a 7 bit secondo tale logica: LSB MSB 1 2 3 Indirizzo fisso 4 5 6 7 Indirizzo variabile i quattro bit di indirizzo fisso permettono di individuare un determinato modello di dispositivo, mentre con gli altri 3 bit posso distinguere tra al massimo 23 = 8 copie dello stesso prodotto inserite nel sistema. 29 Sviluppo di un modulatore di polarizzazione ottica tramite tecnologia LCD in trasmissione 3.5 – Controller I2C La parte più consistente di tutta l'architettura dell'FPGA è senza dubbio quella riguardante l'interfaccia I2C. Come già accennato, infatti, il chip Supertex HV892 che si vuole pilotare tramite la Spartan 3A è in grado di comunicare con l'esterno attraverso il bus I2C: si è dovuto quindi implementare un modulo nella FPGA che fosse in grado di scrivere e leggere i dati trasmessi con tale bus. La figura seguente consente di capire meglio l'architettura del controller I2C realizzato tramite FPGA; all'interno sono individuabili due grandi moduli: controller_top.v ed i2c_master_top.v • • i2c_master_top = è il nucleo del controller complessivo, in quanto esegue tutte le comunicazioni secondo lo standard I2C controller_top = funziona da master, secondo lo standard Wishbone, nei confronti della entity precedente: si occupa quindi di comandare quali comunicazioni debbano essere eseguite nel bus I2C OSSERVAZIONE 1 Dalla figura, si vuole rimarcare ancora una volta la differenza tra Wishbone e I2C: mentre il Wishbone serve a connettere due moduli interni all'FPGA, il bus I2C si utilizza nelle connessioni fisiche verso l'esterno, quando vengono coinvolti due dispositivi distinti (in questo caso, la evaluation board da un lato, e l'integrato HV892 dall'altra). OSSERVAZIONE 2 Il modulo i2c_master_top funziona contemporaneamente da master nei confronti del protocollo I2C, mentre funziona da slave nei confronti del Wishbone. Questo perchè dal fronte Wishbone deve ricevere le indicazioni su quali operazioni compiere, e conseguentemente sul fronte I2C le deve eseguire. Fig. 3.10 – Schema riassunitvo del Controller I 2 C implementato con FPGA Scendendo nei dettagli realizzativi del controller, quasi tutta la logica è stata costruita basandosi sul sistema delle macchine a stati finiti: tale scelta è stata dettata principalmente dalla necessità di far ritornare all'occorrenza il sistema a una condizione precedente in maniera rapida. 30 Sviluppo di un modulatore di polarizzazione ottica tramite tecnologia LCD in trasmissione Il funzionamento di questo controller non è infatti lineare, poichè è complicato notevolmente dal frequente inserimento di istruzioni condizionali che costringono il sistema a saltare da uno stato ad un altro: processi di questo tipo diventerebbero ingestibili se non si utilizzasse l'approccio della macchina a stati. 3.5.1 - OpenCores I2C Controller Si tratta di un modulo generico per la gestione del protocollo I2C; nel progetto del polarizzatore, molte delle funzionalità di cui è dotato non sono state sfruttate: nel nostro caso, l'operazione che ci interessa eseguire nell'ambito del bus I2C è solamente la scrittura. Infatti, richiamando quanto detto nei capitoli precedenti, l'FPGA non deve far altro che scrivere nel chip HV892 un valore AMP di dimensione 1 byte proporzionale all'ampiezza dell'onda quadra generata in uscita a tutto il sistema Pertanto, almeno in questa prima fase di prototipo, non c'è la necessità di effettuare letture dallo slave I2C. Il funzionamento del modulo I2C Master è basato su macchine a stati finiti, ed è implementato a più livelli di astrazione crescente. Questo si può constatare notando che la entity i2c_master_top.v è dotata di altri due moduli annidati che svolgono funzioni sempre più a basso livello. 1. LIVELLO WORD (i2c_master_top) è in grado di gestire la comunicazione direttamente a livello di parole sfruttando le macchine a livello più basso 2. LIVELLO BYTE (i2c_master_byte_ctrl) ogni volta che viene interpellato compie la scrittura di un byte sullo slave I2C 3. LIVELLO BIT (i2c_master_bit_ctrl) è il livello gerarchico più basso, ed esegue singole operazioni di lettura/scrittura su bit singoli 2 Fig. 3.11 – Livelli di astrazione delle entities I C Master Nel diagramma seguente (Fig. 3.12) è presentato uno schema a blocchi del funzionamento interno del blocco I2C Master, che include tutti i registri interni e i blocchi i2c_master_byte_ctrl, i2c_master_bit_ctrl. Come si può osservare, la linea I2C viene modificata effettivamente soltanto dal blocco i2c_master_bit_ctrl, che essendo a livello più basso gerarchicamente, è quello progettato per compiere le operazioni di trasmissione più elementari. 31 Sviluppo di un modulatore di polarizzazione ottica tramite tecnologia LCD in trasmissione Registro Prescale Registro Command Wishbone Master Registro Status Registro Transmit Registro Receive Generatore Clock Byte Command Controller Bit Command Controller SCL SDA DataIO Shift Register Wishbone Slave Fig. 3.12 – Schema a blocchi del funzionamento interno di I2C Master Questo modulo mette a disposizione del master una serie di registri, che possono essere scritti o letti, attraverso il quale vengono realizzate tutte le operazioni. Tali registri possono essere modificati o interrogati attraverso le seguenti porte del modulo: • wb_adr_i (Input) Tramite questo bus a 3bit è possibile selezionare l'indirizzo del registro con il quale si intende interagire • wb_dat_i (Input) & wb_dat_o (Output) Questi due bus a 8bit trasportano il byte coinvolto nell'operazione: in particolare, quando si intende scrivere in un registro, viene utilizzato il primo, mentre nel caso di lettura si impiega il secondo Fig. 3.13 – Schematico RTL Viene presentata qui di seguito una panoramica di tutti i registri a disposizione, evidenziandone la funzione, la tipologia di operazioni che consentono e l'indirizzo che li individua: Nome Codice Indirizzo Dimensione PRER_lo 0x00 8 bit PRER_hi 0x01 8 bit Control CTR 0x02 8 bit Read/Write Transmit TXR 0x03 8 bit Write Receive RXR 0x03 8 bit Read Command CR 0x04 8 bit Write Status SR 0x04 8 bit Read Prescale Accesso Read/Write 32 Sviluppo di un modulatore di polarizzazione ottica tramite tecnologia LCD in trasmissione PRESCALE REGISTER Questo registro va solitamente settato all'inizializzazione del sistema, dal momento che il suo valore viene utilizzato come fattore di scala per dividere il clock dell'oscillatore e ridurlo a quello desiderato per la linea SCL (vale a dire il clock del bus I2C). Tale calcolo va eseguito in accordo con la formula fornita nelle specifiche del Controller I2C: prescale = 1 Clock sistema −1 5 Frequenza SCL Applicando tale formula al caso specifico del progetto, il clock di sistema è quello proveniente dall'oscillatore al quarzo, e vale 50Mhz, mentre la frequenza della linea SCL desiderata è di 100Kbps come precisato al capitolo 2. Il fattore di prescale risulta pertanto pari a 99DEC o in alternativa 63HEX. È proprio per consentire una maggiore regolabilità del clock I2C che il valore di prescale viene memorizzato in due registri, anziché uno, così permettere numeri fino a 16 bit. TRANSMIT REGISTER È il registro utilizzato dal Wishbone Master per trasmettere il valore da scrivere nel Wishbone Slave. L'accesso è consentito solamente in scrittura, e può contenere 1 byte di dati. Nel caso in cui si stia inizializzando la connessione con un dispositivo I2C Slave, il byte a disposizione viene utilizzato per comunicare l'indirizzo del dispositivo fisico nei primi 7 bit più significativi, mentre il LSB viene sfruttato per indicare se si intenderà leggere ('1') o scrivere ('0') nello slave. RECEIVE REGISTER In questo registro, accessibile in sola lettura, viene presentato il byte proveniente dall'I2C Slave in risposta ad una richiesta di lettura da parte del Wishbone Master. COMMAND REGISTER Si tratta di un registro accessibile in sola lettura, che il Wishbone Master utilizza per gestire la comunicazione. Il significato degli 8 bit che lo compongono è riassunto nel seguente prospetto: Bit Descrizione 7 Genera la condizione di start 6 Genera la condizione di stop 5 Lettura dallo slave 4 Scrittura allo slave 3 ACK, il WBM scrive '0' quando ha ricevuto un dato 2:1 Utilizzo riservato 0 IACK, il WBM scrive '1' per ripristinare dopo un'interruzione 33 Sviluppo di un modulatore di polarizzazione ottica tramite tecnologia LCD in trasmissione STATUS REGISTER Viene consultato in sola lettura dal Wishbone Master per aggiornarsi sullo stato della comunicazione nell'I2C Bus. Anche in questo caso, ogni bit ci dà informazioni su una precisa situazione, secondo il prospetto: Bit Descrizione 7 ACK, va a '0' quando la comunicazione con l'I2C Slave ha avuto successo 6 BUSY, vale '1' nell'intervallo tra uno Start e uno Stop 5 Non utilizzato (Arbitraggio) 4:2 Utilizzo riservato 1 TIP, vale '1' durante un trasferimento, '0' quando è terminato 0 IF, interrupt flag, va a '1' quando il trasferimento non ha avuto successo 3.5.2 – Wishbone Master Questo modulo funziona in modo complementare al Wishbone Slave appena presentato: mentre lo Slave non è altro che uno strumento in grado di svolgere tutte le operazioni possibili nell'ambito del bus I2C, il Master è quel blocco che, in relazione alle esigenze del progetto, comanda e coordina tutti i compiti da svolgere: in termini specifici, lo Slave è in grado di realizzare le singole scritture e letture nel bus I2C, mentre il Master opera a un livello più alto, scegliendo in quale ordine e in quale momento tali operazioni debbano essere eseguite. Come già precisato più volte, il funzionamento del polarizzatore in versione prototipo prevede che l'unica operazione da effettuare nel bus I2C sia quella di trasmettere il valore di AMP nel dispositivo I2C Slave (Supertex HV892). Quindi il Wishbone Master deve semplicemente scrivere il valore AMP nel Wishbone Slave provvedendo a trasmetterlo nuovamente ogni qualvolta il suo valore venga modificato dall'input dell'utente. 2 Input utente Generazione AMP AMP Wishbone Master Wishbone Slave IC Slave (HV892) Fig. 3.14 – Schema a blocchi del sistema Come evidenziato dalla fig. 3.14, nello schema a blocchi complessivo del sistema non sono previste frecce di ritorno (cioè letture) dal dispositivo I2C Slave. Il codice Verilog che realizza il modulo Wishbone Master è il seguente: 34 Sviluppo di un modulatore di polarizzazione ottica tramite tecnologia LCD in trasmissione 1 `include "timescale.v" 2 `include "define.v" 3 ////////////////////////////////////////////////////////////////////////////////// 4 // 5 // CONTROLLER 6 // Funziona da wishbone-master nei confronti del modulo i2c_master_top, che è 7 // il wishbone-slave 8 // 9 ////////////////////////////////////////////////////////////////////////////////// 10 11 module controller_top( 12 input trigger, 13 input [7:0] amp_value, 14 input wb_clk_i, 15 input wb_rst_i, 16 output reg [2:0] wb_adr_o, 17 output reg [7:0] wb_dat_o, 18 output reg wb_we_o, 19 output reg wb_stb_o, 20 output reg wb_cyc_o, 21 input wb_ack_i, 22 input wb_inta_i, 23 input [7:0] wb_dat_i 24 ); 25 26 27 // Registri interni 28 reg [4:0] state; // FSM states 29 reg start_wb_cyc; // trigger for wishbone cycle 30 reg got_ack; // Set when ack has been received from wbm 31 reg [2:0] add_reg; // Register Address 32 reg [7:0] data_o; // Data register trasmission 33 reg [7:0] data_i; // Data register reception 34 reg w_rn; // Type of operation 35 36 //reg mem; 37 reg oldtrigger; 38 39 always @(posedge wb_clk_i or posedge wb_rst_i) begin 40 // MSF principale 41 if (wb_rst_i) begin 42 start_wb_cyc <= 1'b0; 43 state <= `INIT0; 44 add_reg <= 3'h0; 45 data_o <= 8'h00; 46 data_i <= 8'h00; 47 w_rn <= 1'b0; 48 end 49 else begin 50 case (state) 51 //INIZIALIZZAZIONE: registro di prescale 52 `INIT0: begin 53 add_reg <= `PRERlo; 54 data_o <= `PRESCALE; 55 w_rn <= 1'b1; 56 start_wb_cyc <= 1'b1; 57 state <= `INIT1; 58 end 59 60 `INIT1: begin 61 start_wb_cyc <= 1'b0; 62 if(got_ack) 63 state <= `INIT2; 64 else 65 state <= `INIT1; 66 end 67 68 `INIT2: begin 69 add_reg <= `PRERhi; 70 data_o <= 8'H00; 71 w_rn <= 1'b1; 72 start_wb_cyc <= 1'b1; 73 state <= `INIT3; 74 end 75 76 `INIT3: begin 77 start_wb_cyc <= 1'b0; 78 if(got_ack) 79 state <= `IDLE0; 35 Sviluppo di un modulatore di polarizzazione ottica tramite tecnologia LCD in trasmissione 80 else 81 state <= `INIT3; 82 end 83 84 //IDLE: la fsm resta in attesa di operazioni 85 `IDLE0: begin 86 oldtrigger <= trigger; 87 if (oldtrigger == 0 && trigger == 1) 88 state <= `ENABLE0; 89 else 90 state <= `IDLE0; 91 end 92 93 //ABILITO IL CORE 94 `ENABLE0: begin 95 add_reg <= `CTR; 96 data_o <= 8'b10000000; 97 w_rn <= 1'b1; 98 start_wb_cyc <= 1'b1; 99 state <= `ENABLE1; 100 end 101 102 `ENABLE1: begin 103 start_wb_cyc <= 1'b0; 104 if(got_ack) 105 state <= `WRITE0; 106 else 107 state <= `ENABLE1; 108 end 109 110 //SCRIVO L'INDIRIZZO DELLO SLAVE 111 `WRITE0: begin 112 add_reg <= `TXR; 113 data_o <= {7'b0100011 , 1'b0}; 114 w_rn <= 1'b1; 115 start_wb_cyc <= 1'b1; 116 state <= `WRITE1; 117 end 118 119 `WRITE1: begin 120 start_wb_cyc <= 1'b0; 121 if(got_ack) 122 state <= `WRITE2; 123 else 124 state <= `WRITE1; 125 end 126 127 //SCRIVO NEL COMMAND REGISTER LA CONDIZIONE DI START 128 `WRITE2: begin 129 add_reg <= `CR; 130 data_o <= 8'b10010000; 131 w_rn <= 1'b1; 132 start_wb_cyc <= 1'b1; 133 state <= `WRITE3; 134 end 135 136 `WRITE3: begin 137 start_wb_cyc <= 1'b0; 138 if(got_ack) 139 state <= `WRITE4; 140 else 141 state <= `WRITE3; 142 end 143 144 //LEGGO LO STATUS REGISTER in attesa del TIP 145 `WRITE4: begin 146 add_reg <= `SR; 147 w_rn <= 1'b0; 148 start_wb_cyc <= 1'b1; 149 state <= `WRITE5; 150 end 151 152 `WRITE5: begin 153 start_wb_cyc <= 1'b0; 154 if(got_ack) begin 155 data_i <= wb_dat_i; 156 state <= `WRITE6; 157 end 158 else 159 state <= `WRITE5; 36 Sviluppo di un modulatore di polarizzazione ottica tramite tecnologia LCD in trasmissione 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 end `WRITE6: begin if (~data_i[1]) if (~data_i[7]) state <= `WRITE7; else state <= `STOP_ERR1; else state <= `WRITE4; end //SCRIVO IL DATO NEL TRANSMIT REGISTER `WRITE7: begin add_reg <= `TXR; data_o <= amp_value; w_rn <= 1'b1; start_wb_cyc <= 1'b1; state <= `WRITE8; end `WRITE8: begin start_wb_cyc <= 1'b0; if(got_ack) state <= `WRITE9; else state <= `WRITE8; end //SCRIVO NEL COMMAND REGISTER LA CONDIZIONE DI STOP e WR BIT `WRITE9: begin add_reg <= `CR; data_o <= 8'b01010000; w_rn <= 1'b1; start_wb_cyc <= 1'b1; state <= `WRITE10; end `WRITE10: begin start_wb_cyc <= 1'b0; if(got_ack) state <= `WRITE11; else state <= `WRITE10; end //LEGGO LO STATUS REGISTER bis `WRITE11: begin add_reg <= `SR; w_rn <= 1'b0; start_wb_cyc <= 1'b1; state <= `WRITE12; end `WRITE12: begin start_wb_cyc <= 1'b0; if(got_ack) begin data_i <= wb_dat_i; state <= `WRITE13; end else state <= `WRITE12; end `WRITE13: begin if (~data_i[1]) if (~data_i[7]) state <= `DISABLE0; else state <= `STOP_ERR1; else state <= `WRITE11; end //ABILITO IL CORE `DISABLE0: begin add_reg <= `CTR; data_o <= 8'b00000000; w_rn <= 1'b1; start_wb_cyc <= 1'b1; 37 Sviluppo di un modulatore di polarizzazione ottica tramite tecnologia LCD in trasmissione 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 state <= `DISABLE1; end `DISABLE1: begin start_wb_cyc <= 1'b0; if(got_ack) state <= `IDLE0; else state <= `DISABLE1; end // In caso di mancanza di ACK dello slave mando lo STOP di chiusura `STOP_ERR1: begin state <= `STOP_ERR1; end `LOOP: begin state <= `LOOP; end default: state <= `INIT0; endcase end //////////////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\\ // Macchina inferiore - interfaccia al wishbone bus \\ //////////////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\\ if (wb_rst_i) begin wb_adr_o <= 3'h0; wb_dat_o <= 8'h00; wb_we_o <= 1'b0; wb_stb_o <= 1'b0; wb_cyc_o <= 1'b0; got_ack <= 1'b0; end else begin if(start_wb_cyc == 1'b1) begin // Start Wishbone Cycle wb_stb_o <= 1'b1; wb_cyc_o <= 1'b1; wb_adr_o <= add_reg; wb_dat_o <= data_o; wb_we_o <= w_rn; got_ack <= 1'b0; end else if((wb_stb_o == 1'b1)&&(wb_ack_i == 1'b1)) begin // End Wishbone cycle wb_stb_o <= 1'b0; wb_cyc_o <= 1'b0; wb_we_o <= 1'b0; got_ack <= 1'b1; if(~wb_we_o) begin data_i <= wb_dat_i; end end end end endmodule Il codice implementa una macchina a stati finiti che compie un ciclo di scrittura quando l'apposito segnale di trigger presenta un impulso. Tale macchina a stati viene qui rappresentata in forma compatta, condensando gli stati simili per non appesantire troppo l'impatto grafico. Ad esempio, i 13 stati per completare la scrittura (WRITE0-WRITE13) sono riuniti sotto un unico stato (WRITE). 38 Sviluppo di un modulatore di polarizzazione ottica tramite tecnologia LCD in trasmissione Fig. 3.15 – Macchina a stati finiti sintetica Ciascuno dei blocchi indicati nel diagramma contiene al suo interno un certo numero di stati ma, sostanzialmente, il principio di avanzamento della macchina si basa ovunque sullo stesso algoritmo: 1. Scegliere l'indirizzo del registro con cui si vuole operare 2. Eseguire l'operazione sul Wishbone Slave, che può essere una scrittura o una lettura 3. Attendere l'acknowledge, ossia la conferma che l'operazione ha avuto successo, e in base a questo far progredire o meno lo stato della macchina 3.6 – Visualizzazione su display Il blocco adibito alla scrittura sul display lavora in maniera parallela rispetto al Controller del bus I2C. Quindi, il sistema provvede a scrivere ogni nuovo valore di AMP contemporaneamente sia nel dispositivo HV892, sia nel display. Per raggiungere questo risultato, si è scelto di aggiornare il display sul fronte di salita del segnale Update, che è lo stesso segnale impulsivo ad entrare nel modulo Wishbone Master con il nome trigger. In definitiva, ogni volta che l'utente applica un input al sistema mediante gli switch a disposizione , il blocco knob_interace restituisce in uscita un segnale di trigger impulsivo e un valore aggiornato di AMP: tale coppia di segnali va in input sia al controller I2C, sia al controller LCD. Sul piano tecnico, anche il modulo LCD_top è stato implementato mediante macchine a stati finiti annidate, con livello di astrazione crescente con la gerarchia dei moduli. Di seguito si riporta il codice del modulo top: 39 Sviluppo di un modulatore di polarizzazione ottica tramite tecnologia LCD in trasmissione module LCD_top( input clk, input rst, input Update, input mode, input [7:0] Data, output [11:8] LCD_Data, output LCD_E, output LCD_RS, output LCD_RW ); wire ClkDiv; wire LCDAck; wire GenBusy; wire [8*16:1] DisplayData; reg reg reg reg reg LCDUpdate; [2:0] state; [7:0] AMP; Refresh; oldUpdate; LCDEncoder LCDStringGen( .CLK .RST .Refresh .Raw_Input .Busy .LCD_Output (clk (rst (Refresh (AMP (GenBusy (DisplayData .clk .reset .slow_clk (clk (rst (ClkDiv ), ), ), ), ), ) ); clock_slower2 LCDClock ( ), ), ) ); LCDDisplay LCDDriver ( .Clk .Rst .LCDUpdate .Mode .LCD_Data_In .LCDAck .LCD_Data .LCD_E .LCD_RS .LCD_RW (ClkDiv (rst (LCDUpdate (mode (DisplayData (LCDAck (LCD_Data (LCD_E (LCD_RS (LCD_RW ), ), ), ), ), ), ), ), ), ) ); always @ (posedge clk or posedge rst) if (rst) begin LCDUpdate <= 0; state <= 0; AMP <= 0; Refresh <= 0; oldUpdate <= 0; end else case (state) 0: begin 40 Sviluppo di un modulatore di polarizzazione ottica tramite tecnologia LCD in trasmissione oldUpdate <= Update; if (Update == 1 && oldUpdate == 0) begin state <= 1; AMP[7:0] <= Data; Refresh <= 1; end else state <= 0; end 1: begin if (GenBusy) state <= 1; else state <= 2; end 2: begin LCDUpdate <= 1; Refresh <= 0; if (LCDAck == 1) begin state <= 3; LCDUpdate <= 0; end else state <= 2; end 3: begin if (LCDAck == 0) state <= 0; else state <= 3; end default: state <= 0; endcase endmodule Nella testa del codice si possono individuare tre moduli che vengono istanziati: LCDClock, LCDStringGen ed LCDDriver. Modulo LCDClock Contiene un divisore di clock strutturalmente uguale a quello utilizzato per il sistema antirimbalzo. La sua presenza è necessaria per il corretto funzionamento del display: infatti, nei capitoli precedenti si era fatto presente che l'LCD in dotazione alla Spartan fosse molto lento e che pertanto non sarebbe stato in grado di sostenere direttamente la velocità dell'oscillatore di sistema. In fase di progettazione si è scelto di dividere il clock utilizzando un contatore a 11 bit: valori più elevati sarebbero stati un inutile dispendio di prestazioni, mentre per valori più bassi si era constatato un funzionamento scorretto del display, dato che la stessa inizializzazione non aveva successo. 41 Sviluppo di un modulatore di polarizzazione ottica tramite tecnologia LCD in trasmissione Modulo LCDStringGen Tale generatore di stringhe ha lo scopo di preparare il dato per essere inviato al display nel formato idoneo; le operazioni che svolge sono le seguenti: 1. Converte il valore binario a 7bit di AMP nelle rispettive cifre BCD che sono un formato compatibile con la mappa caratteri del controller LCD 2. Aggiunge la parte testuale al dato, distinguendo a seconda che il sistema sia in standby, resettato oppure in funzionamento normale 3. Porta il dato a 128bit (16 caratteri ciascuno di 8 bit) in uscita Il codice che lo implementa è il seguente: module LCDEncoder( input RST, input CLK, input Refresh, input [7:0] Raw_Input, output reg Busy, output reg [8*16:1] LCD_Output ); wire [11:0] BCD_Output; //Scritta --> "NIX Standby" parameter STANDBY = 128'B01001110... parameter RESET_STRING = 128'B01001110... Bin2BCD Converter ( .Binary (Raw_Input), .BCD (BCD_Output) ); always @ (posedge CLK or posedge RST) if (RST) begin Busy <= 1; LCD_Output <= RESET_STRING; end else if (Refresh) begin Busy <= 1; if (Raw_Input == 8'h00) LCD_Output <= STANDBY; else begin //Scritta --> "NIX OUT=" LCD_Output [128:65] <= 64'B01001110... //Livello polarizzazione, es. "255" LCD_Output [64:61] <= 4'B0011; LCD_Output [60:57] <= BCD_Output[11:8]; LCD_Output [56:53] <= 4'B0011; LCD_Output [52:49] <= BCD_Output[7:4]; LCD_Output [48:45] <= 4'B0011; LCD_Output [44:41] <= BCD_Output[3:0]; //Spazi finali --> " #" LCD_Output [40:1] <= 40'B00100000... 42 Sviluppo di un modulatore di polarizzazione ottica tramite tecnologia LCD in trasmissione end end else Busy <= 0; endmodule Modulo LCDDriver Rappresenta il blocco logico che si interfaccia fisicamente con il display, ovvero che ha il controllo diretto dei relativi pin sull'FPGA. Secondo le specifiche della Xilinx, il controller può interfacciarsi con il display utilizzando a scelta la modalità a 4 oppure ad 8 bit. Dato l'utilizzo relativamente leggero che si fa del display, e visto che non ci sono particolari vincoli di velocità, tale interfaccia è stata implementata utilizzando il bus a 4 bit. I restanti pin, corrispondenti ai bit meno significativi, sono stati collegati direttamente a livello logico alto in modo da predisporre questa modalità di funzionamento a bus ridotto. L'architettura del modulo, trattandosi sempre di una scrittura, ricalca quella del modulo Wishbone Slave precedentemente analizzata, che ha lo scopo di scrivere i dati nel bus I2C. Analogamente a prima, infatti, sono individuabili all'interno del modulo diverse macchine a stati finiti che operano a livelli di dati diversi. Tale modulo si presenta gerarchicamente così suddiviso: − LCDDriver (LCDDisplay.v) − LCDInterface.v · LCDcntrl.v · LCDDriver.v LCDDriver e LCDCntrl sono le entities che lavorano a basso livello, completando la scrittura nel seguente modo: LCDCntrl riceve la parola a 128 bit e in sequenza invia pacchetti da 8 bit (corrispondenti ad un singolo carattere nella mappatura del display) a LCDDriver, il quale si occupa di scriverli singolarmente sul display. Si fa presente che il display, al momento dell'inzializzazione, è stato preconfigurato in modo da spostare automaticamente il cursore a destra di una posizione dopo ogni carattere scritto. 43 Sviluppo di un modulatore di polarizzazione ottica tramite tecnologia LCD in trasmissione 3.7 – Risorse utilizzate L'ambiente di sviluppo Xilinx ISE ci consente, nella fase successiva alla progettazione, di avere un report stimato sull'utilizzo delle risorse fisiche, utile per avere un indice di quanto efficientemente è stato descritto l'hardware. Nel nostro caso i riepiloghi di utilizzo in fase di sintesi (valori stimati) e implementazione (valori reali) sono stati i seguenti: SINTESI Device Utilization Summary (estimated values) Logic Utilization Used Available Utilization Number of Slices 640 5888 10% Number of Slice Flip Flops 780 11776 6% Number of 4 input LUTs 1158 11776 9% Number of bonded IOBs 20 372 5% Number of GCLKs 2 24 8% IMPLEMENTAZIONE Device Utilization Summary Logic Utilization Number of Slice Flip Flops Used Available Utilization Note 780 11,776 6% 1,121 11,776 9% Number of occupied Slices 725 5,888 12% Number of Slices containing only related logic 725 725 100% 0 725 0% Total Number of 4 input LUTs 1,155 11,776 9% Number used as logic 1,121 372 5% 24 8% Number of 4 input LUTs Number of Slices containing unrelated logic Number used as a route-thru 34 Number of bonded IOBs 20 IOB Flip Flops 3 Number of BUFGMUXs 2 Average Fanout of Non-Clock Nets 4.29 Come si può osservare dai riepiloghi, l'utilizzo delle risorse a disposizione è nel complesso contenuto. In ogni caso, trattandosi di un prototipo, e considerando che le versioni successive del prodotto non saranno implementate mediante FPGA, non ci sarebbe motivo per effettuare un'operazione di revisione del codice per ottimizzare lo sfruttamento delle risorse. 44 Sviluppo di un modulatore di polarizzazione ottica tramite tecnologia LCD in trasmissione Capitolo 4 POLARIZZATORE 4.1 – Polarizzazione In questo paragrafo sono trattate alcune informazioni di base riguardo la luce e la polarizzazione, per poter inquadrare meglio il campo di applicazione del progetto. Per raggiungere questo scopo, prima della polarizzazione verranno dati alcuni richiami sulle onde elettromagnetiche. 4.1.1 – Classificazione delle onde Il primo passo per avvicinarsi al polarizzatore ottico è quello di classificare i vari tipi di onda, evidenziando per ciascuno di essi se abbia senso o meno parlare di polarizzazione. Una classificazione di base delle onde può essere effettuata osservando due caratteristiche fondamentali: 1. La direzione in cui si muovono le singole particelle del mezzo di propagazione 2. La capacità dell'onda di propagarsi nel vuoto Una prima distinzione delle onde viene effettuata appunto a seconda della direzione in cui si muovono le particelle del mezzo in cui questa si propaga. Prima di tutto è bene notare che con l'espressione “direzione di propagazione” ci si riferisce alla direzione nella quale avviene il trasporto di energia. Le onde in generale possono essere longitudinali oppure trasversali: rientrano nel primo caso quei tipi di onda in cui le particelle del mezzo si muovono in direzione coincidente a quella di propagazione; le onde trasversali invece sono quelle in cui il tale movimento del mezzo avviene in direzione perpendicolare a quella di propagazione. La seconda distinzione che si compie riguarda la capacità di un'onda di propagarsi nel vuoto: questa è una caratteristica tipica delle onde elettromagnetiche, vale a dire quelle onde prodotte da una carica elettrica in movimento. È bene notare che le onde elettromagnetiche, dal punto di vista vettoriale, sono date dalla composizione di un campo elettrico e di un campo magnetico: questo è coerente, dal punto di vista fisico, con il fatto che derivino da cariche elettriche in moto. Tutti i tipi di onde meccaniche non sono in grado di propagarsi nel vuoto ma richiedono un mezzo fisico attraverso il quale potersi spostare. 4.1.2 – Onde polarizzate Se considero un fascio di luce proveniente da una sorgente qualsiasi, ad esempio una lampadina, con tutta probabilità esso sarà costituito da una moltitudine di singole onde, dove ciascuna oscilla su di un piano ben definito mantenendo comunque una direzione di propagazione comune. Si tratta dunque di un fascio di onde non polarizzato. Se invece prendo in esame una sola di queste onde, l'oscillazione avviene in un unico piano, e tale onda viene detta polarizzata. In generale, la luce proveniente da sorgenti naturali è quasi sempre non polarizzata, visto che è causata dalla vibrazione di cariche elettriche in molte direzioni casuali. 45 Sviluppo di un modulatore di polarizzazione ottica tramite tecnologia LCD in trasmissione Richiamando il paragrafo precedente, il concetto di polarizzazione ha senso solamente se si sta facendo riferimento ad onde elettromagnetiche e comunque trasversali. Con il termine polarizzazione si va ad indicare il processo di trasformazione di un generico fascio luminoso in un'onda polarizzata, operazione che si può effettuare in diversi modi, ad esempio: 1. Polarizzazione per trasmissione 2. Polarizzazione per riflessione 3. Polarizzazione per rifrazione TRASMISSIONE La tecnica più comune per polarizzare un fascio di luce è quello di farlo passare attraverso un filtro, come ad esempio il Polaroid. Il materiale di questi filtri è in grado di far passare solamente le onde che oscillano su di un piano ben definito, assorbendo con buona efficacia tutte le altre. Questa caratteristica è riconducibile ad una proprietà chimica di tale materiale: esso infatti è costituito da lunghe catene di molecole che vengono stirate per tutta l'estensione del filtro, e disposte in maniera omogenea sulla sua superficie. Come test per il funzionamento, è possibile sovrapporre due filtri Polaroid in modo che i loro assi di polarizzazione siano perpendicolari: il risultato è che il primo filtro restituisce un'onda che oscilla su un piano, e il secondo filtro, avendo asse di polarizzazione ortogonale, la assorbe completamente; pertanto l'azione combinata di questi due filtri è quella di oscurare la radiazione iniziale. Il Polaroid rappresenta l'esempio più comune di un filtro polarizzatore in trasmissione di tipo passivo; nel caso del progetto del polarizzatore elettronico, si è scelto di utilizzare un filtro trasmissivo di tipo attivo, vale a dire una cella LCD. Come verrà spiegato più avanti, anche i cristalli liquidi possono ricoprire la stessa funzione del Polaroid, con la differenza che l'asse di polarizzazione può essere variato per via elettronica, senza dover necessariamente agire meccanicamente sul filtro. RIFLESSIONE E RIFRAZIONE Un altro modo per ottenere luce polarizzata a partire da un generico fascio luminoso è quello di sottoporla a riflessione da parte di una superficie non metallica. La radiazione riflessa risulterà polarizzata parallelamente alla superficie: è bene notare che l'efficacia della trasformazione dipende principalmente dall'angolo d'incidenza del fascio originale e dal materiale della superficie riflettente. Come specificato in precedenza, le superfici metalliche non si prestano per funzionare da polarizzatori in riflessione: questo si spiega considerando che i metalli, una volta raggiunti da una radiazione elettromagnetica, sono in grado di rifletterla in una varietà di direzioni differenti. Un buon esempio di luce polarizzata riflessa è quella proveniente dalle superfici d'acqua: in fotografia, infatti, è cosa frequente impiegare dei polarizzatori ottici proprio allo scopo di eliminare i riflessi indesiderati provenienti dal mare o altri specchi d'acqua. Un fenomeno simile si verifica quando il fascio non polarizzato viene rifratto nel passaggio tra due materiali aventi densità differente: in questo caso tuttavia la radiazione riflessa che si ottiene è polarizzata perpendicolarmente alla superficie di passaggio. È da osservare che i due fenomeni appena descritti (polarizzazione per riflessione e rifrazione) sono stati riportati solo allo scopo di accennare quali possono essere le fonti naturali di luce polarizzata: dovendo progettare un filtro, le soluzioni in trasmissione sono senza dubbio preferibili sia per la loro comodità che per la maggiore efficacia polarizzante. La luce riflessa oppure rifratta infatti presenta solitamente un certo grado di polarizzazione, che tuttavia non è elevato come nel caso di un filtro trasmissivo appositamente studiato. 46 Sviluppo di un modulatore di polarizzazione ottica tramite tecnologia LCD in trasmissione 4.2 – Cristalli liquidi Nel progetto del polarizzatore elettronico viene impiegato un filtro trasmissivo di tipo attivo, che si basa sulla tecnologia LCD. Con il termine cristalli liquidi si indicano dei composti organici dotati di proprietà fisiche particolari; la definizione stessa suggerisce che essi presentino caratteristiche appartenenti ad ambedue gli stati solido e liquido, al punto che viene loro attribuito uno stadio intermedio tra questi, detto mesofase. Questi materiali sono formati da molecole ellissoidali la cui disposizione, pur essendo vincolata ad un certo ordine geometrico (come avviene nei solidi cristallini), permette comunque un certo grado di libertà spaziale delle molecole: ad esempio esse sono in grado di ruotare e traslare l'una rispetto all'altra, in seguito a sollecitazioni meccaniche o elettriche. Le proprietà che tornano più utili nelle applicazioni ottiche sono senza dubbio l'anisotropia elettrica e la possibilità di regolarne l'ordine mediante l'applicazione di campi magnetici ed elettrici. I cristalli liquidi sono classificabili in tre mesofasi: 1. NEMATICA le molecole si presentano tutte parallele tra loro, ma posate su piani casuali (3 gradi di libertà : traslazione in x,y,z) 2. SMECTICA le molecole sono ancora parallele tra loro, ma posano su piani ben definiti (2 gradi di libertà per ogni piano : traslazione in x,z) 3. COLESTEROLICA le molecole sono parallele tra loro a piani alterni (2 gradi di liberta per ogni piano : traslazione in x,z) (1) NEMATICA (2) SMECTICA (3) COLESTEROLICA Fig. 4.1 – Mesofasi più comuni dei cristalli liquidi Azione del campo elettrico Le molecole elissoidali dei cristalli liquidi reagiscono all'applicazione di un campo elettrico trasformandosi in dipoli indotti con le cariche concentrate alle estremità. Il campo elettrico agisce dunque sulle molecole come una coppia di forze, e tende ad orientarle con l'asse parallelo alle linee di forza. 47 Sviluppo di un modulatore di polarizzazione ottica tramite tecnologia LCD in trasmissione molecole orientate campo elettrico Fig. 4.2 – Azione del campo elettrico sulle molecole dei cristalli liquidi 4.3 – Cella LCD La cella impiegata nel progetto contiene cristalli liquidi di tipo nematico, dunque tutte le molecole che lo compongono sono disposte casualmente nello spazio, con l'unico vincolo di essere, a riposo, parallele tra loro secondo l'asse longitudinale. La sezione di tale cella consente di capire meglio quanti strati la compongono e quale funzione essi svolgano. Fig. 4.3 – Sezione di una cella a cristalli liquidi Tale cella è così costruita: • interno riempito di cristalli liquidi • 2 pareti esterne in vetro • 2 strati interni di allineamento • 2 strati intermedi conduttivi e trasparenti Le due pareti poste all'esterno del dispositivo hanno il solo scopo di contenere fisicamente tutti gli altri componenti. Appena più internamente, vengono collocati due sottilissimi film caratterizzati da elevata conducibilità elettrica: così facendo, una volta collegati ai capi di un generatore di tensione, si induce un campo elettrico uniforme su tutta la superficie della cella. Nella parte interna della cella viene posto uno strato di cristalli liquidi in forma nematica, che tuttavia non va a contatto direttamente con le lamine conduttive: infatti, viene interposto un ulteriore strato che viene opportunamente abraso. Tale abrasione viene praticata in modo molto leggero, e avviene ovunque nella stessa direzione: la 48 Sviluppo di un modulatore di polarizzazione ottica tramite tecnologia LCD in trasmissione finalità di questa operazione è quella di conferire un orientamento preferenziale alle molecole dei cristalli liquidi. Infatti, essendo questi a diretto contatto con la parete, succede che tendono ad adagiarsi su di essa seguendo proprio l'orientamento dettato da questi graffi: in assenza di campo elettrico, quindi, si può pensare che tutte le molecole dei cristalli liquidi abbiano una direzione ordinata. Bisogna precisare che non solo le molecole a contatto con la superficie graffiata si orientano, bensì l'intera massa dei cristalli liquidi: trattandosi infatti di una varietà nematica, le molecole tenderanno ad assumere un orientamento omogeneo anche nella parte più interna dello strato, e a restare sempre parallele tra loro. 49 Sviluppo di un modulatore di polarizzazione ottica tramite tecnologia LCD in trasmissione Capitolo 5 TEST Nel seguente capitolo vengono riportate le osservazioni conseguenti i vari test a cui è stato sottoposto il sistema nella fase finale. TEST ELETTRONICI Una prima verifica del corretto funzionamento è stata quella di controllare se l'onda quadra generata all'uscita dell'elettronica di controllo rispettasse tutti i parametri indicati nelle specifiche. A tale scopo si è utilizzato un oscilloscopio digitale collegato ai morsetti OUT1 e OUT2 dell'integrato HV892. Dal momento che l'uscita OUT1 è quella che produce la semionda quadra positiva e OUT2 quella negativa, sono state connesse ciascuna ad un canale dell'oscilloscopio e successivamente, mediante le funzioni matematiche messe a disposizione dello strumento, si è generato un segnale virtuale dato dalla somma dei due canali, che corrisponde all'onda quadra cercata. Tutte le misurazioni successive sono state effettuate considerando direttamente questo segnale virtuale. VOUT Ch. 1 t Ch. 2 Nella seguente tabella riassuntiva vengono riportati i parametri che sono risultati più significativi per valutare l'accuratezza dell'onda quadra prodotta. Alcune di queste grandezze, come evidenziato, presentano un certo scostamento dal valore nominale riportato nelle specifiche: questo problema è da ricondursi al fatto che, con l'oscilloscopio utilizzato, le sonde corredate presentavano un'impedenza di ingresso di 1MΩ, a differenza dei 10MΩ che venivano suggeriti nel datasheet della Supertex per le eventuali misurazioni. Parametro Valore rilevato Range datasheet Frequenza ≈ 1.42 kHz 1.0 ÷ 2.0 kHz Ampiezza AMP=00xH ≈ 0.15 VRMS 0 VRMS Ampiezza AMP=FFxH ≈ 56 VRMS 58.5 ÷ 65.5 VRMS TEST OTTICI I test su banco ottico non sono stati al momento effettuati a causa dell’impossibilità di reperire in tempo utile la cella a cristalli liquidi compatibile con il sistema. 50 Sviluppo di un modulatore di polarizzazione ottica tramite tecnologia LCD in trasmissione CONCLUSIONI Al termine del tirocinio, gli obiettivi prefissi sono stati interamente rispettati: la realizzazione del prototipo è stata completata sviluppando tutte le funzionalità pensate originariamente, ed inoltre è stata aggiunta una modalità, utile in fase di debug, con la quale è possibile aumentare lo step di incremento/decremento dell’ampiezza nell’onda quadra in uscita. Questa funzionalità risulta utile per stressare maggiormente la componente dinamica del sistema. Dal punto di vista personale, ritengo che il tirocinio si sia svolto in maniera soddisfacente, principalmente per due motivi: anzitutto, dal punto di vista tecnico, avendo avuto l’opportunità di entrare in contatto con la parte più concreta e commerciale dell’elettronica; infatti mi sono fatto un’idea più chiara di come vengano costruiti i sistemi elettronici, servendosi di componenti di vari produttori opportunamente interfacciati tra loro. A questo proposito, è stato fondamentale investire del tempo per reperire ed analizzare accuratamente i data-sheet degli integrati e le documentazioni dei bus standard (I2C, Wishbone..). Questa esperienza assume ancora più valore poiché, avendo frequentato una scuola superiore ad orientamento umanistico, e del tutto priva della componente tecnico-pratica, ho potuto acquisire familiarità con alcuni aspetti di base dell’elettronica che risultano invece banali o scontati per chi proviene da un istituto superiore di tipo tecnico. In secondo luogo, l’altro vantaggio derivante dalla frequentazione del tirocinio, e che ritengo non meno importante dei progressi didattici raggiunti, è stato quello di poter osservare e toccare in prima persona lo svolgimento dell’attività aziendale: trovandomi sempre in contatto con il personale, infatti, ho avuto modo di familiarizzare con le dinamiche e i problemi che si affrontano quotidianamente nell’attività produttiva. Oltretutto, il tirocinio si è svolto in un’azienda fondata da poco, il che è stato senza dubbio un vantaggio, poiché, parallelamente alla realizzazione del progetto assegnatomi, avevo la possibilità di seguire da vicino la produzione principale, che è al momento particolarmente intensa dato che l’impresa è in fase di sviluppo. 51 Sviluppo di un modulatore di polarizzazione ottica tramite tecnologia LCD in trasmissione RIFERIMENTI Fonti • Manuale utente Spartan 3A Kit (http://www.xilinx.com/support/documentation/boards_and_kits/ug334.pdf) • Specifiche OpenCores I2C Controller Core (http://www.opencores.org/project,i2c) • Wishbone Specification edizione Settembre 2002 (http://www.opencores.org/downloads/wbspec_b3.pdf) • Specifiche Bus I2C Philips edizione 2.1 Gennaio 2000 (http://www.nxp.com/acrobat_download2/literature/9398/39340011.pdf) • Optics E. Hecht, A. Zajac Addison Wesley 52
advertisement
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project