Matricola:
567/58
chiamato km3 (per il suo volume) posto sott'acqua e atto alla rivelazione dei
gire con altri corpi, questo li rende ideali per lo studio di eventi lontani sia
Alla dicoltà di rilevazione e alla rarità degli eventi, comuni anche ad altri
esperimenti dello stesso tipo, NEMO va incontro alla dicoltà di essere real-
resistere alla pressione, alle correnti marine e alla corrosione. Il mio lavoro si
il segnale generato dal telescopio. Purtroppo però tale segnale può essere
della scheda è stata svolta sia dal punto di vista Hardware, tramite linguaggio
I
laze in un FPGA; che Software, scrivendo un programma in linguaggio C con
II
Indice
1 NEMO 1
1.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2 Struttura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2.1 La torre . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.2.2 Il piano . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.2.3 Modulo ottico (OM) . . . . . . . . . . . . . . . . . . . 6
1.3 formazione dei muoni . . . . . . . . . . . . . . . . . . . . . . . 7
1.4 Radiazione Cherenkov . . . . . . . . . . . . . . . . . . . . . . 7
1.5 Il problema della comunicazione . . . . . . . . . . . . . . . . . 9
3 Progetto 20
3.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
3.2 Scheda elettronica . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.3 Simulatore . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.4 Computer Aided Design (CAD) . . . . . . . . . . . . . . . . . 26
3.5 Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
3.5.1 Inizializzazione . . . . . . . . . . . . . . . . . . . . . . 30
3.5.2 Inizio del ciclo di registrazione . . . . . . . . . . . . . . 31
3.5.3 Risultati . . . . . . . . . . . . . . . . . . . . . . . . . . 32
III
Capitolo 1
NEMO
1.1 Introduzione
1
CAPITOLO 1. NEMO 2
studiare le zone più remote del cosmo. Tuttavia essendo la sua probabilità di
Cherenkov prodotta dai Muoni che entrano in acqua con una velocità supe-
riore a quella della luce nel mezzo. Essendo i Muoni formati dall'interazione
informazioni sui neutrini generatori (si consideri che il Muone possiede circa
1.2 Struttura
Il sistema di osservazione è basato su una serie di moduli ottici (paragrafo
della luce, maggiore potrà essere la distanza fra i moduli ottici. Il numero
di moduli ottici necessari alla misura, e quindi il costo del rivelatore stesso,
il compito di generare una risposta elettronica che è funzione del numero dei
fotoni Cherenkov rilevati e del loro tempo di arrivo. Occorre poi trasmettere
siche rilevanti.
come una matrice 9x9 su una supercie di 2 km2 e alte circa 750 m. Ogni
(JB) che separeranno i cavi lungo il proprio percorso da terra no ai 5832
1.2.1 La torre
Questi ultimi sono disposti in modo tale che due siano orientati verso il
basso e due a formare un angolo di 90◦ rispetto alla verticale. I piani sono
m, con una distanza dal fondale del primo piano di 150 m. Per tenere le
Alla base della torre è posta la JB-tower che, come detto prima, è il nodo
Figura 1.3: Vista schematica di una torre. Le sfere bianche sono i moduli
ottici
CAPITOLO 1. NEMO 6
1.2.2 Il piano
I piani presenti sulle torri hanno struttura tubolare e su essi sono collocati,
oltre ai 4 moduli ottici, diversi sensori e due moduli di controllo. Nella parte
centrale della gura 1.4 possiamo vedere il modulo di controllo FCM che è
in due semisfere, è garantita per resistere ad una pressione di 700 bar. In una
mento nero per far si che i fotoni rilevati provengano prevalentemente dalla
direzione in cui è puntato il PMT. Inne in tutto il modulo viene posta una
è di 50 - 60 Hz).
e un'altra particella:
νµ + N → µ + X
sempre maggiore di uno (la velocità della luce in un mezzo è sempre inferiore
a quella nel vuoto). Può accadere che una particella incidente in un mez-
quest'ultima.
particella v.
9 1.5. IL PROBLEMA DELLA COMUNICAZIONE
bassi.
di banda per ogni singolo canale sarebbe di 8 bit x 200 x 106 s−1 = 1.6 Gb/s.
In questo caso la necessità di banda totale per 5832 rivelatori sarebbe di 1.6
2.1 Introduzione
L'FPGA è un potente strumento nell'ambito dell'elettronica digitale, con-
funzionamento.
mentali: i primi sono quelli che possono essere programmati una volta sola
(in genere hanno dimensioni ridotte), gli altri possono essere programmati
più volte (ma perdono la congurazione ogni volta che si spegne il dispositi-
vo). Nel secondo caso è necessaria una sequenza di bit, detto bitstream, per
10
11 2.1. INTRODUZIONE
Con il passare degli anni gli FPGA sono stati migliorati in complessità
cose:
sequenziale2
1 Le
uscite del circuito sono funzioni solo degli ingressi
2 Le
uscite sono funzioni anche dello stato in cui si trova il sistema, per funzionare
richiede memoria ed un clock
CAPITOLO 2. FIELD PROGRAMMABLE GATE ARRAYS (FPGA) 12
Nella parte destra abbiamo due ip-op di tipo D con set, reset e counter
13 2.2. CONFIGURABLE LOGIC BLOCK (CLB)
enable (EC): i primi due vengono usati per settare le uscite dei ip-op a
0 o 1, l'EC per bloccare lo stato del ip-op. L'ingresso dei ip-op può
venire dalla parte combinatoria o dall'esterno tramite l'input DIN. Una serie
ria, i CLB della famiglia xc4000 sono stati migliorati per l'implementazione
2.2.1 Contatore
Nel caso si vogliano creare dei contatori, lo scambio dei riporti tra i CLB
avviene tramite la linea COUT. Sono presenti due funzioni logiche combi-
(Figura 2.3).
I CLB possono essere usati come memorie RAM contenenti no a 64 bit. Gli
Le linee di ingresso dati sono DIN e H1, quelle di uscita corrispondo a quelle
2.3 Interconnessioni
La connessione tra i vari blocchi avviene attivando degli interruttori che
uniranno tra loro le varie linee di collegamento. Tali linee possono essere
di tipo diretto (DI) per far comunicare blocchi vicini velocizzando la logica,
oppure linee lunghe usate per portare segnali in tutto il chip (ad esempio il
clock). L'FPGA in uso ha quattro linee globali veloci, utilizzate per segnali
come il clock, la cui fase deve rimanere piuttosto invariata. In più vi sono
altre quattro linee globali secondarie che presentano sfasamenti. Queste linee
dei pin posti negli angoli dell'FPGA (Figura 2.5. Nella gura 2.6 possiamo
ip-op per la sincronizzazione e possono essere settati come solo uscita, solo
2.5 MicroBlaze
MicroBlaze è un microprocessore open source3 che ho utilizzato in questo
• registri speciali
• due bus separati a 32 bit: per gli indirizzi e i dati si usano bus divisi
(architettura Harvard)
mazione è che per i dati si usa la codica Big-Endian, ovvero le cifre dei
Per comunicare con le periferiche il MicroBlaze utilizza dei bus sui quali
mandare i segnali. Dei vari tipi di bus quello utilizzato in questo progetto è
Tale bus è costituito da una serie di OR che collegano tra loro le varie
sequenza:
master
Progetto
3.1 Introduzione
Lo scopo di questo progetto è quello di limitare la quantità di dati da trasmet-
tere facendoli ltrare da un programma nel quale viene impostata una soglia
di circa 100KHz.
dati selezionati vengono scritti in un'altra zona della memoria e alla ne viene
dopo la selezione.
20
21 3.2. SCHEDA ELETTRONICA
utilizzate le seguenti:
pc
Quattro LED : 2 Led verdi e 2 Rossi usati per indicare lo stato della scheda
CAPITOLO 3. PROGETTO 22
3.3 Simulatore
Come già detto il simulatore è costituito da un contatore e da un Linear Feed-
back Shift Register (LFSR). Esso può essere resettato, attivato e disattivato
dal programma.
10bit per far si che il generatore di numeri casuali lavori ad una frequen-
da 1 a 65535 ma a sequenza casuale (il numero 0 non può essere usato come
Il punto di inizio del simulatore è il contatore a 10 bit che dopo 1024 colpi
e controllato.
delle simulazioni.
1 Un automa a stati niti le cui uscite sono funzioni esclusivamente dello stato in cui si
trova. Inoltre lo stato iniziale deve essere denito.
25 3.3. SIMULATORE
Figura 3.6: Si può qui vedere il segnale della durata di 20 ns generato dal
contatore ogni 10240 ns. C'è un ritardo di 100 ns a causa di un reset iniziale
CAPITOLO 3. PROGETTO 26
Figura 3.7: Transazione del linear feedback shift register quando riceve il
segnale di enable dal contatore
bus o altro.
inne sono stati congurati i collegamenti con il bus, gli indirizzi e i gestori
delle periferiche.
I bus LMB (Local Memory Bus) sono due per il tipo di architettura del
al bus OPB. Nella seconda gura possiamo invece notare che un le VHDL
L'ultimo le, con estensione .ucf, contiene informazioni sull'utilizzo dei pin
esterni.
A partire dal le VHDL seguono diversi processi per la creazione del
creato un netlist.
4. Place and Route: Ai CLB creati nella fase precedente viene data una
nel le bitstream che può nalmente essere scritto sul dispositivo o su
ROM programmabile.
29 3.5. SOFTWARE
3.5 Software
fornite dalla Xilinx. Viene inoltre creata una libreria, xparameters.h, con le
3.5.1 Inizializzazione
Per inizializzare una periferica bisogna usare una funzione specica, la quale
inserisce informazioni sul registro e tipo di periferica in una variabile che può
31 3.5. SOFTWARE
Per il display è diverso in quanto c'è bisogno di uno strobe per convalidare
il dato ed un tempo di attesa per far si che i caratteri vengano scritti, riporto
lo pseudo-codice utilizzato:
2. breve attesa
4. attesa
Per puro scopo di valutazione tutti i dati vengono registrati. Per memoriz-
della memoria. Nella stessa routine vengono confrontati i numeri con il valore
3.5.3 Risultati
Conclusione
Ricapitolando in questa tesi sono state discusse le motivazioni che spin-
quali si va incontro.
nell'esperimento NEMO.
Il cuore della tesi è l'analisi del problema della trasmissione dei dati ed
una possibile soluzione ad esso. La soluzione proposta dalla mia tesi riguarda
dopo il fotomoltiplicatore.
Nel terzo capitolo ho spiegato i vari passi del progetto, tuttavia ci tengo
a far capire che, per quanto possa sembrare semplice, è stato piuttosto arduo
parlare poi del mancato funzionamento del debug module (MDM) che mi ha
successo e spero possa essere in qualche modo di aiuto a chi voglia cimentarsi
Appendice
Codice sorgente del programma (Linguaggio c)
#include <stdio.h>
#include <stdlib.h>
#include <xgpio.h>
#include <xintc.h>
#include <xbasic_types.h>
#include <xstatus.h>
#include d:\oscar\progetto_irq\microblaze_0\include\xparameters.h
//
//inizializzazione LEDs
if (XGpio_Initialize(&led_gpio, XPAR_LEDS_4BIT_DEVICE_ID)
!= XST_SUCCESS)
{
xil_printf(\n\rErrore nell'inizializzazione dei LEDs);
exit(1);
}
XGpio_DiscreteWrite(&led_gpio, 1, 11); //sono stati spenti i LED
tranne il secondo (rosso)
//inizializzazione LCD;
if (XGpio_Initialize(&int_ack_gpio, XPAR_LCD_DEVICE_ID) !=
XST_SUCCESS) //utilizzo il puntatore int_ack per non sprecare
memoria
{
xil_printf(\n\rErrore nell'inizializzazione del display);
exit(1);
}
XGpio_DiscreteWrite(&int_ack_gpio, 1, 0x23f);
for(i=0;i<lcd_delay;i++);
XGpio_DiscreteWrite(&int_ack_gpio, 1, 0x3f); //impostati 8-bit
input
for(i=0;i<lcd_delay*300;i++);
lcd_printf(Soglia:\n, 1);
lcd_printi(soglia, 0);
// inizializzazione indirizzo memoria
mem_add = (Xuint32 *)XPAR_DDR_SDRAM_32MX16_MEM0_
BASEADDR;
//inizialiazzazione indirizzo di acquisizione
PRC_add = (Xuint32 *)XPAR_PRC_BASEADDR;
//inizializzazione periferica interrupt
if (XIntc_Initialize(&Intc, XPAR_OPB_INTC_0_ DEVICE_ID)
!= XST_SUCCESS)
{
xil_printf(\n\rErrore nell'inizializzazione della periferica interrupt);
exit(1);
}
//Inizializzazione interrupt sulla periferica usata come strobe
if (XGpio_Initialize(&int_ack_gpio, XPAR_INT_ACK_DEVICE_ID)
!= XST_SUCCESS)
{
xil_printf(\n\rErrore nell'inizializzazione della periferica int_ack);
CAPITOLO 3. PROGETTO 38
exit(1);
}
if (GpioSetupIntrSystem(&Intc, &int_ack_gpio, XPAR_INT_ACK_
DEVICE_ID, XPAR_OPB_INTC_0_INT_ACK_IP2INTC_IRPT_
INTR, 1) != XST_SUCCESS)
{
xil_printf(\n\rErrore nell'inizializzazione dell'interrupt per la perifer-
ica push_buttons);
exit(1);
}
//-
microblaze_enable_interrupts(); //attiva gli interrupt sul microblaze
XGpio_DiscreteWrite(&led_gpio, 1, 7); //acceso il primo LED (verde)
IntrFlag=0;
//avvio generatore di numeri casuali
PRC_add[0]=1;
//inizio stato di attesa interrupt
while(contatore<n_campioni)
{
while(!IntrFlag); //quando si riceve un interrupt si esce da questo ciclo
// Quando si riceve un interrupt questo viene disattivato durante la
procedura di acquisizione
if (IntrFlag)
{
XIntc_Acknowledge(&Intc, 0);
XIntc_Disable(&Intc, 0);
acquisizione_dati(&contatore, &selezionati);
XIntc_Enable(&Intc, 0);
}
IntrFlag=0; //il ag di interrupt viene azzerato
} //ne while(contatore) //il programma raccoglie 200 campioni
// Disattivazione degli interrupt
GpioDisableIntr(&Intc, &int_ack_gpio, XPAR_OPB_INTC_0_PUSH_
BUTTONS_3BIT_IP2INTC_IRPT_INTR, 1);
GpioDisableIntr(&Intc, &int_ack_gpio, XPAR_OPB_INTC_0_INT_ACK_
IP2INTC_IRPT_INTR, 1);
XGpio_DiscreteWrite(&led_gpio, 1, 11); //acceso di nuovo il LED
rosso
// Stampa dei risultati -
stampa_campioni(selezionati);
39 3.5. SOFTWARE
return 0;
} //ne main
// FUNZIONI -
//
// funzione GpioSetupIntrSystem
//
// Funzione che attiva l'interrupt sulla periferica con:
// indirizzo di base del registro: InstancePtr
// indirizzo dell'interrupt: IntcInstancePtr
// ID di dispositivo: DeviceId
// ID di interrupt della periferica: IntrID
// IntrMask è il canale, in genere è 1
XStatus GpioSetupIntrSystem(XIntc* IntcInstancePtr, XGpio* InstancePtr,
Xuint16 DeviceId, Xuint16 IntrId, Xuint16 IntrMask)
{
XStatus Result;
GlobalIntrMask = IntrMask; //viene memorizzato come variabile
globale per un'altra funzione
/* Associa la funzione GpioDriverHandler all'interrupt della periferi-
ca*/
Result = XIntc_Connect(IntcInstancePtr, IntrId, (XInterruptHandler)GpioDriverHandler,
InstancePtr);
if (Result != XST_SUCCESS)
{
xil_printf(\n\rErrore sull'attivazione dell'interrupt);
exit(1);
}
/* vengono ora attivati gli interrupt della periferica Gpio*/
XGpio_InterruptEnable(InstancePtr, IntrMask);
XGpio_InterruptGlobalEnable(InstancePtr);
/* viene attivato l'interrupt sull'interrupt controller */
XIntc_Enable(IntcInstancePtr, IntrId);
Result = XIntc_Start(IntcInstancePtr, XIN_REAL_MODE);
if (Result != XST_SUCCESS)
{
xil_printf(\n\rErrore sull'attivazione dell'interrupt);
exit(1);
}
return XST_SUCCESS;
}
//-
CAPITOLO 3. PROGETTO 40
//
// linea e tabulazioni
//
// clear: 1 pulisce il display prima di scrivere
void lcd_printf(char* frase, int clear)
{
int i,tempo;
XGpio address;
if (XGpio_Initialize(&address, XPAR_LCD_DEVICE_ID) != XST_SUCCESS)
//inizializzazione periferica
{
xil_printf(Errore di inizializzazione display\n\r);
exit(1);
}
if (clear==1)
{
XGpio_DiscreteWrite(&address,1,1 | (19));
for(tempo=0;tempo<lcd_delay;tempo++);
XGpio_DiscreteWrite(&address,1,1); //clear eettuato
for(tempo=0;tempo<lcd_delay*300;tempo++);
XGpio_DiscreteWrite(&address,1,0xc | (19));
for(tempo=0;tempo<lcd_delay;tempo++);
XGpio_DiscreteWrite(&address,1,0xc); //display on
for(tempo=0;tempo<lcd_delay*300;tempo++);
}
for (i=0;i<strlen(frase);i++)
{
switch(frase[i])
{
case '\n':
XGpio_DiscreteWrite(&address,1,0x2a8);
for(tempo=0;tempo<lcd_delay;tempo++);
XGpio_DiscreteWrite(&address,1,0xa8); //seconda riga
for(tempo=0;tempo<lcd_delay*10;tempo++);
break;
case '\t': xil_printf(Errore, tabulazioni non supportate dal display\n\r);
exit(1);
case '\r': break;
default:
XGpio_DiscreteWrite(&address, 1,frase[i]| 0x300);
for(tempo=0;tempo<lcd_delay;tempo++);
XGpio_DiscreteWrite(&address, 1,frase[i] | 0x100); //scritto il carat-
tere sul display
43 3.5. SOFTWARE
for(tempo=0;tempo<lcd_delay*10;tempo++);
} //ne switch (frase[i])
} //ne for (i)
}
//-
// funzione xtoa
//
// Converte il numero val in stringa, associando il valore a buf, la
conversione avviene in base radix
// Se il numero è negativo is_neg deve essere uguale ad 1
static void xtoa (unsigned long val, char *buf, unsigned radix, int
is_neg)
{
char *p; /* pointer to traverse string */
char *rstdig; /* pointer to rst digit */
char temp; /* temp char */
unsigned digval; /* value of digit */
p = buf;
if (is_neg)
{
/* negative, so output '-' and negate */
p++ = '-';
val = (unsigned long)(-(long)val);
}
rstdig = p; /* save pointer to rst digit */
do
{
digval = (unsigned) (val
val /= radix; /* get next digit */
/* convert to ascii and store */
if (digval > 9)
p++ = (char) (digval - 10 + 'a'); /* a letter */
else
p++ = (char) (digval + '0'); /* a digit */
} while (val > 0);
/* We now have the digit of the number in the buer, but in reverse
order. Thus we reverse them now. */
*p = '\0'; /* terminate string; p points to last digit */
do
{
CAPITOLO 3. PROGETTO 44
temp = *p;
p = *rstdig;
rstdig = temp; /* swap *p and *rstdig */
p;
++rstdig; /* advance to next two digits */
} while (rstdig < p); /* repeat until halfway */
}
//-
// funzione lcd_printi
//
// Funzione per scrivere un numero sul display
//
// num è il numero da scrivere, la base è ssata a 10
// clear deve essere 1 se si vuole pulire il display
void lcd_printi(int num,int clear)
{
int i,tempo;
char frase[33];
XGpio address;
if (XGpio_Initialize(&address, XPAR_LCD_DEVICE_ID) != XST_SUCCESS)
{
xil_printf(Errore di inizializzazione display\n\r);
exit(1);
}
if (clear==1)
{
XGpio_DiscreteWrite(&address,1,1 | (19));
for(tempo=0;tempo<lcd_delay;tempo++);
XGpio_DiscreteWrite(&address,1,1); //clear eettuato
for(tempo=0;tempo<lcd_delay*150;tempo++);
XGpio_DiscreteWrite(&address,1,0xc | (19));
for(tempo=0;tempo<lcd_delay;tempo++);
XGpio_DiscreteWrite(&address,1,0xc); //display on
for(tempo=0;tempo<lcd_delay*150;tempo++);
}
xtoa(num,frase,10,0); //conversione del numero in stringa
if (frase != NULL)
{
for(i=0;i<strlen(frase);i++)
{
XGpio_DiscreteWrite(&address, 1, frase[i] | 0x300);
45 3.5. SOFTWARE
for(tempo=0;tempo<lcd_delay;tempo++);
XGpio_DiscreteWrite(&address, 1,frase[i] | 0x100); //scrittura delle
cifre
for(tempo=0;tempo<lcd_delay*10;tempo++);
}
}
else
{
xil_printf(Errore, il numero inserito non è valido\n\r);
exit(1);
}
}
//