Università degli Studi di Lecce
Facoltà di Ingegneria
Corso di Laurea in Ingegneria dell’Informazione
Tesi di Laurea
SVILUPPO DI UN OSCILLATORE SINCRONIZZATO
COL GPS PER APPLICAZIONI DI TIME STAMPING
Relatore:
Chiar.mo Prof. Marco Panareo
Laureando:
Andrea Donno
Anno Accademico 2005/2006
Indice
INDICE
Introduzione
1
CAPITOLO 1
IL SISTEMA SATELLITARE GPS
1.1
1.2
1.3
1.4
1.5
1.6
Cenni storici
Configurazione del sistema GPS
Come funziona il GPS
Scale temporali e segnale PPS
Errori del sistema
Il ricevitore GPS
4
5
8
11
12
14
CAPITOLO 2
ESPERIMENTO EEE E RIVELATORI
2.1 L’esperimento EEE
2.2 Il telescopio a MRPC
2.3 Teoria dell’operazione
17
17
20
CAPITOLO 3
SVILUPPO DEL FIRMWARE DELLA PIC
3.1
3.2
3.3
3.4
Il protocollo TSIP
L’errore di quantizzazione
Programmazione della PIC
Test del codice per la PIC
23
29
31
37
I
Indice
CAPITOLO 4
SVILUPPO DEL FIRMWARE DELL’FPGA
4.1 Introduzione ai dispositivi FPGA e
teoria delloperazione
4.2 Cenni sui linguaggi utilizzati per FPGA
4.3 Sviluppo del codice per FPGA
4.4 Simulazione al PC del codice sviluppato
4.5 Realizzazione circuitale
4.6 Test del dispositivo
4.6.1 Test del contatore “contaclock”
4.6.2 Test del contatore “contapps”
39
42
43
47
50
53
54
60
Conclusioni e sviluppi futuri
64
Appendice A
Piedinatura della PIC e caratteristiche principali
66
Appendice B
Listato Firmware della PIC
68
Appendice C
Piedinatura dell’FPGA
72
Appendice D
Listato Firmware dell’FPGA
75
Bibliografia
81
Ringraziamenti
82
II
Introduzione
INTRODUZIONE
I Raggi Cosmici sono particelle e nuclei atomici di alta energia che, muovendosi
quasi alla velocità della luce, colpiscono la terra da ogni direzione. L’esistenza dei
Raggi Cosmici fu scoperta dal fisico tedesco Victor Hess agli inizi del ventesimo
secolo. All’epoca gli scienziati si trovavano di fronte a un problema che non
riuscivano a spiegare: sembrava che nell’ambiente ci fosse molta più radiazione di
quella che poteva essere prodotta dalla radioattività naturale.
Nel 1912, Hess decise di tentare un esperimento per risolvere la questione ancora
aperta. Egli caricò su un pallone aerostatico un dispositivo per misurare le
particelle cariche detto elettroscopio a foglie e intraprese un viaggio che dimostrò
come la quantità di particelle cariche (e quindi di radiazione) aumentava con
l’altitudine. Questo significava che la radiazione sconosciuta non aveva origine
terrestre (come la radioattività naturale) ma proveniva dallo spazio esterno, da cui
il nome di Raggi Cosmici.
A partire da questo primo esperimento i raggi cosmici sono stati intensamente
studiati e adesso sappiamo molte cose sul loro conto. Da misure fatte su palloni
aerostatici a grande altitudine o su satelliti sappiamo che la grandissima
maggioranza dei raggi cosmici e’ costituita da protoni (circa 90%). Abbiamo poi
nuclei atomici (ovvero atomi privi dei loro elettroni) di svariati elementi, da quelli
più leggeri come l’elio (circa 9%) fino ai più pesanti (circa 1%) come ferro e
addirittura uranio.
Si pensa che i Raggi Cosmici, almeno quelli con energie fino a 1015 eV, vengano
accelerati in seguito alle esplosioni di Supernovae nella nostra Galassia. Una
esplosione di Supernova produce una fortissima onda d’urto che si propaga nel
gas interstellare ed e’ in grado di accelerare le particelle e i nuclei anche ad
energie molto elevate come quelle che vediamo nei raggi cosmici.
1
Introduzione
Quando i Raggi Cosmici entrano nell’atmosfera terrestre collidono con i nuclei di
cui essa e’ composta. In queste collisioni viene prodotto un gran numero di
particelle che a loro volta interagiscono o decadono creandone delle altre. Il
risultato e’ quello che viene chiamato “shower” ( Fig. 1), o sciame di particelle.
Per studiare i raggi cosmici di energia elevata si usano esperimenti situati sulla
superficie terrestre. Questi esperimenti rivelano i raggi cosmici secondari prodotti
nell’interazione del primario con l’atmosfera. Dalle caratteristiche dello “shower”
di particelle si può ricavare l’energia e la direzione del raggio cosmico primario.
Fig. 1 – Angolo di incidenza del raggio cosmico primario e direzione delle
particelle generate dall’interazione con l’atmosfera.
2
Introduzione
Questo e’ lo scopo del progetto EEE (Extreme energy events) che prevede
l’installazione di una serie di dispositivi, per la rivelazione dei raggi cosmici,
chiamati MRPC (Multigap Resistive Plate Chamber) in diverse sedi scolastiche
che vanno dall’estremo Nord al limite Sud Italia.
Uno dei problemi che ci si pone nell’affrontare l’esperimento, che corrisponde
anche all’obbiettivo di questa tesi, è dovuto al fatto che come detto in precedenza
abbiamo uno sciame di particelle che per essere rivelate hanno bisogno di
dispositivi distribuiti su di un’ampia estensione territoriale, così i dati estrapolati
dai vari rivelatori non possono essere controllati da un unico terminale e
soprattutto da un unico clock, quindi non si può ottenere facilmente una
correlazione temporale tra un dato e l’altro.
Per questo si impiega come riferimento temporale il sistema GPS che fa uso di
orologi atomici ad alta precisione per fornire indicazioni estremamente accurate.
Il ricevitore GPS riceve ogni secondo un segnale chiamato pulse per second (PPS)
sincronizzato con l’UTC (Universal Coordinated Time) che è oggi il sistema di
riferimento per la misura del tempo accettato in tutto il mondo, per questa ragione
l’esperimento EEE prevede l’uso di una stazione GPS locale per ogni rivelatore
MRPC.
Nell’intervallo di un secondo però possiamo avere più di un evento rivelato da
parte di un MRPC, per questo si ha bisogno di una sincronizzazione tra il
ricevitore GPS ed un oscillatore al quarzo che nel nostro caso lavora a 50 Mhz in
modo da ottenere dei riferimenti di tempo molto precisi (dell’ordine dei
nanosecondi).
Grazie alla presenza del GPS che ci fornisce il tempo assoluto, sincronizzato con
il quarzo siamo in grado di effettuare un’applicazione di time stamping che
consente di registrare, insieme alla misura, le informazioni sul tempo, cioè
ricreare in modo accurato l’evoluzione temporale dei dati rivelati registrando il
valore di un contatore, opportunamente sincronizzato, ogni volta che si verifica un
evento nel rivelatore.
Questa tesi è stata svolta con il supporto del Centro Studi e Ricerche Enrico
Fermi di Roma e della sezione di Lecce dell’Istituto Nazionale di Fisica Nucleare.
3
Capitolo 1. Il sistema satellitare GPS
Capitolo 1
Il Sistema satellitare GPS
1.1. Cenni Storici
Il sistema NAVSTAR – GPS (NAVigation System for Timing and Ranging –
Global Positioning System), più comunemente indicato con l’acronimo GPS,
avviato dagli U.S.A. a partire dagli anni ‘70, e completato nel 1994, è stato
realizzato per motivi principalmente militari, per rispondere all’esigenza del
Ministero della difesa degli Stati Uniti di seguire il percorso di mezzi militari
sulla terraferma ed in mare in modo da localizzarne la posizione in ogni momento
e consentirne eventuali operazioni di supporto e di salvataggio.
Nei primi anni ‘60 il primo esperimento a prendere vita è il TRANSIT, frutto
della collaborazione tra alcune delle più importanti organizzazioni governative, i
cui contributi maggiori sono da ricercarsi nel campo degli algoritmi di predizione
della posizione dei satelliti. Nel 1964 prende vita un altro precursore del GPS,
chiamato TIMATION, nel quale si ritrovano le prime applicazioni di orologi
atomici a bordo dei satelliti. Da qui in poi seguono diversi sistemi come il System
621B ed il SECOR.
Allo scopo di unificare i contributi di ognuno dei precedenti in un unico sistema,
si istituisce nel 1968 un comitato congiunto chiamato NAVSEG (NAVigation
Satellite Executive Group), con il compito di mettere a punto tutte le specifiche, al
fine di dar vita cinque anni dopo all’ esperimento chiamato GPS.
Tale programma entra nel vivo a partire dal 1969, quando la Rockwell
International produce i primi satelliti GPS; il primo lancio avviene nel luglio del
1974, seguito dopo quattro anni dal lancio del primo di undici satelliti
appartenenti al blocco che nel 1985 renderà il sistema funzionante. Nel febbraio
1989 iniziano i lanci dei 28 satelliti dei quali 24 operativi e 4 riservati ad eventuali
sostituzioni, che renderanno operativo nel 1994 il sistema GPS.
4
Capitolo 1. Il sistema satellitare GPS
Fino ad oggi non sono state apportate sostanziali modifiche escluso la rimozione
di alcuni disturbi ed il lancio dei satelliti di nuova generazione chiamati BLK IIA
(Fig. 1.1) e BLK IIR.
Fig. 1. 1 – Satellite BLK IIA
1.2. Configurazione del sistema GPS
Il GPS è un sistema di individuazione della posizione che utilizza 24 satelliti
artificiali, divisi in gruppi di quattro che ruotano attorno alla terra alla quota di circa
20.200 Km in orbite distanti fra loro di un angolo di 60° e formanti un angolo di 55°
rispetto al piano equatoriale. Esso consente la misura della posizione dell’utente
nelle tre coordinate spaziali (latitudine, longitudine e altitudine) e del tempo UTC (
Universal coordinated time) con una copertura globale e continua. Inoltre è possibile
ricavare altre grandezze, se richieste, quali velocità, direzione, accelerazione ed altro
ancora. Ovviamente la precisione sarà
limitata da tutta una serie di sorgenti di errori inevitabili (e che verranno descritte in
seguito), ma soprattutto dal tipo di ricevitore utilizzato la cui qualità influisce sulle
prestazioni complessive.
5
Capitolo 1. Il sistema satellitare GPS
Sono previste due classi di utenza: gli utenti militari, che fruiscono del Precise
Positioning Service (PPS), e gli utenti civili, che sfruttano lo Standard Positioning
Service (SPS). La differenza in termini di prestazioni tra PPS e SPS è ottenuta
artificialmente tramite i meccanismi di crittografia Selective Availability (SA) e di
Anti-Spoofing (AS). Il primo consiste nell’introduzione voluta di errori aggiuntivi
sui parametri di navigazione (rimossa dal DOD dal maggio 2000, ma con riserva di
riattivazione in caso di necessità senza preavviso). Questo tipo di disturbo serve per
negare una piena accuratezza all’utente SPS, mentre non ha effetti su utenti PPS in
quanto possiedono gli elementi per eliminare questa crittografia del segnale. Il
secondo è attivato per evitare tentativi di jamming da parte di utenti non autorizzati,
cioè serve a far in modo che nessun possa inviare repliche del codice proveniente dai
satelliti con l’intento di ingannare il ricevitore. La configurazione complessiva del
sistema GPS comprende tre distinti segmenti:
•
Il segmento SPAZIALE, formato dalla costellazione satellitare GPS
orbitante intorno alla Terra;
•
Il segmento di CONTROLLO, costituito da cinque stazioni GPS permanenti
poste lungo l'Equatore;
•
Il segmento UTENTE, rappresentato da chiunque sia dotato di un ricevitore
GPS.
Il segmento spaziale è costituito da una costellazione di 24 satelliti operativi, come
già accennato, affiancati da 4 satelliti previsti per eventuali sostituzioni. I satelliti
sono disposti, a gruppi di 4 o 5, su sei orbite centrate attorno alla Terra, in modo che
siano visibili da qualsiasi punto della superficie terrestre e in qualsiasi momento
almeno 4 satelliti al di sopra di un angolo di elevazione rispetto all'orizzonte di 15°.
Le orbite, di tipo ellittico, sono equispaziate tra loro di 60° e presentano un angolo di
inclinazione di 55° rispetto all’equatore ed un raggio approssimativo di 26,560 km
(Fig. 1.2).
I satelliti non sono di tipo geostazionario, ma hanno un tempo di rivoluzione attorno
alla Terra pari alla metà del giorno siderale, equivalente a circa 11 ore e 58 minuti,
con una velocità di 3874 m/sec.
6
Capitolo 1. Il sistema satellitare GPS
Fig. 1.2 – Costellazione delle orbite dei satelliti GPS
Componenti fondamentali di ciascun satellite sono i quattro orologi atomici di
bordo, due al Cesio e due al Rubidio, che garantiscono un errore inferiore al secondo
per un periodo che va da 30,000 ad un milione di anni e che servono per la
generazione dei segnali in trasmissione; tali orologi, infatti, danno luogo ad un
oscillatore con una frequenza base di 10.23 MHz, da cui è possibile ricavare tutte le
frequenze in gioco.
Per rendere il più indipendente possibile la potenza ricevuta dal punto di ricezione, il
diagramma di radiazione dei trasmettitori presenta un profilo sagomato
opportunamente sull’angolo di apertura; tale distribuzione deve tenere conto anche
del non uniforme guadagno di antenna del ricevitore di terra rispetto all’angolo di
elevazione. Il segmento di controllo ha il compito di controllare e monitorare l’intero
sistema GPS.
L’intera sezione è composta da una stazione di comando, la MCS (Master Control
Station), situata nella Falcon Air Force Base in Colorado, da cinque stazioni di
monitoraggio MS (Monitor Station) e da tre stazioni trasmittenti GA (Ground
Antenna),
controllate
dall’organo
statunitense
DSCS
(Defense
Satellite
Communications System). Le stazioni MSC e GA sono situate attorno al Globo
nelle vicinanze dell’equatore. La stazione di comando è responsabile del lavoro
svolto da tutto il control segment; essa elabora le informazioni pervenute da tutti i
satelliti attraverso le 5 stazioni di monitoraggio, mette a punto tutte le correzioni
7
Capitolo 1. Il sistema satellitare GPS
necessarie per ogni satellite e comanda la trasmissione delle stesse attraverso le 3
stazioni di controllo.
Tra le operazioni svolte dal Control Segment, le più importanti sono quelle di
monitoraggio dello stato dei satelliti, monitoraggio degli orologi di bordo dei
satelliti, del calcolo dei fattori orbitali e della trasmissione delle correzioni di tali
parametri, ottenute avvalendosi di strumenti di misurazione e di calcolo
notevolmente potenti e accurati, infatti la MSC è dotata di una serie di orologi
atomici altamente precisi ai quali vengono riferiti tutti gli altri orologi, sia a terra che
a bordo dei satelliti.
Infine il segmento utente è rappresentato da tutti gli utenti civili e militari del sistema
GPS, in particolare dai ricevitori, decodificatori ed elaboratori dei segnali GPS.
La Fig. 1.3 mostra uno schema generale della struttura del sistema GPS, visto nei
suoi principali segmenti.
Fig. 1. 3 – Organizzazione del sistema GPS nei tre segmenti
1.3. Come funziona il GPS
Il sistema di funzionamento del GPS è relativamente semplice. Si basa, di fatto,
sul metodo della triangolazione, un sistema utilizzato per secoli dai navigatori; il
sistema ricevente dell'utente riceve impulsi dai satelliti della costellazione Gps e,
attraverso un sistema di equazioni, desume la propria posizione triangolando i
segnali automaticamente. Utilizzando la rilevazione della posizione di almeno tre
8
Capitolo 1. Il sistema satellitare GPS
punti fissi (con coordinate note) si calcola la propria posizione, data dall'incontro
delle rette passanti per detti punti. Questa prima considerazione fa dedurre,
quindi, che non è il dispositivo di navigazione al suolo (in mare o nel cielo) che
comunica la propria posizione ai satelliti, come si potrebbe immaginare, ma il
contrario. Il dispositivo è atto a ricevere segnali univoci e continui dal satellite che
li invia in maniera unidirezionale. La ricezione dei segnali di tre distinti satelliti
fornisce un'indicazione abbastanza precisa della posizione, ma non assolutamente
precisa; per questo motivo occorre ricevere l'impulso da un quarto satellite per
ottenere la maggiore precisione possibile come vedremo tra poco. Ogni satellite
della costellazione genera un segnale contenente tre informazioni: il proprio
identificativo, la posizione sull'orbita in cui si trova e un segnale temporale la cui
precisione è garantita dall'orologio atomico montato a bordo. Attraverso queste
informazioni il dispositivo ricevente è in grado di conoscere la distanza esatta dal
satellite, moltiplicando il tempo di percorrenza del segnale per la velocità della
luce, circa 300.000 km al secondo. Chiaramente, però, il ricevitore può trovarsi in
un qualsiasi punto di un'ipotetica sfera il cui raggio è rappresentato dalla distanza
ricevitore/satellite. La ricezione di un secondo segnale, analogo al primo, da un
altro satellite genererà una seconda sfera che s'intersecherà con la prima in due
punti formando un'ellisse entro la quale si troverà il punto ricercato. Basterà
quindi ricevere il segnale da un terzo satellite per limitare le possibilità a due
punti molto vicini (uno dei quali potrà essere automaticamente eliminato per via
di considerazioni matematiche e cinematiche) e quindi ottenere la corretta
posizione dell'apparato ricevente. I problemi essenziali a questo punto sono due:
calcolare con massima precisione il tempo di percorrenza del segnale e garantire
la migliore sincronizzazione degli orologi (quello sul satellite e quello
dell'apparato di ricezione). Il sistema di codici utilizzato per ottenere la migliore
precisione del tempo di percorrenza è di tipo "pseudocasuale". S'intende con
questo termine un sistema di codici estremamente complesso, tale da apparire
pressoché casuale. In realtà si tratta di un codice ripetuto mille volte al secondo.
La lettura del codice generato dal satellite e di quello generato localmente dal
dispositivo ricevente (teoricamente nello stesso istante) e il loro confronto
causano una discrepanza e quindi una grandezza misurabile che fornisce il valore
della distanza. Il satellite emette il proprio segnale, e invia il proprio codice, su
due portanti: L1 (1.575,42 MHz) e L2 (1.227,60 MHz). Sulla prima portante
9
Capitolo 1. Il sistema satellitare GPS
viaggia un codice, detto C/A (Coarse Acquisition), ripetuto ogni 1.023 bit, e
occupa una banda da 1 MHz. Il C/A definisce un'acquisizione grossolana in
quanto lo sfasamento di un microsecondo (pari a poco meno di un ciclo),
moltiplicato per l'enorme distanza, può generare errori fino a 300 metri. Il secondo
codice P (Precise) è modulato invece a 10 MHz, quindi con una frequenza al
secondo dieci volte maggiore. Questo è il codice che, combinato con il primo,
garantisce la precisione richiesta. Il codice P è anche quello che l'Amministrazione
americana si è riservata di potere degradare in caso di necessità e di minaccia alla
sicurezza. Risolto il problema dei codici la questione è riconducibile a un problema
di precisione degli orologi. I quattro montati sul satellite sono precisi al milionesimo
di secondo, ma non altrettanto precisi possono essere quelli montati
sull'apparecchiatura. Entra in gioco allora il segnale ricevuto dal quarto satellite.
Supponendo che tutti i dispositivi (spazio-terra) siano perfettamente sincronizzati, la
triangolazione di quattro segnali che s'intersecano dovrebbe fornire l'indicazione
accurata di un punto. Si risolve, in pratica, un sistema di quattro equazioni in quattro
incognite rappresentate dalla latitudine, longitudine, altitudine ed errore
dell’orologio.
10
Capitolo 1. Il sistema satellitare GPS
Fig. 1. 4 – Misura della posizione nelle tre coordinate spaziali con errore di
sincronizzazione
1.4. Scale temporali e segnale PPS
Il GPS, come già accennato, può essere usato per la sincronizzazione temporale.
Esistono diverse scale per la misurazione del tempo, e si dividono principalmente
in tre categorie fondamentali: siderale, solare e atomica. Le prime due sono legate
al moto di rotazione terrestre rispetto a una direzione di riferimento nello spazio:
le scale siderali rispetto alla direzione dell’equinozio; le scale solari rispetto alla
direzione del Sole; La direzione di riferimento può essere quella vera o una
direzione media, depurata degli effetti perturbativi. Una scala di tempo siderale è
la GMST (Greenwich Mean Sidereal Time): angolo orario fra meridiano di
Greenwich e equinozio medio, aumentato di 12 ore; di tipo solare è la scala UT1
(Universal Time 1): angolo orario fra meridiano di Greewich e direzione del Sole,
depurato degli effetti del polar motion, aumentato di 12 ore. A causa
dell’irregolarità del moto di rotazione terrestre queste scale di tempo presentano
irregolarità significative e quindi tempo solare e tempo siderale differiscono
poiché, a causa del moto di rivoluzione terrestre intorno al Sole, la direzione di
11
Capitolo 1. Il sistema satellitare GPS
questo vista dalla Terra retrocede di giorno in giorno (in un anno vi sono
365.2422 giorni solari e 366.2422 giorni siderali).
Le scale di tempo atomico sono invece definite da un certo numero di orologi
atomici al Cesio 133 e sono le più accurate e stabili. In particolare abbiamo la scala
TAI (Tempo Atomico Internazione), definita dal BIPM di Parigi; la scala UTC
(Tempo Universale Coordinato) che ha la stessa cadenza del TAI ma è
periodicamente aggiornata sottraendogli 1 s per mantenerla sincronizzata entro il
secondo con la scala UT1. Infine abbiamo la scala di tempo GPST (GPS Time), che
è quella a cui il sistema, e quindi il ricevitore, GPS fa riferimento. Quest’ultima
coincide con il TAI a meno di un offset, definito in modo che al 6 gennaio 1980, ore
00.00, il GPST coincidesse con l’UTC.
Attraverso il ricevitore GPS si può quindi accedere con la precisione di una scala di
tempo atomica, ricevendo un particolare segnale ogni secondo chiamato PPS, che
può essere utilizzato come sistema di riferimento per il tempo. Il segnale PPS
garantisce una precisione dell’ordine di pochi nanosecondi ed è in assoluto il
migliore standard disponibile per lunghi tempi di integrazione.
1.5. Errori del sistema
Fino a questo punto si è ipotizzato che la posizione derivata dal sistema GPS sia
molto precisa ma in realtà esistono varie fonti d’errore che diminuiscono la
precisione della posizione GPS di alcuni metri. Molti di essi possono essere
corretti mediante appositi algoritmi o formule derivate da misure effettuate
durante la fase sperimentale del sistema.
Le fonti principali di errore sono:
•
Ritardi d’origine ionosferica ed atmosferica : Il segnale GPS
attraversando l'atmosfera può subire un rallentamento, con un effetto
simile alla luce che si rifrange attraverso un blocco di vetro. Tale
rallentamento può introdurre un elemento di errore nel calcolo della
posizione a terra in quanto la velocità del segnale viene alterata. La
ionosfera non causa un ritardo costante del segnale, ma esistono vari
fattori che contribuiscono ad influenzarne l'effetto, come l’elevazione del
12
Capitolo 1. Il sistema satellitare GPS
satellite, l'influenza del Sole sulla densità della ionosfera e il vapore
acqueo contenuto nell'atmosfera. Questi effetti però sono controllabili
attraverso l’uso di ricevitori GPS a doppia frequenza.
•
Errori degli orologi di satellite e ricevitore : benché gli orologi operativi
sul satellite siano molto accurati (fino a circa 3 nanosecondi), sono
soggetti in alcuni casi a lievi variazioni che danno luogo ad errori di
minima entità che influiscono quindi sull'accuratezza della posizione. Il
Dipartimento della Difesa statunitense controlla gli orologi dei satelliti
mediante il segmento di controllo e può correggere qualsiasi variazione
rilevata.
•
Multipath : Il Multipath del segnale GPS si verifica quando l'antenna del
ricevitore è posizionata vicino ad un'ampia superficie riflettente, quale per
esempio un lago o un edificio. Il segnale del satellite non si dirige
direttamente sulla antenna, bensì colpisce l'oggetto vicino e viene riflesso
sull'antenna, dando luogo quindi ad una falsa misurazione. Gli effetti del
Multipath possono essere ridotti utilizzando delle speciali antenne GPS
che incorporano un "ground plane", un disco metallico, che impedisce
all'antenna la ricezione di segnali provenienti dal basso. Le antenne GPS
dell'ultima generazione sono in grado di filtrare il segnale che ha subito un
Multipath anche se la massima accuratezza è ottenibile utilizzando
un'antenna di tipo choke ring. Questo tipo di antenna è infatti dotata di 4 o
6 anelli concentrici che "intrappolano" i segnali indiretti. Il Multipath
influisce solamente sulle misure di precisione, del tipo richiesto dai rilievi
topografici. I semplici ricevitori portatili per navigazione non utilizzano
tecniche di filtro per i segnali riflessi.
•
Diluizione della precisione : la Diluizione della Precisione (DOP) è il
parametro di valutazione della disposizione dei satelliti e si riferisce alla
distanza e alla posizione dei satelliti nel cielo. Il parametro DOP può
amplificare l'effetto degli errori di rilevamento dei satelliti. Quando i
satelliti sono correttamente distanziati la posizione è individuabile
nell'ambito dell'area in ombra del diagramma e il margine di errore
13
Capitolo 1. Il sistema satellitare GPS
possibile è ridotto. Quando i satelliti sono eccessivamente ravvicinati le
dimensioni dell'area in ombra
aumentano e aumenta di conseguenza
anche l'incertezza della posizione. I diversi tipi di Diluizione della
Precisione sono calcolabili in base alle dimensioni. Il miglior modo per
ridurre al minimo gli effetti del DOP consiste nell'osservare il maggior
numero possibile di satelliti.
•
Disponibilità selettiva e Anti Spoofing (S/A) : La disponibilità selettiva
insieme all’ anti spoofing
è un algoritmo, inizialmente applicato al
segnale GPS dal Dipartimento della Difesa statunitense, allo scopo di
impedire ai civili e a potenze straniere ostili di usufruire al completo della
capacità di localizzazione del sistema GPS; il processo consiste
nell'introdurre una piccola alterazione nel funzionamento degli orologi dei
satelliti. Inoltre le effemeridi (ovvero la posizione del satellite sul
percorso) vengono trasmesse in modo leggermente diverso dal reale. Ne
risulta la degradazione dell'accuratezza della posizione. Recentemente,
come già detto in precedenza, questi algoritmi sono stati eliminati,
consentendo ai ricevitori civili un incremento della precisione.
1.6. Il ricevitore GPS
I ricevitori GPS sono ricevitori radio sintonizzati sulle frequenze usate dal
sistema, dotati di sistemi di decodifica ed elaborazione dei segnali ricevuti e di
una memoria per l’immagazzinamento dei dati. Sono composti da un’antenna che
viene disposta sul punto da determinare. L’antenna è collegata mediante un cavo
schermato al ricevitore propriamente detto, ovvero al gruppo di sintonizzazione e
acquisizione dati che comprende oltre ai sistemi di decodifica del segnale e al
microprocessore di elaborazione, un orologio di precisione (normalmente un
oscillatore al quarzo di elevata qualità), una memoria fisica interna e un software
interno per il controllo del processo di acquisizione dati. Le caratteristiche dei
ricevitori variano a seconda della ditta produttrice e del modello. Le differenze
più significative fra i vari tipi di ricevitori attualmente in commercio sono le
seguenti:
14
Capitolo 1. Il sistema satellitare GPS
•
possibilità di ricezione dei segnali su una sola frequenza, (apparati
“monofrequenza”) o entrambe le frequenze disponibili;
•
numero di canali di ricezione (ne occorre uno per satellite), da un minimo
di 4 a un massimo di 12;
•
misura con il metodo “pseudoranges” o anche con il metodo per
“differenza di fase”.
Il ricevitore utilizzato in questo lavoro è il Trimble Resolution T (Fig. 1.5) che per
alcune proprietà elencate di seguito è stato scelto tra i vari modelli presenti sul
mercato.
Il Resolution T ha un numero di canali in ricezione pari a 12 ed opera sulla
frequenza L1 (1575.42 MHz). Sfrutta inoltre lo standard SPS usando il codice
C/A ( Coarse Acquisition). Necessita di una doppia alimentazione: 3.3V per
alimentare il GPS e 5.5V per alimentare l’antenna. Il ricevitore è montato su di
una motherboard che permette l’interfacciamento con un PC attraverso la porta
seriale RS-232, ed è stato scelto in primo luogo per l’alta risoluzione nelle
applicazioni temporali infatti, prevede una precisione dell’ordine di pochi
nanosecondi (1 Sigma) per l’uscita PPS.
Un’altra importante caratteristica è data dall’antenna (Fig. 1.6) che ha forma
semisferica per permettere di correggere l’errore di multipath già descritto nel
paragrafo precedente, evitando quindi di incorrere in errori dovuti alla ricezione di
segnali riflessi. Può inoltre operare usando uno dei due protocolli disponibili:
TSIP (Trimble Standard Interface Protocol) o NMEA 0183 (National Marine
Electronics Association). Il primo, utilizzato in questo lavoro, è un protocollo a
pacchetti binari che permette all’utilizzatore il massimo controllo sulla
configurazione, fornendo come dato in uscita anche l’errore di quantizzazione
che, permette di ottenere una correzione sul segnale PPS emesso dal ricevitore e
quindi una più alta precisione. Il protocollo NMEA invece è uno standard
industriale usato soprattutto per applicazioni marine e permette una compatibilità
diretta con altri dispositivi che supportano questo standard.
15
Capitolo 1. Il sistema satellitare GPS
Fig. 1. 6 – Antenna del
Fig. 1.5 – Ricevitore resolution T
ricevitore
16
Capitolo 2. Esperimento EEE e rivelatori
Capitolo 2
Esperimento EEE e rivelatori
2.1. L’esperimento EEE
L’esperimento EEE (Extreme Energy Events) ha come obiettivo lo studio della
radiazione cosmica ad alta energia. Esso prevede che nel corso dei successivi tre
anni scolastici, attraverso una sinergia tra Scuola, Università ed Enti di ricerca,
21 Scuole del territorio nazionale (Licei e Istituti Tecnici) vengano dotate di un
apparato sperimentale dedicato all’osservazione e alla misura dei muoni cosmici,
consistente in un “telescopio” formato da tre piani di rivelatori del tipo Multigap
Resistive Plate Chambers (MRPC).
Il progetto si articola nelle seguenti tre fasi:
1. costruzione dei rivelatori MRPC;
2. realizzazione del telescopio con MRPC e messa a punto della
strumentazione;
3. presa dati e analisi.
Questo lavoro si propone di sviluppare una parte della terza fase del progetto, più
precisamente si occupa della rivelazione dei dati catturati dai telescopi
affrontando tutte le problematiche esistenti in un sistema con dati dislocati.
2.2. Il telescopio a MRPC
Il sistema di rivelazione modulare del Progetto EEE, che viene installato in ogni
Scuola, è un telescopio costituito da tre piani di rivelatori MRPC (Fig. 2.1). Ogni
17
Capitolo 2. Esperimento EEE e rivelatori
camera, che offre un’area sensibile di (1.6 x 0.82) m2, presenta una struttura a
sandwich, costituita da:
•
due piani esterni di elettrodi metallici che hanno la forma di strisce
longitudinali,
•
ciascuna lunga 1.6 m e larga 34 mm ;
una coppia di vetri resistivi, cui è applicata una alta tensione, posta tra i due
piani;
•
un insieme di lastre di vetro, posizionate all’interno, ed intervallate da strati
di gas, nel quale i raggi secondari rilasciano la propria energia ionizzandone
le molecole.
Il sistema descritto è capace di misurare con grande precisione il punto d’impatto
della particella cosmica incidente e il suo tempo di attraversamento. La precisione
nella determinazione della coordinata trasversale del punto d’impatto è di 34 mm,
ma potrà anche risultare migliore nel caso in cui due strip vicine diano segnale. Ogni
strip è connessa, a ciascuna delle sue estremità, con un sistema elettronico di lettura
e di acquisizione del segnale. La differenza in tempo tra i segnali ai due estremi di
ogni strip produce la coordinata longitudinale del punto d’impatto, con una
precisione di circa 1 cm. Tramite la misura della posizione dei tre punti d’impatto
(uno per piano) è quindi possibile ricostruire la traiettoria rettilinea della particella
che ha attraversato il telescopio. Per la lettura e l’acquisizione dei dati, a ogni
telescopio è associata una catena elettronica costituita da: un sistema di front end,
per l’amplificazione e la discriminazione dei segnali forniti dagli elettrodi di readout
dei rivelatori MRPC; da un sistema di conversione, per la digitalizzazione delle
informazioni acquisite e da un sistema di trigger, per la selezione delle particelle, che
genera un segnale (trigger), quando almeno una striscia di ogni singolo piano è
attraversata da una particella. Il segnale di trigger si ottiene effettuando un OR logico
fra tutti i segnali provenienti dalle strisce di ogni singolo piano e, successivamente,
ponendo i tre OR in AND logico. La catena elettronica è connessa con un
calcolatore tramite un’opportuna interfaccia. Il telescopio è dunque in grado di
acquisire dati e di trasmetterli via rete ad un opportuno “centro di raccolta”. Ogni
telescopio inoltre è geograficamente localizzato e temporalmente sincronizzato via
satellite tramite un sistema GPS. È dunque prevista anche l’installazione di
un’apposita antenna GPS. Così facendo i telescopi delle varie Scuole possono essere
messi in coincidenza in fase di analisi dei dati, allo scopo di rivelare eventi cosmici
18
Capitolo 2. Esperimento EEE e rivelatori
di energie estreme connessi a sciami cosmici di grande apertura angolare; in questo
modo il notevole numero di muoni da essi trasportati, provenienti da un punto
comune nell’alta atmosfera terrestre (il cosiddetto vertice d’interazione del raggio
cosmico primario che ha dato origine allo sciame) potrebbero essere rivelati
simultaneamente da diversi telescopi situati a grande distanza l’uno dall’altro. I dati
trasmessi da tutti i telescopi nelle varie Scuole saranno raccolti e archiviati presso il
CNAF (National Center for Telematics and Informatics) dell’INFN (Istituto
Nazionale di Fisica Nucleare) di Bologna. L’analisi dei dati sarà effettuata tramite il
sistema innovativo di calcolo distribuito GRID, usufruendo dell’esperienza del
CERN e dell’INFN in tale settore.
Fig. 2.1 – Principio di funzionamento di un rivelatore MRPC
19
Capitolo 2. Esperimento EEE e rivelatori
2.3. Teoria dell’operazione
La fase del progetto da espletare in questa tesi, come già detto precedentemente,
riguarda
la
rilevazione
dei
dati
e
una
prima
analisi,
consistente
nell’organizzazione temporale dei dati rilevati sull’intero territorio nazionale.
I dispositivi fin qui esposti sono caratterizzati dal fatto di essere esterni al modulo
progettato, più precisamente sono dei dispositivi di input del sistema. Di seguito è
riportato uno schema a blocchi che descrive le varie parti del progetto e i
collegamenti tra questi:
Fig. 2.2 – Schema a blocchi del dispositivo generale
20
Capitolo 2. Esperimento EEE e rivelatori
I dispositivi esterni sono: antenna, ricevitore GPS, telescopio a MRPC.
Gli altri blocchi invece fanno parte di un unico circuito che estrae i dati acquisiti e
li organizza dal punto di vista temporale, creando un database elettronico.
Essi sono:
•
il blocco PIC, che corrisponde ad un microcontrollore della Microchip,
che estrae i dati necessari dal ricevitore GPS, per ottenere un riferimento
temporale con una precisione del secondo, converte l’UTC e la data in
secondi dall’inizio dell’anno e, associando questo valore a posizione del
GPS ed errore di quantizzazione, invia il tutto tramite un bus dati, al
dispositivo successivo;
•
il blocco CONTATORE, che in realtà contiene una coppia di contatori.
Questo dispositivo, si può dire, che permette di colmare la lacuna della
PIC, permettendo una precisione superiore al secondo, attraverso l’uso di
un clock esterno, indicato in figura, con frequenza pari a 50 Mhz.
Il ricevitore GPS invia i dati alla PIC attraverso la porta seriale RS232 senza
necessità di un’interfaccia, visto che il ricevitore è montato su una scheda madre
che prevede la conversione dei dati dallo standard TTL a quello RS232. I dati
inviati alla PIC sono in formato TSIP, ed oltre a questi viene anche fornito il
segnale PPS. La PIC ha il compito di estrarre solo i dati utili, per questo è stato
necessario interpretare il protocollo TSIP, in modo da elaborare solo le stringhe di
codice che sono di nostro interesse. Il dispositivo CLOCK, che è visto in figura
come un blocco esterno al contatore, è costituito in pratica da un oscillatore al
quarzo. Nel circuito di test è stato utilizzato un oscillatore al quarzo stabilizzato in
temperatura, affiancato da un oscillatore non stabilizzato, perché il primo
consente di ottenere un’alta precisione, e quindi una maggiore stabilità dei dati da
analizzare. Praticamente il quarzo stabilizzato è visto come un clock “quasi”
ideale, usato solo nella fase sperimentale, nella realizzazione finale verrà
utilizzato il quarzo non stabilizzato, dato l’alto costo del concorrente associato al
gran numero di dispositivi da realizzare. L’oscillatore stabilizzato, incorpora al
suo interno, un dispositivo che permette, attraverso un sensore di temperatura, di
raggiungere una determinata temperatura e mantenerla costante nel tempo, per
garantire la stabilità del clock. Si intuisce che questo quarzo ha bisogno di un
certo tempo per raggiungere la temperatura prefissata e stabilizzarsi. Il quarzo non
stabilizzato invece, subisce delle variazioni sui cicli di clock, di un range
21
Capitolo 2. Esperimento EEE e rivelatori
prestabilito ed indicato dalla casa produttrice, dovute all’aumento di temperatura.
Il blocco contatore, permette quindi di aumentare la precisione del time stamping
dei dati, riempiendo la “gap” che lascia la PIC, corrispondente ad un range di un
secondo, attraverso il clock fornito dal quarzo stabilizzato. Il contatore riceve
dalla PIC, il numero di secondi dall’inizio dell’anno, quando questo dato è
disponibile, ponendo il segnale “enable” nello stato alto e i segnali PPS, che
fungono da riferimento per il conteggio. Uno dei contatori fa riferimento al valore
dei secondi dall’inizio dell’anno, come punto di partenza, per poi incrementarlo
grazie agli impulsi PPS. Il secondo contatore, conta le oscillazioni del clock
fornito dal quarzo, azzerando il valore ogni secondo. Il segnale di trigger
stabilisce il momento in cui questi dati (comprensivi di errore di quantizzazione e
posizione del GPS) devono essere riportati in uscita, insieme ai dati rivelati dal
telescopio, ottenendo quindi un riferimento temporale di questi ultimi, con una
precisione dell’ordine dei nanosecondi.
Il contatore fornisce in uscita i dati relativi a posizione ed errore di
quantizzazione, tramite la linea dati indicata in figura 2.2, come “info aggiuntive”.
Per concludere quindi, la PIC ci fornisce un riferimento temporale universale,
scandendo il tempo con intervalli del secondo, mentre il contatore permette,
tramite una sincronizzazione con la PIC, una precisione dell’ordine dei
nanosecondi, necessaria al time stamping dei dati.
Sono stati utilizzati un contatore ed una PIC con le varie interfacce perché questa
soluzione garantisce la massima integrazione rapportata alla massima velocità di
esecuzione dei vari processi.
Infine, tutti i dati necessari per una successiva elaborazione ed organizzazione
sono inviati ad un’interfaccia che è collegata ad un bus dati. Data l’alta frequenza
di lavoro del circuito (50 Mhz) e la dimensione delle stringhe da elaborare (fino a
26 bit per stringa), sarà necessario usare all’interno dell’interfaccia finale un
buffer per la memorizzazione temporanea dei dati, per non perdere nessun ciclo.
Nei prossimi due capitoli si analizzeranno in dettaglio i due blocchi fondamentali
del dispositivo per capirne meglio il funzionamento, elencando le caratteristiche
dei singoli componenti utilizzati, i problemi affrontati nella realizzazione e le
soluzioni possibili.
22
Capitolo 3. Sviluppo del firmware della PIC
Capitolo 3
Sviluppo del firmware della PIC
3.1. Il protocollo TSIP
Il ricevitore GPS trasmette dei pacchetti di dati con tutte le informazioni relative alla
posizione, al tempo e alle richieste effettuate.
Il Resolution T , come già accennato, può fornire questi dati usando uno dei
protocolli disponibili tra l’ NMEA ed il TSIP. Il protocollo utilizzato in questo
esperimento è il TSIP che rispetto al primo fornisce, su richiesta, il valore
dell’errore di quantizzazione per ogni segnale PPS ricevuto. Sarà chiaro nel
prossimo paragrafo l’importanza della presenza dell’errore di quantizzazione tra i
dati prelevati dal GPS.
Il TSIP inoltre, rispetto all’ NMEA, permette la configurazione della porta seriale
RS232 in modo da avere un controllo bidirezionale, attraverso l’invio di richieste
al GPS. Si può così avere un controllo sui dati ricevuti e soprattutto si può evitare
di ricevere dati inutili che ritardano solo la lettura di quelli utili.
Il protocollo TSIP è basato quindi, sulla trasmissione di pacchetti di informazioni
tra il dispositivo collegato e il ricevitore GPS. Ogni pacchetto include un codice
che identifica il significato e il formato dei dati trasmessi nel suo interno, ed è
preceduto e seguito da alcuni caratteri di controllo. Il GPS è configurato per
trasmettere automaticamente in uscita i pacchetti 0x8F-AB e 0x8F-AC (0x
indica che i valori sono indicati in esadecimale). Per la maggior parte degli utilizzi
del GPS questi pacchetti sono sufficienti perché contengono i dati relativi al
tempo, alla posizione e allo stato e funzionamento del GPS.
I parametri di configurazione del GPS sono memorizzati in una memoria non
volatile. L’utente può cambiare il valore dei parametri per ottenere l’operazione
desiderata, ma le modifiche dei parametri non vengono
23
memorizzate
Capitolo 3. Sviluppo del firmware della PIC
automaticamente, per far questo deve inviare il pacchetto 0x8E-26 direttamente al
Resolution T, che provvederà a salvare le modifiche in memoria. Per ripristinare i
parametri al valore di default, basta inviare il pacchetto 0x1E al ricevitore.
La velocità con cui i dati vengono trasmessi con questo protocollo è di 9600 baud,
sia in uscita che in entrata, inoltre questi ultimi hanno una lunghezza di 8 bit; la
parità è dispari, con un bit di stop.
La struttura dei pacchetti TSIP è la stessa sia per le richieste che per i dati in
uscita, ed è di seguito indicata:
<DLE> <id> <data string bytes> <DLE> <EXT>
Dove:
<DLE> rappresenta il byte 0x10
<EXT> rappresenta il byte 0x03
<id> rappresenta il byte che identifica il pacchetto, il quale può avere qualsiasi
valore
tranne <EXT> e <DLE>.
La “stringa dati” può avere qualsiasi valore. Considerando valida l’ultima
affermazione, possiamo supporre che all’interno della “stringa dati”, sia presente
il valore “<DLE> <EXT>”, questo però può portare a confondere una sequenza di
valori all’interno della stringa dati, con la sequenza che indica la fine del
pacchetto. Per ovviare a questo inconveniente, il protocollo TSIP utilizza un
algoritmo apposito:
ogni byte <DLE> contenuto nella stringa dati è preceduto da un byte <DLE>
extra, che deve essere aggiunto prima dell’invio del pacchetto e rimosso dopo la
sua ricezione. Grazie a questo algoritmo si può identificare la fine del pacchetto,
che è rappresentata dal byte <EXT> preceduto da un numero dispari di byte
<DLE>.
Di seguito è riportato un semplice esempio, per comprendere meglio il
funzionamento dell’algoritmo:
24
Capitolo 3. Sviluppo del firmware della PIC
<DLE> <id> <DLE> <EXT> <DLE> <EXT>
stringa dati senza algoritmo
<DLE> <id> <DLE> <DLE> <EXT> <DLE> <EXT> stringa dati con algoritmo
La prima sequenza ricevuta è sempre quella di inizio pacchetto, corrispondente a
<DLE> <id>, successivamente si ha la stringa dati (evidenziata in rosso) che, nel
primo caso non prevede l’algoritmo di correzione, ed essendo identica alla
sequenza di fine pacchetto, non c’è modo di identificarla univocamente. Nel
secondo caso invece, è applicato l’algoritmo e, anche se all’interno della stringa
dati è presente la sequenza <DLE> <EXT> identica a quella di fine pacchetto,
non può mai essere confusa con quest’ultima, visto che all’interno della stringa
dati il valore <EXT> è preceduto da un numero pari di <DLE>.
I pacchetti che contengono tutte le informazioni necessarie da fornire al sistema
progettato sono i due che il GPS trasmette per default, cioè 0x8F-AB e 0x8FAC, ed un terzo, ottenuto tramite la richiesta 0x24 che restituisce il pacchetto
0x6D. Si analizza ora ogni singolo pacchetto per individuare i dati necessari tra
tutti quelli presenti, in modo da poterne effettuare l’estrazione.
Di seguito vengono riportate tre tabelle con tutti i dati contenuti in ogni singolo
pacchetto:
25
Capitolo 3. Sviluppo del firmware della PIC
Byte
Bit
Item
Type
Value
Description
0
Subcode
UINT8
0xAB
1-4
Time of week
UINT32
GPS seconds of
week
5-6
Week number
UINT16
GPS
week
number
7-8
UTC Offset
SINT16
UTC
Offset
(seconds)
9
0
Timing Flag
Bit field
1
2
3
4
0
GPS time
1
UTC time
0
GPS PPS
1
UTC PPS
0
Time is set
1
Time is not set
0
Have UTC info
1
No UTC info
0
Time from GPS
1
Time from user
10
Seconds
UINT8
0 - 59
Seconds
11
Minutes
UINT8
0 - 59
Minutes
12
Hours
UINT8
0 - 23
Hours
13
Day of Month
UINT8
1 - 31
Day of month
14
Month
UINT8
15 - 16
Year
UINT16
1 -12
Month of year
Four digits of
year
Tabella 3.1: pacchetto ricevuto 0x8F-AB
26
Capitolo 3. Sviluppo del firmware della PIC
Byte
Item
Type
Value
0
Subcode
UINT8
0xAC
1
Receiver mode
UINT8
0-7
2
Reserved
UINT8
0-6
3
Self-survey progress
UINT8
4-7
Reserved
UINT32
0
Reserved
8-9
Reserved
UINT16
0
Reserved
10 - 11
Minor alarms
UINT16
12
GPS decoding status
UINT8
13
Reserved
UINT8
0
Reserved
14
Spare status 1
UINT8
0
15
Spare status 2
UINT8
0
16 - 19
Local clock bias
ns
20 - 23
Local clock bias rate
ppb
24 - 27
Reserved
Reserved
28 - 31
Reserved
Reserved
32 - 35
Temperature
Degrees C
36 - 43
Latitude
Double
Radians
44 - 51
Longitude
Double
Radians
52 - 59
Altitude
Double
Meters
60 - 63
PPS Quantization Error
Seconds
64 - 67
Spare
Future
Description
Reserved
0 - 100%
expansion
Tabella 3.2: pacchetto ricevuto 0x8F-AC
27
Capitolo 3. Sviluppo del firmware della PIC
Byte
Bit
Item
0
0:2
Fix dimension Bit field
1-5
0
3
fix mode
0-1
Auto-manual
0
4:7
Number
0 - 12
Count
Type
Bit field
of Bit field
Value
Meaning
sv’s in fix
1-4
PDOP
Single
PDOP
5-8
HDOP
Single
HDOP
9-12
VDOP
Single
VDOP
13-16
TDOP
Single
TDOP
17- n
SV PRN
SINT8
+/- (1-32)
PRN
Tabella 3.3: pacchetto ricevuto 0x6D
Ogni pacchetto è composto da un numero variabile di byte nei quali sono
contenute diverse informazioni diversificate da un item, nella terza colonna è
indicato il tipo di informazione che si sta trasmettendo, e nella successiva i valori
che questa può assumere. Nell’ultima colonna si ha una breve descrizione utile
alla comprensione dei dati. Il byte “0” è l’identificativo del pacchetto, infatti nella
colonna “value” ritroviamo il nome di quest’ultimo.
Da 0xF-AB, che rappresenta il pacchetto primario del tempo, si sono estratti tutti i
dati per ottenere i secondi dall’inizio dell’anno e l’anno corrente, più precisamente,
nella tabella 3.1, dal byte “10” al “14” corrispondenti rispettivamente a: secondi,
minuti, ore, giorno del mese e mese. Nei byte “15 – 16” è contenuto l’anno corrente.
Dal pacchetto 0x8F-AC si può ricavare la posizione del GPS attraverso i dati relativi
alla latitudine (byte “36 – 43”), longitudine (“44 – 51”) e altitudine (“52 – 59”). In
questo pacchetto inoltre, è contenuta l’informazione relativa all’errore di
quantizzazione indicata nella tabella 3.2 in corrispondenza dei byte “60 – 63”. Nel
pacchetto 0x6D, inviato dal GPS su richiesta, l’unica informazione necessaria da
estrarre riguarda il numero di satelliti connessi, che come si è già visto
precedentemente, deve essere superiore o uguale a 4 per ottenere dei dati attendibili.
Attraverso la prima porta seriale del GPS, questi dati sono inviati alla PIC per una
successiva elaborazione.
28
Capitolo 3. Sviluppo del firmware della PIC
Direttamente dal ricevitore GPS invece, più esattamente dal pin 9 della seconda
porta seriale, otteniamo infine l’impulso positivo PPS, che è capace di pilotare un
carico fino a 5mA senza danneggiare il ricevitore.
3.2. L’ errore di quantizzazione
Il flusso di dati in qualsiasi processore è riferito alla velocità di questo ed è misurato
in MHz. Un singolo ciclo di questa frequenza è di solito riferita ad un ciclo di clock,
ed ogni istruzione o calcolo avviene in corrispondenza di un ciclo. Così per ottenere
il segnale PPS ci deve essere un ciclo di clock. Questo metodo di riferimento dei
segnali in corrispondenza del clock introduce un errore chiamato errore di
quantizzazione.
Il ricevitore GPS resolution T garantisce un’alta affidabilità del segnale PPS, grazie
all’accuratezza degli orologi atomici a cui fa riferimento, ma ciò nonostante anche
questo segnale, come tutti i segnali reali, è affetto da diversi errori. Quando le
applicazioni richiedono maggiore precisione di quella fornita dal ricevitore GPS a
basso costo, uno dei principali parametri su cui agire è quello relativo alla correzione
dell’errore di quantizzazione.
Il resolution T include un oscillatore con frequenza a 12.504 MHz, quindi il ciclo di
clock si ha 12.504.000 volte al secondo, che corrisponde ad un periodo di 80
nanosecondi tra due cicli di clock. Possiamo pensare quindi che il GPS per 80
nanosecondi è incapace di fornire il PPS. Il ricevitore tipicamente pone il segnale
PPS nel ciclo di clock vicino; ad esempio, se si suppone che GPS idealmente,
fornisce il PPS 50 nanosecondi dopo il ciclo di clock, allora deve aspettare e portare
in uscita il PPS al prossimo ciclo di clock. Questo ritardo in realtà non è mai
costante, quindi gli 80 nanosecondi di gap introducono un errore di
± 40
nanosecondi (Fig. 3.1). La forma d’onda rappresenta il clock a 12.504 MHz.
L’uscita del resolution T deve essere posta su uno dei fronti del clock, quindi
l’ultima forma d’onda è quella che si ha in uscita dal GPS, mentre la seconda
rappresenta il segnale del tempo UTC ricevuto. La differenza in termini di tempo tra
il fronte di salita del clock usato per generare il PPS e il punto in cui il resolution T
ha determinato dove dovrebbe essere posto il PPS, rappresenta la misura dell’errore
29
Capitolo 3. Sviluppo del firmware della PIC
di quantizzazione. Usando entrambi i fronti del clock l’errore sul PPS per il
resolution T scende a ± 20 nanosecondi.
Fig. 3.1 – Errore di quantizzazione
La misura dell’errore di quantizzazione può essere usata quindi, per ridurre
l’effettivo jitter sull’impulso PPS.
Le specifiche del resolution T riportano una precisione sul tempo del valore di 1sigma, che corrisponde ad un valore inferiore ai 15 nanosecondi. Rimuovendo
l’errore di quantizzazione dal segnale PPS la precisione aumenta, raggiungendo un
valore inferiore ai 5 nanosecondi.
Sono presenti molti altri errori che influenzano la precisione, ma questi sono quasi
irrilevanti rispetto all’errore di quantizzazione.
Un procedimento per eliminare l’errore di quantizzazione ma non implementato in
questo caso, consiste nell’utilizzo di un PLL (phase locked loop), cioè di un anello
ad aggancio di fase, che mette in sintonia la frequenza dell’oscillatore con quella del
sistema GPS, permettendo una riduzione dell’errore sulla fase del segnale. Nel
diagramma ( Fig. 3.2 ) è riportato lo schema a blocchi di un circuito PLL: al nodo
“A” si ha il segnale PPS che include l’errore di quantizzazione, al nodo “B” l’errore
di quantizzazione riportato dal GPS attraverso la porta seriale. Il nodo “C”
corrisponde all’errore di fase dopo aver sottratto l’errore di quantizzazione. In figura
( Fig. 3.2 ) è riportato il grafico temporale del segnale ai tre nodi descritti; si vede
come l’errore in fase è notevolmente ridotto.
30
Capitolo 3. Sviluppo del firmware della PIC
Fig. 3.2 – Schema a blocchi di un PLL e grafici dei segnali ai nodi A, B e C.
3.3. Programmazione della PIC
Le informazioni trasmesse dal GPS, come già detto, sono organizzate in pacchetti,
tramite il protocollo TSIP. L’estrazione dei dati da questo protocollo è il compito
assegnato alla PIC, che collegata tramite una porta seriale al ricevitore GPS, ed
opportunamente programmata, estrae i dati necessari da fornire ai successivi
dispositivi. Il modello di PIC utilizzato in questo lavoro è la PIC16F877 (appendice
A).
In un primo momento, si è collegato il ricevitore GPS in ingresso alla PIC, mentre
l’uscita di quest’ultima era collegata ad un display LCD in modo da poter verificare,
l’esattezza dei dati estratti e soprattutto la presenza di errori o ritardi nella lettura.
Tramite il software messo a disposizione dalla Trimble, è stato possibile visualizzare
sul PC, i pacchetti ricevuti dal GPS. Questo ha permesso lo studio in tempo reale di
ogni singolo pacchetto e la successiva implementazione del codice per programmare
la PIC.
31
Capitolo 3. Sviluppo del firmware della PIC
I dati contenuti nei pacchetti vengono visualizzati e aggiornati dal software sul PC,
con cadenza di un secondo. Di seguito è riportato un esempio di acquisizione dati:
Receive Packet ID: 8F-AB Data Length: 17
(da GPS a PC)
AB 00 04 6E 89 05 5D 00 00 08 29 28 08 03 05 07 D6
Receive Packet ID: 8F-AC Data Length: 68
(da GPS a PC)
AC 07 00 00 00 00 00 00 00 00 08 00 00 00 00 00 C8 8E DA AD 43 6D 65 13 00
00 00 00 00 00 00 00 41 E2 FA D0 3F E6 87 19 2C 02 49 2A 3F D4 3A F2 31
AF 7B 75 40 50 84 23 55 74 00 00 32 11 E8 FE 00 00 00 00
Transmit Packet ID: 24 Data Length: 0
(da PC a GPS)
Transmit Packet ID: 27 Data Length: 0
(da PC a GPS)
Receive Packet ID: 6D Data Length: 20
(da GPS a PC)
38 00 00 00 00 00 00 00 00 00 00 00 00 3F 80 00 00 13 16 0E
Receive Packet ID: 47 Data Length: 61
(da GPS a PC)
0C 01 BF B3 33 33 15 80 00 00 00 10 80 00 00 00 03 80 00 00 00 1C 80 00 00 00
13 40 D9 99 9A 16 40 86 66 66 08 80 00 00 00 0E 40 86 66 66 12 80 00 00 00
1A 80 00 00 00 1D 80 00 00 00
Come si può notare, i pacchetti corrispondono alla descrizione fornita dal protocollo
utilizzato. I primi due sono i pacchetti ricevuti per default dal GPS, poi si ha una
richiesta da parte del PC di due pacchetti supplementari, corrispondente al comando
“transmit packet”, che vengono forniti subito dopo. Ad esempio se vogliamo
ricavare l’orario in cui questi dati sono stati ricevuti, basta convertire l’undicesimo
valore del primo pacchetto da esadecimale in decimale per ottenere i secondi, ed i
due successivi rispettivamente, per minuti ed ore. Nella ricezione dei pacchetti, si è
osservato che la loro lunghezza non è costante, come ci si potrebbe aspettare dal
fatto che le informazioni al loro interno sono divise in byte corrispondenti, nelle
tabelle dei pacchetti, univocamente a quel dato. Questa variazione proviene dal fatto
32
Capitolo 3. Sviluppo del firmware della PIC
che, come osservato in precedenza, ogni volta che il GPS riceve all’interno della
stringa dati, il valore 0x10, che corrisponde anche al valore di inizio e fine del
pacchetto, questo viene seguito da un valore identico extra, in modo da non
confondere il valore interno alla stringa che rappresenta un dato, con quello
utilizzato dal protocollo per la separazione dei pacchetti. Per questo, se all’interno di
una stringa dati sono presenti due valori 0x10, il pacchetto 0x8F-AB che
normalmente ha una lunghezza pari a 17 byte assumerà una lunghezza pari a 18
byte. Tutti i byte nella stringa dati, successivi al dato 0x10, quindi vengono sfasati di
una posizione rispetto a quella che normalmente occupano, e così via se si presenta
un altro dato 0x10. Questo naturalmente ha portato ad affrontare la stesura del
codice per la PIC tenendo conto del fatto che l’array che immagazzina i dati può
essere variabile e soprattutto che i dati non sono sempre nella stessa posizione.
Nell’appendice B è riportato il listato del codice di programmazione della PIC.
Si esaminano di seguito le istruzioni eseguite dalla PIC, riportate, per chiarire
ulteriormente i passaggi, in un diagramma di flusso ( Fig. 3.3) :
prima di tutto vengono inizializzate le linee di I/O della PIC, definendo per ogni
porta se si tratta di ingresso o uscita e se la PIC gestisce segnali analogici o digitali.
Successivamente, si definiscono le variabili e si verifica l’esatto funzionamento del
display LCD, collegato in uscita alla PIC, attraverso la visualizzazione di una
stringa: “dati provenienti dal GPS”. Ora bisogna estrarre le informazioni necessarie
dai pacchetti ricevuti dal GPS: vengono inizializzate alcune variabili; attraverso un
comando di “wait” si attende che la PIC riceva dal GPS l’ID del pacchetto utile,
corrispondente alla prima informazione del pacchetto. Individuata l’intestazione del
pacchetto, seguono tutte le informazioni così come vengono riportate nelle tabelle
precedentemente descritte. Per ovviare al problema del dato “0x10”, si estrae un
numero di byte superiore a quello previsto dal pacchetto; si potrebbe estrarre un
numero di byte in più molto alto, nell’eventualità che il dato “0x10” si ripeta molte
volte nella stringa dati, ma facendo questo rischiamo, nel caso in cui ad esempio il
dato “0x10” non sia presente, di acquisire in un array i dati del pacchetto successivo,
che dovrebbero essere contenuti in un altro array. Per questo si prevede un numero
di byte in più non superiore a tre, per non “intaccare” il pacchetto successivo. Questo
vuol dire che, quando i dati del pacchetto contengono un numero di byte “0x10”
superiore a tre, si può verificare un errore nell’acquisizione dati. Il problema può
essere risolto semplicemente, inserendo un algoritmo di controllo che verifichi la
33
Capitolo 3. Sviluppo del firmware della PIC
successione dei dati e che corregga l’errore quando i valori non sono consecutivi. Il
primo pacchetto estratto è quello che il ricevitore fornisce in uscita per primo, e cioè
il pacchetto 0x8F-AB. Questo contiene i dati relativi a secondi, minuti, ore, giorno,
mese ed anno, che vengono inseriti in un array. Per conoscere la posizione esatta dei
singoli dati nell’array, dobbiamo eliminare l’eventuale presenza dei byte “0x10”
superflui. Questo viene fatto attraverso una concatenazione di cicli IF che
controllano la presenza di due valori “0x10” consecutivi, eliminandone uno, ed
inserendo tutto il contenuto dell’array in un secondo array “normalizzato” che non
contiene cioè i dati superflui. Il limite pari a tre per i byte in più da acquisire, è
dovuto al fatto che il primo pacchetto contiene l’informazione sull’anno corrente in
ultima posizione quindi, dopo di questo abbiamo la sequenza <DLE> <EXT>
<DLE>, dove i primi due termini indicano la fine del pacchetto in esame, mentre
l’ultimo indica l’inizio di quello successivo. Per questo l’acquisizione di un byte in
più potrebbe non far funzionare il “wait” sul pacchetto successivo.
Le operazioni eseguite sul pacchetto seguente ( 10x8F-AC) sono identiche a quelle
precedenti e permettono l’estrazione dei dati relativi a: latitudine, longitudine,
altitudine ed errore di quantizzazione. Queste informazioni vengono sempre inserite
in un array successivamente “normalizzato”.
L’ultimo pacchetto estratto (0x6D) ottenuto in risposta dal GPS alla richiesta
effettuata dalla PIC, contiene le informazioni relative al numero di satelliti collegati.
Questo dato, come gia anticipato, è necessario per verificare l’attendibilità dei dati
fin ora acquisiti. Infatti i dati possono essere considerati esatti solo se il numero di
satelliti collegati è compreso fra 4 e 12. Il numero minimo di satelliti collegati è
posto pari a quattro poiché per misurare in modo esatto e contemporaneamente
latitudine, longitudine, altitudine e tempo, sono necessarie quattro variabili e quindi
quattro segnali ricevuti in questo caso da diversi satelliti.
34
Capitolo 3. Sviluppo del firmware della PIC
Fig. 3.3 – Diagramma di flusso delle operazioni eseguite dalla PIC
35
Capitolo 3. Sviluppo del firmware della PIC
Dalle tabelle dei singoli pacchetti si possono ricavare i tipi di dati usati nel
protocollo TSIP:
•
secondi, minuti, ore, giorno del mese e mese sono byte di tipo UINT8.
Questo vuol dire che il valore rappresentato è composto da 8 bit ed è privo di
segno, può assumere i valori compresi tra 0 e 255;
•
latitudine, longitudine ed altitudine, sono indicati come tipi “Double”, cioè
possono assumere i valori compresi tra 1.7x10-308 e 3.4x10+308, con 53 bit di
precisione;
•
l’errore di quantizzazione è un dato di tipo “Single” e può assumere i valori
compresi tra 3.4x10-38 e 1.7x10+38, con 24 bit di precisione;
•
il numero di satelliti collegati è un dato di tipo “bit field” e usa quattro bit per
rappresentare un numero compreso tra 0 e 12.
L’ultima operazione eseguita dalla PIC riguarda la trasformazione dell’ orario UTC
ricevuto in secondi dall’inizio dell’anno. Per far questo, prima di tutto si verifica
attraverso un ciclo il caso in cui si ha un anno bisestile, in modo da poter considerare
il mese di febbraio di 28 o 29 giorni. Successivamente si ricavano i giorni trascorsi
dell’anno corrente (variabile “dayanno”) che vengono poi trasformati in ore
(variabile “temp”). Il passaggio da ore a secondi dall’inizio dell’anno richiede l’uso
di due variabili, perché essendo quet’ultimo un numero relativamente grande per
essere contenuto in una variabile “word”, bisogna usarne due. Il numero di secondi
contenuti in un anno, è pari a 31536000, che corrisponde ad un numero binario di
25bit. Poiché una variabile “word” può contenere al massimo 16 bit, se ne usano
due, facendo in modo che, attraverso un operazione di assegnazione, si abbiano i bit
più significativi in una variabile “word” chiamata “secannoh”, mentre i bit meno
significativi vengono memorizzati in una variabile “word” chiamata “secannol”.
Bisogna ora aggiungere a questo valore diviso in due variabili i minuti trasformati in
secondi ed i secondi trascorsi, così si avrà il conteggio dei secondi dall’inizio
dell’anno. I minuti convertiti in secondi sommati ai secondi trascorsi, sono
memorizzati in una variabile chiamata “secanno”. Si deve ora decidere come fare
per sommare questa quantità ad un valore che è diviso in due variabili. Una variabile
“word” può rappresentare un valore decimale massimo pari a 65535; il numero
massimo di secondi contenuto in un ora, che corrisponde al massimo valore che può
36
Capitolo 3. Sviluppo del firmware della PIC
assumere la variabile “secanno”, vista la sua definizione, è pari a 3600. Per ottenere
la somma quindi, basta controllare se la quantità “secanno” può essere contenuta
nella variabile “secannol” e se la verifica ha esito positivo, basta solo fare la somma
tra le due, altrimenti oltre a questo bisogna incrementare di uno la variabile che
contiene i bit più significativi e cioè “secannoh”.
Per concludere, viene effettuata una verifica dei dati attraverso la visualizzazione di
questi su di un display LCD.
3.4. Test del codice per la PIC
Una volta programmata, la PIC viene inserita in un circuito creato per il test del
codice ottenuto ( Fig. 3.4). La programmazione avviene attraverso la porta seriale
del PC collegata al circuito di test, tramite un deviatore che in base alla posizione
riceve o trasmette i dati dalla porta. Il ricevitore GPS può essere inoltre collegato
tramite la porta seriale sia al circuito di test che al PC. Il collegamento al circuito
permette di verificare il funzionamento del programma, attraverso la visualizzazione
dei dati a display. Il collegamento al PC permette di verificare che la PIC trasmetti al
ricevitore GPS la richiesta del pacchetto aggiuntivo necessario all’estrazione del
numero di satelliti collegati e soprattutto di confrontare i valori visualizzati sul
display LCD con quelli ottenuti dal software della Trimble per verificare l’esattezza
dei dati ottenuti. I valori visualizzati sul display, quando è garantito il minimo
numero di satelliti collegati, sono:
•
UTC
•
Data
•
Latitudine
•
Longitudine
•
Altitudine
•
Numero di satelliti collegati
•
Errore di quantizzazione
Se le informazioni non risultano attendibili, sul display è visualizzata la stringa:
“Numero di satelliti insufficiente”.
37
Capitolo 3. Sviluppo del firmware della PIC
Quando il numero di satelliti collegati è superiore a tre, il circuito estrae i dati in
modo continuo e senza errori. Il collegamento ad un numero di satelliti superiore a
tre, è garantito dal ricevitore dopo un tempo di qualche minuto dal momento
dell’accensione, ed è mantenuto se le condizioni di ricezione sono ottime. Il circuito
prevede 8 bus di uscita da 16 pin ciascuno, per trasferire le informazioni prelevate, al
blocco successivo.
Fig. 3.4 – Circuito di test per la PIC
38
Capitolo 4. Sviluppo del firmware dell’FPGA
Capitolo 4
Sviluppo del firmware dell’FPGA
4.1. Introduzione ai dispositivi FPGA e teoria dell’operazione
Fig. 4.1 – Diagramma a blocchi di una FPGA generica
Le FPGA (Field Programmable Gate Array) sono dispositivi programmabili
dall’utente, costituiti da un array di componenti logici, circondati da blocchi di
I/O programmabili e collegabili tra loro tramite interconnessioni anch’esse
programmabili; le FPGA costituiscono un’importante evoluzione nel mondo dei
dispositivi programmabili poichè forniscono un’elevata potenza di calcolo e di
39
Capitolo 4. Sviluppo del firmware dell’FPGA
connessione. Un aspetto molto importante sono i collegamenti locali che
attraversano il dispositivo e che sono condivisi da pochi
elementi logici, per cui la potenza utilizzata ed i ritardi che si generano sono
limitati. All’interno di uno stesso dispositivo possono esserci differenti linee
locali di lunghezza diversa e questo garantisce un’elevata flessibilità del sistema.
Field Programmable Gate Array, significa che la funzione dell' FPGA è definita
dal programma dell'utente, piuttosto che dalla disposizione, non modificabile, dei
dispositivi che realizzano le funzioni logiche.
Questi dispositivi permettono di raggiungere livelli di integrazione molto spinti,
mantenendo la caratteristica di basso costo di produzione iniziale, tipico dei
dispositivi programmabili.
Esistono diverse FPGA in commercio con caratteristiche molto variabili. In
questo lavoro si è utilizzata una SPARTAN-XL della XILINX, perché soddisfa le
richieste di progetto, corrispondenti a:
•
Un adeguato numero di connessioni I/O, vista la dimensione ed il numero
dei dati in gioco;
•
Un’alta velocità di esecuzione delle istruzioni da eseguire;
•
Capacità di porte equivalenti disponibile;
•
Possibilità di programmazione sul campo.
Il modello di SPARTAN-XL utilizzata è, più precisamente, la XCS10XL che ha
le seguenti caratteristiche:
Dispositivo Celle
Massimo
logiche numero
di Gate
Range Matrice CLB
tipico
CLB
Numero
totali FLIP
Di
FLOP
I/O Bit di
RAM
totali
Gate
XCS10XL 466
10.000
3.000
14 x 14
196
616
112 6.272
–
10.000
Le altre caratteristiche (data sheet), come piedinatura e altro, sono riporatate
nell’appendice C.
40
Capitolo 4. Sviluppo del firmware dell’FPGA
Il codice viene trasferito nell’FPGA saldata sulla scheda da una EEPROM
montata su zoccolo e opportunamente programmata.
Come si vede dalle caratteristiche di questa FPGA, il numero di piedini
disponibili come ingressi o uscite è pari a 112, un numero abbastanza elevato per
questo tipo di applicazione. Le celle logiche disponibili per la programmazione
sono 466, che corrisponde ad una quantità molto più alta di quella necessaria alla
realizzazione del blocco da progettare ma utile per eventuali sviluppi futuri. Altre
caratteristiche sono il numero di CLB (Configurable Logic Blocks), pari a 196,
corrispondenti ai quadratini in giallo indicati con la sigla LC di figura 4.1; la
matrice è inoltre composta da 14 righe e altrettante colonne. Il numero di flip-flop
implementabili al suo interno è pari a 616.
La rete implementata nella FPGA deve assolvere il compito di doppio contatore,
come già detto precedentemente. Di seguito è riportato uno schema a blocchi, che
visualizza i segnali di ingresso, di uscita e le varie interconnessioni tra i due
contatori implementati nella FPGA:
Fig. 4.2 – Schema a blocchi del contatore realizzato con FPGA
41
Capitolo 4. Sviluppo del firmware dell’FPGA
Questo schema è una visione più dettagliata del blocco “CONTATORE” indicato
in figura 2.1. Vediamo come questo viene integrato nello schema generale:
•
il segnale “clockin”, corrisponde all’ingresso proveniente dal blocco
“clock”;
•
“ppsin” proviene direttamente dal ricevitore GPS e corrisponde al segnale
PPS prelevato dalla porta seriale;
•
“triggin” arriva in ingresso al contatore, dall’interfaccia collegata al
telescopio a MRPC, corrispondente al segnale di trigger, cioè di dato
pronto in ingresso al contatore;
•
il segnale “offsetin”, corrisponde al bus di dati proveniente dalla PIC;
•
entrambi
i
segnali
“enablein”
e
“resetin”,
vengono
impostati
dall’utilizzatore, per effettuare determinate operazioni di lettura o di reset;
•
“selectin” è semplicemente un segnale che permette di selezionare uno dei
due segnali provenienti dai contatori, per portarlo in uscita;
•
l’uscita “outconta” corrisponde ai due segnali in uscita al contatore dello
schema generale “contaclock” e “contapps”.
Si vedrà in seguito che uno stesso segnale può effettuare operazioni logiche
diverse a seconda del contatore che pilotano e che quindi non si può etichettate
una variabile con la sua funzionalità.
4.2. Cenni sui linguaggi utilizzati per FPGA
Esistono diversi linguaggi per la programmazione di dispositivi FPGA, ma il
software che la casa produttrice Xilinx fornisce per la programmazione delle
SPARTAN-XL utilizza i due linguaggi più diffusi. Più che due linguaggi, in realtà
si tratta di un unico codice utilizzato con approcci diversi:
•
Schematic
•
VHDL
Il primo è un metodo di programmazione grafico che permette un’ampia visibilità
dei dispositivi e delle porte utilizzate, e quindi una maggiore facilità di
comprensione del funzionamento. Il VHDL invece è di per se un linguaggio di
programmazione vero e proprio, composto da una sequenza di codice scritto.
Anche se molto più complesso del primo il VHDL permette l’integrazione
42
Capitolo 4. Sviluppo del firmware dell’FPGA
massima, dovuta all’assenza di codice ridondante. Quindi il metodo migliore per
programmare una FPGA è attraverso il VHDL che permette di personalizzare il
codice a livelli molto alti, diminuire le celle utilizzate ed aumentare quindi la
velocità di esecuzione. La particolarità del VHDL sta nel fatto che diversamente
da molti altri linguaggi, l’interpretazione del codice non è sequenziale ma
concorrenziale. Questo vuol dire che tutte le istruzioni vengono eseguite
parallelamente. In sostanza il VHDL è un linguaggio descrittivo, che descrive
appunto un circuito elettronico attraverso la connessione di porte logiche e
l’utilizzo di diversi segnali. Esso rappresenta uno standard industriale per la
descrizione, la modellizzazione e sintesi di circuiti e sistemi digitali.
Gli elementi fondamentali della sintassi del codice sono:
• entità (ENTITY);
• architettura (ARCHITECTURE)
L’entità corrisponde ad un blocco funzionale, ed è equivalente ad un simbolo in
uno schema elettrico. Nella figura 4.2 i blocchi “CONTATORE CLOCK”,
“CONTATORE PPS”, “SELETTORE”, insieme al blocco generale che li
contiene, sono delle entità. In essa si definiscono soltanto le linee di input ed
output ed il tipo di dato ricevuto o trasmesso per ciascun segnale. Ad ogni entità è
associata un’architettura che descrive il comportamento di questa, attraverso l’uso
di funzioni, processi e variabili interne.
Questa premessa sul linguaggio VHDL è necessaria per la comprensione del
codice sviluppato per la SPARTAN-XL.
4.3. Sviluppo del codice per FPGA
Una grossa pecca individuata nell’utilizzo dell’FPGA della Xilinx è stata quella di
non poter utilizzare l’ultima versione del software disponibile (ISE Foundation
8.1i), perché non supporta il modello di FPGA utilizzato. La versione utilizzata,
che lo implementa, è “Xilinx Foundation F1.5”.
L’operazione affidata a questo blocco circuitale, come già detto precedentemente,
è quella di un doppio contatore, necessaria per ottenere la precisione temporale
43
Capitolo 4. Sviluppo del firmware dell’FPGA
dell’ordine dei nanosecondi, grazie soprattutto anche al clock di riferimento
ottenuto dal quarzo a 50 MHz. In un primo momento i due contatori sono stati
sviluppati separatamente, per avere una visibilità più chiara dei segnali in fase di
sperimentazione; successivamente i due contatori sono stati inclusi in un unico
blocco funzionale.
Il primo contatore implementato nel codice (appendice D) è chiamato
“CONTACLOCK”, nome proveniente da quello della sua entità. Come si può
vedere anche dalla figura 4.2, questo blocco è costituito da quattro segnali di
ingresso e due di uscita:
•
pps (ingresso);
•
clock (ingresso);
•
trigg (ingresso);
•
reset (ingresso);
•
triggout (uscita);
•
outclock (uscita).
Il funzionamento logico è il seguente:
Il segnale “clock” proveniente dal blocco esterno CLOCK, cioè dall’oscillatore al
quarzo (fig. 4.2), incrementa un contatore di un passo per volta, ad ogni fronte di
salita del segnale. Il risultato di questo conteggio è trasferito in uscita “outclock”,
quando è attivo il segnale “trigg”, cioè quando il valore del segnale è posto alto.
Questo segnale proviene dall’interfaccia collegata con il telescopio e assume il
valore alto quando i dati rivelati da quest’ultimo sono presenti in uscita. Il segnale
“pps” arriva dal GPS e corrisponde ad un impulso della durata di qualche
nanosecondo che si verifica ogni secondo. Ad ogni impulso ricevuto dal GPS il
contatore viene azzerato. Il segnale di uscita “triggout” non è altro che il segnale
“trigg”, normalizzato con un clock cioè, essendo il “trigg” un segnale che può
essere alto per un tempo variabile, si procede facendo in modo che questa durata
sia fissa e corrispondente alla durata di un ciclo del segnale “clock”. Questa
operazione è effettuata da un’entità chiamata “debounce”, opportunamente
richiamata e inizializzata. Le conseguenze della normalizzazione del segnale
“trigg”, sono visualizzate in figura 4.3.
44
Capitolo 4. Sviluppo del firmware dell’FPGA
Fig. 4.3 – Effetto della normalizzazione sul segnale “trigg”.
Infine il segnale “reset”, quando è al livello logico alto, azzera tutti i valori dei
segnali interni e delle uscite, per riportare allo stato iniziale il processo in caso di
un blocco accidentale. Il contatore è implementato nell’architettura del
“contaclock”, attraverso una funzione di incremento di un numero binario ed una
serie di processi contenenti dei cicli.
Il secondo blocco da analizzare, è un contatore chiamato “CONTAPPS”. La sua
entità è composta dai seguenti segnali di ingresso / uscita:
•
pps (ingresso):
•
trigg (ingresso);
•
offset (ingresso);
•
enable (ingresso);
•
reset (ingresso);
•
OUTpps (uscita).
Il funzionamento logico del blocco è il seguente:
in questo caso il segnale che incrementa il contatore non è più il clock del quarzo
a 50 MHz ma i segnali “pps” provenienti dal ricevitore GPS. Quindi, ogni volta
che si verifica un fronte di salita sul segnale “pps” un contatore interno viene
incrementato di un passo. Il segnale “trigg”, proveniente dall’interfaccia con il
telescopio a MRPC, assolve la stessa funzione svolta nel precedente contatore
cioè trasferisce in uscita, attraverso il segnale “OUTpps”, il risultato
dell’avanzamento del contatore. Il contatore però ha un offset iniziale non nullo e
45
Capitolo 4. Sviluppo del firmware dell’FPGA
dipendente dal segnale “offset” in ingresso, che rappresenta i secondi dall’inizio
dell’anno provenienti dall’uscita della PIC. Quindi il conteggio ha inizio dal
valore del segnale “offset” e avanza di un passo ad ogni fronte di salita del “pps”.
Il segnale “enable” permette di azzerare il contatore in modo da far partire il
conteggio dall’eventuale offset. La necessità di usare il segnale “enable” nasce dal
fatto che, prima che la PIC invii l’informazione relativa ai secondi dall’inizio
dell’anno, questa ha bisogno di un certo tempo per agganciare il numero di
satelliti necessari e ottenere quindi dei dati attendibili; una volta che questo è
avvenuto, la PIC attiva il segnale “enable”, azzera il contatore e fornisce la base
da cui questo comincia ad avanzare.
L’ultimo segnale in ingresso è il “reset”, che corrisponde allo stesso segnale del
contatore precedente, ed ha anche la stessa funzione, cioè quella di azzerare tutti i
segnali in caso di necessità o per un blocco accidentale del sistema.
Questa operazione di conteggio è stata implementata nell’architettura dell’entità
“contapps”, attraverso l’uso di due funzioni, una di incremento e l’altra di somma
di due numeri binari, di una serie di processi e di cicli IF. La funzione incremento
è stata utilizzata per ottenere l’avanzamento continuo di un passo ad ogni fronte di
clock, mentre la funzione somma permette di sommare il valore del contatore
all’eventuale valore di offset. In questo modo il segnale “enable” al livello logico
alto azzera il contatore che continua però il suo avanzamento, e quando un
segnale di trigger è inviato in ingresso, si riporta in uscita la somma dei valori di
contatore ed offset.
Il blocco “SELETTORE” non è una vera e propria entità, ma è semplicemente
un’operazione implementata nell’entita “GENERALE”, nella quale avvengono
tutti i collegamenti necessari tra segnali di ingresso, contatori e segnali di uscita.
L’operazione di selezione in uscita del valore di uno o l’altro contatore è stata
introdotta per una questione di facilità di analisi del dispositivo, e soprattutto per
il fatto che i pin fisicamente collegati alla FPGA e disponibili come uscite nel
circuito di test, non sono in numero sufficiente. Il selettore permette di ottenere in
uscita il valore di uno dei due contatori; più precisamente se il segnale “select” è
attivo basso, in uscita si ha il valore del contatore “contaclock”, mentre se è attivo
alto, il valore in uscita corrisponde al contatore “contapps”.
46
Capitolo 4. Sviluppo del firmware dell’FPGA
4.4. Simulazione al PC del codice sviluppato
Una volta scritto il codice per ognuno dei contatori, il passo successivo consiste
nel verificare l’esattezza sia logica che funzionale dei blocchi. Il software
utilizzato permette di effettuare la simulazione del circuito, senza dover
programmare necessariamente la SPARTAN-XL. Questo permette di poter
verificare passo passo il codice scritto e assicurarsi che la funzionalità voluta è
realmente implementata. La simulazione permette di applicare dei segnali in
ingresso ai blocchi logici e di verificare il relativo andamento delle uscite. Grazie
alla simulazione è stato possibile visualizzare una serie di ritardi nel circuito che
in qualche modo ne potevano alterare il funzionamento. Si osserva infatti nella
simulazione del blocco precedentemente accennato, chiamato “debounce”, che
effettua la normalizzazione dei segnali, un ritardo del segnale di uscita rispetto a
quello di ingresso, in funzione del clock. Infatti idealmente, i segnali dovrebbero
avere un andamento come quello indicato in figura 4.3. In realtà la simulazione
visualizza un ritardo del segnale di uscita di un fronte di salita del clock (Fig. 4.4):
Fig. 4.4 – ritardo applicato ad un segnale dalla funzione “debounce” (il
primo segnale rappresenta il clock, il secondo l’ingresso, l’ultimo è il segnale
di uscita).
Il fattore di ritardo osservato non influisce sul funzionamento perché è un errore
sistematico e quindi facilmente eliminabile nella fase finale. Inoltre, per alcuni
segnali, il “debounce” è stato applicato solo in fase sperimentale per ovviare ad
inconvenienti, mentre in fase di realizzazione pratica questo non sarà necessario.
47
Capitolo 4. Sviluppo del firmware dell’FPGA
Ad esempio il segnale “enable” è forzato ad un livello alto in fase di test, per un
ciclo di clock; questo naturalmente si può avere solo tramite la funzione
“debounce”.
In figura 4.5 è mostrata la simulazione del blocco “contaclock”; il segnale “pps1”
rappresenta il segnale “pps” dopo il debounce, ed è questo che deve essere
considerato nell’analisi logica del circuito.
Fig. 4.5 – Simulazione del blocco “contaclock”
L’uscita indicata in figura 4.5 con il nome “outconta31”, rappresenta un vettore di
32 bit, visualizzato in decimale. In realtà sarebbero bastati 26 bit per visualizzare
l’array di uscita, ma il bus del nostro circuito di test ne possiede 32, ed in questo
modo i restanti 6 bit vengono posti a zero.
La simulazione del blocco “contapps” (Fig. 4.6) prevede un array in ingresso,
contenente i secondi dall’inizio dell’anno che devono essere sommati al valore del
contatore ogni volta che si verifica un evento di segnale di “trigger” attivo alto. Il
segnale “selectin” questa volta è posto sempre alto per avere il uscita il valore del
contatore di pps, prima invece era al valore logico “0” per visualizzare il
conteggio del clock del quarzo.
In questo caso il clock di riferimento è rappresentato dal segnale “pps”.
All’ingresso “offsetin” è stato assegnato un valore costante uguale a “16” in
notazione decimale, quindi ogni volta che il contatore viene azzerato, il suo
conteggio riparte dal valore “16”. Si notano anche qui una serie di ritardi dovuti al
fatto che il segnale “enablein” deve essere normalizzato al segnale “pps” tramite il
48
Capitolo 4. Sviluppo del firmware dell’FPGA
“debounce”. In figura è anche indicato il valore applicato ad ogni segnale di
ingresso, attraverso lo “stimolatore”. Nel riquadro “set formula” di figura 4.6 sono
indicati nel settore clocks, tre funzioni associate a C1, C2, C3. queste sono
associate rispettivamente ai segnali “ppsin”, “triggin”, “enablein”.
Fig. 4.6 – Simulazione del blocco “contapps” e visualizzazione degli
stimolatori applicati.
Una volta verificato il comportamento logico del circuito implementato, la fase
successiva consiste nella realizzazione circuitale e la programmazione del
dispositivo FPGA. Nel prossimo paragrafo saranno indicati in dettaglio tutti i
passaggi della fase di realizzazione del circuito.
49
Capitolo 4. Sviluppo del firmware dell’FPGA
4.5. Realizzazione circuitale
Il circuito per verificare il funzionamento della SPARTAN-XL è relativamente
semplice (Fig. 4.7). Esso è costituito dalle seguenti parti:
• uno stadio di alimentazione del circuito che, alimentato con valori di tensione
maggiori o uguali di +15V fornisce oltre a questa, una tensione di +5V per la
logica e di +3.3V per l’FPGA;
• due oscillatori al quarzo collegati ad uno zoccolo che in base a come è connesso
permette l’uso o esclude il quarzo non stabilizzato;
• un connettore collegato ai pin di
ingresso/uscita della FPGA usati
preferibilmente per i segnali di clock;
• una memoria EEPROM necessaria per programmare la SPARTAN-XL;
• otto connettori, collegati alle linee di ingresso/uscita standard del dispositivo.
La FPGA è saldata in modo permanente sul circuito stampato, mentre la memoria
EEPROM è connessa al circuito tramite uno zoccolo. Questo permette di poter
estrarre facilmente la memoria e programmarla tramite un opportuno dispositivo
collegato al PC.
Fig.4.7 – Circuito di test per FPGA
50
Capitolo 4. Sviluppo del firmware dell’FPGA
Prima di programmare la EEPROM bisogna implementare il codice scritto.
L’implementazione prevede una serie di operazioni tra le quali il passaggio tra
descrizione comportamentale e descrizione a porte logiche; di conseguenza il
passo successivo deve essere la mappatura del circuito, cioè l’assegnazione reale
ad ogni segnale di un piedino fisico sul dispositivo. Questa associazione avviene
grazie al fatto che il software include il datasheet della SPARTAN-XL utilizzata e
grazie alla modifica di un file con estensione “ucf” nel quale bisogna inserire i
nomi dei segnali e i rispettivi pin che si vogliono associare. Se questa operazione
non viene effettuata la mappatura avviene comunque, ma in modo casuale. Un
esempio di assegnazione di un segnale ad un determinato pin è il seguente:
NET clockIN LOC = P2;
NET ppsIN LOC = P39;
NET triggIN LOC= P70;
NET selectIN LOC=P106;
NET enableIN LOC=P76;
I segnali, vengono indicati con il loro nome, mentre il nome del pin è ottenuto dal
datasheet della SPARTAN-XL. Ogni pin della FPGA è collegato al bus di
ingresso/uscita oppure direttamente dal circuito stampato ad uno dei componenti
del circuito. Lo schema elettrico è riportato in figura 4.8. Una visione completa
del file contenente la mappatura dei segnali si può trovare nell’appendice D.
51
Capitolo 4. Sviluppo del firmware dell’FPGA
Fig.4.8 – Schema elettrico del circuito per FPGA
52
Capitolo 4. Sviluppo del firmware dell’FPGA
Gli ingressi e le uscite sono così disposte: il bus a 32 pin più vicino allo stadio di
alimentazione corrisponde all’ingresso dell’offset proveniente dalla PIC; il
secondo bus a 32 bit corrisponde all’uscita di uno dei due contatori implementati
in base al valore logico del segnale “select”. Tutti gli altri segnali di
ingresso/uscita del contatore sono situati sul bus a 8 bit singolo collegato alle
porte di in/out dell’FPGA preferenziali per i segnali di clock (fig. 4.9).
Fig.4.9 – Disposizione dei segnali di ingresso/uscita sui bus del circuito
Una volta realizzato il circuito e stabilita la corrispondenza di ogni segnale con un
pin fisico, si procede effettuando il test di funzionamento e l’analisi dei valori
ottenuti.
4.6. Test del dispositivo
Per il test del dispositivo si è utilizzato un data generator della Tektronix
(DG2020A) il quale, sincronizzato con il segnale “pps” proveniente dal ricevitore
GPS, fornisce in ingresso al circuito i segnali “pps” e “trigger”, permettendo di
impostare correttamente la durata dello stato alto dei segnali, la frequenza e lo
sfasamento tra i due visualizzandoli sul display. L’uscita del circuito di test è
collegata in ingresso ad un analizzatore di stati logici della Tektronix (TLA715)
53
Capitolo 4. Sviluppo del firmware dell’FPGA
che visualizza l’andamento del segnale e permette di effettuare una statistica sulla
stabilità dei valori ottenuti. Questo primo approccio con segnali in ingresso ideali
è necessario per verificare il corretto funzionamento del dispositivo; in un
secondo momento si utilizzeranno ingressi reali che sono comunque segnali molto
stabili e uguali ai precedenti.
4.6.1. Test del contatore “contaclock”
In figura 4.10 è riportata l’uscita del contatore realizzato, corrispondente ad un
segnale “select” basso e quindi ad un avanzamento del contatore relativo al blocco
“contaclock”.
Fig.4.10 – Segnale di uscita del contatore, quando è selezionato il
“contaclock”
Il segnale ATOT rappresenta l’uscita del contatore mentre il segnale CK0
rappresenta il segnale “triggerout” prelevato dal circuito e corrispondente al
trigger in ingresso una volta applicato il “debounce”. L’uscita del contatore è
l’insieme dei bit dei quattro bus di uscita del circuito, esclusi i 3 bit più
54
Capitolo 4. Sviluppo del firmware dell’FPGA
significativi del bus A3. I 29 bit disponibili in uscita (considerando il bit più a
destra in figura 4.9 quello meno significativo) convertiti in decimale,
rappresentano il valore indicato in ATOT. Per verificare l’esattezza del valore
ottenuto in uscita, si assegnano ai segnali di ingresso “pps” e “trigger” dei valori
noti che permettono il calcolo del valore di uscita graficamente, attraverso il data
generator (Fig. 4.11).
Fig.4.11 – Segnali generati dal data generator ed inviati al circuito come
ingressi: partendo dal basso il primo segnale rappresenta il “pps” il secondo
il “trigger”
Considerando il fatto che il segnale in ingresso “pps” viene normalizzato,
introducendo un ritardo sul fronte di salita reale del “pps” di circa tre passi (ogni
passo in figura rappresenta un intervallo di 20 nanosecondi), si può calcolare, a
partire dai segnali riportati in figura 4.11, la distanza tra i due fronti di salita dei
segnali “pps” e “trigger”. Il primo segnale in basso rappresenta il “pps”. Il suo
fronte di salita è posto nella scala del data generator al valore 1 che in realtà, dopo
la normalizzazione, si posiziona al valore quattro. Il secondo segnale rappresenta
55
Capitolo 4. Sviluppo del firmware dell’FPGA
il “trigger”, che ha il fronte di salita posizionato al valore 55 (campo “cursor” in
figura 4.11). Il segnale in uscita al contatore deve essere la differenza tra questi
due valori che è pari a 51 e corrisponde esattamente al valore dell’uscita del
contatore riportata in figura 4.10. La sequenza dei segnali “pps” e “trigger” è
pilotata da un segnale di trigger in ingresso al data generator rappresentato dal
“pps” reale proveniente dal ricevitore GPS, in questo modo il “pps” generato dal
data generator risulta sincronizzato con il segnale pps reale.
Il valore di uscita dovrebbe essere costante visto che la distanza tra i due fronti di
salita degli ingressi è fissata dal generatore di segnale. In realtà osservando
l’analizzatore di stati logici, si nota di tanto in tanto un cambiamento del valore di
uscita dovuto al fatto che tutta la strumentazione lavora al limite della sua
risoluzione. L’analizzatore di stati logici è in grado di effettuare una statistica
sull’andamento del segnale di uscita, visualizzando un istogramma nel quale si
osserva la percentuale dei valori rivelati (fig.4.12). Nel caso in esame, al dato 51 è
associato un valore pari a 88.89% mentre il restante 11.11% delle rivelazioni è
distribuito sul clock precedente e su quello sucessivo.
Fig. 4.12 – Istogramma dei dati acquisiti con il logic analyzer
56
Capitolo 4. Sviluppo del firmware dell’FPGA
Il logic analyzer è impostato per acquisire 256 campioni (bin) del dato ad ogni
impulso di trigger ricevuto. Nel caso in esame, accanto al valore 51 è indicato un
conteggio pari a 38.912 mentre in alto si ha un valore pari a 43.776. Questo vuol
dire che su 43.776 campioni, 38.912 sono posizionati al valore 51 mentre i
restanti sono distribuiti sui 2 valori primi vicini. Quindi su 171 (43.776/256 )
impulsi di trigger, 152 hanno individuato il valore 51.
I risultati ottenuti circa la precisione del dato in uscita possono essere ritenuti
validi per l’applicazione in esame ma un’ulteriore prova sul circuito ci permette di
stabilire la fonte dell’errore riscontrato. L’oscillatore interno al data generator ha
una frequenza massima di 200MHz ed è inoltre stabilizzato in temperatura.
Attraverso un divisore questa frequenza viene portata al valore di 50MHz in modo
che sia sincrona con la frequenza del quarzo che fornisce gli impulsi di clock al
contatore. In realtà la precisione dei due quarzi in esame è differente infatti, nel
primo ha un valore pari a 50 ppm (parti per milione), nel secondo il valore è di 7
ppb (parti per miliardo). È evidente che il quarzo del circuito è molto più preciso
del quarzo interno allo strumento, per questo non saranno mai perfettamente
sincronizzati. Per verificare l’influenza di questo sfasamento sulla statistica dei
dati in uscita al contatore, si è implementato lo schema in figura 4.13.
Fig. 4.13 – schema a blocchi del circuito per il quarzo esterno
57
Capitolo 4. Sviluppo del firmware dell’FPGA
Il data generator permette di usare un clock esterno in alternativa a quello
disponibile al suo interno, per questo si è utilizzato il quarzo installato sul circuito
del contatore come clock unico per il sistema fornito in ingresso al data generator
tramite un adattatore di livello che converte il segnale da TTL in logica 0 – 2 V.
In questo modo i segnali in ingresso al contatore “pps” e “trigger” sono
esattamente sincronizzati dall’unico segnale di clock fornito dal quarzo del
circuito. Un’analisi dell’istogramma dei dati in uscita (fig. 4.14), mostra che: tutti
i dati prelevati dal contatore sono distribuiti su di un unico valore, pertanto
l’errore riscontrato in precedenza è dovuto alla precisione del clock interno del
data generator.
Fig. 4.14 – Istogramma dei dati acquisiti con il logic analyzer e uso di un
unico clock
58
Capitolo 4. Sviluppo del firmware dell’FPGA
Per i motivi precedentemente esposti, nel circuito finale il quarzo usato non è
stabilizzato, per questo si è voluta verificare la distribuzione dei dati
sull’istogramma fornendo al circuito il clock del quarzo non stabilizzato mentre,
al data generator, un clock esterno dato dal quarzo stabilizzato. Il risultato è una
distribuzione delle acquisizioni su valori che si discostano da quello centrale
anche di 25 cicli di clock (fig. 4.15). Il valore 51 è stato acquisito per circa il 90%
del tempo su un intervallo di circa un’ora. Si osserva quindi che il quarzo non
stabilizzato introduce un errore sulla precisione dei dati in uscita comunque
superiore a quello di figura 4.12 che riteniamo accettabile.
Fig. 4.15 – Istogramma dei dati acquisiti con il logic analyzer (clock non
stabilizzato)
59
Capitolo 4. Sviluppo del firmware dell’FPGA
4.6.2. Test del contatore “contapps”
Assegnando al segnale “select” un valore logico alto si seleziona il contatore del
segnale pps.
Il contatore deve acquisire i secondi trascorsi dall’inizio dell’anno tramite il
segnale “offset”, nell’istante in cui il segnale “enable” proveniente dalla PIC
avvisa che i dati in uscita sono attendibili, inoltre incrementa il suo valore di un
passo a partire dall’offset ottenuto con impulsi di clock dati dal segnale “pps”
proveniente dalla PIC. In pratica il segnale di uscita del contatore deve
corrispondere esattamente all’avanzamento dei secondi dall’inizio dell’anno
forniti in uscita dalla PIC.
Prima di effettuare il test, facciamo un passo indietro sulle istruzioni del firmware
per comprendere meglio il funzionamento del contatore. La logica di
avanzamento del contatore include, come già visto, due funzioni, una di somma di
due numeri binari e una di incremento di un numero binario. Considerando come
segnali di ingresso “pps” e “trigger” quelli usati per il “contaclock” (fig. 4.11),
bisogna definire il segnale “enable”. Dal codice del firmware si può vedere che un
contatore incrementa il suo valore di un passo ad ogni impulso del segnale “pps”
finchè il segnale “enable è mantenuto al valore logico zero. Quando il segnale
“enable” subisce una modifica passando dallo stato logico basso a quello alto,
nell’istante in cui si ha il fronte di salita del segnale una variabile interna
memorizza il valore del segnale “offset” proveniente dalla PIC. Il contatore
continua ad essere azzerato ad ogni impulso di pps, finchè il segnale “enable”
rimane nello stato alto. Quando “enable” torna nello stato basso il contatore
ricomincia il suo avanzamento. Ad ogni impulso di “trigger”, infine, il valore del
contatore viene sommato al valore dell’offset memorizzato precedentemente e il
risultato rappresenta l’uscita del “contapps”. Da questo si capisce che
l’andamento ideale del segnale “enable” deve essere impulsivo, infatti questo
segnale proveniente dalla PIC ha una durata dello stato alto dell’ordine dei
microsecondi.
Per l’analisi dell’uscita del “contapps” si pone, in un primo momento, il bus di
ingresso del segnale “offset” (fig. 4.9) ad un valore prestabilito pari a 14 in
decimale collegando a massa i pin che devono essere posti ad un valore logico
60
Capitolo 4. Sviluppo del firmware dell’FPGA
pari a zero e collegando alla tensione +5V quelli che devono assumere uno stato
logico alto.
Attraverso l’assegnazione di un offset in ingresso direttamente dalla porta del
circuito con un valore conosciuto a priori, si verifica, portando il segnale “enable”
ad uno stato alto in modo permanente, che l’uscita del contatore collegata al logic
analyzer assume il valore dell’offset inserito; infatti nell’istante in cui il segnale
“enable” è portato alto, il dispositivo preleva il valore di offset inserito in ingresso
e azzera il contatore in continuazione, visto che il segnale “enable” rimane al
valore alto. La somma del valore dell’offset con quello del contatore, che è
sempre nullo, restituisce in uscita l’offset applicato in ingresso. Una volta
verificata la perfetta acquisizione dell’offset, si procede applicando il segnale di
“offset” proveniente dalla PIC e il segnale “enable” fornito dal data generator
(segnale DATA02 in fig. 4.16). In questo caso il valore dell’offset in ingresso al
dispositivo non è costante e quindi l’uscita del contatore, quando è applicato un
impulso del segnale “enable” a passi di “pps”, corrisponde esattamente
all’avanzamento dell’offset in ingresso. In questa configurazione il contatore non
fa altro che riportare in uscita il valore di ingresso che corrisponde
all’avanzamento dei secondi dall’inizio dell’anno della PIC (fig. 4.17).
61
Capitolo 4. Sviluppo del firmware dell’FPGA
Fig.4.16 – Segnali generati dal data generator: dal basso il primo segnale
rappresenta il “pps” il secondo il “trigger” ed il terzo “enable”
Fig.4.17 – Segnale di uscita del “contapps” con offset dalla PIC e segnale
“enable”
62
Capitolo 4. Sviluppo del firmware dell’FPGA
In questo caso il segnale ATOT corrisponde all’uscita del “contapps” che avanza
ad ogni fronte di salita del segnale “trigger” rappresentato in figura dal segnale
CK0 mentre “C0” corrisponde al segnale “offset” proveniente dalla PIC.
L’obiettivo del contatore, però, è quello di ottenere il conteggio dei secondi
dall’inizio dell’anno in modo indipendente dalla PIC. L’unico compito di
quest’ultima è quello di fornire la base del conteggio che procederà
successivamente grazie al segnale “pps” del ricevitore. La verifica finale è stata
quella di porre il segnale “enable” in uno stato logico basso dopo aver acquisito
l’offset in ingresso, in questo stato l’uscita del contatore è indipendente dall’
ingresso di offset, ma, come previsto, assume lo stesso valore.
63
Conclusioni e sviluppi futuri
CONCLUSIONI E SVILUPPI FUTURI
L’obiettivo di ottenere la sincronizzazione temporale tra sistemi di acquisizione
remoti con relativo time stamping dei dati dislocati è stato raggiunto con successo
attraverso l’uso di dispositivi adatti alle esigenze da espletare.
I punti fondamentali da sviluppare sono stati:
•
scelta di un dispositivo di sincronizzazione temporale dei dati ad alta
precisione;
•
estrazione dei dati necessari dal dispositivo per ottenere riferimenti di
posizione e tempo universali;
•
realizzazione di un dispositivo sincronizzato con il riferimento temporale per
la gestione degli eventi con precisione dell’ordine dei nanosecondi;
•
acquisizione dei dati e test della risoluzione ottenuta dal dispositivo finale.
Il dispositivo utilizzato per ottenere un riferimento temporale di alta precisione e
disponibile in qualsiasi punto territoriale è il GPS, accessibile tramite un
ricevitore GPS che utilizza un protocollo dei dati chiamato TSIP il quale
permette, tramite il calcolo dell’errore di quantizzazione, la massima precisione
nella ricezione del segnale “pps” corrispondente ad un impulso ogni secondo.
L’estrazione delle informazioni necessarie per il time stamping dei dati è stata
possibile grazie all’uso di una PIC che implementa un firmware appositamente
creato per ottenere la posizione geografica degli strumenti ed il riferimento
temporale espresso in secondi dall’inizio dell’anno. La parte più complessa del
progetto relativa al terzo punto è stata risolta attraverso l’uso di una FPGA e di un
quarzo da 50MHz che permettono di ricevere il dato relativo ai secondi dall’inizio
dell’anno dalla PIC e incrementare un contatore con risoluzione dell’ordine del
nanosecondo che riparte ad ogni impulso del segnale “pps” e permette il time
stamping sui dati ogni volta che un impulso di trigger segnala la presenza di un
dato rivelato. Accanto all’informazione dell’evento avvenuto al determinato
istante è disponibile anche l’informazione dei secondi dall’inizio dell’anno,
fornita però non dalla PIC ma dalla stessa FPGA che riceve solo inizialmente
questa informazione dalla PIC e la incrementa in corrispondenza di ogni impulso
64
Conclusioni e sviluppi futuri
di “pps” ricevuto dal ricevitore GPS. L’acquisizione dei dati temporali con il
dispositivo finale fornisce una statistica sulla precisione di quest’ultimo: l’utilizzo
di un quarzo stabilizzato in temperatura ad alta precisione permette di ottenere la
totale distribuzione dei valori rivelati per lunghi periodi, sul determinato impulso
di clock. L’uso di un quarzo non stabilizzato introduce invece un significativo
errore di sincronizzazione nei dati.
Gli sviluppi futuri del dispositivo riguardano l’integrazione di quest’ultimo su di
un modulo VME in modo da renderlo disponibile in diverse applicazioni. Bisogna
inoltre implementare un registro, interno o esterno all’FPGA, per la raccolta delle
informazioni prelevate da questa; in particolare, ad ogni evento rivelato dal
telescopio in corrispondenza di un segnale di trigger bisogna associare i seguenti
valori:
•
riferimento temporale con precisione dell’ordine del nanosecondo;
•
errore di quantizzazione relativo al segnale pps;
•
numero di cicli di clock compiuti dal quarzo non stabilizzato
nell’intervallo di segnale pps considerato.
Ognuno di questi dati è disponibile però in momenti differenti, per questo, oltre a
stabilire il metodo migliore per la registrazione dei dati, occorre anche prelevare
il dato nell’istante giusto considerando i ritardi del dispositivo da cui
l’informazione viene estratta. Un’ulteriore implementazione riguarda la
normalizzazione dei cicli di clock effettuati dal quarzo ad ogni segnale pps, cioè
ottenere, attraverso una proporzione, il numero di cicli di clock del quarzo in
corrispondenza di un segnale di trigger, supponendo che il numero di oscillazioni
nell’intervallo del pps siano esattamente 50.000.000. Questa operazione non può
essere effettuata da una FPGA perché essa non è in grado di operare con
moltiplicazioni e divisioni che non siano per due. Una strada possibile sarebbe
quella di ricondurre moltiplicazioni e divisioni a semplici operazioni di somma e
sottrazione attraverso l’uso di un algoritmo appropriato.
65
Appendice A
APPENDICE A
PIEDINATURA DELLA PIC
66
Appendice A
CARATTERISTICHE PRINCIPALI
67
Appendice B
APPENDICE B
LISTATO FIRMWARE DELLA PIC
Di seguito è riportato il listato del firmware della PIC. Le righe di codice
evidenziate in rosso rappresentano una versione precedente, queste sostituivano la
riga successiva. Tutte le informazioni prelevate dal GPS sono contenute nei
vettori DATAOUT e DATAOUT2 che corrispondono rispettivamente ai pacchetti
ricevuti 10x8F-AB e 10x8F-AC. Per estrapolare dall’array un determinato dato, si
ottiene l’indice facendo riferimento al numero del byte del dato voluto indicato
nella tabella del rispettivo pacchetto, sottratto di una unità.
'****************************************************************
'* Name : PICFIRMWARE.BAS
'* Author : ANDREA DONNO
'* Date : 03/05/2006
'* Version : 1.0
'****************************************************************
DEFINE OSC 20
Define ONINT_USED 1
include "modedefs.bas"
ADCON1=7
TRISC=%10000000
TRISA=0
'ABILITA IL PORTA COME USCITA
TRISD=0
'ABILITA IL PORTD COME USCITA
'ISTRUZIONI PER LA COMUNICAZIONE CON IL DISPLAY LCD
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_BITS 4
Define LCD_RSREG PORTB
DEFINE LCD_RSBIT 1
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 3
DEFINE LCD_LINES 2
DEFINE SER2_ODD 1
DEFINE SER2_BITS 9
ORE VAR BYTE
S VAR BYTE
M VAR BYTE
H VAR BYTE
D VAR BYTE
68
Appendice B
MESE VAR BYTE
A1 VAR byte
A2 VAR byte
ANNO VAR WORD
S1 VAR BYTE
S2 VAR BYTE
M1 VAR BYTE
H1 VAR BYTE
D1 VAR BYTE
MESE1 VAR BYTE
ANNO1 VAR WORD
NSAT VAR BYTE
SAT VAR BYTE
DATIX VAR BYTE [22]
DATIIN VAR BYTE[18]
DATIIN2 VAR BYTE[67]
DATIOUT VAR BYTE[18]
DATIOUT2 VAR BYTE[67]
EQ1 VAR BYTE[4]
I VAR BYTE
J VAR BYTE
A VAR BYTE
B VAR BYTE
C VAR BYTE
E VAR BYTE
CONTROLLOSAT VAR PORTC.5
SECANNOH VAR WORD
SECANNOL VAR WORD
SECANNOLINV VAR WORD
SECANNO VAR WORD
DAYANNO VAR WORD
N VAR BYTE
TEMP VAR WORD
USCITA2
VAR PORTD
LCDOUT $FE, 1, "DATI PROVENIENTI"
LCDOUT $FE, $C0, "DAL GPS"
INI:
A=0
I=0
C=0
J=0
E=0
SERIN2 PORTC.7,8276,[WAIT ($108F),WAIT ($AB), STR DATIIN\18 ]
SERIN2 PORTC.7,8276,[WAIT ($108F),WAIT ($AC), STR DATIIN2\67 ]
'SERIN2 PORTC.7,8276,[WAIT ($8FAB),SKIP 9,S,M,H,D,MESE, a1,a2 ]
FOR I=0 TO 17
IF (DATIIN[I] == $10) AND (DATIIN[I+1] == $10 )THEN
FOR B=I TO 16
DATIIN[B]=DATIIN[B+1]
NEXT B
DATIOUT[A]=DATIIN[I]
A=A+1
ELSE
DATIOUT[A]=DATIIN[I]
A=A+1
ENDIF
NEXT I
FOR I=0 TO 66
IF (DATIIN2[I] == $10) AND (DATIIN2[I+1] == $10 )THEN
69
Appendice B
FOR B=I TO 65
DATIIN2[B]=DATIIN2[B+1]
NEXT B
DATIOUT2[C]=DATIIN2[I]
C=C+1
ELSE
DATIOUT2[C]=DATIIN2[I]
C=C+1
ENDIF
NEXT I
ANNO.byte1 = DATIOUT[14]
ANNO.byte0 = DATIOUT[15]
EQ1[0]=DATIOUT2[59]
EQ1[1]=DATIOUT2[60]
EQ1[2]=DATIOUT2[61]
EQ1[3]=DATIOUT2[62]
FOR J=0 TO 40
IF (ANNO != 2008+4*J) THEN
N=0
ELSE
N=1
GOTO DATI
ENDIF
NEXT J
DATI:
IF DATIOUT[13]== 1 THEN DAYANNO = DATIOUT[12]
IF DATIOUT[13]== 2 THEN DAYANNO = DATIOUT[12]+31
IF DATIOUT[13]== 3 THEN DAYANNO = DATIOUT[12] +59+N
IF DATIOUT[13]== 4 THEN DAYANNO = DATIOUT[12] +90+N
IF DATIOUT[13]== 5 THEN DAYANNO = DATIOUT[12] +120+N
IF DATIOUT[13]== 6 THEN DAYANNO = DATIOUT[12] +151+N
IF DATIOUT[13]== 7 THEN DAYANNO = DATIOUT[12] +181+N
IF DATIOUT[13]== 8 THEN DAYANNO = DATIOUT[12] +212+N
IF DATIOUT[13]== 9 THEN DAYANNO = DATIOUT[12] +243+N
IF DATIOUT[13]== 10 THEN DAYANNO = DATIOUT[12] +273+N
IF DATIOUT[13]== 11 THEN DAYANNO = DATIOUT[12] +304+N
IF DATIOUT[13]== 12 THEN
DAYANNO = DATIOUT[12] +334
ENDIF
TEMP= DATIOUT[11] + (24*DAYANNO)
SECANNOH = 3600**TEMP
SECANNOL = 3600*TEMP
'MINUTI
'SECONDI
SECANNO = 60* DATIOUT[10]+ DATIOUT[9]
IF (65535 - SECANNOL) <= SECANNO THEN
SECANNOH=SECANNOH+1
ENDIF
SECANNOL=SECANNOL+SECANNO
LCDOUT $FE, 1, dec DATIOUT[12],"/", dec DATIOUT[13],"/",dec ANNO ,
DATIOUT[11],":",dec DATIOUT[10],":",dec DATIOUT[9]
SEROUT2 PORTC.6,8276,[$10,$24,$10,$03]
SERIN2 PORTC.7,8276,[WAIT ($106D), NSAT]
SAT = NSAT >> 4
70
" ",dec
Appendice B
'LCDOUT $FE, $C0,DEC SAT , " EQ:", HEX EQ1[0],HEX EQ1[1],HEX
EQ1[3]
LCDOUT $FE, $C0,"SECANNO:",DEC SECANNOH,DEC SECANNOL
CONTROLLOSAT=1
SECANNOLINV=SECANNOL REV 16
USCITA2=SECANNOLINV.Byte1
CONTROLLOSAT=0
GOTO INI
END
71
EQ1[2],HEX
Appendice C
APPENDICE C
PIEDINATURA DELL’ FPGA
72
Appendice C
73
Appendice C
74
Appendice D
APPENDICE D
LISTATO FIRMWARE DELL’FPGA
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
ENTITY debounce IS
PORT (CLOCK : IN std_logic;
sign : IN std_logic;
signout : OUT std_logic);
END debounce;
------debounce
ARCHITECTURE comp7 OF debounce IS
signal Q1,Q2,Q3 : std_logic;
BEGIN
process(CLOCK)
begin
-------
if (clock'event AND clock = '1') then
Q1 <= sign;
Q2 <= Q1;
Q3 <= Q2;
end if;
end process;
signout <= Q1 and Q2 and (not Q3);
END comp7;
---------------------------------------------------------------------------------library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
ENTITY contaclock is
port (
pps: in STD_LOGIC;
clock: in STD_LOGIC;
trigg: in STD_LOGIC;
triggout: out STD_LOGIC;
reset: in STD_LOGIC;
outA: out STD_LOGIC_VECTOR (31 downto 0));
end contaclock;
ARCHITECTURE contaclock_arch of contaclock is
signal out1:STD_LOGIC_VECTOR (31 downto 0);
SIGNAL pps1 : std_logic;
75
--------
Appendice D
signal debounce_trigg : std_logic;
COMPONENT debounce
PORT (clock : IN std_logic;
sign : IN std_logic;
signout : OUT std_logic);
END COMPONENT;
function inc_bv
(a: std_logic_vector) return std_logic_vector is
variable s: std_logic_vector (31 downto 0);
variable carry: std_logic;
begin
carry := '1';
for i in 0 to 31 loop
s(i) := a(i) xor carry;
carry := a(i) and carry;
end loop;
return (s);
end inc_bv;
begin
A : debounce
port map (clock, pps, pps1);
B : debounce
port map (clock, trigg, debounce_trigg);
process(clock, pps1)
--------begin
if (pps1 = '1') then
out1 <= "00000000000000000000000000000000";
elsif (clock'event and clock = '1' ) then
if (out1 > "00000001000011110101111101000000" or reset = '1') then
out1 <= "00000000000000000000000000000000";
else
out1 <= inc_bv (out1);
end if;
end if;
end process;
process (trigg)
begin
if (trigg'event and trigg = '1' ) then
outA<= out1;
end if;
end process;
----------
triggout<= debounce_trigg;
end contaclock_arch;
-----------------------------------------------------------------------------------library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
ENTITY contapps is
pps
-------entity conta
76
Appendice D
port (
pps: in STD_LOGIC;
trigg: in STD_LOGIC;
offset: in STD_LOGIC_VECTOR (31 downto 0);
enable: in STD_LOGIC;
reset: in STD_LOGIC;
OUTpps: out STD_LOGIC_VECTOR (31 downto 0));
end contapps;
ARCHITECTURE contapps_arch of contapps is
signal out2:STD_LOGIC_VECTOR (31 downto 0);
signal enabledeb : std_logic;
signal offset1:STD_LOGIC_VECTOR (31 downto 0);
COMPONENT debounce
PORT (clock : IN std_logic;
sign : IN std_logic;
signout : OUT std_logic);
END COMPONENT;
function inc_bv (a: std_logic_vector) return std_logic_vector is
variable s: std_logic_vector (31 downto 0);
variable carry: std_logic;
begin
carry := '1';
for i in 0 to 31 loop
s(i) := a(i) xor carry;
carry := a(i) and carry;
end loop;
return (s);
end inc_bv;
function sum_bv ( a, b: std_logic_vector) return std_logic_vector is
variable s: std_logic_vector (31 downto 0);
variable carry : std_logic;
begin
carry := '0';
for i in 0 to 31 loop
s(i) := (a(i) xor b(31-i)) xor carry;
carry := ((a(i) or b(31-i)) and carry) or (a(i) and b(31-i));
end loop;
return (s);
end sum_bv;
begin
A : debounce
port map (pps, enable, enabledeb);
process(enable)
begin
if (enable'event and enable = '1') then
offset1 <= offset;
end if;
end process;
process(pps, reset, enable)
begin
77
Appendice D
if (reset = '1' or enable= '1') then
out2 <= "00000000000000000000000000000000";
elsif (pps'event and pps = '1' ) then
if (out2 > "00000001000011110101111101000000" ) then
out2 <= "00000000000000000000000000000000";
else
out2 <= inc_bv (out2);
end if;
end if;
end process;
process (trigg)
begin
if (trigg'event and trigg = '1' ) then
OUTpps<= sum_bv(out2,offset1);
end if;
end process;
end contapps_arch;
---------------------------------------------------------------- ENTITY PRINCIPALE
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
ENTITY generale is
port (ppsIN,triggIN, clockIN,resetIN,selectIN,enableIN : in std_logic;
outtrigg: out std_logic;
offsetIN: in STD_LOGIC_VECTOR (31 downto 0);
OUTconta: out STD_LOGIC_VECTOR (31 downto 0));
end generale;
ARCHITECTURE generale_arch of generale is
signal OUTclock:STD_LOGIC_VECTOR (31 downto 0);
signal OUTpps:STD_LOGIC_VECTOR (31 downto 0);
component contaclock
port ( pps: in STD_LOGIC;
clock: in STD_LOGIC;
trigg: in STD_LOGIC;
triggout: out STD_LOGIC;
reset: in STD_LOGIC;
outA: out STD_LOGIC_VECTOR (31 downto 0));
end component;
component contapps
port( pps: in STD_LOGIC;
trigg: in STD_LOGIC;
offset: in STD_LOGIC_VECTOR (31 downto 0);
enable: in STD_LOGIC;
reset: in STD_LOGIC;
OUTpps: out STD_LOGIC_VECTOR (31 downto 0));
end component;
begin
C: contaclock
port map (ppsIN,clockIN,triggIN,outtrigg,resetIN,OUTclock);
D: contapps
port map (ppsIN,triggIN,offsetIN,enableIN,resetIN,OUTpps);
78
Appendice D
process (selectIN, OUTclock, OUTpps)
begin
if (selectIN = '0') then
OUTconta <= OUTclock;
else
OUTconta <= OUTpps;
end if;
end process;
end generale_arch;
79
Appendice D
Di seguito è riportato il file con estensione “ucf” per l’assegnazione
fisica dei piedini ai segnali di ingresso/uscita implementati nel listato
del firmware:
NET clockIN LOC = P2;
NET ppsIN LOC = P39;
NET triggIN LOC= P70;
NET selectIN LOC=P106;
NET enableIN LOC=P76;
NET outtrigg LOC=P112;
NET OUTconta<0> LOC = P56 ;
NET OUTconta<1> LOC = P57 ;
NET OUTconta<2> LOC = P58 ;
NET OUTconta<3> LOC = P59 ;
NET OUTconta<4> LOC = P60 ;
NET OUTconta<5> LOC = P61 ;
NET OUTconta<6> LOC = P62 ;
NET OUTconta<7> LOC = P63 ;
NET OUTconta<8> LOC = P65 ;
NET OUTconta<9> LOC = P66 ;
NET OUTconta<10> LOC = P67 ;
NET OUTconta<11> LOC = P68 ;
NET OUTconta<12> LOC = P69;
NET OUTconta<13> LOC = P77 ;
NET OUTconta<14> LOC = P78;
NET OUTconta<15> LOC = P80 ;
NET OUTconta<16> LOC = P82 ;
NET OUTconta<17> LOC = P83;
NET OUTconta<18> LOC = P86 ;
NET OUTconta<19> LOC = P87 ;
NET OUTconta<20> LOC = P89 ;
NET OUTconta<21> LOC = P94 ;
NET OUTconta<22> LOC = P95 ;
NET OUTconta<23> LOC = P97 ;
NET OUTconta<24> LOC = P98 ;
NET OUTconta<25> LOC = P99 ;
NET OUTconta<26> LOC = P103 ;
NET OUTconta<27> LOC = P104 ;
NET OUTconta<28> LOC = P113 ;
NET OUTconta<29> LOC = P114 ;
NET OUTconta<30> LOC = P120 ;
NET OUTconta<31> LOC = P119 ;
NET offsetIN<0> LOC = P4 ;
NET offsetIN<1> LOC = P5 ;
NET offsetIN<2> LOC = P9 ;
NET offsetIN<3> LOC = P10 ;
NET offsetIN<4> LOC = P12 ;
NET offsetIN<5> LOC = P13 ;
NET offsetIN<6> LOC = P14 ;
NET offsetIN<7> LOC = P15 ;
NET offsetIN<8> LOC = P16 ;
NET offsetIN<9> LOC = P19 ;
NET offsetIN<10> LOC = P20 ;
NET offsetIN<11> LOC = P21 ;
NET offsetIN<12> LOC = P22;
NET offsetIN<13> LOC = P23;
NET offsetIN<14> LOC = P24;
NET offsetIN<15> LOC = P25 ;
NET offsetIN<16> LOC = P26 ;
NET offsetIN<17> LOC = P28;
NET offsetIN<18> LOC = P29 ;
NET offsetIN<19> LOC = P30 ;
NET offsetIN<20> LOC = P31 ;
NET offsetIN<21> LOC = P32 ;
NET offsetIN<22> LOC = P41 ;
NET offsetIN<23> LOC = P42 ;
NET offsetIN<24> LOC = P43 ;
NET offsetIN<25> LOC = P46 ;
NET offsetIN<26> LOC = P47 ;
NET offsetIN<27> LOC = P48 ;
NET offsetIN<28> LOC = P49 ;
NET offsetIN<29> LOC = P50 ;
NET offsetIN<30> LOC = P51 ;
NET offsetIN<31> LOC = P52 ;
80
Bibliografia
BIBLIOGRAFIA
[1] Antonio Zichichi - progetto EEE (Extreme Energy Events) “La scienza
nelle scuole”
[2] Jean Marie Zogg - “GPS Basic Intrduction to the system Application
overiew”
[3] Micro Engineering Labs - “PicBasic Pro Compiler”
[4] www. Xilinx.com
[5] Douglas L. Perry - “VHDL: Programming by Example”
81
Ringraziamenti
RINGRAZIAMENTI
Un primo e doveroso ringraziamento al
Prof. Marco Panareo
per la costante disponibilità e cortesia avute nei miei confronti e per aver svolto il
compito di relatore con grande impegno.
Ringrazio inoltre tutto il gruppo di lavoro del laboratorio di elettronica
dell’INFN per il supporto tecnico, in particolare il
Dott. Alessandro Corvaglia per il suo contributo fondamentale alla riuscita di
questo lavoro, per avermi seguito e consigliato costantemente aiutandomi a
superare tutte le difficoltà incontrate.
Grazie a tutti gli amici, compagni di studi e di vita che mi sono stati vicini in tutti
i momenti di necessità e di felicità.
Un particolare ringraziamento alla mia famiglia, in particolare a mia madre
Anna e mio padre Salvatore, che mi hanno sostenuto in tutti questi anni
affrontando sacrifici senza i quali non avrei raggiunto questo traguardo.
Un ultimo ma non meno importante grazie a Manuela che mi è stata sempre
accanto come nessun altro poteva fare.
82
Scarica

A. Donno, Sviluppo di un oscillatore sincronizzato col GPS per