Introduzione                                                                                                             pag. II 
In genere i sistemi embedded sono caratterizzati da: 
• Funzionalità fissa e determinata dalle interazioni con l’ambiente. 
• Diversi modi di funzionamento alternativi. 
• Limitato accesso dell’utente alla programmabilità del sistema. 
• Capacità di reagire rapidamente agli eventi esterni. 
• Alto livello di parallelismo e concorrenza. 
• Elevate garanzie di sicurezza e affidabilità. 
 
Lo schema tipico di un sistema embedded è riassumibile come in figura 1: 
 
 
Sistema embedded
memoria CPU
Unita'  hardware
ASIC; timer; convertitoti A/D, D/A
S
e
n
s
o
r
i
A
t
t
u
a
t
o
r
i
 
Ambiente 
 
Figura 1 – Schema tipico di un sistema embedded 
 
Accanto a uno o più microprocessori, che vengono visti come “unità 
software”, sono presenti nuclei hardware dedicati a particolari funzioni 
(eventualmente funzioni critiche in termini temporali, che non possono 
quindi essere demandate a procedure software) e strutture hardware 
specifiche di interfacciamento col sistema ospitante (in generale, sensori e 
attuatori). 
 
Introduzione                                                                                                             pag. III 
L’obbiettivo di questo lavoro di tesi e quello di realizzare un coprocessore 
matematico che lavori sui numeri in formato floating point (FPU) allo 
scopo di aumentare la potenza di calcolo del processore LEON, un 
processore realizzato in VHDL dall’Agenzia Spaziale Europea (oggi 
mantenuto dalla Gaisler Research, Svezia) che è disponibile in open source 
e può essere utilizzato per realizzare un core all’interno di sistemi 
embedded più complessi.  
Nel capitolo 1 viene brevemente descritto il processore LEON a cui verrà 
interfacciata la FPU da realizzare. 
Nel capitolo 2 vengono descritti i vari modi utilizzati per rappresentare i 
numeri nei sistemi di elaborazione dell’informazione e lo standard IEEE 
per la rappresentazione dei numeri in virgola mobile. 
Nel capitolo 3 viene trattata l’aritmetica in virgola mobile, in particolare 
sono studiate le operazioni base dell’aritmetica in virgola mobile e lo 
standard IEEE. 
Nel capitolo 4 viene realizzata la FPU. Dopo aver studiato le FPU presenti 
in letteratura vengono scelte le specifiche e l’architettura della FPU da 
realizzare. La FPU è stata realizzata usando il linguaggio VHDL per la 
descrizione dell’hardware e il flusso di progetto da esso conseguente. 
Vengono descritti e testati singolarmente tutti i blocchi della FPU, superata 
questa fase la FPU è stata sottoposta alla verifica del UCBTEST, un test 
che esamina il comportamento dei dispositivi che utilizzano l'aritmetica in 
virgola mobile con lo standard IEEE 754 sviluppato a Berkeley presso la 
University of California. 
Nel capitolo 5 viene descritta la sintesi della FPU e dell’interfaccia per 
connetterla al LEON. 
Nell’Appendice A è riportato tutto il codice VHDL che descrive la FPU. 
Nell’Appendice B è riportato il test bench eseguito sulla FPU ed i risultati 
dell’UCBTEST a cui è stata sottoposta. 
 
Introduzione                                                                                                             pag. IV 
Nell’Appendice C è riportato il codice VHDL che descrive l’interfaccia per 
connettere la FPU al LEON. 
Nell’appendice D è riportato lo Script utilizzato per fare la sintesi della 
FPU con il software di Synopsys. 
Nell’Appendice E è riportata la verifica del metodo di Newton-Raphson per 
il calcolo della radice quadrata dei numeri denormalizzati. 
 
Capitolo 1 
 
Il Microprocessore LEON 
 
 
 
1.1 Il Microprocessore LEON 
 
L’architettura del processore LEON si basa sullo standard SPARC a 32 bit 
(versione 8), il cui set di istruzioni è conforme allo standard IEEE-754.  Il 
codice che descrive il LEON è stato scritto sotto forma di file VHDL (Very 
high speed circuits Hardware Description Language) da Jiri Gaisler [1.1], 
ed è distribuito ed utilizzabile entro i limiti di due licenze:  
• La GNU Public Licence  (GPL) 
• La Lesser GNU Public Licence  (LGPL) 
I termini di queste licenze consentono di utilizzare il codice VHDL del 
processore per realizzare un core all’interno di un sistema contenente altri 
dispositivi integrati (System on Chip, SoC), con il vincolo di rendere 
disponibili tutte le modifiche apportate al codice stesso, senza dover fare 
nessun cenno agli altri elementi aggiuntivi del progetto. 
 
 
 
Figura 1.1 – Il microprocessore LEON 
 
Capitolo 1 : Il Microprocessore LEON                                                                      pag. 2 
   
1.2 Architettura SPARC  
  
Poiché il processore LEON viene implementato secondo la versione 8 dello 
SPARC (Scalable Processor ARChitecture), di esso ne verrà dato un breve 
cenno. Lo SPARC [1.2] è un’architettura di istruzioni RISC, con dati interi 
su 32 bit e floating-point su 32, 64 e 128 bit secondo lo standard IEEE 754. 
Si tratta di un’architettura load/store nella quale, per la manipolazione dei 
dati, possono essere utilizzati solo i registri e non locazioni di memoria. Le 
istruzioni di load/store in memoria indirizzano uno spazio lineare di 2
32 
byte, consentendo l’indirizzamento di byte singoli nella modalità big 
endian (la MSB viene caricata per prima). Come tutte le architetture RISC, 
SPARC sfrutta la tecnica della pipeline e per ottimizzarla usa un branch 
delay slot, ciò significa che l’istruzione che segue un branching è sempre 
eseguita.  
Sono disponibili da 2 a 32 set di 24 registri generali che si dividono in local 
%l[0-7], in %i[0-7] e out %o[0-7] e che sono utilizzati mediante un sistema 
di finestre sovrapposte. L’architettura SPARC fornisce anche 8 registri 
global %g[0-7], 32 registri floating-point %f[0-31] ed alcuni registri di 
controllo/stato (%pc, %sp, %psr ecc.). Il set di istruzioni, tutte codificate su 
32 bit, è molto semplice ed è formato da 72 istruzioni di base  che per la 
maggior parte utilizzano 3 registri (origine 1, origine 2 e destinazione). 
Tutte le  procedure condividono i registri globali mentre i registi %l[0-7],  
%i[0-7] e %o[0-7] costituiscono la register window dove i registri di output 
sono sovrapposti con quelli di input della subroutine da essa chiamata. Se 
ad esempio un procedura A chiama una procedura B che a sua volta invoca 
una procedura C si avrà la situazione illustrata nella figura 1.2. Le finestre 
hanno un andamento circolare e l’attuale register window è indirizzata da 
CWP (current window pointer) contenuto nei 5 bit meno significativi di 
%psr e modificabile mediante save e restore. 
 
Capitolo 1 : Il Microprocessore LEON                                                                      pag. 3 
   
 
Figura 1.2  - Register window 
 
Strutturalmente il processore è costituito da 3 unità fondamentali (figura 
1.1) : 
1. unità intera (Integer Unit, IU ): contiene registri di uso generale 
(general pourpose) e controlla le operazioni del processore 
2. unità floating-point (Floating Point Unit, FPU)  
3. coprocessore (Coprocessor, CP): opzionale e dipendente 
dall’implementazione. 
 
Ognuna di queste unità utilizza i propri registri, tutti a 32 bit. FPU e CP 
sono connessi alla IU e ricevono da quest’ultima i segnali di controllo per il 
loro funzionamento. Il processore può essere in due modalità: utente (user 
mode) o supervisore (supervisor mode). In modalità supervisore può 
eseguire ogni istruzione, incluse quelle privilegiate mentre in modalità 
utente ogni tentativo di eseguire un’istruzione privilegiata causerà 
un’eccezione di tipo trap: l’istruzione non viene eseguita e si passa a quella 
immediatamente successiva. 
 
1.3 Amba BUS 
 
Le varie unità funzionali che costituiscono il processore LEON sono 
interconnesse attraverso l’utilizzo di 2 bus: AMBA AHB (Advanced High 
performance Bus) e AMBA APB (Advanced Peripheral Bus). I 2 bus 
svolgono le seguenti funzioni: 
 
Capitolo 1 : Il Microprocessore LEON                                                                      pag. 4 
   
AMBA AHB: interconette il processor core (integer unit e i controllori 
della cache) al controllore della memoria, all’APB bridge e ad eventuali 
altre unità a cui sono richieste alte prestazioni. Il processore è l’unico 
master sul bus mentre ci sono due slave: il controllore della memoria e 
l’APB bridge. L’AMBA AHB è in grado di connettere fino a 16 unità 
master e un numero elevato di unità slave. 
AMBA APB: interconette l’AMBA AHB con le unità periferiche attraverso 
l’APB bridge. Le unità periferiche connesse all’APB sono: il controllore 
delle interruzioni, il timer, 2 unità uart e la I/O port. L’APB bridge è 
connesso all’AHB come unità slave, mentre è l’unica unità master per 
l’AMBA APB bus. 
 
1.3.a Bus AHB 
 
Permette di realizzare trasferimenti dati ad alta velocità e consente: 
 
• trasferimenti burst; 
• transizioni split; 
• handover tra i master presenti sul bus in un unico ciclo; 
• operazioni su un unico fronte di clock; 
• implementazione non tristate; 
• trasferimenti dati fino a 128 bit.  
Tipicamente il sistema AMBA AHB è costituito da: 
• AHB master: il master è capace di iniziare un’operazione di lettura o 
scrittura fornendo un indirizzo e informazioni di controllo. Ad ogni 
istante un solo master è abilitato ad utilizzare il bus. (figura 1.3) 
• AHB slave: lo slave risponde ad un’operazione di lettura o scrittura 
effettuata in un dato range nello spazio di indirizzamento. Segnala al 
master attivo il successo, il fallimento o un’operazione di attesa 
(waiting) del trasferimento dati richiesto.(figura 1.4). 
 
Capitolo 1 : Il Microprocessore LEON                                                                      pag. 5 
   
 
 
 
Figura 1.3 - AHB master Figura 1.4 - AHB slave 
 
 
• AHB arbiter : l’arbitro assicura che ad ogni istante un solo master 
sia autorizzato ad iniziare il trasferimento dati. Ciascun master ha 
una interfaccia di tipo request /grant con l’arbitro e può richiedere 
un accesso esclusivo al bus con il segnale HLOCK. Il protocollo 
di arbitraggio non è specificato nello standard e viene definito 
internamente all’applicazione. (figura 1.5) 
• AHB decoder: il decoder è utilizzato per decodificare gli indirizzi 
dei trasferimenti e fornisce un segnale di selezione allo slave 
coinvolto nel trasferimento. (figura 1.6) 
Il protocollo dell’AMBA AHB bus è progettato per essere usato con uno 
schema di interconnessione centrale multiplexato. 
Tutti i master inviano l’indirizzo e i segnali di controllo indicanti il 
trasferimento che vorrebbero effettuare e l’arbitro decide quale master può 
inviare questi segnali a tutti gli slave. È necessario anche un decoder 
centralizzato, per controllare i dati letti e i segnali di risposta multiplexati e 
selezionare il segnale appropriato proveniente dallo slave coinvolto nel 
trasferimento. 
 
Capitolo 1 : Il Microprocessore LEON                                                                      pag. 6 
   
 
 
 
Figura 1.5 - Arbitro AHB Figura 1.6 - AHB decoder 
 
1.3.b Bus APB 
 
Il bus APB è stato progettato per 
avere bassi consumi di potenza e 
interfacce semplificate sulle 
periferiche. Per questo motivo si 
adatta particolarmente a 
periferiche con banda stretta che 
non richiedono le alte 
performance di un bus in pipeline. 
Anche la temporizzazione è molto 
semplice in quanto è presente un 
solo master (l’APB bridge), la 
selezione degli slave avviene attraverso i segnali dedicati PSELx (uno per 
ogni slave) e l’esecuzione del comando (lettura o scrittura) attraverso il 
segnale PENABLE. Per rappresentare l’attività dell’APB si usa il 
diagramma di stato di figura  1.7. 
 
Figura 1.7 - Diagramma di stato APB. 
 
 
 
Capitolo 1 : Il Microprocessore LEON                                                                      pag. 7 
   
• IDLE: stato di default per il bus APB; 
• SETUP: quando è richiesto un trasferimento il bus si sposta in questo 
stato e viene asserito l’opportuno segnale di selezione PSELx. Il bus 
rimane in questo stato per un solo ciclo e al clock successivo si 
sposta nello stato enable, 
• ENABLE: in questo stato viene asserito il segnale PENABLE. I 
segnali di indirizzo, scrittura e selezione devono rimanere stabili 
durante il passaggio tra i due stati. Anche questo stato dura un solo 
ciclo e dopo, se non sono richiesti altri trasferimenti, torna nello stato 
idle, se invece ci sono altri trasferimenti riguardanti la stessa 
periferica va nello stato setup. 
 
L’operazione di scrittura ( figura 1.8) ha inizio con il cambiamento, dopo il 
fronte di clock, dell’indirizzo (PADDR), del dato da scrivere (PWDATA), 
del segnale di scrittura (PWRITE) e del segnale di selezione della periferica 
(PSELx). 
Il primo ciclo di clock è il ciclo di SETUP mentre al successivo fronte di 
clock, con l’asserimento del segnale di abilitazione (PENABLE), entriamo 
nel ciclo di ENABLE alla fine del quale il trasferimento è completato. In 
questo ciclo l’indirizzo, il dato e i segnali di controllo rimangono validi. 
Alla fine del trasferimento il segnale PENABLE deve essere rimosso ed 
anche il segnale di selezione deve tornare basso, a meno che il 
trasferimento non sia immediatamente seguito da un altro per la stessa 
periferica. Per ridurre i consumi di potenza l’indirizzo e il segnale di 
scrittura non cambiano finché non comincia un altro trasferimento. 
Nell’operazione di lettura (figura 1.9) la temporizzazione dei segnali di 
indirizzo, scrittura, selezione e abilitazione è la stessa del trasferimento di 
scrittura mentre il dato deve essere fornito dallo slave durante il ciclo 
 
Capitolo 1 : Il Microprocessore LEON                                                                      pag. 8 
   
ENABLE e viene campionato sul fronte in salita del clock alla fine del 
ciclo. 
 
 
 
Figura 1.8 - Trasferimento in scrittura. Figura 1.9 - Trasferimento in lettura. 
  
 
 
1.4 APB bridge  
 
L’ APB bridge è l’unico master presente sul bus APB ed è anche uno slave 
sul bus AHB. La sua funzione è quella di memorizzare i trasferimenti 
effettuati sul bus AHB (diretti a una periferica APB) e in seguito pilotare 
opportunamente il bus APB in modo da rendere effettivi tali trasferimenti. 
 
 
Figura 1.10 - APB bridge. 
 
 
 
 
Capitolo 1 : Il Microprocessore LEON                                                                      pag. 9 
   
Il bridge esegue le seguenti operazioni: 
• campiona gli indirizzi e li mantiene validi per tutto il trasferimento. 
• decodifica gli indirizzi e genera i corrispondenti segnali di selezione 
(PSELx) per ciascuna periferica. 
• invia i dati dell’AHB sul bus APB in caso di trasferimento in 
scrittura. 
• manda i dati dell’APB sul bus AHB nei trasferimenti in lettura. 
• pilota il segnale PENABLE che regola la temporizzazione dell’APB. 
 
1.5 Architettura del microprocessore LEON 
 
Il modello del LEON [1] implementato è composto dalle seguenti unità: 
 
• Integre Unit con 32 register 
window 
• 2 cache separate per istruzioni 
e dati  
• una RAM AHB da 32 Kbyte 
• un APB bridge 
• un controllore delle 
interruzioni 
• 2 contatori a 24 bit  
• un watchdog 
• 2 porte seriali (UARTs) 
• una porta di I/O 
• un controllore AHB 
• un controllore di memoria 
• un blocco di protezione 
scrittura  
• Interfaccia generica per FPU e 
coprocessore 
 
Di questi blocchi verrà fatta una breve descrizione senza entrare nei dettagli 
della loro realizzazione, per ulteriori approfondimenti si rimanda a [1]. 
 
Capitolo 1 : Il Microprocessore LEON                                                                    pag. 10 
 
1.5.a L’Integer Unit 
 
La Integer Unit dell LEON implementa lo standard SPARC V8 incluse le 
istruzioni di moltiplicazione e divisione. La configurazione scelta è 
caratterizzata da : 
• 5 stadi di pipeline per le istruzioni. 
• Interfacce separate per data cache e instruction cache. 
• 32 register windows (NWINDOWS). 
• Moltiplicatore 16x16. 
• MAC (moltiplicatore con accumulatore) 16x16 bit con accumulatore 
a 40 bit. 
I 5 stadi della pipeline sono : 
1. FE (instruction fetch) : se l’instruction cache è abilitata viene 
prelevata l’istruzione dalla cache, altrimenti la fase di fetch è 
rimandata al controllore di memoria. L’istruzione è valida alla fine di 
questa fase e viene registrata all’interno della IU. 
2. DE (instruction decode) : viene decodificata l’istruzione e vengono 
letti gli operandi. L’indirizzo del target per le istruzioni CALL e 
Branch viene calcolato in questa fase. 
3. EX (execute) : sono eseguite operazioni aritmetiche, logiche e di 
shift. Viene generato l’indirizzo per le operazioni di memoria (load e 
store) e per le istruzioni JMPL e RETT. 
4. ME (memory) : viene effettuato l’accesso alla data cache. Per le 
letture nella cache il dato deve essere valido alla fine di questo stadio 
e per le scritture in memoria il dato è scritto nella data cache in 
questo stadio. 
5. WR (write) : il risultato delle operazioni aritmetiche, logiche, di shift 
e i dati letti nella cache vengono scritti nei registri destinatari. 
 
Capitolo 1 : Il Microprocessore LEON                                                                    pag. 11 
   
 
1.5.b Reset del processore 
 
Il processore viene resettato asserendo l’ingresso RESET almeno per un 
ciclo di clock. L’esecuzione ha inizio dall’indirizzo 0. La tabella 1.1 indica 
i valori dei registri del processore sensibili all’operazione di reset, gli altri 
mantengono invariato il loro valore. 
 
 
Registro 
PC 
program 
counter 
nPC  
next PC 
PSR 
processor 
status reg 
CCR 
cache control 
reg. 
    
Valore 
reset 
0x0 0x4 ET=0, S=1 0x0
Tabella 1.1 – Registri sensibili al reset del processore LEON 
 
 
1.5.c Eccezioni 
 
Il processore LEON aderisce al modello generale di trap dello Sparc. Nella 
tabella 1.2 sono mostrate le trap implementate, il tipo e la priorità. 
 
Trap TT Priorità Descrizione 
Reset 0x00 1 Reset
write error 0x2b 2 Errore nel write buffer 
instruction_access_error 0x01 3 Errore durante la fase di fetch 
illegal_instruction 0x02 5 Istruzione non implementata 
privileged_instruction 0x03 4 Esecuzione di istruzione privilegiata 
in modalità user 
fp_disabled 0x04 6 Istruzione FP con FPU disabilitata 
cp_disabled 0x24 6 Istruzione CP con coprocessore 
disabilitato 
watchpoint_detect 0x0b 7 Watchpoint
window_overflow 0x05 8 Istruzione SAVE in finestra non 
valida