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