Elettronica delle Telecomunicazioni II
Transcript
Elettronica delle Telecomunicazioni II
. Elettronica delle Telecomunicazioni II - Esercitazione 1 Interfaccia di convertitori A/D e A/D con logica programmabile 1. Obbiettivo dell’esercitazione: Questa esercitazione ha l’obbiettivo di realizzare l’interfaccia tra scheda Altera UP1 e una scheda con A/D e D/A realizzata al LADISPE (ADDA05). Tramite l’interfaccia vengono poi resi operativi un voltmetro digitale, un generatore di segnali, e un combinatore di segnali (somma, prodotto). L’esercitazione si svolge secondo una sequenza di più passi 1. Interfaccia con un canale D/A, generazione di un segnale in uscita; 2. Interfaccia con un canale A/D; acquisizione di un segnale di ingresso (statico) e visualizzazione del valore corrispondente sul display della scheda EPLD (voltmetro a due cifre); 3. Interfaccia con due canali A/D; risultato di operazioni di combinazione dei due segnali (somma, prodotto, raddrizzatore …) riportato sul canale D/A in uscita; 4. Generazione di più segnali in uscita. L’interfaccia con A/D e D/A sviluppata in questa esercitazione verrà riutilizzata come IP nelle esercitazioni successive, per realizzare funzioni complesse. Avvertenza: Valgono sempre le consuete regole per l’uso di componenti e piastre elettroniche: - non lasciare ingressi CMOS aperti; - verificare le tensioni di alimentazione prima di eseguire i collegamenti; - evitare di applicare cariche statiche ai componenti e alle piastre. Negli ambienti di lavoro professionali devono essere indossati appositi “bracciali” collegati a terra; per le esercitazioni al LADISPE usare le seguenti precauzioni: o prima di manipolare piastre o componenti toccare una massa (ad esempio quella dell’oscilloscopio); Ripetere la procedura di “scarica” (cioè toccare la massa) se si fanno operazioni suscettibili di generare cariche statiche (ad esempio alzarsi da una sedia in materiale sintetico, camminare con scarpe isolanti, …). o collegare prima le masse e poi gli altri cavi (alimentazioni, segnale). - evitare di applicare segnali a piastre non alimentate (gli ingressi sono collegati a massa e alimentazione dai diodi di protezione; se l’alimentazione è 0V, ogni ingresso è collegato verso massa da due diodi contrapposti in parallelo). In questa esercitazione ciascuna delle due piastre (UP1 e ADDA05) genera segnali verso l’altra, quindi la procedura corretta da seguire è: - staccare i collegamenti tra le piastre, e predisporre ciascuna piastra; - dare alimentazione alle dua piastre; - effettuare i collegamenti tra le due piastre. Se la procedura risulta troppo macchinosa, è possibile lasciare le piastre collegate, ma interporre delle resistenze in serie, in modo da limitare la corrente che può scorrete da una uscita verso un ingresso di piastra non alimentata. EseDVM06g.doc – PF, DDC - 10/05/2006 8.40 1 . 2. Interfaccia con convertitore D/A tipo TLV 5636 Il primo punto dell’esercitazione prevede il progetto e la realizzazione dell’interfaccia che permette di trasferire dati tra la scheda UP1 e il convertitore D/A presente sulla scheda ADDA05. Il componente TLV 5636 contiene due convertitori D/A a 12 bit, che ricevono dati e segnali di comando attraverso un canale seriale tipo SIP (Clock, Dati, Chip Select). I valori dei vari parametri e le caratteristiche dettagliate sono ricavabili dal data sheet del componente e dal manuale di uso della piastra ADDA05. Le specifiche di progetto per questo punto dell’esercitazione sono: - cadenza di comunicazione (clock seriale): 2 MHz (o frequenza prossima facilmente ottenibile); data rate (cadenza di aggiornamento di valori in uscita): 100 kS/s; forma d’onda da sintetizzare in uscita: rampa su 12 bit. La piastra con EPLD deve quindi generare i segnali: CLK CSDA DOUT: cadenza 2 MHz, ricavato con contatore dal clock a bordo piastra (25,175 MHz); va a SCLK del D/A. Chip Select per il convertitore; deve avere una durata (stato basso) di 16 CLK, e ripetersi con cadenza 100 kHz (o prossima). Va al CS* del D/A. flusso di dati, che deve contenere sia i bit da convertire in analogico, sia i bit di comando, come indicato nelle specifiche del componente. Va al DIN del convertitore D/A. Dato che in uscita deve essere generata una rampa, i bit di dato possono essere ricavati da un contatore binario. Tutti questi segnali possono essere generati con un contatore e circuiti di decodifica, oppure con macchine a stati, sempre partendo dal clock interno della piastra UP1. Predisporre il D/A (tramite i bit di comando inviati attraverso l’interfaccia seriale) per: - slow mode, normal operation (Posizione e valore dei comandi sono a pag 12 del data sheet). Notare che bisogna prima di tutto inviare al D/A una parola di comando (per definire la tensione di riferimento e i registri dati utilizzati), e poi i dati veri e propri. Comando e dati sono distinti da alcuni bit di comando nel gruppo di 16 bit. E’ anche possibile alternare ciclicamente comandi e dati. Le operazioni da eseguire per questo punto dell’esperienza sono, nell’ordine: - stesura del codice VHDL verifica con simulazione compilazione (usare il componente EPM7128) programmazione della piastra verifica dei segnali di interfaccia generati da UP1 verso ADDA05 (CLK, CS e DOUT) verifica della presenza del segnale analogico corretto all’uscita della ADDA05 misura della frequenza di ripetizione e dell’ampiezza del segnale analogico (incremento della velocità, e verifica del comportamento dinamico). EseDVM06g.doc – PF, DDC - 10/05/2006 8.40 2 . 3. Interfaccia con AD tipo ADS7861 (DVM a due cifre) Ingresso analogico Il modo di funzionamento del convertitore A/D presente sulla scheda è determinato dai comandi M0, M1 e A0, predisposti tramite ponticelli. I canali disponibili sono 4 (due con filtro e due diretti); in questo punto dell’esercitazione viene utilizzato solo uno dei canali non filtrati. La dinamica utilizzabile è da 0 a 5 V. La piastra utilizza la tensione di riferimento generata internamente al chip (2,5 V). La piastra deve quindi essere impostata per: - due canali di ingresso, uscita solo canali A (inizialmente solo A0) La conversione è continua, avviata dal segnale CONVST (L-H) collegato a RD Uscita digitale seriale Sull’uscita seriale (SDA) vengono inviate parole di 16 bit comprendenti i dati e l’indicazione del canale attivo. La piastra UP1 deve fornire - Clock , - CS* - CONVST/RD per sincronizzare la lettura dei dati e leggere - SDA: uscita dell’A/D presentata come dato seriale La tensione da applicare all’ingresso si può ricavare con un potenziometro dalla tensione di alimentazione (5V). Le operazioni da eseguire sono, nell’ordine: - stesura del codice VHDL verifica con simulazione compilazione (usare il componente EPM7128) programmazione della piastra verifica dei segnali di interfaccia generati da UP1 verso ADDA05 (CLK, CS*, CONVST) verifica del segnale trasferito su SDA verifica della lettura sul display misura dell’offset e del fondo scala, e verifica rispetto ai dati nominali. (verifica della massima cadenza di conversione consentita) Variando il livello di tensione continua all’ingresso fornito con il potenziometro si deve osservare una variazione nel flusso seriale di bit (conviene sincronizzare l’oscilloscopio con CS*). 4. Filtro tipo LTC 1264 Non viene utilizzato in questa esercitazione EseDVM06g.doc – PF, DDC - 10/05/2006 8.40 3 . 5. Progetto della logica di controllo all’interno della FPGA: Ricapitolando quanto detto precedentemente, la FPGA (Max EP7128 montata sulla UP1) deve, per il punto 2: - Generare i segnali CLK e CSDA; generare i valori dei campioni del segnale (rampa) inviare su DOUT i campioni del segnale; Per quanto riguarda la generazione del segnale di clock si può utilizzare un divisore di frequenza che operi sul clock in entrata alla FPGA. Questo segnale sulla scheda UP1 è fornito da un oscillatore che opera alla frequenza di 25 MHz, collegato direttamente al piedino 83 della MAX (come riportato sul data sheet della UP1). Il modo più semplice per realizzare un divisore di frequenza all’interno della FPGA è quello di utilizzare un contatore modulo N: ad ogni colpo di clock dell’oscillatore interno CLKIN il contatore incrementa di un’unità il valore che aveva precedentemente e quando arriva a N riparte da zero. L’uscita viene presa sul FF del MSB. Un primo contatore di questo tipo (Counter 1) realizza il clock CLK alla frequenza richiesta. Un secondo contatore (Counter 2) può generare il segnale CSDA e i campioni da trasmettere serialmente sulla linea DOUT verso il D/A. L’uscita di questo secondo contatore è disponibile in forma parallela, e quindi occorre un registro di conversione a ingresso parallelo e uscita seriale (PISO). A ogni colpo di clock la configurazione del contatore deve essere caricata dagli ingressi paralleli del PISO, e da questo scaricata serialmente verso il D/A (prima del clock successivo). Occorre poi alternare comandi e dati, ad esempio tramite un multiplexer. Lo schema a blocchi di uno dei possibili circutiti è in figura 1. CLK CLKIN COUNTER 1 CSDA COUNTER 2 COMMAND MULTIPLEXER PISO REGISTER DOUT Fig 1. Schema a blocchi interfaccia D/A (1 canale) Il registro PISO può essere realizzato con una catena di D-FF, collegati a shift register, con lo stesso Clock (CLK) e un comando di LOAD comune EseDVM06g.doc – PF, DDC - 10/05/2006 8.40 4 . (la parte che segue è derivata dall’esercitazione dell’AA 2004-05, con altro convertitore A/D; gli esempi di VHDL sono indicativi, e vanno adattati al nuovo convertitore) Per il punto 3 voltmetro con A/D) deve: - generare il segnale Clock - generare il comando Chip Select CS - leggere CONVST/RD per sincronizzare la lettura dei dati - memorizzare il dato seriale emesso da SERIAL DATA, ricostruendo correttamente il formato (12 bit); - decodificare il dato campionato in modo da pilotare correttamente i segmenti delle due cifre del display sulla scheda. Per quanto riguarda la generazione del segnale di clock si può utilizzare un divisore di frequenza che operi sul clock in entrata alla FPGA da utilizzarsi (ossia la MAX). Questo segnale sulla scheda UP1 è fornito da un oscillatore che opera alla frequenza di 25 MHz, collegato direttamente al piedino 83 della MAX (come riportato sul data sheet). Il modo più semplice per realizzare un divisore di frequenza all’interno della FPGA è quello di utilizzare un contatore modulo N: ad ogni colpo di clock dell’oscillatore il contatore incrementa di un’unità il valore che aveva precedentemente e quando arriva a N riparte da zero. Nel caso si aggiunga un’uscita ad un bit che cambia di stato (nel caso sia all’uno viene forzato allo zero e viceversa), questa genera un’onda quadra di frequenza fOSC/N. Una possibile implementazione di tale contatore con uscita del divisore di frequenza può essere: PROCESS(Clk_osc) CONSTANT N : INTEGER := … VARIABLE cnt : INTEGER RANGE 0 TO DIV; VARIABLE status: BIT :='0'; BEGIN Clkout <= status; IF (Clk_osc'EVENT AND Clk_osc = '1') THEN cnt:=cnt+1; IF (cnt=N) THEN cnt:=0; IF (status='0') THEN status:='1'; ELSE status:='0'; END IF; END IF; END IF; END PROCESS; Clk_osc è il clock in entrata alla FPGA (ossia quello dell’oscillatore a 25 MHz), mentre Clkout è quello di uscita utilizzato per il pin CLOCK I/O dell’ADC. Il numero intero N è definito come costante in quanto rappresenta il modulo del contatore (ossia il rapporto di divisione tra frequenza dell’oscillatore e quella dell’onda quadra generata in uscita). Ovviamente, essendo una costante, deve essere reimpostato nel codice VHDL. Si scelga questo valore in modo che la frequenza risultante in uscita sia di 2 MHz circa. Per quanto riguarda il segnale da impartire al piedino CS* dell’ADC, è possibile generare un’onda quadra (dato che si vuole che il voltmetro sia sempre attivo) con una frequenza 16 volte inferiore rispetto a quella del pin I/O CLOCK, questo perché l’ADS 7861 richiede 16 colpi di clock per emettere il valore della conversione sul pin DATA OUT. Per realizzare tale forma d’onda è sufficiente utilizzare sempre la struttura del process mostrato precedentemente ma con un modulo 16 e come segnale di clock d’ingresso quello destinato a I/O CLOCK invece di quello emesso dall’oscillatore. EseDVM06g.doc – PF, DDC - 10/05/2006 8.40 5 . Un altro blocco che deve essere realizzato all’interno della FPGA è il registro SIPO (Serial In Parallel Out) necessario per rendere parallelo a 12 bit il campione inviato dall’ADC sulla linea seriale DATA OUT. Questa funzione può essere svolta da uno shift-register, il quale può essere decritto utilizzando il linguaggio VHDL oppure utilizzando uno schematico composto dalla catena di flip flop di tipo D (componente presente in libreria). Il clock che deve avere in ingresso questo componente deve avere ovviamente la stessa frequenza di quello impartito all’ADC (essendo i dati inviati sincroni con questo segnale) ma per evitare possibili errori dovuti ai tempi di setup e hold, tenendo conto che i dati sono sincronizzati in trasmissione dai fronti di salita, si può sincronizzare lo shift register operi sul fronte di discesa del clock. Una possibile implementazione in VHDL di uno shiftregister sensibile al fronte negativo può essere: signal temp : std_logic_vector (7 downto 0); begin q <= temp; process(clock_ADC,reset) begin if reset = '1' then temp <= (others => '0'); elsif clock_ADC = '0' and clock_ADC'event then temp(0) <= shift_in; for i in 1 to 7 loop temp(i) <= temp(i-1); end loop; end if; end process; Nel caso lo si voglia descrivere utilizzando la modalità grafica, occorre inserire una catena di D-FF per formare uno shift-register, come indicato nella fig 2: q(0) q(7) data in D Q D Q … D Q clock AD Figura 2: Schematico dello shift register. Come si può notare lo shift register realizzato è sempre attivo: se le uscite pilotassero direttamente il display, verrebbero visualizzati dei valori continuamente variabili. Il valore corretto è questo presente quando tutti i dati seriali sono stati caricati nello shift; è necessario aggiungere un registro (PIPO) che mantenga verso l’ingresso del display il valore campionato sull’uscita parallela dello shift register. Questo secondo registro va aggiornato quando si riceve un nuovo valore dall’ADC, ossia sul fronte del 15° clock dopo l’attivazione (L H) di CONVST. EseDVM06g.doc – PF, DDC - 10/05/2006 8.40 6 . Questa funzione può essere svolta da un registro con ingresso di enable che viene a coincidere con il segnale CS#, oppure sempre con un registro che riceve come clock il segnale CS# stesso: questo infatti campionerà il dato contenuto nello shift register solo in corrispondenza del fronte positivo, ossia quando CS# si disattiva. L’ultimo blocco necessario è quello di decodifica, le cui uscite si interfacciano direttamente ai sette segmenti che compongono i due display presenti sulla scheda UP1. Per conoscere la corrispondenza tra pin della MAX e segmento del display è sufficiente visionare la tabella a pagina 9 del data sheet della UP1. 12 Il convertitore A/D può generare 2 = 4096 combinazioni, ma nel display sono disponibili solo due cifre. Per comodità di lettura si sceglie di rappresentare con quella di sinistra i V e quella di destra V/10. La tensione di ingresso è al massimo di 5 V, quindi è sufficiente usare i 6 bit più significativi 6 (2 = 64). Il blocco decodificatore può essere realizzato in VHDL utilizzando il costrutto WITH MYREGISTER_OUT SELECT DISPLAY1 <= “…” WHEN … … WITH MYREGISTER_OUT SELECT DISPLAY2 <= “…” WHEN … … Analogamente è equivalente usare il process: process(MYREGISTER_OUT) begin case (MYREGISTER_OUT) is when “…” => DISPLAY1 <= … DISPLAY2 <= … … end case; end process; Dove MYREGISTER_OUT è l’uscita a 6 bit del registro PIPO di campionamento, mentre DISPLAY1 e DISPLAY2 sono i due gruppi di uscite a 7 bit collegate rispettivamente al primo ed al secondo display. Lo schema finale di principio del voltmetro è quindi quello di figura 3. EseDVM06g.doc – PF, DDC - 10/05/2006 8.40 7 . clock_IO clock OSC CS# DIV. FREQ. GEN.CS# SHIFT REGISTER 12 bit SIPO data ADC 6 MYREG. 6 bit PIPO 6 DISPLAY1 7 DEC. 7 DISPLAY2 Figura 3: schema a blocchi voltmetro. I piedini CLOCK, CS* e SERIALDATA vanno collegati alla piastra ADDA05; è necessario sapere a quale numero dei piedini della MAX corrispondono. Si ricorda che è possibile assegnarli manualmente, oppure si può lasciare assegnare a Max+Plus. In questo caso la piedinatura utilizzata è indicata nel file di report del fitter. Se alcuni segnali vengono pilotati da uscite 3-S che possono andare in alta impedenza in determinate condizioni di funzionamento, è necessario inserire resistenze di pull-up o pull-down per avere sempre su tutti gli ingressi uno stato logico ben definito. EseDVM06g.doc – PF, DDC - 10/05/2006 8.40 8