Esercitazione di Elettronica Digitale -...

13
1 Esercitazione di Elettronica Digitale Ing. F. Iannuzzo - A.A. 2006/2007 Timer Programmabile. Introduzione Nella presente esercitazione si realizzerà un timer programmabile facendo uso di due dispositivi digitali di tipo sequenziale e precisamente un Flip-flop SR e un contatore. Si vedrà anche come realizzare un divisore di frequenza mediante l’uso di un contatore. Nel seguente diagramma temporale è riprodotto il comportamento del sistema. In corrispondenza del fronte di salita dell’ingresso start, il sistema inizia un conteggio di durata t COUNT . Alla fine di esso, il sistema produrrà un impulso in uscita. time start end t COUNT Lo schema da realizzare sarà il seguente: Il funzionamento è il seguente: inizialmente lo stato Q del flip-flop SR è 0. Conseguentemente, il pin cnt_en (“count enable”) del contatore è a 0, e il contatore non conta. Inoltre, data la presenza di una porta not, il pin sload (“syncronous load”) del contatore è alto e il contatore viene aggiornato continuamente al valore presente sugli ingressi data[7..0]. In queste condizioni, l’uscita cout (“Carry out”) è bassa, e diverrà alta solo nello stato di conteggio finale (in questo caso nello stato 0, essendo questo un down counter). Conseguentemente, anche l’ingresso R del flip-flop SR è nello stato basso. Portando alto il pin start, l’uscita Q del flip-flop SR verrà settata alta. In questo modo si avrà il duplice effetto di abilitare il contatore al conteggio e abbassare l’ingresso sload, impedendo al contatore di aggiornarsi ulteriormente al valore di ingresso. A questo punto, partendo dallo stato iniziale fissato da data[7..0], il contatore conterà all’ingiù

Transcript of Esercitazione di Elettronica Digitale -...

Page 1: Esercitazione di Elettronica Digitale - webuser.unicas.itwebuser.unicas.it/elettronica/iannuzzo/ElettronicaDigitale_2006... · Si apra l’ambiente di sviluppo Quartus II Si faccia

1

Esercitazione di Elettronica Digitale Ing. F. Iannuzzo - A.A. 2006/2007

Timer Programmabile.

Introduzione

Nella presente esercitazione si realizzerà un timer programmabile facendo uso di due dispositivi digitali di tipo sequenziale e precisamente un Flip-flop SR e un contatore. Si vedrà anche come realizzare un divisore di frequenza mediante l’uso di un contatore.

Nel seguente diagramma temporale è riprodotto il comportamento del sistema. In corrispondenza del fronte di salita dell’ingresso start, il sistema inizia un conteggio di durata tCOUNT. Alla fine di esso, il sistema produrrà un impulso in uscita.

time

start

end

tCOUNT

Lo schema da realizzare sarà il seguente:

Il funzionamento è il seguente: inizialmente lo stato Q del flip-flop SR è 0. Conseguentemente, il pin cnt_en (“count enable”) del contatore è a 0, e il contatore non conta. Inoltre, data la presenza di una porta not, il pin sload (“syncronous load”) del contatore è alto e il contatore viene aggiornato continuamente al valore presente sugli ingressi data[7..0]. In queste condizioni, l’uscita cout (“Carry out”) è bassa, e diverrà alta solo nello stato di conteggio finale (in questo caso nello stato 0, essendo questo un down counter). Conseguentemente, anche l’ingresso R del flip-flop SR è nello stato basso. Portando alto il pin start, l’uscita Q del flip-flop SR verrà settata alta. In questo modo si avrà il duplice effetto di abilitare il contatore al conteggio e abbassare l’ingresso sload, impedendo al contatore di aggiornarsi ulteriormente al valore di ingresso. A questo punto, partendo dallo stato iniziale fissato da data[7..0], il contatore conterà all’ingiù

Page 2: Esercitazione di Elettronica Digitale - webuser.unicas.itwebuser.unicas.it/elettronica/iannuzzo/ElettronicaDigitale_2006... · Si apra l’ambiente di sviluppo Quartus II Si faccia

2

fino allo stato 0. Non appena verrà raggiunto tale stato, poi, l’uscita cout andrà alta, resettando il flip-flop e riportando il sistema alla condizione iniziale.

Si noti come la durata del conteggio dipenda dal dato programmato dall’esterno data[7..0] mediante la semplice relazione:

CKCOUNT Tdatat ⋅= ]0..7[

dove TCK è il periodo del clock di sistema ed è, ovviamente, pari a:

CKCK f

T 1=

con fCK frequenza del clock di sistema.

Lo schema presenta i seguenti pin:

data[7..0]: ingresso a 8 bit, con cui si imposta il ritardo.

ck: segnale di clock.

start: start al conteggio.

out[7..0]: bus a 8 bit che contiene lo stato del contatore.

end: impulso di fine conteggio.

Progetto del Timer programmabile

Per prima cosa, dal menù Start -> Risorse del computer si scelga Disco locale (C:). si crei una cartella C:\Elettronica, e dentro se ne crei un’altra chiamata Timer. In questa cartella si inseriranno tutti i file del progetto.

Alla fine dell’esperienza si copi questa cartella su un supporto di memorizzazione rimovibile (FLOPPY o PENDRIVE) in quanto allo spegnimento del PC si perderanno tutti i dati salvati in precedenza.

Si apra l’ambiente di sviluppo Quartus II

Si faccia click su: File -> New Project Wizard, all’apertura della finestra, si scelga Next,

si scelga, facendo click su nel primo spazio, la directory C:\Elettronica\Timer precedentemente creata e si dia il nome Timer al progetto, specificandolo nel secondo e terzo spazio bianco. Si faccia click su Next fino ad arrivare alla finestra seguente:

Page 3: Esercitazione di Elettronica Digitale - webuser.unicas.itwebuser.unicas.it/elettronica/iannuzzo/ElettronicaDigitale_2006... · Si apra l’ambiente di sviluppo Quartus II Si faccia

3

Nella finestra che si apre, si scelga la sigla EPM240T100C5 dalla lista.

Si clicchi su Finish.

Si clicchi sull’icona e si scelga Block Diagram / Schematics File.

Si clicchi su OK

Si aprirà una finestra con una griglia, è qui che si dovranno inserire i componenti come mostrato dalla schema iniziale.

Si clicchi sull’icona , si aprirà la finestra denominata “Symbol”.

Si apra la libreria cliccando sull’icona , si scelga Primitives -> Storage e si inserisca “srff” (flip-flop di tipo SR) disabilitando la funzione Repeat-insert mode.

Ora si scelga, sempre dalla libreria, Megafunction e la sottocartella Arithmetic, si scelga “lpm_counter”. Si disabiliti la funzione Repeat-insert mode, altrimenti si inseriranno più componenti e si controlli che sia abilitata la funzione LaunchMegawizard Plug-In.

Si faccia click su Ok, si aprirà il wizard, si imposti AHDL come tipo di output file e si dia Next. Si scelga il numero di bit, pari a 8, si selezioni Down only e si dia Next. Si scelga Plain binary, Count Enable e Carry-out e si dia Next. Ora si scelga di inserire anche l’ingresso Load dalla sezione Synchronous inputs e si clicchi su Finish.

Page 4: Esercitazione di Elettronica Digitale - webuser.unicas.itwebuser.unicas.it/elettronica/iannuzzo/ElettronicaDigitale_2006... · Si apra l’ambiente di sviluppo Quartus II Si faccia

4

Si inserisca il blocco creato. Ora si apra la libreria cliccando sull’icona . Si disabiliti la funzione Repeat-insert mode e si scelga dal gruppo Primitives, la sottocartella Logic e si inserisca la porta Not come mostrato nello schema.

Si apra la libreria cliccando sull’icona . Si disabiliti la funzione Repeat-insert mode e si scelga dal gruppo Primitives, la sottocartella Pin, qui si scelga “Input”. Si inseriscano nello schema i pin di input e si colleghino come mostrato dallo schema.

Si rinominino i pin di input nel modo seguente: start, data[7..0] e Ck.

Si inseriscano i pin “Output” e si colleghino al bus q[7..0] e al cout rinominandoli rispettivamente out[7..0] e cout. Per effettuare il collegamento tra i componenti si avvicini il puntatore del mouse all’ingresso o all’uscita degli stessi. Si noti il cambiamento del cursore, e a questo punto, tenendo premuto il pulsante sinistro del mouse, si tracci il collegamento tra i componenti.

Si salvi il file e si proceda alla compilazione tramite l’icona posta in alto sulla barra dei comandi.

Finita la compilazione si visualizzi il Report della compilazione. Le informazioni che vi sono indicate riguardano le fasi della compilazione. Le fasi sono le seguenti:

Analysis and Synthesis: in questa fase si analizza il progetto e viene generata la Netlist che specifica i collegamenti tra i vari componenti.

Fitter: in questa fase il compilatore distribuisce nello spazio del CPLD le macrocelle contenenti i componenti del progetto.

Assembler: in questa fase il compilatore produce il file binario per la programmazione del CPLD.

Timing Analyzer: in questa fase il compilatore analizza i tempi di propagazione nel CPLD, calcola il tempo peggiore e il tempo migliore specificando il percorso per cui si hanno.

Simulazione del Progetto

Si impostino nel menù Tools -> Options e nella categoria Waveform Editor i seguenti valori:

Page 5: Esercitazione di Elettronica Digitale - webuser.unicas.itwebuser.unicas.it/elettronica/iannuzzo/ElettronicaDigitale_2006... · Si apra l’ambiente di sviluppo Quartus II Si faccia

5

1) Default file end time: 15 s

2) Default grid period : 100 ms

Si continui con l’esperienza cliccando su . Si scelga Vector Waveform File dal sottomenu Other Files e si clicchi su OK.

Nella presente esercitazione occorrerà modificare la scala dei tempi. Si scelga il menù Edit -> End Time... e si imposti 15 s (secondi). Si scelga il menù Edit -> Grid size... e si imposti 100 ms (millisecondi).

E’ utile osservare l’intero intervallo temporale. Per ottenere ciò, si faccia click sullo strumento Zoom Tool e si clicchi ripetutamente col tasto destro del mouse al centro dell’area di lavoro, fino a evidenziare

l’intervallo di simulazione di 15s.

Si faccia doppio clic nella parte sinistra della schermata bianca e si imposti, nell’opzione Radix il tipo di dato Binary, si scelga Node Finder.... Si utilizzi il menù filter e si scelga “Pins: all” e poi List. Apparirà la lista di tutti i pin del progetto. Si selezioni ck e start, e si clicchi su OK. Si ripeta il procedimento ma si imposti il tipo di dato in Radix al valore Unsigned

Decimal e si selezionino i segnali data e out. Ora si selezioni ck e si clicchi sull’icona apparirà la finestra seguente. Si imposti il periodo del clock a 1 secondo, come nella figura sotto e si dia OK

Si clicchi sull’icona e si selezioni, per l’ingresso start un intervallo di tempo di circa 1 secondo all’inizio della time bar, (prima di 3 secondi ad esempio). Si veda la figura seguente:

Page 6: Esercitazione di Elettronica Digitale - webuser.unicas.itwebuser.unicas.it/elettronica/iannuzzo/ElettronicaDigitale_2006... · Si apra l’ambiente di sviluppo Quartus II Si faccia

6

Si è impostato l’ingresso per quell’intervallo ad un valore alto. Si continui selezionando l’ingresso

data e cliccando sull’icona si imposti il valore 5.

Che cosa si sta facendo? Si sta indicando al contatore di caricare il dato presente in ingresso (5), impostando così il timer a 5 secondi.

Si salvi il file delle forme d’onda e si passi alla simulazione cliccando su Tools ->

Simulator Tool. Si ingrandisca la finestra del simulator tool con il tasto . Si imposti il tipo di simulazione tra le tre a disposizione.

Si hanno due tipi di simulazione principali (simulation modes), più un terzo avanzato (Fast timings model).

a) Functional: simulazione ideale, non tiene conto dei tempi di propagazione.

b) Timing: simulazione reale, tiene conto dei tempi di propagazione.

c) Timing Using fast timings model: non importante per questa esercitazione.

Si scelga per prima la simulazione Functional, e si clicchi su Generate Functional Simulation Netlist. Si selezioni il file delle forme d’onda (.vwf), e si dia Start per iniziare la simulazione. Se non si sono avuti errori, si clicchi su Report.

Nella finestra che si aprirà si visualizzeranno gli ingressi da noi impostati e le uscite calcolate dalla simulazione. Si verifichi se il risultato è quello voluto.

Dopo un transitorio iniziale, che dura fino al primo fronte di salita del clock, il sistema si porta nello stato iniziale, in cui il contatore è predisposto nello stato 5 (uscita out). In corrispondenza del primo fronte di salita del clock con ingresso start alto, comincia il conteggio all’ingiù. Alla fine del conteggio, l’uscita end viene attivata per un colpo di clock e il contatore torna allo stato iniziale.

Si ripeta la simulazione scegliendo questa volta il tipo Timing, si dia Start e si visualizzi, cliccando su Report, il risultato ottenuto in modo da confrontare le due simulazioni e notare le differenze.

Predisposizione della basetta Per utilizzare l’oscillatore di clock presente sulla basetta, occorre predisporre i connettori J4, J5 e J6 come indicato nella figura seguente. Tale impostazione fornisce al pin 14 del CPLD un clock a frequenza di 512Hz.

Page 7: Esercitazione di Elettronica Digitale - webuser.unicas.itwebuser.unicas.it/elettronica/iannuzzo/ElettronicaDigitale_2006... · Si apra l’ambiente di sviluppo Quartus II Si faccia

7

Per quanto detto, la basetta che si utilizza per le esercitazioni offre una frequenza di clock diversa da 1Hz, utilizzata in simulazione. Per sperimentare il funzionamento del timer realizzato, bisogna, dunque, modificare il progetto per far sì che funzioni alla frequenza di clock della basetta, pari a 512Hz. Come mostrato in figura seguente, è possibile far operare un contatore supplementare come divisore di frequenza. Nel nostro caso, tale contatore dovrà aver modulo di conteggio pari a:

512==richiesta

basetta

ffN .

Page 8: Esercitazione di Elettronica Digitale - webuser.unicas.itwebuser.unicas.it/elettronica/iannuzzo/ElettronicaDigitale_2006... · Si apra l’ambiente di sviluppo Quartus II Si faccia

8

Per fare ciò, si scelga dalla libreria il contatore LPM_COUNTER e si personalizzi impostando le seguenti opzioni nella creazione guidata.

• Up only • Number of bit: 9 (29=512) • plain binary • Carry Out • Clear – Load – Set: NO

Si è scelto un contatore modulo 512 che divide la frequenza del clock iniziale e la porta ad 1 Hz. Il contatore usato da divisore di frequenza si è dimensionato a 9 bit in quanto 29 = 512 è esattamente sufficiente a fornire il modulo del contatore. Come si nota dallo schema circuitale, il clock fornito al contatore contasecondi proviene dal divisore di frequenza. In questo modo, il timer, contando i colpi di clock conterà effettivamente un ritardo in secondi. Questa modifica però rende il circuito asincrono, in quanto non c’è un solo clock a sincronizzare tutti i componenti. Si noti anche che, nella figura precedente, sono state inserite le consuete porte not necessarie all’inversione dei segnali di led e pulsanti.

Modificato il progetto, lo si compili nuovamente con l’icona .

Assegnazione dei pin

Prima di programmare la basetta, occorre assegnare i pin al nostro progetto.

Cosa significa assegnare i pin?

Significa specificare le corrispondenze tra gli input e gli output del progetto e quelli del CPLD. A cosa saranno collegati, fisicamente, i segnali di ingresso? E quelli di uscita?

Un’idea potrebbe essere quella di impiegare SW1..SW8 per specificare l’ingresso data[7..0], SW) per il segnale di start, gli 8 led blu per l’uscita out[7..0], e il segmento A del display 1 all’uscita end. In appendice sono riportati i pin relativi a tali dispositivi.

Page 9: Esercitazione di Elettronica Digitale - webuser.unicas.itwebuser.unicas.it/elettronica/iannuzzo/ElettronicaDigitale_2006... · Si apra l’ambiente di sviluppo Quartus II Si faccia

9

Ai fini di assegnare i pin come stabilito sopra, si entri nel menù Assignments -> Pins, si

aprirà una finestra, si faccia click sull’icona posta in alto a destra. Col comando Show all Known Pin Names, si visualizzino tutti i segnali del progetto, in modo da facilitare l’assegnazione:

Si inseriscano, nella colonna Location, i pin stabiliti (Pin 14 per il segnale Ck).

Si ripeta tale operazione per gli altri pin, rispettando le assegnazioni descritte in appendice. Si ricordi che il display 1 va abilitato mettendo a massa il pin Enable DISP1 come segue:

a) e assegnandolo al pin 30. (Vedi Appendice)

Completata l’assegnazione dei pin, si salvi il file.

Che ne è degli altri pin inutilizzati del CPLD? E’ buona norma non lasciare “unspecified” alcun pin inutilizzato. Per fare ciò, si attivi Assignments… -> Device.

Si scelga il tasto Device & Pin Options… (v. sotto).

Page 10: Esercitazione di Elettronica Digitale - webuser.unicas.itwebuser.unicas.it/elettronica/iannuzzo/ElettronicaDigitale_2006... · Si apra l’ambiente di sviluppo Quartus II Si faccia

10

Si scelga la scheda Unused Pins e si scelga la voce “As input tri-stated with weak pull-up” (v. sotto).

Si clicchi su OK e si compili di nuovo il progetto (tasto ). Se non si hanno errori, si proceda alla fase di programmazione del CPLD.

Set-up della basetta

poiché è possibile che in questa fase si spenga inavvertitamente il PC, prima di effettuare qualunque operazione, è caldamente consigliato fare un backup della cartella di lavoro c:\elettronica su memory stick USB o floppy disk, pena il rischio di perdere il lavoro fatto finora.

Page 11: Esercitazione di Elettronica Digitale - webuser.unicas.itwebuser.unicas.it/elettronica/iannuzzo/ElettronicaDigitale_2006... · Si apra l’ambiente di sviluppo Quartus II Si faccia

11

Elenco del materiale che viene consegnato:

- basetta sperimentale

- alimentatore

- kit tripla presa + adattatore schuko

- cavetto di programmazione

Seguire scrupolosamente la seguente sequenza di operazioni:

1. Per prima cosa, per collegare l’alimentatore alla presa di alimentazione, staccare il monitor dalla presa (NON IL PC!!!!!) e utilizzare il kit tripla presa/adattatore per derivare la necessaria presa aggiuntiva. Ricollegare il monitor del PC.

2. Sincerarsi che l’alimentatore sia posizionato su 6V e inserirlo nella presa aggiuntiva.

3. Collegare lo spinotto di alimentazione alla basetta e accenderla con l’interruttore apposito. Se la basetta non dovesse accendersi subito, scollegare immediatamente lo spinotto e chiamare il docente!!!!

4. se la basetta si accende, è possibile che essa sia già programmata con vecchie esercitazioni. Non ci si stupisca, dunque, se il sistema incomincia alcune sequenze di operazioni (accensione di led, conteggi, ecc. ecc.)

5. Collegare il cavo di programmazione alla porta parallela del PC e al connettore di programmazione della basetta.

Programmazione del CPLD

Si faccia click sull’icona . Nella finestra che si aprirà, si controlli che appaia, come di seguito, la scritta ByteBlaster [LPT1] (se non compare, v.sotto).

Se non dovesse comparire, si clicchi su Hardware setup…, si clicchi su Add Hardware… e si scelga ByteBlasterMV or ByteBlaster II. Si clicchi su OK. Adesso si clicchi su No Hardware e si scelga ByteBlasterII [LPT1]. Si clicchi su Close.

Si attivi l’opzione Program/Configure e si clicchi su Start per iniziare la programmazione:

Page 12: Esercitazione di Elettronica Digitale - webuser.unicas.itwebuser.unicas.it/elettronica/iannuzzo/ElettronicaDigitale_2006... · Si apra l’ambiente di sviluppo Quartus II Si faccia

12

Verifica del progetto a) Si impostino dapprima tempi brevi (!) su SW1..SW8. Si dia lo start con SW9 e si contino i

secondi per verificare se effettivamente il timer funziona in modo corretto. b) Si facciano diverse prove di conteggio. c) Si modifichi il progetto in modo da mandare a un altro segmento del display anche l’uscita

Q del flip-flop SR. d) Si aggiunga al progetto la funzionalità di reset, collegando il pulsante reset sulla basetta

(attivo basso, pin 44) in OR logica sull’ingresso R del flip-flop. Verificare che, durante il conteggio, è possibile resettare il sistema senza attenderne la fine.

e) Alla fine del conteggio, appare uno stato “spurio”, con out=11111111b (255d). Perché? Come è possibile modificare il circuito per evitare tale fenomeno?

Ringraziamenti

Desidero ringraziare il Dott. Paolo Mele, laureato di questa Facoltà, per l’insostituibile contributo dato alla preparazione di questa e delle altre esercitazioni sugli hardware programmabili, nell’ambito del suo lavoro di tesi di laurea.

Appendice

Pin relativi agli switch on/off, ai display e ai led della basetta e assegnazioni suggerite.

Clock generator: PIN_14

Page 13: Esercitazione di Elettronica Digitale - webuser.unicas.itwebuser.unicas.it/elettronica/iannuzzo/ElettronicaDigitale_2006... · Si apra l’ambiente di sviluppo Quartus II Si faccia

13

SW Pin del

CPLD SW1 2 SW2 3 SW3 6 SW4 7 SW5 15 SW6 16 SW7 19 SW8 20 SW9 4 SW10 5 SW11 8 SW12 12 SW13 17 SW14 18 SW15 21 SW16 26

NB: tutti gli switch sono attivi BASSI

(switch premuto pin a “0”)

LED Pin del CPLD

LED1 48 LED2 49 LED3 43 LED4 47 LED5 37 LED6 39 LED7 90 LED8 88

NB: tutti i led sono attivi BASSI (“0”

led acceso)

Segmento Pin del

CPLD Segment A 33 Segment B 34 Segment C 35 Segment D 42 Segment E 41 Segment F 36 Segment G 38

Dot Point DP 40

Enable DISP 1 30 Enable DISP 2 29 Enable DISP 3 28 Enable DISP 4 27

NB: tutti i segmenti e i segnali di enable sono attivi BASSI (“0” segmento acceso)

Out7…Out0

Data7… Data0 start

end