Vous êtes sur la page 1sur 100

UNIVERSITÁ DEGLI STUDI DI PAVIA

FACOLTÁ DI INGEGNERIA
DIPARTIMENTO DI INFORMATICA E SISTEMISTICA

Implementazione
della sezione digitale
di un modulatore LINC
per la trasmissione
di segnali GSM-EDGE

Relatore:
Prof. Carla Vacchi

Correlatore:
Dott.ssa Paola Uggetti

Tesi di Laurea di
Marco Rossi

Anno Accademico 2004/2005


Indice

1 Introduzione 6

1.1 Lavoro svolto . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

1.2 Scelta della tesi . . . . . . . . . . . . . . . . . . . . . . . . . . 9

2 Teoria del sistema 10

2
INDICE 3

2.1 Analogico o Digitale? . . . . . . . . . . . . . . . . . . . . . . . 12

2.2 Il trasmettitore LINC . . . . . . . . . . . . . . . . . . . . . . . 14

2.2.1 Struttura . . . . . . . . . . . . . . . . . . . . . . . . . 14

2.2.2 Teoria Matematica . . . . . . . . . . . . . . . . . . . . 17

2.2.3 Vantaggi . . . . . . . . . . . . . . . . . . . . . . . . . . 17

2.3 La sezione digitale . . . . . . . . . . . . . . . . . . . . . . . . 19

2.3.1 Modulazione PSK . . . . . . . . . . . . . . . . . . . . . 19

2.3.2 Interpolazione . . . . . . . . . . . . . . . . . . . . . . . 21

2.3.3 Il filtro FIR . . . . . . . . . . . . . . . . . . . . . . . . 23

2.3.4 Separazione del segnale . . . . . . . . . . . . . . . . . . 31

2.4 Valutazione dei risultati . . . . . . . . . . . . . . . . . . . . . 33

2.4.1 Maschera dello spettro . . . . . . . . . . . . . . . . . . 33

2.4.2 EVM . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34

3 Implementazione Matlab 36

3.1 Lo schema Simulink . . . . . . . . . . . . . . . . . . . . . . . . 37

3.2 Effetti di quantizzazione . . . . . . . . . . . . . . . . . . . . . 39

3.3 Risultati . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

3.3.1 Quantizzazione FIR . . . . . . . . . . . . . . . . . . . . 41


INDICE 4

3.3.2 Quantizzazione Separazione . . . . . . . . . . . . . . . 45

3.3.3 Il filtro FIR . . . . . . . . . . . . . . . . . . . . . . . . 46

4 Implementazione VHDL 48

4.1 Note Implementative . . . . . . . . . . . . . . . . . . . . . . . 50

4.2 La libreria FIX-STD . . . . . . . . . . . . . . . . . . . . . . . 51

4.3 Descrizione generale . . . . . . . . . . . . . . . . . . . . . . . 53

4.4 Il filtro FIR . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54

4.4.1 Specifiche di quantizzazione . . . . . . . . . . . . . . . 58

4.5 Il Separatore . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59

4.5.1 Entità CORDIC.VHD . . . . . . . . . . . . . . . . . . 61

4.5.2 Specifiche di quantizzazione . . . . . . . . . . . . . . . 63

5 Conclusione 66

5.1 Risultati . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67

5.2 Sviluppi Futuri . . . . . . . . . . . . . . . . . . . . . . . . . . 68

A Fixed Point Toolbox 69

B L’algoritmo CORDIC 73
INDICE 5

C Acronimi 80

D Codice vhdl 82
Capitolo

Introduzione 1
Il primo capitolo introduce al lettore l’argomento dell’elaborato, assieme ad
alcune considerazioni personali dell’autore sullo stato attuale della comuni-
cazione mobile.

6
1.1. LAVORO SVOLTO 7

Il mercato della telefonia mobile negli ultimi anni si è rivelato redditizio.


Le aziende produttrici sono incentivate dagli utili ad investire in ricerca e
sviluppo per migliorare le prestazioni dei propri prodotti; attualmente le so-
luzioni tecnologiche ci offrono apparecchi cellulari in grado di adempiere ad
una vasta gamma di funzionalità, impensabili fino a qualche anno addietro.
L’utente finale è ormai abituato ad usufruire di servizi che vanno ben al di
là della comunicazione vocale. Navigazione su Internet tramite il protocollo
WAP (Wireless Application Protocol), trasmissione in tempo reale di segna-
li video e SMS (Short Message Service) sono ormai diventati caratteristiche
comuni a molti modelli di telefoni cellulari attualmente in commercio. Per
permettere all’utente di usufruire di questi servizi sono stati sviluppati diversi
standard telefonici nei quali, tramite tecniche via via più sofisticate di mo-
dulazione digitale, a spese di occupazioni di banda maggiori, si raggiungono
velocità di scambio dell’informazione (bit rate) sempre più elevate. Purtroppo
l’utilizzo di queste funzionalità è ancora limitato dalla durata della batteria;
le industrie produttrici sono sempre alla ricerca del punto di equilibrio, che
minimizzi i costi (sviluppo, produzione e distribuzione) e i consumi energetici
ma allo stesso tempo offra funzionalità avanzate. Una possibile soluzione al
problema risiede nell’investire nel settore della ricerca per progettare dispo-
sitivi utilizzando componenti economici ma ad alto rendimento, in modo da
ammortizzare i costi fissi con un alto volume di vendite.

1.1 Lavoro svolto

Questa tesi ha come oggetto l’implementazione hardware della sezione di-


gitale di una tipologia di modulatore per apparecchi di comunicazione mo-
bile, in particolare del modulatore LINC (Linear Amplification using Non
linear Components). É stato progettato e ottimizzato secondo le specifiche
1.1. LAVORO SVOLTO 8

dello standard GSM-EDGE (Global System for Mobile communications -


Enhanced Data rate for GSM Evolution) ma la sua struttura modulare lo
rende adattabile a standard differenti. Il sistema nel suo complesso è compo-
sto da una sezione analogica e da una digitale. La sezione analogica è stata
studiata e implementata su silicio da dottorandi dell’università di Pavia, in
collaborazione con ST Microelectronics. Uno studio teorico della parte digi-
tale è stato realizzato in particolare dalla dottoressa Paola Uggetti. I passi
fondamentali del mio lavoro sono stati:

• Comprendere a grandi linee il funzionamento del modulatore, at-


traverso articoli teorici pubblicati, il progetto Matlab della dott.ssa
Uggetti e i lavori di tesi precedenti.

• Studiare i risultati delle simulazioni Matlab, effettuate dalla dott.ssa


Uggetti in condizioni ideali e valutare l’impatto delle non idealità in un
sistema reale (in primis gli effetti di quantizzazione del segnale nei vari
punti del sistema, che contribuiscono in maniera notevole a degradare
le prestazioni)

• Proporre una soluzione concreta, tenendo conto dei vincoli di pro-


getto (area, potenza dissipata, velocità di funzionamento) cercando di
ottimizzare le prestazioni del sistema.

• Implementare in un linguaggio descrittivo dell’hardware il sistema, in


modo che potesse essere sintetizzato in un progetto successivo. In par-
ticolare è stato utilizzato il VHDL (Very high speed integrated circuit
Hardware Description Language).
1.2. SCELTA DELLA TESI 9

1.2 Scelta della tesi

Questa tesi sin dall’inizio mi ha molto interessato perché esamina un proble-


ma reale che può essere risolto in modi differenti. L’ingegnere informatico
puro potrebbe risolverlo implementando algoritmi di ottimizzazione degli er-
rori di quantizzazione, mentre l’ingegnere elettronico potrebbe proporre con-
fronti con architetture differenti. Il software, sin dal nome, è qualcosa di
astratto, mentre studiare qualcosa che diverrà un componente reale di un
circuito di trasmissione dati mi ha appassionato enormemente e descrivere
un circuito digitale in VHDL mi ha permesso di apprezzare ancora di più il
punto d’incontro tra informatica ed elettronica digitale.
Capitolo

Teoria del sistema 2


Per meglio comprendere l’implementazione del sistema, è necessario descrive-
re i principi teorici sui quali esso si basa. Questo capitolo contiene riferimenti
alla struttura del trasmettitore LINC e descrive come il segnale viene elabo-
rato per una corretta trasmissione. Include inoltre una descrizione dei metodi
che ho utilizzato per valutare l’esito delle simulazioni effettuate.

10
11

La comunicazione è sempre stata fondamentale per qualsiasi società. Il lin-


guaggio, il disegno e in seguito la scrittura hanno permesso ai popoli di
evolversi e trasmettere il proprio sapere e i propri valori. In tutta la storia
dell’umanità, la quantità di informazioni accessibili a tutti non è mai stata
cosı̀ importante come oggi. Essa si presenta sotto forma di dati, immagini,
suoni e filmati. Se l’avvento delle prime reti informatiche ha fatto intrave-
dere queste prospettive, oggi è l’insieme delle attività umane che invoca uno
sviluppo dei sistemi di comunicazione che, al di là delle frontiere, diano nuove
dimensioni al nostro pianeta.

Sorgente Ricevente

Un sistema di comunicazione può essere schematizzato a grandi linee con


trasmettitori di informazioni e ricettori potenziali collegati tra loro attraver-
so canali di comunicazione. I terminali sono dotati di componenti comuni,
che si occupano di ottenere l’informazione, elaborarla ed infine trasmetterla.
Il trasmettitore è un circuito che si occupa di trasferire l’informazione (sia
essa vocale o di altro genere) al canale di telecomunicazione. Il compito del
trasmettitore di cui mi occuperò in questo lavoro di tesi può essere diviso in
tre passi principali:

• modulazione

• mixing

• amplificazione
2.1. ANALOGICO O DIGITALE? 12

Tramite la modulazione si modificano le caratteristiche di ampiezza, fase o


frequenza di una portante, generata appositamente in funzione del segnale
che si vuole trasmettere. Tale segnale si trova inizialmente a una frequenza
inferiore rispetto alla frequenza prevista dallo standard di trasmissione (RF,
Radio Frequenza). Successivamente, tramite il mixing, si trasla il segnale
modulato sino alla frequenza definita. Infine, prima di giungere all’anten-
na, il segnale viene opportunamente amplificato per raggiungere i livelli di
potenza previsti. Obiettivo primario di questa tesi è di proporre una soluzio-
ne implementativa per la prima sezione, ovvero la modulazione, utilizzando
l’elettronica digitale.

2.1 Analogico o Digitale?

Realizzare il modulatore di segnale utilizzando circuiti analogici non è sempre


possibile o, per lo meno, potrebbe richiedere un grande sforzo di progettazio-
ne. Nel caso le operazioni di modulazione fossero particolarmente complesse
non è banale trovare una soluzione analogica, sempre che esista. Affidandosi
all’elettronica digitale, invece, il lavoro del progettista molte volte è facilitato.
A meno di esigenze particolari, infatti, deve implementare in un linguaggio
descrittivo le operazioni necessarie per ottenere il risultato, lasciando al cal-
colatore il compito di tradurre i costrutti in un circuito vero e proprio. Nel
caso di esigenze particolari, potrebbe essere costretto a progettare o migliora-
re manualmente sia il circuito che il layout finale. Un componente analogico
deve avere una risposta lineare alle sollecitazioni in ingresso, su tutta la banda
del segnale. Purtroppo più le caratteristiche dei componenti analogici sono
spinte, più il costo degli stessi aumenta. Il rovescio della medaglia è rappre-
sentato dal fatto che il circuito digitale soffre degli effetti di quantizzazione
del segnale. Diviene necessario prestare particolare attenzione alla progetta-
2.1. ANALOGICO O DIGITALE? 13

zione, per evitare di peggiorare (in termini qualitativi) il segnale elaborato


dal circuito; uno dei problemi più impegnativi da affrontare, nella progetta-
zione di circuiti digitali, pertanto, è proprio quello di valutare l’impatto degli
errori di quantizzazione e dimensionare la dinamica del circuito. In natura i
segnali sono analogici, cioè sono funzioni continue di una variabile continua
(come ad esempio la voce), e quindi possono essere classificati come tempo
continui a valore continuo. In alcune applicazioni, però, è necessario disporre
di segnali digitali, che possono essere classificati come tempo discreti a valore
discreto. Il passaggio tra mondo analogico e mondo digitale avviene attraver-
so un convertitore analogico digitale (ADC - Analog to Digital Converter)
ed implica due operazioni: una discretizzazione nel tempo (campionamento),
ed una discretizzazione in ampiezza (quantizzazione). Durante il processo
di campionamento, il segnale a tempo continuo x(t), viene convertito in se-
gnale a tempo discreto x(n), prelevando dei campioni (samples) del segnale
originario, in precisi istanti temporali, separati da un intervallo T. Il campio-
namento non comporta perdita di informazione, purché il segnale di ingresso
abbia banda finita e la frequenza di campionamento sia sufficientemente ele-
vata. Sotto queste condizioni, il processo di campionamento è reversibile, ed
il segnale analogico può essere ricostruito esattamente a partire dal segnale
campionato. Durante il processo di quantizzazione, il segnale campionato
x(n), che ha valori continui in ampiezza, viene convertito in segnale a valori
discreti xq (n), scelti tra un numero finito di valori possibili. Rappresentando
un segnale a valori continui con un numero limitato di valori, si introduce un
errore, detto errore di quantizzazione (o rumore di quantizzazione eq (n), dato
dalla differenza tra il segnale in ingresso e quello in uscita dal quantizzatore:

eq (n) = xq (n) − x(n) (2.1)

Questo errore dipende dall’accuratezza, cioè dal numero di bit del processo
di conversione A/D.
2.2. IL TRASMETTITORE LINC 14

2.2 Il trasmettitore LINC

La tesi considera una tipologia di trasmettitori chiamati LINC. Il trasmettito-


re LINC fu inventato da Cox (1959) negli anni trenta allo scopo di ottenere
modulazioni di ampiezza (AM - Amplitude Modulation) di buona qualità
tramite valvole poco lineari e dalle prestazioni non propriamente ottimali.

2.2.1 Struttura

La struttura generale del sistema è la seguente:

PA

A/D CPU MODULATORE

PA

DATI

I/O, GESTIONE TRASMISSIONE ANTENNA

Figura 2.1: Schema Funzionale - Sistema di comunicazione mobile

In ingresso si hanno due tipologie di dati: il segnale audio, che dev’essere


prima digitalizzato e altri dati, già in formato digitale. Quando dev’essere
effettuata una trasmissione, l’unità di elaborazione centrale suddivide questi
dati in spezzoni (burst); a seconda dello standard utilizzato (GSM, GSM-
EDGE, UMTS), hanno lunghezza differente. Per semplicità durante la reda-
zione della tesi non si è tenuto conto di questo fattore, ma si è supposto che
il segnale fosse continuo. Ciascuno di questi burst viene suddiviso in blocchi
da 3 bit ciascuno, chiamati simboli (symbol ).
2.2. IL TRASMETTITORE LINC 15

Definizione 2.2.1 La frequenza intersimbolica, legata al tempo che inter-


corre tra l’arrivo di un simbolo e il successivo è un parametro dettato dallo
standard di trasmissione. Essa vale 270.8 kHz e verrà indicata da ora in
avanti come fL

Il blocco di trasmissione, evidenziato in verde, è formato da due sottosezioni


differenti:

S1(t)
PA

E(t) MODULATORE cos(ωt)

PA
S2(t)

SEZ. DIGITALE SEZ. ANALOGICA

Figura 2.2: Schema Funzionale - Trasmettitore LINC

La sezione digitale elabora il segnale d’ingresso, effettuando quattro opera-


zioni:

1. Assegna ad ogni simbolo in ingresso un punto sulla mappa di modu-


lazione PSK.

2. Interpola il segnale per poterlo filtrare in modo corretto.

3. Limita la banda del segnale che verrà trasmesso, per eliminare fre-
quenze che non possono-non devono essere trasmesse.
2.2. IL TRASMETTITORE LINC 16

4. Separa il segnale in due componenti S1 (t) e S2 (t).

La parte della sezione digitale che raccoglie i simboli in ingresso, pertan-


to, lavora a frequenza pari a fL . Successivamente, con l’interpolazione, la
frequenza di elaborazione viene portata ad un valore più alto.

Definizione 2.2.2 Studi teorici eseguiti dalla dott.ssa Paola Uggetti e da


collaboratori hanno stabilito che il coefficiente di sovracampionamento adatto
al sistema è 16×. La frequenza di elaborazione del segnale interpolato è quindi
16 × 270.8 kHz = 4332.8 kHz e verrà indicata da ora in avanti con fM

É importante sottolineare che la variazione dei simboli si mantiene a


frequenza fL all’interno di tutta la sezione digitale. All’interno di essa,
però, le elaborazioni sul segnale vengono eseguite a frequenza differente (fL
e fM )

La sezione analogica, invece, effettua queste operazioni:

1. Modula i segnali S1 (t) e S2 (t) con una portante di equazione cos(ω0 t),
in modo da portarlo alla reale frequenza di trasmissione. Questa ope-
razione viene effettuata da un circuito chiamato PLL (Phase Locked
Loop). Matematicamente equivale a moltiplicare il segnale con la
sinusoide di frequenza ω0

2. Amplifica il segnale modulato per effettuare la trasmissione. Vengono


utilizzati due PA (Power Amplifiers) non lineari.

3. Ricombina il segnale modulato e lo trasmette.


2.2. IL TRASMETTITORE LINC 17

2.2.2 Teoria Matematica

Per meglio comprendere il funzionamento del trasmettitore, è opportuno esa-


minare il principio matematico su cui esso si basa. Per ipotesi suppongo di
avere a che fare con un generico segnale continuo, E(t). Questo segnale è
modulato su una generica portante descritta dall’equazione cos(ω0 t + φ(t))

Sia
S(t) = E(t)cos(ω0 t + φ(t)) con 0 < E(t) < Emax (2.2)

Questo segnale equivale, in forma esponenziale, a

S(t) = <{E(t)ejφ(t) ejω0 t } (2.3)

Allora si può dimostrare che

S1 (t) + S2 (t)
S(t) = (2.4)
2
Dove
S1 (t) = Emax ejφ(t) ejα ejω0 t S2 (t) = Emax ejφ(t) e−jα ejω0 t (2.5)

e
E(t)
α = arccos (2.6)
Emax

Questo significa che il trasmettitore LINC può produrre un segnale modulato


in ampiezza combinando l’uscita di due amplificatori pilotati tramite segnali
ad inviluppo costante modulati esclusivamente in fase.

2.2.3 Vantaggi

Il principale vantaggio del modulatore LINC è il poter trasmettere un flus-


so di dati (in rosso) utilizzando due segnali ad ampiezza costante (in blu)
2.2. IL TRASMETTITORE LINC 18

S2(t)

S(t)

S1(t)

Figura 2.3: Trasmettitore LINC - Schema fasoriale

ma a fase variabile. Ciò permette di utilizzare amplificatori di potenza non


lineari e quindi economici. Per fare questo, però bisogna investire risorse
sulla parte di sviluppo e progettazione del processore digitale di segnale. Un
altro importante vantaggio riguarda il consumo di potenza; la suddivisione
del segnale nelle due componenti di fase, infatti, non viene effettuata alla
frequenza di trasmissione del segnale (fH ), ma ad una frequenza più bassa
(fL ), quindi con un minor consumo di energia. É opportuno sottolineare che
il ricevitore dovrà possedere un circuito abbastanza complesso per ricavare
il segnale originario ma anche in questo caso la progettazione sarà facilitata
sulla parte analogica, perché non serviranno preamplificazioni linenari.
2.3. LA SEZIONE DIGITALE 19

2.3 La sezione digitale

Una decrizione particolareggiata della sezione digitale del trasmettitore LINC


è necessaria per capire le scelte intraprese nell’implementazione. É impor-
tante, inoltre, effettuare richiami teorici sui concetti chiave che regolano il
funzionamento del sistema.

PSK INTERPOLAZIONE FIR SEPARAZIONE

MODULATORE LINC

Figura 2.4: Schema Funzionale - Modulatore LINC

2.3.1 Modulazione PSK

Il segnale di ingresso è formato da flussi di dati, composti da simboli. Ogni


simbolo, formato da 3 bit, viene assegnato ad una posizione sul cerchio di
raggio unitario, utilizzando le convenzioni della modulazione M-PSK (Phase
Shift Keying) (in questo caso M = 8). É doveroso sottolineare che la succes-
sione dei numeri, a partire dallo ‘0’, è scandita da un codice di numerazione
Gray.1
1
La successione è ‘000’,’001’,’011’,’010’,’110’,’111’,’101’,’100’
2.3. LA SEZIONE DIGITALE 20

Trasmettere il simbolo 1-3-7 significa idealmente compiere il cammino trac-


ciato in figura 2.5. Nella realtà ciò significa trasmettere per ogni istante il
valore del modulo e della fase del vettore che si muove all’interno del cerchio
per passare tra tutti i punti. Siamo in ambito digitale, per cui il clock di
sistema definisce la frequenza intersimbolica, ovvero quella legata al tempo
che passa tra un simbolo e il successivo.
Mappatura M-PSK

1
3

0.8

2 1
0.6

0.4

0.2
Im

0 6 0

-0.2

-0.4

-0.6
7 4

-0.8

5
-1

-1 -0.8 -0.6 -0.4 -0.2 0 0.2 0.4 0.6 0.8 1


Re

Figura 2.5: Traiettoria 1-3-7

Nella figura 2.5 ogni punto in rosso rappresenta il momento in cui viene scan-
dito il clock del segnale d’ingresso. Al tempo zero ci troviamo al punto 1, e ci
2.3. LA SEZIONE DIGITALE 21

dirigiamo verso il 3, per trasmettere il secondo simbolo. Arrivati al simbolo


3, è necessario che la portante inverta bruscamente la fase. Questo si traduce,
nel dominio delle frequenze, in un’occupazione idealmente infinita della ban-
da del segnale trasmesso e impone la necessità di filtrare tale informazione.
In un sistema in cui il canale ha banda limitata, infatti, non ci si può per-
mettere di avere un’estensione spettrale maggiore di quanto assegnato dallo
standard, poiché si potrebbe interferire con i canali adiacenti. Il filtraggio,
limitando l’estensione spettrale del segnale, modera tali interferenze. Dotare
l’apparato ricevente di un filtro in ingresso, inoltre, attenua (o elimina) le
componenti di ‘rumore’ che stanno al di fuori della banda del segnale.

2.3.2 Interpolazione

Prima dell’operazione di filtraggio è opportuno sovracampionare il segnale,


in modo da aumentare la risoluzione in uscita, e quindi delineare un cammino
più ‘continuo’. L’interpolatore è definito come una scatola nera che raccoglie
il segnale d’ingresso ad una frequenza di valore basso e restituisce il segnale
ad una frequenza più alta; il rapporto

numero simboli in uscita


OS = numero simboli in ingresso

è detto coefficiente di sovracampionamento (oversampling ratio).

Se indichiamo con n il numero di simboli del segnale di input e con m deno-


tiamo il fattore di sovracampionamento, il segnale in output sarà costituito
da n blocchi, all’interno dei quali avremmo 1 simbolo (ossia il segnale in
ingresso) e m-1 zeri.

Esempio 2.3.1 Sia il fattore di sovracampionamento pari a 3x, sia il segnale


in input è A B C; allora il segnale di output sarà A 0 0 B 0 0 C 0 0
2.3. LA SEZIONE DIGITALE 22

Mappatura M-PSK

1.5

1
3

2 1

0.5
Im

0 6 0

-0.5
7 4

5
-1

-1.5

-1.5 -1 -0.5 0 0.5 1 1.5


Re

Figura 2.6: Traiettoria correttamente filtrata

In questa figura la traiettoria del segnale è correttamente filtrata, e nella


trasmissione non avvengono brusche variazioni di fase. Ogni punto rosso
rappresenta l’uscita della fase di filtraggio.

Bisogna porre attenzione alla classe di filtro utilizzato e alla scelta dei pa-
rametri, dato che un filtro troppo ‘aggressivo’ modificherebbe la traiettoria
del segnale, causando un overshoot: fenomeno per cui il modulo dell’invi-
luppo raggiunge valori molto maggiori di quelli ammissibili, determinando
uno spreco di potenza e/o cadendo in zone di non linearità (vedi figura 2.7).
Inoltre il filtraggio può portare a interferenza intersimbolica (InterSymbol
2.3. LA SEZIONE DIGITALE 23

Mappatura M-PSK

1.5

1
3

2 1

0.5
Im

0 6 0

-0.5
7 4

5
-1

-1.5

-1.5 -1 -0.5 0 0.5 1 1.5


Re

Figura 2.7: Traiettoria non correttamente filtrata

Interference) e causare mutua interferenza tra simboli consecutivi. Un’accu-


rata analisi del sistema è necessaria per trovare il compromesso tra potenza
dissipata e banda filtrata.

2.3.3 Il filtro FIR

Diversi studi teorici2 hanno dimostrato che il filtro indicato per questo tipo di
modulazione è un filtro FIR (Finite Impulse Response) con risposta impul-
2
Mashhour (1999),Schell (2000)
2.3. LA SEZIONE DIGITALE 24

siva di tipo Gaussiano. Un generico filtro FIR di lunghezza M con ingresso


x(n) ed uscita y(n) è descritto dalla seguente equazione alle differenze :

y(n) = b0 x(n) + b1 x(n − 1) + ... + b(m−1) x(n − M) (2.7)

dove l’insieme {b1 } costituisce l’insieme dei coefficienti del filtro.

Questa equazione suggerisce un modo possibile per la realizzazione di un


sistema di questo tipo: l’uscita non è altro che la somma degli ingressi ritar-
dati opportunamente e moltiplicati per i coefficienti bk . Si ricorda che in un
sistema FIR si ha: bk = 0 per k=0 e k=M, dove M è l’ordine del filtro. Per
implementare il sistema FIR con questa strategia, servono un numero finito
di elementi di ritardo, di moltiplicatori e di sommatori, come illustrato in
figura:

1 -1 -1 -1 -1
z z z z
Input1

K K K K K
b(1) b(2) b(3) b(4) b(5)

1
Output

Figura 2.8: Filtro FIR - Forma Canonica

É importante sottolineare che prima dell’applicazione del filtro, il segnale


modulato deve subire una pre-elaborazione secondo un preciso algoritmo, con
lo scopo di correggerne la traiettoria3 . Per effettuare le simulazioni è stato
generato un vettore di numeri casuali di simboli da trasmettere. Possono
essere 8 simboli differenti, che si muovono verso uno degli altri 8 simboli. Per
un numero molto alto di prove, quindi, questo vettore copre tutte le possibili
traiettorie di input. La figura 2.9 rappresenta queste traiettorie.
3
Schell (2000)
2.3. LA SEZIONE DIGITALE 25

1.5

0.5

−0.5

−1

−1.5
−1.5 −1 −0.5 0 0.5 1 1.5

Figura 2.9: Traiettoria originale

Si nota immediatamente che in otto casi avviene il passaggio per il punto


(0,0); Ciò rappresenta un notevole problema per l’architettura LINC, che
è basata su due segnali simmetrici, modulati in fase. Una spiegazione più
dettagliata sarà fornita più avanti, quando sarà descritta l’architettura della
seconda parte del modulatore. Per ovviare al problema, deve essere applicata
un’operazione matematica al segnale d’ingresso.

Questa operazione dev’essere:

1. Reversibile, in modo che l’unità ricevente possa ricavare il segnale


originale.

2. Ininfluente rispetto all’informazione da trasmettere, ovvero che non


cambi il significato delle informazioni da trasmettere.

3. Di facile implementazione, per non appesantire il circuito in modo


eccessivo.
2.3. LA SEZIONE DIGITALE 26

4. Funzionale, ovvero con lo scopo di impedire che il segnale percorra il


punto (0,0), per evitare che non linearità nelle regioni a bassa potenza
distorcano il segnale.

Indichiamo con cn il segnale che esce dal codificatore 8-PSK e inoltre sia

3πn
pn = e 8

avremo che sn = pn cn dove sn è il segnale risultante, sul quale verrà applicato


3πn
il filtro FIR. La funzione e 8 è periodica, con periodo n=16. In parole povere
3πn
ogni simbolo modulato in fase 8-PSK viene ulteriormente ruotato di 8
dove
n è l’indice del simbolo; questo tipo di operazione di definisce Cumulative
Phase Shifting.

1.5
5
6 4
1
C
7 3
D B
0.5 8 2

0 9 E A 1

−0.5 10 16
F H
−1 11 15
G
12 14
13
−1.5
−1.5 −1 −0.5 0 0.5 1 1.5

Figura 2.10: Esempio CPS - figura 1

Il segnale originale è correttamente assegnato a valori della modulazione 8-


psk; in particolare nel nostro caso il segnale (in rosso) passa sui simboli
F-B-E-H
2.3. LA SEZIONE DIGITALE 27

1.5
5
6 4
1
C
7 3
D B
0.5 8 2

0 9 E A 1

−0.5 10 16
F H
−1 11 15
G
12 14
13
−1.5
−1.5 −1 −0.5 0 0.5 1 1.5

Figura 2.11: Esempio CPS - figura 2

Il segnale CPSK (in blu), parte correttamente dal simbolo 11 (che coincide

con F), il primo valore cade su 6, ovvero sarebbe il simbolo 3 ruotato di 8
,

il secondo su 15 (ovvero E-9 ruotato di 8
) e il terzo simbolo su 8 (ossia H-15

ruotato di 8
) ).

L’operazione di CPS trasforma il segnale di partenza in segnale ruotato, non


passante per (0,0). Questa operazione risolve anche il problema di trasmis-
sione di due simboli uguali uno dopo l’altro. Senza CPS il sistema si sarebbe
‘fermato’ nel suo stato, con il CPS un cammino avviene in tutti i casi.

A questo punto è effettivamente possibile applicare il filtro che riduca la


banda del segnale trasmesso. I coefficienti di questo filtro sono determinati
dalla sua risposta impulsiva, la quale è definita dalla seguente equazione, il
cui valore è diverso da zero nell’intervallo − 25 T < t < 25 T e vale

5
p(t) = c0 t + T (2.8)
2
2.3. LA SEZIONE DIGITALE 28

1.5

0.5

−0.5

−1

−1.5
−1.5 −1 −0.5 0 0.5 1 1.5

Figura 2.12: Traiettoria con CPS

1
dove T = fL
ovvero il tempo di arrivo di ogni simbolo.

Si ha che

 Q
 3 f (t + iT ) per 0 ≤ t ≤ 5T
i=0
c0 (t) = (2.9)
 0 altrimenti

 Rt


 sinπ 0 g(u)du per 0 ≤ t ≤ 4T
 R t−4T
f (t) = cosπ 0 g(u)du per 4T ≤ t ≤ 8T (2.10)


0 altrimenti

1
g(t) = gGSM K (t − 2T ) (2.11)
2

1 t 1 t 1
gGSM K (t) = erfcα − − erfcα + (2.12)
2T T 2 T 2
2.3. LA SEZIONE DIGITALE 29


α = 2π(0.3)/ 2ln (2.13)

Essendo l’ordine pari a 5 e il fattore di interpolazione pari a 16, ci sono 80+1


coefficienti che moltiplicano i dati di ingresso, dopo che sono stati interpolati.
Di seguito le caratteristiche significative del filtro.

Magnitude Response (dB)


50

−50
Magnitude (dB)

−100

−150

−200

−250
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9
Normalized Frequency (×π rad/sample)

Figura 2.13: Risposta in frequenza (modulo) del filtro

Phase Response
0

−200

−400

−600
Phase (degrees)

−800

−1000

−1200

−1400
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9
Normalized Frequency (×π rad/sample)

Figura 2.14: Risposta in frequenza (fase) del filtro


2.3. LA SEZIONE DIGITALE 30

Impulse Response
1

0.9

0.8

0.7

0.6
Amplitude

0.5

0.4

0.3

0.2

0.1

0
0 10 20 30 40 50 60 70 80
Samples

Figura 2.15: Risposta impulsiva del filtro

Step Response
30

25

20
Amplitude

15

10

0
0 10 20 30 40 50 60 70 80
Samples

Figura 2.16: Risposta allo scalino del filtro


2.3. LA SEZIONE DIGITALE 31

Dopo l’applicazione del filtro, la traiettoria del segnale non è più rettilinea a
tratti ma segue un cammino meno diretto.

1.5

0.5

−0.5

−1

−1.5

−2
−2 −1.5 −1 −0.5 0 0.5 1 1.5 2

Figura 2.17: Traiettoria filtrata

2.3.4 Separazione del segnale

MODULO

CONVERSIONE NORM ARC COS


IM
DA

NUMERO COMPLESSO FASE


-
+
A
RE
MODULO E FASE
+
+

Figura 2.18: Schema Funzionale - Separazione del segnale

In entrata a questo stadio si ha un numero complesso, con la componente


reale e la componente immaginaria. Il primo blocco funzionale ne calcola
2.3. LA SEZIONE DIGITALE 32

modulo e fase. Il modulo viene normalizzato secondo un valore fisso, ricavato


dalle simulazioni e ne viene calcolato l’arcocoseno. Il risultato finale viene
sommato e sottratto al valore della fase sopra calcolato.

Osservazione 2.3.1 Dopo diverse simulazioni, si è visto che il valore mas-


simo in input è pari a circa 1.6, per cui la normalizzazione viene calcolata
su quel valore.

Bisogna trasmettere un segnale, di cui conosciamo modulo e fase (il vettore


blu). Imponiamo che il modulo dei vettori rossi sia identico, pari a uno (per
utilizzare un amplificatore non lineare) Quello che resta da calcolare è quanto
vale la fase dei due vettori rossi, ovvero quanto vale l’angolo α.

S2(t)

S(t)

S1(t)

Dato che α = arccos |ρ∗ | , dove ρ∗ è il modulo normalizzato, per ρ∗ che tende
a zero, il valore di α non può superare 90◦ .
2.4. VALUTAZIONE DEI RISULTATI 33

Se il modulo tendesse a zero, i due vettori modulati in fase (i vettori rossi)


tenderebbero ad essere paralleli. La loro ricombinazione, perciò, darebbe un
segnale nullo. Questo è uno dei motivi per cui al segnale dev’essere applicata
la rotazione cumulativa di fase prima di effettuare il filtraggio.

2.4 Valutazione dei risultati

Il progetto è stato sviluppato per lo standard GSM-EDGE, ma è stato im-


plementato considerando la possibilità di poterlo adattare ad altri standard
attualmente in vigore (GMS, UMTS). Per valutare la correttezza delle simu-
lazioni, però, è necessario affidarsi a metodi precisi e a vincoli stabiliti dallo
standard. Durante la realizzazione del lavoro di tesi ho dovuto sottostare a
due parametri che indicano quanto il modulatore effettua correttamente il
suo compito.

2.4.1 Maschera dello spettro

Lo spettro del segnale in uscita deve essere contenuto in una maschera, de-
scritta con rigore dallo standard GSM EDGE, per non interferire con altri
canali adiacenti.

La maschera, disegnata in rosso, rappresenta il limite a cui lo spettro del


segnale può arrivare. In condizioni ottimali (ovvero senza effetti di quantiz-
zazione del segnale, quindi nelle simulazioni Matlab a dinamica ‘illimitata’)
lo spettro è ben al di sotto dei valori limite (figura ??,in nero). In un si-
stema reale mantenere tale livello richiede uno sforzo non banale in termini
di tempo per lo sviluppo di una soluzione valida e di potenza dissipata per
effettuare i calcoli con una tale precisione. Per questa applicazione è più
2.4. VALUTAZIONE DEI RISULTATI 34

10
MASK
Matlab
0

−10
Spettro di potenza [dBc] − Maschera EDGE

−20

−30

−40

−50

−60

−70

−80
−8 −6 −4 −2 0 2 4 6 8
Frequenza [Hz] x 10
6

Figura 2.19: Spettro del segnale

importante minimizzare i consumi e l’area occupata, quindi mi è stato posto


l’obiettivo di rimanere 15 dB sotto la maschera. Questo valore tiene conto
anche del fatto che alla sezione digitale seguirà anche la sezione analogica,
che introdurrà ulteriori non-linearità e peggiorerà ulteriormente lo spettro.
Naturalmente l’operazione di filtraggio influisce notevolmente sullo spettro
di segnale. Senza di esso le frequenze in output si spostano ben al di fuori
della maschera.

2.4.2 EVM

Ad ogni trasmettitore progettato corrisponde un ricevitore. Anche nel caso


del LINC esiste un circuito che si occupa di ricevere il segnale ad alta fre-
quenza (fH ) e riconvertirlo in simboli. A causa della non idealità del canale
di trasmissione e degli errori introdotti nella modulazione il segnale ricevuto
2.4. VALUTAZIONE DEI RISULTATI 35

non è mai uguale al segnale trasmesso. Il ricevitore, pertanto deve avere


un margine di errore, all’interno del quale il segnale viene riconosciuto con
successo. Dopo aver ricevuto il segnale e averlo translato alla frequenza fL ,
il ricevitore vedrà delle traiettorie simili alla figura 2.9. Un filtro particolare,
con annesso un decimatore (che funziona nella maniera opposta dell’inter-
polatore) trasforma il segnale come in figura 2.12. Infine al segnale verrà
applicata l’operazione inversa alla CPS, ovvero una SPS (Subtractive Phase
Shifting) per ottenere un segnale simile a quello di figura 2.17. A questo
punto, teoricamente, la traiettoria di input (ovvero la sequenza di simboli
trasmessa) dovrebbe coincidere con la traiettoria ricevuta e filtrata, con un
margine di errore. Per quantificare questo margine dobbiamo definire una
grandezza conosciuta come EVM (Error Vector Magnitude). Il vettore er-
rore (error vector) (in rosso) è la differenza vettoriale tra il valore ideale e
quello effettivamente trasmesso del segnale. L’EVM è dato dal valor medio
del modulo (in blu) di tale vettore. Nella realizzazione del progetto l’errore
massimo ammesso per la parte digitale è pari al 5 %.

error vector magnitude


segnale ideale error vector

segnale trasmesso

Figura 2.20: Misura dell’EVM


Capitolo

Implementazione Matlab 3
Per lo studio teorico del circuito digitale è stato utilizzato l’ambiente di si-
mulazione Matlab-Simulink. Attraverso un semplice linguaggio di scripting,
progettato per il calcolo scientifico, è stato possibile ottenere da subito dei ri-
sultati concreti, senza doversi preoccupare delle funzioni di base (es. gestione
delle matrici, calcolo numerico approssimato, ecc)

36
3.1. LO SCHEMA SIMULINK 37

3.1 Lo schema Simulink

Grazie al lavoro svolto dalla Dott.ssa Uggetti, buona parte della modelliz-
zazione del progetto era già pronta. Come prima cosa, ho investito un pò
di tempo nel comprenderne il funzionamento e ho riorganizzato la struttura
secondo lo stile adottato nel resto del progetto.

O_SEP1 I_AN1
Integer to Bit
Random I_PSK O_FIR I_SEP O_ANT output
Converter
Integer O_SEP2 I_AN2
Signal To
Psk, Interpolazione, Separazione del Trasmissione Workspace
FIR Segnale

Figura 3.1: Trasmettitore LINC - Modello Simulink - Generale

Lo schema è molto simile alla figura 2.4, per semplicità sono state raggruppate
alcune sezioni. Per simulare il flusso di dati GSM-EDGE si è utilizzato un
blocco che genera interi casuali da 0 a 7, convertiti poi in numeri binari.

1 M-PSK
x[n/16] 1
I_PSK
O_FIR
Product
FIR
Interpolation
exp(jx)

Ramp Zero-Order
Hold

Figura 3.2: Trasmettitore LINC - Modello Simulink - Sezione 1

La prima parte effettua la rotazione del segnale e il risultato viene immesso


in un blocco Simulink con interpolatore e filtro integrati. La rotazione viene
implementata mediante la moltiplicazione del segnale in input con un valore
che varia nel tempo. Il blocco ‘Ramp’ genera un segnale di tipo ‘rampa’ con
3.1. LO SCHEMA SIMULINK 38

3πn
pendenza pari a 8
; il mantenitore di ordine zero (‘Zero-Order Hold’) cam-
piona il segnale, sincronizzandolo al tempo di simbolo. L’esponenziale calcola
il valore dell’espressione l(z) = eik(z) dove k(z) è l’output del mantenitore e

i = −1; utilizzo z come variabile perchè il sistema è a tempo discreto. Si
nota che ogni sedici iterazioni la successione si ripete. Questo coefficiente
(che mantiene una sorta di informazione di stato) viene moltiplicato con il
simbolo di ingresso, modulato con la codifica gray-PSK e il risultato viene
passato al blocco di interpolazione-filtraggio.

Osservazione 3.1.1 La funzione che regola l’ingresso del sistema ha due


variabili: il simbolo, ovvero una variabile indipendente dallo stato attuale
del sistema e il coefficiente di rotazione, che è una variabile di stato (imple-
mentata in simulink con una rampa). In un circuto hardware una soluzione
implementativa potrebbe essere l’utilizzo di un contatore.

Sul blocco filtro-interpolatore non c’è nulla di particolare da sottolineare. Ma-


tlab prende come parametri i coefficienti del filtro da applicare e il coefficiente
di sovracampionamento ed elabora automaticamente il risultato.

acos

Divide Trigonometric
Function
1.6

Constant

1
O_SEP1

|u|
1 u 2
I_SEP
Complex to O_SEP2
Magnitude-Angle

Figura 3.3: Trasmettitore LINC - Modello Simulink - Sezione 2


3.2. EFFETTI DI QUANTIZZAZIONE 39

La sezione di separazone del segnale è realizzata con due blocchi principali,


che effettuano la conversione da coordinate cartesiane a coordinate polari, e il
calcolo dell’arcocoseno. Gli operatori di somma e moltiplicazione provvedono
a normalizzare il modulo e addizionare-sottrarre la fase.

1.6

Constant2

1 exp(jx)
I_AN1 Product1
UnwrapA

1
O_ANT
2 exp(jx) Divide1
I_AN2 Product
UnwrapB

Constant1

Figura 3.4: Trasmettitore LINC - Modello Simulink - Sezione 3

L’ultimo blocco dello schema provvede a simulare il comportamento della se-


zione analogica, già realizzata da un altro team di sviluppo. Il segnale, dopo
essere stato modulato e amplificato, viene ricombinato e trasmesso all’an-
tenna; naturalmente non verrà presa in considerazione nell’implementazione
VHDL)

3.2 Effetti di quantizzazione

Matlab effettua tutti i suoi calcoli utilizzando tipi di dati ad alta precisione
(a seconda del processore utilizzato) in virgola mobile. Implementare quel
genere di operazioni su un circuito hardware richiede un notevole sforzo di
progettazione ma soprattutto un notevole dispendio in termini di area del
3.3. RISULTATI 40

circuito e di potenza dissipata. Si è pertanto deciso di studiare a fondo il


problema della quantizzazione del segnale, ponendo un valore limite al nu-
mero di bit utilizzati per l’implementazione in VHDL delle varie operazioni.
Naturalmente questo valore non è fisso per tutto il percorso del segnale, ma
varia in funzione delle esigenze di precisione. Durante lo sviluppo del proget-
to ho dovuto valutare l’impatto sul risultato finale, in termini di spettro e di
EVM, dei cambiamenti alla risoluzione di ognuno di questi parametri. Natu-
ralmente non si poteva procedere effettuando le prove di quantizzazione su
una sezione sola, sperando che gli effetti si sommassero in maniera lineare, ma
per studiare la quantizzazione si è dovuto prendere in considerazione l’intero
sistema, effettuare parecchie prove e valutare i risultati. Questo può essere
schematizzato come un problema di ottimizzazione: abbiamo n variabili da
minimizzare, ovvero l’errore di quantizzazione, il costo in termini di area e la
potenza dissipata. La prima la possiamo valutare immediatamente, perché
abbiamo gli strumenti offerti da Matlab, per le altre possiamo affidarci alla
sintesi, che fornisce un’idea approssimata di questi parametri. Si tratta di
un processo di tipo ‘trial and error’ condotto con buon senso e accortezza;
essenzialmente si eseguono modifiche sul progetto, si valutano i risultati e
si ricomincia a provare. Fortunatamente non è necessario riprogettare tutto,
Matlab offre strumenti validi che, cambiando pochi parametri, permettono di
visualizzare il nuovo risultato; lo strumento principale per lo studio di segnali
quantizzati è il Fixed Point Toolbox. Ulteriori indicazioni sull’uso di questo
toolbox sono contenute nell’appendice A.

3.3 Risultati

Sono stati svolti svariati esperimenti in ambiente Matlab, per comprendere


il funzionamento del sistema e per capire quali potessero essere i parametri
ottimali da inserire nel prototipo finale. Di seguito i risultati più rilevanti.
3.3. RISULTATI 41

3.3.1 Quantizzazione FIR

Come primo esperimento ho quantizzato a dinamica differente l’output che


proveniva dal filtro FIR, e ho visualizzato il risultato ottenuto. Il segnale
originale, calcolato da MATLAB a precisione macchina compie un cammino
continuo su tutti i punti (figura 3.5). Quantizzando fino a 12 bit la differenza
tra il segnale originale e quello quantizzato si attesta in media a valori minori
di 10−4(figura 3.6). Nella figura 3.7 il segnale è stato quantizzato a 8 bit; si
nota che esso percorre una griglia, saltando i valori intermedi e introducendo
elevato rumore di quantizzazione.

1.5

1.4

1.3

1.2

1.1

0.9

0.8
−1.3 −1.2 −1.1 −1 −0.9 −0.8 −0.7 −0.6 −0.5 −0.4 −0.3

Figura 3.5: Output del FIR senza quantizzazione

In termini di spettro (figura 3.8)possiamo notare che a 10 e a 12 bit il segnale è


ancora correttamente contenuto nella maschera di trasmissione. Utilizzando
8 bit, però, il segnale fuoriesce dalla maschera e crea interferenza con gli altri
canali di comunicazione.

Come si può notare, 8 bit non sono sufficienti per immagazzinare tutte le
informazioni. 10 e 12 bit potrebbero andare bene, ma si sta valutando una
3.3. RISULTATI 42

1.5

1.4

1.3

1.2

1.1

0.9

0.8
−1.3 −1.2 −1.1 −1 −0.9 −0.8 −0.7 −0.6 −0.5 −0.4 −0.3

Figura 3.6: Output del FIR con quantizzazione a 12 bit

1.5

1.4

1.3

1.2

1.1

0.9

0.8
−1.3 −1.2 −1.1 −1 −0.9 −0.8 −0.7 −0.6 −0.5 −0.4 −0.3

Figura 3.7: Output del FIR con quantizzazione a 8 bit

situazione non reale. Quello che è stato quantizzato non è il segnale in


tutti i punti del processo, ma solamente il risultato finale. D’altronde ciò ci
permette di delineare un limite, al di sotto del quale non è possibile ridurre
la dinamica. In relazione alla prima parte (modulazione PSK e filtraggio) gli
3.3. RISULTATI 43

10
MASK
matlab
0 matlab 12 bit
matlab 8 bit

−10

Spettro di potenza [dBc] − Maschera EDGE


−20

−30

−40

−50

−60

−70

−80

−90
−8 −6 −4 −2 0 2 4 6 8
Frequenza [Hz] x 10
6

Figura 3.8: Spettro del segnale - Confronto tra differenti quantizzazioni

Quantizzazione (bit) EVM


nessuna 1.2689
12 1.5613
10 2.0305
8 6.1739

Tabella 3.1: Valori dell’EVM in funzione al numero di bit utilizzati

elementi che devono essere quantizzati sono:

• il valore iniziale della corrispondenza simbolo-posizione PSK; su questo


valore verranno effettuati tutti i calcoli.

• il valore dei coefficienti del filtro FIR; questi coefficienti dovranno essere
moltiplicati per i dati di ingresso

• la capacità (in termini di dinamica) delle unità di moltiplicazione dei


coefficienti.

• la capacità (in termini di dinamica) dell’unità di addizione dei prodotti.


3.3. RISULTATI 44

Per quanto riguarda la struttura interna del FIR, ho notato che dando un va-
lore basso alla dinamica dei moltiplicatori (16-18 bit) comparivano in output
alcuni ‘artefatti’.

MASK
matlab
−70 matlab16−16

−75
Spettro di potenza [dBc] − Maschera EDGE

−80

−85

−90

−95

−5 0 5 10 15 20 25
Frequenza [Hz] x 10
5

Figura 3.9: Spettro del segnale - Artefatti di quantizzazione

Il fenomeno è causato dagli errori di arrotondamento nella moltiplicazione.


Se, per esempio volessimo moltiplicare due numeri, codificati con 16 bit di
dinamica ciascuno, il numero ideale di bit per contenere il risultato è 32. Un
numero inferiore provoca questo genere di artefatti. Per effettuare queste
prove sulla dinamica del segnale, è stato sufficiente inserire un blocco di tipo
‘data conversion’ appena prima del blocco ‘FIR / interpolation’. Simulink
supporta, per quel blocco, l’elaborazione di oggetti ‘fi’. É inoltre possibile
con facilità specificare all’interno del blocco come comportarsi con i parametri
relativi alla quantizzazione (ad esempio dinamica dei coefficienti, saturazione
o troncamento in caso di overflow, ecc). Diverse simulazioni hanno portato
a determinare che un giusto compromesso tra prestazioni e precisione della
dinamica si ottiene effettuando l’elaborazione a 13 bit.
3.3. RISULTATI 45

3.3.2 Quantizzazione Separazione

Lo studio degli effetti di quantizzazione sulla sezione di separazione del segna-


le si è rivelato molto più complesso del previsto. Sono presenti due operazioni
non banali, ovvero calcolo di modulo e fase di un numero complesso e calcolo
dell’arcocoseno di un numero. Queste due operazioni non sono direttamente
implementabili in hardware (come la somma o la moltiplicazione) ma possono
essere implementate in maniera differente.

A questo punto si sono presentate due possibilità:

1. Effettuare i calcoli utilizzando i blocchi Matlab già esistenti, per poi


quantizzare il risultato appena fosse possibile. É un’ipotesi abbastanza
plausibile, non porterebbe al medesimo risultato dell’implementazione
VHDL, ma servirebbe come punto di partenza per decidere i parametri
di quantizzazione.

2. Decidere come realizzare in hardware tali operazioni, e implementarle


sia in Matlab che in VHDL. É una soluzione più azzardata, e sicu-
ramente più dispendiosa in termini di tempo, ma che rende possibile
ottenere un risultato VHDL che coincide con le simulazioni Matlab.

I vantaggi di utilizzare Matlab per tutte le simulazioni sono i seguenti:

1. Portabilità: il team di sviluppo della sezione analogica ha progettato


il sistema utilizzando Matlab e programmi di simulazione circuitale; al
momento attuale non è prevista un’integrazione con modelli VHDL.
Per ovviare al problema, però, si possono elaborare i dati in VHDL e
convertirli in un formato comprensibile a Matlab, stratagemma che ho
effettivamente utilizzato per valutare le prestazioni.
3.3. RISULTATI 46

2. Facilità di manutenzione: quella proposta in questa tesi è una so-


luzione ad uno specifico problema, con dei vincoli molto stringenti (in
particolare è una soluzione per lo standard GSM-EDGE). Dev’essere
possibile in ogni momento adattare la soluzione ad un altro sistema
oppure modificare facilmente (senza riprogettare il tutto) il trade-off
‘prestazioni’ (ovvero quanto lo spettro è sotto la maschera) e ‘costi’
(ovvero area occupata - potenza dissipata). Fortunatamente, per co-
me è stato implementato il codice VHDL, è possibile, tramite semplici
parametri, aumentare o diminuire la dinamica di ciascun punto del
sistema.

Dopo attente valutazioni ho deciso dei scegliere la prima strada, investendo


più tempo sul codice VHDL, dato che come obiettivo primario era produrre
un risultato concreto. Varie simulazioni effettuati mi hanno portato a stabi-
lire a 15 bit il valore finale di uscita della sezione digitale. Per un’accurata
descrizione della dinamica scelta per ogni singolo componente del sistema
rimando alla sezione di implementazione VHDL.

3.3.3 Il filtro FIR

La figura 3.10 mette a confronto il segnale d’ingresso (colore blu e nero),



dopo che è stata effettuata la rotazione di 8
e il segnale filtrato, (in colore
rosso e verde), in un istante non determinato della simulazione. Il segnale
filtrato possiede una risoluzione maggiore, dato che è stato effettuato il so-
vracampionamento a 16x. Si parte dal punto ‘A’ per entrambi i segnali e
si prosegue il cammino. I cambiamenti di colore sono in corrispondenza del
simbolo trasmesso. Si può notare che il segnale filtrato segue abbastanza
fedelmente l’originale, con le dovute eccezioni. Per esempio, al punto ‘B’ la
potenza del segnale è relativamente più bassa, mentre tra il ‘C’ e il ‘D’ c’è
un leggero overshoot. Le circonferenze concentriche rappresentano il valore
3.3. RISULTATI 47

minimo e il valore massimo della potenza trasmessa, che in questo caso varia
da 1.3 a 0.5; nel complesso è compreso ta 0.2 e 1.6.

1.5

F
1 A

0.5
C E

−0.5

D B
−1

−1.5
−1.5 −1 −0.5 0 0.5 1 1.5

Figura 3.10: Confronto fra segnale trasmesso e segnale filtrato - figura 1

La figura 3.11, invece, mette in evidenza le distanze simbolo reale-ideale at-


traverso delle circonferenze. Una modulazione accurata tende a minimizzare
questa distanza, permettendo al ricevitore di interpretare il segnale.

1.5

F
1 A

0.5
C E

−0.5

A
D B

−1

−1.5
−1.5 −1 −0.5 0 0.5 1 1.5

Figura 3.11: Confronto fra segnale trasmesso e segnale filtrato - figura 2


Capitolo

Implementazione VHDL 4
Il passo finale del lavoro è l’implementazione delle funzionalità del modula-
tore LINC in un Hardware Description Language (linguaggio di descrizione
dell’hardware) in modo da poter sintetizzare con semplicità il modulatore
in un circuito reale. É stato scelto il VHDL come linguaggio, per la sua
semplicità d’uso, l’elevata standardizzazione e il notevole supporto tecnico
disponibile in rete e all’interno dell’università.

48
49

TOP

SEPARAZION
FIR
E

PSK CORDIC

COR_N (16)
FPFF (4)

FPFF(4)
MOLTIPL(5)

ADDER
ARCOSENO

COEFF
ADDERMOD1

ADDERMOD2

COEFF

Figura 4.1: VHDL - Struttura gerarchica

Nella figura 4.1 è rappresentato lo schema gerarchico che descrive la struttura


dell’implementazione VHDL del progetto. Lo sviluppo è avvenuto secondo
la metodologia ‘bottom-up’. Partendo dalle fondamenta, ho costruito un
sistema correttamente funzionante, affiancato dalle unità di test-bench.
4.1. NOTE IMPLEMENTATIVE 50

4.1 Note Implementative

Il linguaggio VHDL è un linguaggio che permette di descrivere le funziona-


lità dei circuiti elettronici con un livello di astrazione più alto delle singole
porte logiche. Il VHDL sta diventando rapidamente il mezzo più diffuso per
la progettazione di circuiti integrati digitali. Le aziende che progettano e
sviluppano ambienti integrati di CAD elettronico stanno utilizzando VHDL
come standard di input e output dei lori prodotti. Fra questi si trovano in
commercio programmi di simulazione e di sintesi, che generano gli schemi
circuitali a partire dal codice VHDL, programmi che generano codice VHDL
a partire dallo schema elettrico e programmi che convertono un sottoinsieme
del VHDL in altri linguaggi descrittivi dell’hardware e viceversa. La descri-
zione VHDL di un circuito può avere diversi livelli di astrazione : il livello più
alto (quello più lontano dall’hardware) contiene una sommaria descrizione sul
comportamento dell’intera rete, un livello intermedio descrive la suddivisio-
ne del circuito nei vari sottoblocchi ed il funzionamento di ciascuno di questi
mentre il livello di astrazione più basso, quello più vicino all’hardware, è
la descrizione del circuito a livello delle porte logiche. Il grande vantaggio
di questo approccio risiede nel fatto che ogni descrizione VHDL a qualsiasi
livello può essere simulata funzionalmente e può essere eventualmente conver-
tita in uno schema elettrico tramite sintesi. Nella progettazione del sistema
ho utilizzato un insieme ridotto delle istruzioni VHDL per realizzare codice
adatto alla sintesi. In particolare ho utilizzato una struttura del tipo RTL
(Register Transfer Language). Si basa sul concetto che qualsiasi rete sequen-
ziale può essere descritta da una logica combinatoria ed un registro ad essa
associata (eventualmente la struttura deve essere retroazionata). Si descrive
il sistema come un flusso di dati tra registri. Si può immaginare che il flusso
di dati venga elaborato nel sistema (una volta realizzato in modo hardware)
4.2. LA LIBRERIA FIX-STD 51

dalla logica combinatoria. Il mio progetto è sviluppato secondo una variante


della logica RTL, in particolare, tutte le unità che compongono il sistema si
comportano come registri , ovvero:

• Sono sincronizzate da un clock.

• Ad esse è associato un segnale di reset

• La logica combinatoria compare all’interno, attraverso una descrizione


comportamentale.

Nella scrittura del codice ho anche seguito le seguenti specifiche:

• Le strutture di controllo sono semplici (IF-THEN-ELSE, CASE)

• Non vi sono iterazioni (FOR, WHILE)

• Le variabili utilizzate hanno ampiezza fissa (ma parametrica, inserita


in un package per mantenere la modularità del progetto)

• Non vengono assegnati esplicitamente dei ritardi ai segnali

• I costrutti di tipo CASE vengono completamente definiti.

• I processi vengono attivati al fronte di salita del clock.

4.2 La libreria FIX-STD

Nello sviluppo del progetto è stata utilizzata una libreria, dedicata alla gestio-
ne delle variabili di tipo fixed point. Questa libreria contiene macroistruzioni
4.2. LA LIBRERIA FIX-STD 52

che facilitano la conversione da formati standard IEEE con differenti preci-


sioni, garantendo la possibilità di una successiva sintesi. Nella scrittura del
codice ho definito una convenzione per descrivere le variabili utilizzate. Ad
esempio:

FP S 3 14 è definito come un numero di tipo floating point con segno (S), 3


bit prima della virgola e 14 bit dopo. In definitiva si tratta di un standard
logic vector a 14+3+1 = 18 bit.

La libreria è solo una ‘maschera’, per gestire con più semplicità le operazioni
in virgola mobile e renderle trasparenti al programmatore. Per il compila-
tore e (successivamente) per il sintetizzatore non crea problemi, dato che si
appoggia alle librerie standard IEEE.

All’interno del codice vengono spesso utilizzate le istruzioni ‘Copy S’ e ‘Co-


py V’. La sintassi è nella forma

Copy_[S|V] ( destinazione , sorgente )

Ciò permette di assegnare al valore di ‘destinazione’ il contenuto di ‘sorgente’.


‘S’ oppure ‘V’ devono essere indicate, per specificare se ‘destinazione’ è di
tipo ‘signal’ oppure di tipo ‘variable’. A differenza dell’assegnazione standard
( utilizzando rispettivamente gli operatori ‘<=’ e ‘:=’) l’istruzione effettua
automaticamente la conversione dei tipi di dati.

Ulteriori informazioni su questo pacchetto si trovano sul sito dell’autore,


Jonathan Bromley, che lo ha reso disponibile gratuitamente. L’indirizzo è

http://www.geocities.com/bromley_jonathan/fix_std_02.zip
4.3. DESCRIZIONE GENERALE 53

4.3 Descrizione generale

L’implementazione VHDL può essere suddivisa in due macroblocchi, rappre-


sentati dalla sezione di filtraggio/interpolazione e dalla sezione di separazione.
L’ingresso del circuito è rappresentato da un segnale a 3 bit, che viene letto da
un file di testo all’interno del blocco ‘input’. Per valutare i risultati ho dovuto
salvare l’output della sezione di separazione in un altro file di testo, per poi
elaborarlo con Matlab. Questo avviene nell’unità ‘output’. I restanti blocchi
sono flip-flop di servizio, servono per propagare il segnale di attivazione della
scrittura su file (solo quando esistono dati da immagazzinare).

clk
clk_cordic
clk_diviso
reset

U2 U1 U4 U10
clk_cordic
reset

clkd

clk

reset
Clk

Clk
clk

R_output fir_R_out Mod_A R_ris


Symbol(2:0) sym(2:0)
I_output fir_I_out Mod_B I_ris
Write

Wr

input fir separatore output


U5 U6 U7 U8 U9
S_in S_out S_in S_out S_in S_out S_in S_out S_in S_out
Reset

Reset

Reset

Reset

Reset
Clk

Clk

Clk

Clk

Clk

ff ff ff ff ff

Figura 4.2: VHDL - Data Flow - Entity TOP.VHD


4.4. IL FILTRO FIR 54

L’entità ‘top’ è necessaria per simulare l’ambiente nel quale il vero e proprio
circuito lavorerà. Per il funzionamente del sistema sono necessari tre segnali
di clock.

1. clk diviso lavora alla frequenza fL , ovvero alla frequenza di arrivo di


ogni simbolo. Viene utilizzato solo nella prima sezione.

2. clk lavora alla frequenza fM , ovvero 16 volte fL ; è la frequenza di


lavoro della maggioranza delle unità presenti del sistema ed è anche
la frequenza a cui viene aggiornato il segnale in output dalla sezione
‘separazione’.

3. clk CORDIC lavora alla frequenza fC , che equivale a fM x8. Viene


utilizzato solo nella seconda parte, ed è necessario all’unità di conver-
sione da notazione cartesiana a notazione polare. Una trattazione più
approfondita di questa unità sarà svolta più avanti.

Al di sopra di questo schema lavora il file di testbench, che fornisce le indi-


cazioni al simulatore su quali segnali assegnare ai vari terminali in input (in
pratica si occupa di effettuare le oscillazioni dei clock per il tempo necessario
e di assegnare il valore di reset all’inizio della simulazione).

4.4 Il filtro FIR

Il filtro FIR in una forma canonica richiede un numero di moltiplicatori pa-


ri all’ordine del filtro stesso. In presenza di un interpolatore, però, l’ordine
del filtro deve essere moltiplicato per il fattore di interpolazione. Nel no-
stro caso il FIR Gaussiano è di ordine 5, mentre il fattore di oversampling
4.4. IL FILTRO FIR
reset
Figura 4.3: VHDL - Data Flow - Entity FIR.VHD
clk_div U4 U1 U2 U3 U6

clk
Reset

Reset

Reset

Reset

Reset
Clk

Clk

Clk

Clk
R_out R_in R_out R_in R_out R_in R_out R_in R_out
sym(2:0) Symbol(2:0)
I_out I_in I_out I_in I_out I_in I_out I_in I_out
psk
fpff fpff fpff fpff

clk

U8 Reset

U9

Reset
R_in

clk
I_in
c0 coeff_in

R_out
I_out
clk
U10
moltip

Reset
R_in

clk
I_in
c1 coeff_in

R_out
I_out
U11
moltip

Reset
R_in
I_in

clk
coeff_in

R_out
c2

I_out
moltip U12

Reset
R_in

clk
I_in
c3 coeff_in

R_out
I_out
U13
moltip

Reset
R_in
I_in

clk
c4 coeff_in

R_out
I_out
moltip
coeff
U14

Reset
R_M0
I_M0

R_M1
I_M1

R_M2
I_M2

R_M3
I_M3

R_M4
I_M4
clk
R_Ris R_output
I_Ris I_output
adder

55
4.4. IL FILTRO FIR 56

è pari a 16; Ad ogni ciclo di clock a frequenza fL il filtro avrebbe effettuato


(5*16)=80+11 moltiplicazioni di cui 5 con valori diversi da zero e i restanti
con valori nulli2 . Implementare uno schema canonico avrebbe richiesto un
enorme dispendio in termini di area occupata e potenza dissipata per effet-
tuare il più delle volte operazioni a vuoto. Si è deciso quindi di ottimizzare la
struttura del filtro, minimizzano il numero di moltiplicatori necessari. Sono
state studiate diverse possibilità, tutte quante scartate perché richiedevano
molte più risorse di quelle effettivamente utilizzate per cui ho sviluppato una
soluzione ‘ad hoc’. Il punto chiave di questa struttura è che richiede solo
cinque moltiplicatori. Nelle soluzioni standard i coefficienti rimangono fissi,
all’interno di ogni registro moltiplicatore e sono sintetizzati solitamente con
operazioni di shift e addizione. Nel mio caso, invece, sia i dati in ingresso,
sia i coefficienti, ruotano ad ogni ciclo di clock, per sfruttare al massimo l’a-
rea disponibile. Le celle superiori contengono il dato in input; esse vengono
aggiornate a frequenza fL . La prima unità (PSK) si occupa di convertire il
dato (da vettore 3 bit standard logic a vettore 15 bit standard logic, secondo
le convenzioni della modulazione PSK). Ad ogni ciclo di clock il dato viene
spostato nella cella successiva, in modo che i moltiplicatori possano leggerlo
correttamente; quando raggiunge la quinta cella il dato viene perso definiti-
vamente. L’unità sulla sinistra è la cella dei coefficienti. É un contatore, che
lavora a clock a frequenza fM . Ad ogni impulso emette in output i valori
dei coefficienti dello stato attuale. Le cinque unità centrali si occupano di
moltiplicare i dati in input per i coefficienti attuali; infine l’unità in basso
addiziona il risultato e lo manda alla seconda parte del sistema.

Per chiarire meglio le idee è opportuno fare un esempio pratico.


1
ad un filtro FIR di ordine n sono associati n+1 coefficienti e quindi n+1 moltiplicatori
2
É opportuno ricordare che interpolare un segnale significa interporre tra i vari simboli
dei valori nulli.
4.4. IL FILTRO FIR 57

Sia dato il segnale d’ingresso

QPONMLIHGFEDCBA

Ovvero il primo simbolo è A, il secondo è B, eccetera; Bisogna interpolare


questo segnale; per semplicità pongo fattore di sovracampionamento 3x. A
regime, il segnale di ingresso sarà

.... H 0 0 G 0 0 F 0 0 E 0 0 D 0 0 C 0 0 B 0 0 A

Questo entrerà in un filtro FIR di ordine 5*Os =15 quindi avrà 16 coefficienti,
che dovranno essere moltiplicati con il segnale di ingresso.

C1 C2 C3 C4 C5 C6 C7 C8 C9 C10 C11 C12 C13 C14 C15 C16


0 0 E 0 0 D 0 0 C 0 0 B 0 0 A -

Fortunatamente non è necessario fare tutte le moltiplicazioni ma solo 5 ,


perche il resto dei dati in ingresso è pari a zero.

E*C3 + D*C6 + C*C9 + B*C12 + A*C15

I successivi cicli:

C1 C2 C3 C4 C5 C6 C7 C8 C9 C10 C11 C12 C13 C14 C15 C16


F 0 0 E 0 0 D 0 0 C 0 0 B 0 0 A
C1 C2 C3 C4 C5 C6 C7 C8 C9 C10 C11 C12 C13 C14 C15 C16
0 F 0 0 E 0 0 D 0 0 C 0 0 B 0 0
C1 C2 C3 C4 C5 C6 C7 C8 C9 C10 C11 C12 C13 C14 C15 C16
0 0 F 0 0 E 0 0 D 0 0 C 0 0 B 0

e cosi via...
4.4. IL FILTRO FIR 58

Come si può notare è possibile mettere in un cella di memoria i dati (ad esem-
pio F) e moltiplicarli consecutivamente per il C1, C2, C3, ad ogni periodo del
clock ad alta frequenza. All’arrivo del nuovo dato, (clock lento) il simbolo F
verrà spostato nella seconda cella di memoria, per esser poi moltiplicato per
i coefficienti C4, C5, C6.

Il filtro che verrà applicato è un FIR di tipo Gaussiano. I coefficienti C1 e


C16 tendono a zero; oltretutto, a causa di effetti di quantizzazione, nell’im-
plementazione pratica VHDL sono effettivamente pari a zero. Per come è
strutturato il FIR, il coefficiente 16 sarebbe utilizzato solo una volta su 5.
Per entrambi i motivi e per semplificare il sistema, si è deciso di non imple-
mentare un ulteriore moltiplicatore, e, a sua volta, un operatore di addizione
in più.

4.4.1 Specifiche di quantizzazione

Di seguito le specifiche di quantizzazione per la sezione di filtro, proposte


dopo svariate simulazioni come un buon ‘trade-off’ tra prestazioni e potenza
dissipata.

• Dinamica del valore iniziale della corrispondenza simbolo-posizione PSK:


16 bit.

• Dinamica dei coefficienti del filtro FIR: 15 bit.

• Dinamica delle unità di moltiplicazione: 22 bit.

• Dinamica dell’unità di addizione (e dell’output della sezione FIR): 16


bit.
4.5. IL SEPARATORE 59

4.5 Il Separatore

reset
clk

U1 U4

clk
Clk_slow

Reset

Reset
U2

fir_R_out R_in Modulo prodotto acos Reset Ris Mod_A


fir_I_out I_in clk

cos
arcoseno
clk_cordic Clk Fase fase

cordic addermod1
U3

Reset Ris Mod_B


clk

cos

fase

addermod2

Figura 4.4: VHDL - Data Flow - Entity SEPARATORE.VHD

La seconda parte del circuito si occupa di modulare il segnale in uscita dal


FIR, come previsto dal modello Simulink. Il FIR restituisce un flusso di sim-
boli che rappresentano numeri complessi, ovvero i dati che dovranno essere
trasmessi. La prima sottounità del modulatore ha il compito di calcola-
re modulo e fase dei dati in ingresso e di trasmetterli ai successivi blocchi
funzionali. Calcolare il modulo e fase di un numero complesso utilizzando
linguaggi di programmazione ad alto livello è molto semplice, implementare
il calcolo su un dispositivo hardware, invece, si è rivelata un’impresa non
banale. Tra le tante possibilità, esistono due metodi relativamente semplici
da implementare:
4.5. IL SEPARATORE 60

• Un algoritmo iterativo, che, a passi successivi approssima la


soluzione cercata. Questa soluzione richiede maggior tempo di svi-
luppo, sempre che esista l’algoritmo adatto, e, probabilmente, se cor-
rettamente implementata, una minore occupazione d’area sul circuito
integrato. Si suppone che l’algoritmo richieda più di un’iterazione per
essere completato con successo, quindi il circuito deve funzionare ad
una frequenza di clock maggiore rispetto al sistema.

• Una tabella precalcolata (look-up table) che, in funzione del-


l’ingresso, restituisce il valore di modulo e fase. Il tempo di
sviluppo di questa soluzione è praticamente nullo. Attraverso una pro-
cedura Matlab (o altri linguaggi) si crea il file VHDL che descrive
il comportamento desiderato dell’unità. L’occupazione su silicio può
diventare notevole.

Dalle specifiche del filtro FIR si evidenzia che il segnale in uscita ha una
dinamica pari a 16 bit per la parte reale e 16 bit per la parte immaginaria.
Il risultato (modulo e fase), secondo le simulazioni Matalb, deve avere dina-
mica pari a 13 bit e a 15 bit rispettivamente. E’ possibile tramite semplici
calcoli verificare che lo spazio occupato dalla loookup table è enorme e quin-
di, per il calcolo del modulo e della fase, questa soluzione è stata scartata
a priori. Dopo ricerche su internet e studio di articoli scientifici ho scelto
di utilizzare l’algoritmo di CORDIC per effettuare i calcoli. Per i principi
teorici sull’algoritmo CORDIC si rimanda all’appendice B. Per il blocco ‘ar-
cocoseno’, invece, ho deciso di utilizzare una look-up table. Grazie ad alcune
simulazioni ho notato che il metodo CORDIC avrebbe richiesto molto più
delle otto iterazioni concesse3 , ed, allo stesso tempo, il numero di possibili
input era limitato (ricordiamo che il modulo è un valore compreso tra 0.2 e
1.6). La tabella è stata costruita con uno script Matlab, che genera il codice
3
Il metodo CORDIC per calcolare l’arcocoseno si basa sull’approssimazione di Taylor
della funzione, pertanto introduce ulteriori errori di approssimazione
4.5. IL SEPARATORE 61

VHDL; dalla teoria sappiamo che il modulo calcolato da CORDIC è 1.6467


* il modulo reale del vettore; inoltre il modulo deve essere normalizzato con
un’operazione di moltiplicazione. Queste due operazioni sono state ‘incluse’
all’interno della lookup-table, in modo da risparmiare lo spazio dedicato ad
un moltiplicatore. I blocchi ‘addermod1’ e ‘addermod2’, infine sono semplici
addizionatori che sommano (o sottraggono) il risultato dell’arcocoseno dal
valore della fase, secondo quanto specificato dallo schema del modulatore
LINC.

Prima di descrivere il funzionamento del blocco ‘CORDIC’, è opportuno fare


una precisazione: quell’unità trasmette in output due dati, ovvero il valore
del modulo e il valore della fase. Il segnale si propaga nel tempo da sinistra a
destra; al primo ciclo il valore del modulo è contenuto nell’unità ‘CORDIC’,
al secondo nell’unità ‘arcocoseno’ e al terzo nelle unità di addizione. La
fase, invece si comporta diversamente; in un primo tempo per sincronizzare
il segnale si era pensato di interporre un flip-flop, dopo ho adottato una
soluzione differente, descritta nel prossimo paragrafo.

4.5.1 Entità CORDIC.VHD

L’intero blocco ‘CORDIC’ è formato da 16 celle (cor 1, cor 2, ecc..), ognuna


delle quali elabora i dati ad alta precisione. Utilizzano 18 bit per memorizzare
il modulo del vettore e 35 bit per memorizzare il valore della fase, durante
il calcolo. L’entità lavora alla frequenza fC , pari a 8 volte fM . Ognuna di
queste celle implementa un’iterazione dell’algoritmo di CORDIC.

Per i che va da 1 a 16
Dato il numero complesso z
Se im(z) > 0
//calcolo del modulo
4.5. IL SEPARATORE 62

Re(z) = Re(z) + sh(Im(z),i)


Im(z) = Im(z) - sh(Re(z),i)
//calcolo della fase
Ph=Ph+ffase(i)
Altrimenti
//calcolo del modulo
Re(z) = Re(z) - sh(Im(z),i)
Im(z) = Im(z) + sh(Re(z),i)
//calcolo della fase
Ph=Ph-ffase(i)
Fine se

dove Sh (numero, indice) è una funzione che effettua lo shift aritmetico del
numero e Ffase (indice) restituisce un valore precalcolato da aggiungere o
sottrarre al valore attuale della fase. La tabella contiene i valori dell’espres-
sione atan(2−k ), con k = 1, 2, 3, ... Le simulazioni hanno dimostrato che il
calcolo della fase deve avvenire a massima precisione possibile per portare
risultati soddisfacenti, per cui questi valori sono stati quantizzati a 32 bit.
Sono tutti valori minori di uno. La variabile di accumulazione, pertanto,
necessita di 3 bit aggiuntivi per evitare overflow. Il valore del modulo è
correttamente calcolato dopo otto iterazioni di CORDIC ovvero dopo
otto cicli di clock a fC , e quindi un ciclo di clock a fM ; la successiva unità
(‘arcocoseno’) leggerà il valore ed effettuerà le necessarie operazioni. Il va-
lore della fase, invece è correttamente calcolato dopo sedici iterazioni di
CORDIC ovvero dopo sedici cicli di clock a fC , e quindi due ciclo di clock
a fM ; le unità di somma leggeranno il valore e lo combineranno in maniera
corretta con il valore in output dal blocco (‘arcocoseno’). Il segnale SIGN,
calcolato in ‘corin’ e l’input della sezione ‘CORDIC’, ovvero ‘R In’ e ‘I In’
vengono propagati all’interno dell’entità attraverso quattro flip-flop; Le unità
‘corout a’ e ‘corout b’ si occupano di effettuare le correzioni della fase e del
modulo, come descritto nella teoria, utilizzando il valore di quei segnali di
4.5. IL SEPARATORE 63

controllo. Il blocco ‘corout a’ è un semplice buffer che rende il risultato del


modulo all’unità ‘arcocoseno’, mentre ‘corout b’, a seconda del valore iniziale
del numero complesso e il valore di ‘SIGN’ corregge la fase e manda il valore
ai blocchi di somma.

4.5.2 Specifiche di quantizzazione

Di seguito le specifiche di quantizzazione per la sezione di separazione.

• Dinamica del valore iniziale proveniente dalla sezione FIR: 16 bit.

• Dinamica dei valori interni di modulo (reale e immaginario): 18 bit.

• Dinamica dei valori interni della fase: 35 bit.

• Dinamica dei coefficienti per il calcolo della fase: 32 bit.


4.5. IL SEPARATORE
Figura 4.5: VHDL - Data Flow - Entity CORDIC.VHD - prima parte

Clk_slow Clk

Reset
U7

Clk

Reset
U8 U1 U2 U3 U4 U5 U6 R_in R_out Modulo

Clk

Reset

Clk

Reset

Clk

Reset

Clk

Reset

Clk

Reset

Clk

Reset

Clk

Reset
R_in R_in R_out R_tmp R_out R_tmp R_out R_tmp R_out R_tmp R_out R_tmp R_out R_tmp R_out fpff2
I_out I_tmp I_out I_tmp I_out I_tmp I_out I_tmp I_out I_tmp I_out I_tmp I_out

I_in I_in Phase Phase Phase_out Phase Phase_out Phase Phase_out Phase Phase_out Phase Phase_out Phase Phase_out

SIGN
cor_in cor_2 cor_3 U20 cor_4 cor_5 cor_6 cor_7
S_in S_out

Clk
U9 U18
ff
R_in R_out R_in R_out
I_in I_out I_in I_out
Reset Reset
Clk Clk
U21
fpff fpff
S_in S_out
Reset
Clk

ff

64
4.5. IL SEPARATORE
Figura 4.6: VHDL - Data Flow - Entity CORDIC.VHD - seconda parte

U10 U11 U12 U13 U14 U15 U16


U19 U17
Reset

Reset

Reset

Reset

Reset

Reset

Reset
Clk

Clk

Clk

Clk

Clk

Clk

Clk

Clk
Reset

Clk

Reset
R_tmp R_out R_tmp R_out R_tmp R_out R_tmp R_out R_tmp R_out R_tmp R_out R_tmp R_out R_tmp R_out R_tmp Fase Fase
I_tmp I_out I_tmp I_out I_tmp I_out I_tmp I_out I_tmp I_out I_tmp I_out I_tmp I_out I_tmp
Phase Phase_out Phase Phase_out Phase Phase_out Phase Phase_out Phase Phase_out Phase Phase_out Phase Phase_out Phase Phase_out Phase

R_in

Sign
I_in
cor_8 cor_9 cor_10 cor_11 cor_12 cor_13 cor_14 cor_15

cor_out

65
Capitolo

Conclusione 5
L’ultimo capitolo riporta i risultati più importanti di questa esperienza di
progettazione e indica i possibili svliuppi futuri per questo progetto.

66
5.1. RISULTATI 67

5.1 Risultati
Lunghe sessioni di progettazione e simulazione hanno portato ad un risultato
soddisfacente, in termini sia di spettro che di EVM. Lo spettro del segnale
risiede all’interno della maschera, ed in alcuni punti tende ad i valori del-
lo spettro calcolati utilizzando i modelli Matlab senza quantizzazione. Le
sezioni laterali dello spettro, infatti, offrono un margine di errore rispetto
alla maschera di quasi 20 dB. L’EVM risulta essere pari a 3,208% Grazie

20
MASK
matlab
VHDL

0
Spettro di potenza [dBc] − Maschera EDGE

−20

−40

−60

−80

−100
−8 −6 −4 −2 0 2 4 6 8
Frequenza [Hz] x 10
6

Figura 5.1: Risultati - Spettro del segnale - 16 it. CORDIC


all’ampio margine di errore mi è stato consigliato di modificare in parte il si-
stema, ottimizzando la potenza dissipata; per fare ciò ho sostituito le ultime
quattro sottounità di CORDIC con dei flip-flop standard. Successivamente,
quando verrà effettuata la sintesi del sistema questi flip-flop saranno collegati
in modo da minimizzare il consumo di corrente. Le prestazoni del sistema
peggiorano lievemente, pur rimaendo in zona accettabile. Il margine d’errore
5.2. SVILUPPI FUTURI 68

nella maschera si riduce a 15 dB, l’EVM sale a 3,452%.

20
MASK
matlab
VHDL

0
Spettro di potenza [dBc] − Maschera EDGE

−20

−40

−60

−80

−100
−8 −6 −4 −2 0 2 4 6 8
Frequenza [Hz] x 10
6

Figura 5.2: Risultati - Spettro del segnale - 12 it. CORDIC

5.2 Sviluppi Futuri


Sono previsti i seguenti sviluppi per il futuro di questo progetto:

• La sintesi su silicio, che verrà effettuata dagli ingegneri della ST Mi-


croelectronics; verranno effettuate simulazioni per stabilire la potenza
dissipata e l’area occupata.
• Le ottimizzazioni al codice VHDL, nel caso si stabilisse che la precisione
attuale dei calcoli non è necessaria.
• L’integrazione con la sezione analogica, già sviluppata.
• L’ultimo passo prevede l’utilizzo del modulatore LINC su un reale
apparato di comunicazione mobile.
Appendice

Fixed Point Toolbox A


Il Fixed Point Toolbox è un pacchetto aggiuntivo che si occupa di simulare
calcoli con aritmetica a punto fisso. Attraverso molteplici opzioni è possibile
specificare il numero di bit che ogni variabile deve avere, quanti prima e
dopo la virgola e se dev’essere mantenuta o meno l’informazione del segno.
É stato sviluppato per essere utilizzato nella modellizzazione di componenti
hardware i componenti del modello Simulink.

69
70

Questo toolbox si basa sull’oggetto ‘fi’, il quale contiene il numero (o la


matrice) e alcuni parametri relativi alla quantizzazione. Per utilizzare un
oggetto ‘fi’ è necessario crearlo, utilizzando il comando ‘fi’ con la seguente
sintassi:

v_q = fi(v,s,w,f)

Questo comando assegna alla variabile di tipo ‘fi’ chiamata v q il valore


quantizzato di v. Il parametro s indica se deve essere considerato il segno
di v, la conversione viene fatta in complemento a due. w è la lunghezza
della parola, espressa in bit che dovranno essere allocati. f è la lunghezza
in bit della parte frazionaria; nel caso che questi parametri venissero omessi,
Matlab cerca di selezionarli automaticamente, fino a raggiungere una soglia
di errore.

Per meglio comprendere il funzionamento del toolbox, utilizzo π come valore


da quantizzare; in Matlab il valore di π è definito nella variabile ‘pi’; una sua
visualizzazione, con le opzioni di default porta al seguente risultato.

>> pi

ans =

3.1416

Naturalmente tutti i calcoli con quella variabile vengono effettuati a massima


precisione possibile, a dispetto del numero di cifre visualizzate. Provando a
quantizzare il valore di π otteniamo
71

>> pi_q = fi(pi)

pi_q =

3.1416
DataTypeMode: Fixed-point: binary point scaling
Signed: true
WordLength: 16
FractionLength: 13

RoundMode: round
OverflowMode: saturate
ProductMode: FullPrecision
MaxProductWordLength: 128
SumMode: FullPrecision
MaxSumWordLength: 128
CastBeforeSum: true

Si evince dall’output che vengono utilizzati 16 bit, di cui 13 per la parte


frazionaria e uno per il segno. Ne restano 2 per il valore intero. Di que-
sto oggetto possiamo visualizzarne la rappresentazione binaria attraverso la
proprietà ‘.bin’

>> pi_q.bin

ans =

0110010010001000

e visualizzare lo scarto rispetto al valore non quantizzato (attraverso la


proprietà ‘.double’)
72

>> pi_q.double-pi

ans =
8.9089e-006

Facendo ulteriori prove si può vedere come sia semplice valutare gli effetti di
quantizzazione su una serie di operazioni aritmetiche.

>> pi_q_8 = fi(pi,0,8,5)

pi_q_8 =
3.1563
>> pi_q_8.double-pi

ans =
0.0147

Il toolbox supporta l’esecuzione delle 4 operazioni aritmetiche su oggetti di


tipo ‘fixed-point’. Attraverso questa libreria è stato quindi possibile conver-
tire lo schema simulink originale in uno schema quantizzato. Naturalmente
il livello di quantizzazione è stato mantenuto paramentrico ad ogni blocco
simulink, in modo da concedere maggiore libertà nella progettazione. Sono
previste, però, alcune operazioni sul segnale non banali (calcolo di modulo e
fase, operazioni trigonometriche). Per queste è stato necessario procedere in
un modo alternativo:

Per ipotesi, il blocco X non accetta in input dati di tipo ‘fi’, per cui all’entrata
del blocco si è dovuto convertire il segnale da fi a double e, all’uscita, da
double a ‘fi’. Questo significa che l’operazione viene calcolata a ‘precisione
macchina’, e poi viene quantizzato il risultato e ciò è differente da quello
che avviene nell’implementazione VHDL (e quindi nella realtà), dove tutto
il sistema è quantizzato.
Appendice

L’algoritmo CORDIC B
Il metodo Cordic e’ uno dei modi piu’ validi per calcolare velocemente fun-
zioni trigonometriche come seni, coseni, esponenziali, coseni iperbolici, seni
iperbolici. E’ particolarmente impiegato nelle unità di calcolo o nelle cal-
colatrici tascabili per la sua velocita’ di esecuzione e semplicità di realizza-
zione pratica sia a livello hardware che software. Il suo nome è l’acronimo
di ‘COordinate Rotation DIgital Computer algorithm’. L’aspetto più rile-
vante di questo algoritmo è la possibilità di realizzarlo unicamente tramite

73
74

addizioni, sottrazioni e divisioni o moltiplicazioni per il fattore due in mo-


do iterativo. Dato che moltipicare (o dividere) un numero per un fattore
due significa, a livello hardware, effettuare uno shift aritmetico (a destra o a
sinistra) l’algoritmo non necessita di moltiplicatori hardware e ciò consente
di risparmiare notevolmente sull’area e sulla potenza dissipata. L’algoritmo
originale calcola seno e coseno di un numero reale, ma può essere facilmente
adattato per il calcolo di modulo e fase di un numero complesso ed è proprio
questa versione che ho utilizzato all’interno del sistema.

Sia z = a + ib il valore di ingresso; si vogliono calcolare le componenti di


modulo ρ e fase θ di z.

Im

b
ρ

a Re

Dato

zk = a + ib, per k = 1, 2, 3, ..., n

avremo che

zk+1 = zk ∗ (1 + αk 2−k i)
75

dove


+1 se Im(zk ) > 0
αk = 
−1 se Im(zk ) < 0

Graficamente:

Im

Re

Mano a mano che le iterazioni proseguono, il vettore in input viene molti-


plicato con i vettori disegnati in rosso; la sua parte reale tende al valore ρ∗ ,
mentre la sua parte immaginaria tende a zero. La fase può essere calcolata
al procedere dell’algoritmo, aggiungendo o sottraendo i valori di atan(2−k )
ad una variabile accumulatrice, sempre in funzione del valore di Im(zk ). Il
valore di ρ∗ equivale a ρ ∗ 1.64671

1
più precisamente equivale a 1.64676025812107. La motivazione per questa correzione
risiede nel fatto che i vettori per i quali il numero è moltiplicato non hanno modulo uguale
a zero.
76

Dato
z1 = a + bi e z2 = c + di
allora
z1 ∗ z2 = (a + bi)(c + di)
ma
c=1
e naturalmente
i2 = −1
quindi l’algoritmo diventa


 (a + b ∗ d) + (b − a ∗ d) ∗ i se Im(zk ) > 0
zk+1 =
 (a − b ∗ d) + (b + a ∗ d) ∗ i se Im(zk ) < 0

dove d = 2−k

L’algoritmo funziona correttamente per valori di ρ compresi tra 0◦ e 90◦ , men-


tre non ha limiti di funzionamento per quanto riguarda i valori del modulo.
Per assicurarne il funzionamento per tutti i valori della fase, quando l’al-
goritmo viene avviato si ‘sposta’ il valore nel quadrante corretto (mediante
cambiamenti di segno) e si assegna ad una variabile il reale quadrante di
partenza. Alla fine verranno apportate le adeguate correzioni alla fase.
77

Im

Re

Figura B.1: CORDIC - Schema Correzione Quadrante


78

input
z=a+ib

no z è nel 1' si
quadrante?

sposta z
nel 1'
quadrante

memorizza lo
spostamento

calcola n
iterazioni di
cordic

no z è nel 1' si
quadrante?

effettua le
correzioni di
fase

output:
abs(z),angle(z)

Figura B.2: CORDIC - Diagramma di Flusso - Correzione Quadrante


79

input
z(k)=a+ib

si no
im(z(k)) > 0

re(z(k+1)) = re( z(k)) + shift( im(z(k))) re(z(k+1)) = re( z(k)) - shift( im(z(k)))

im(z(k+1)) = im(z(k)) - shift(re( z(k))) im(z(k+1)) = im(z(k)) + shift(re( z(k)))

fase = fase - funz_fase(k) fase = fase + funz_fase(k)

k=k+1

si
k<KMAX?

no

output:
modulo=re(z(k)),
fase

Figura B.3: CORDIC - Diagramma di Flusso - Iterazione


Appendice

Acronimi C
80
81

Sigla Significato.
WAP Wireless Application Protocol.
SMS Short Message Service.
LINC Linear Amplification using Non linear Components.
ADC Analog to Digital Converter.
VHDL Very high speed integrated circuit Hardware Description Language.
AM Amplitude Modulation.
RF Radio Frequenza.
PLL Phase locked Loop.
UMTS Universal Mobile Telecommunications System.
PA Power Amplifiers.
ISI InterSymbol Interference.
SPS Subtractive Phase Shifting.
CPS Cumulative Phase Shifting.
EVM Error Vector Magnitude.
GSM Global System for Mobile Communications.
EDGE Enhanced Data rates for GSM Evolution.
Appendice

Codice vhdl D
La presente appendice contiene i listati in codice VHDL dei blocchi più im-
portanti progettati in questo lavoro. Sono stati omessi quelli che non saranno
oggetto di sintesi. Le entity che descrivono una struttura (ad esempio FIR)
non sono state incluse, ma possono essere ricavate dalle figure.

82
83

Adder.vhd

É parte del blocco FIR; si occupa di sommare i risultati dei moltiplicatori

library IEEE;
use IEEE.STD_LOGIC_1164.all;
use WORK.fix_std.all;
entity Adder is
port(
R_M0 : in FP_S_3_18;
I_M0 : in FP_S_3_18;
R_M1 : in FP_S_3_18;
I_M1 : in FP_S_3_18;
R_M2 : in FP_S_3_18;
I_M2 : in FP_S_3_18;
R_M3 : in FP_S_3_18;
I_M3 : in FP_S_3_18;
R_M4 : in FP_S_3_18;
I_M4 : in FP_S_3_18;
clk : in std_logic;
Reset : in std_logic;
R_Ris : out FP_S_1_14;
I_Ris : out FP_S_1_14
);
end Adder;
architecture AdderA of Adder is
begin
process (Clk,Reset)
begin
if(Reset = ’0’)then
R_Ris <= (others => ’0’);
I_Ris <= (others => ’0’);
elsif (Clk’event AND Clk=’1’) then
Copy_S(R_Ris,R_M0+R_M1+R_M2+R_M3+R_M4);
Copy_S(I_Ris,I_M0+I_M1+I_M2+I_M3+I_M4);
end if;
end process;
end AdderA;

Addermod1.vhd

É parte del blocco SEPARATORE; si occupa di sommare la fase e l’arcoco-


seno.
84

library IEEE;
use IEEE.STD_LOGIC_1164.all;
use WORK.fix_std.all;
entity Addermod1 is
port(
cos : in FP_S_1_12;
fase : in FP_S_3_12;
clk : in std_logic;
Reset : in std_logic;
Ris : out FP_S_3_12
);
end Addermod1;
architecture Addermod1A of Addermod1 is
begin
process (Clk,Reset)
begin
if(Reset = ’0’)then
Ris <= (others => ’0’);
elsif (Clk’event AND Clk=’1’) then
Copy_S(Ris,cos+fase);
end if;
end process;
end Addermod1A;

Addermod2.vhd

É parte del blocco SEPARATORE; si occupa di sottrarre l’arcocoseno dalla


fase.

library IEEE;
use IEEE.STD_LOGIC_1164.all;
use WORK.fix_std.all;
entity Addermod2 is
port(
cos : in FP_S_1_12;
fase : in FP_S_3_12;
clk : in std_logic;
Reset : in std_logic;
Ris : out FP_S_3_12
);
end Addermod2;
architecture Addermod2A of Addermod2 is
begin
process (Clk,Reset)
begin
if(Reset = ’0’)then
Ris <= (others => ’0’);
85

elsif (Clk’event AND Clk=’1’) then


Copy_S(Ris,fase-cos);
end if;
end process;
end Addermod2A;

Arcocoseno.vhd

É la lookup-table dell’arcocoseno. non sono stati riportati tutti i valori ma


solo un piccolo sottoinsieme.

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_signed.all;
use IEEE.std_logic_arith.all;
use IEEE.numeric_std.all;
use WORK.fix_std.all;
entity arcocoseno is
port(
prodotto : in FP_S_1_12;
clk : in STD_LOGIC;
Reset : in STD_LOGIC;
acos : out FP_S_1_12
);
end arcocoseno;
architecture arcocosenoA of arcocoseno is
begin
process (Clk,Reset)
begin
if(Reset = ’0’)then
acos <= (others => ’0’);
elsif (Clk’event AND Clk=’1’) then
case prodotto is
when "00000000000000" =>
acos <= "01100100100010";
when "00000000000001" =>
acos <= "01100100100001";
when "00000000000010" =>
acos <= "01100100100000";
.....
when "00111111111111" =>
acos <= "00000001011011";
when "01111111111111" =>
acos <= "00000000000010";
when "11111111111111" =>
acos <= "01100100100010";
86

end case;
end if;
end process;
end arcocosenoA;

coeff.vhd

É l’entity che fornisce ai moltiplicatori i coefficienti del filtro FIR. É struttu-


rata come macchina a stati finiti.

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_signed.all;
use IEEE.std_logic_arith.all;
use IEEE.numeric_std.all;
use WORK.fix_std.all;
entity coeff is
port(
clk : in STD_LOGIC;
Reset : in STD_LOGIC;
c0 : out FP_S_1_13;
c1 : out FP_S_1_13;
c2 : out FP_S_1_13;
c3 : out FP_S_1_13;
c4 : out FP_S_1_13
);
end coeff;
architecture coeffA of coeff is
begin
process (Clk,Reset)
variable Cnt: std_logic_vector(3 downto 0);
begin
if(Reset = ’0’)then
Cnt := "0000";
elsif (Clk’event AND Clk=’1’) then
Cnt := Cnt + "0001";
case Cnt is
when "0000" =>
c0 <= "000000000000000";
c1 <= "000000100010110";
c2 <= "001100001011101";
c3 <= "001100001011110";
c4 <= "000000100010111";
....
when "1111" =>
c0 <= "000000011000000";
c1 <= "001011010000110";
87

c2 <= "001101000010001";
c3 <= "000000110001001";
c4 <= "000000000000000";
end case;
end if;
end process;
end coeffA;

complfunc.vhd

Il package definisce le funzioni per l’algoritmo di CORDIC.

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use WORK.fix_std.all;
package compl_func is
function fffase(n: integer) return FP_S_0_31;
function Smi(n: integer; Ing: FP_S_3_14) return FP_S_3_14;
end;
package body compl_func is
function fffase(n: integer) return FP_S_0_31 is
variable b : FP_S_0_31;
begin
case n is
when 0 => b := ("01100100100001111110110101010001");
when 1 => b := ("00111011010110001100111000001011");
when 2 => b := ("00011111010110110111010111111001");
when 3 => b := ("00001111111010101101110101001101");
when 4 => b := ("00000111111111010101011011101110");
when 5 => b := ("00000011111111111010101010110111");
when 6 => b := ("00000001111111111111010101010110");
when 7 => b := ("00000000111111111111111010101011");
when 8 => b := ("00000000011111111111111111010101");
when 9 => b := ("00000000001111111111111111111011");
when 10 => b := ("00000000000111111111111111111111");
when 11 => b := ("00000000000100000000000000000000");
when 12 => b := ("00000000000010000000000000000000");
when 13 => b := ("00000000000001000000000000000000");
when 14 => b := ("00000000000000100000000000000000");
when 15 => b := ("00000000000000010000000000000000");
when others => b := (others => ’0’);
end case;
return b;
end fffase;
function Smi(n: integer; Ing: FP_S_3_14) return FP_S_3_14 is
88

Variable a : std_logic_vector(FP_S_3_14’LENGTH-1 downto 0);


Variable b : std_logic_vector(FP_S_3_14’LENGTH-1 downto 0);
begin
a := std_logic_vector(Ing);
if a (FP_S_3_14’LENGTH-1)=’0’ then
case n is
when 0 => b := (a);
when 1 => b := ("0" & a(a’LENGTH-1 downto 1));
when 2 => b := ("00" & a(a’LENGTH-1 downto 2));
when 3 => b := ("000" & a(a’LENGTH-1 downto 3));
when 4 => b := ("0000" & a(a’LENGTH-1 downto 4));
when 5 => b := ("00000" & a(a’LENGTH-1 downto 5));
when 6 => b := ("000000" & a(a’LENGTH-1 downto 6));
when 7 => b := ("0000000" & a(a’LENGTH-1 downto 7));
when 8 => b := ("00000000" & a(a’LENGTH-1 downto 8));
when 9 => b := ("000000000" & a(a’LENGTH-1 downto 9));
when 10 => b := ("0000000000" & a(a’LENGTH-1 downto 10));
when 11 => b := ("00000000000" & a(a’LENGTH-1 downto 11));
when 12 => b := ("000000000000" & a(a’LENGTH-1 downto 12));
when 13 => b := ("0000000000000" & a(a’LENGTH-1 downto 13));
when 14 => b := ("00000000000000" & a(a’LENGTH-1 downto 14));
when 15 => b := ("000000000000000" & a(a’LENGTH-1 downto 15));
when others => b := (others => ’0’);
end case;
else
case n is
when 0 => b := (a);
when 1 => b := ("1" & a(a’LENGTH-1 downto 1));
when 2 => b := ("11" & a(a’LENGTH-1 downto 2));
when 3 => b := ("111" & a(a’LENGTH-1 downto 3));
when 4 => b := ("1111" & a(a’LENGTH-1 downto 4));
when 5 => b := ("11111" & a(a’LENGTH-1 downto 5));
when 6 => b := ("111111" & a(a’LENGTH-1 downto 6));
when 7 => b := ("1111111" & a(a’LENGTH-1 downto 7));
when 8 => b := ("11111111" & a(a’LENGTH-1 downto 8));
when 9 => b := ("111111111" & a(a’LENGTH-1 downto 9));
when 10 => b := ("1111111111" & a(a’LENGTH-1 downto 10));
when 11 => b := ("11111111111" & a(a’LENGTH-1 downto 11));
when 12 => b := ("111111111111" & a(a’LENGTH-1 downto 12));
when 13 => b := ("1111111111111" & a(a’LENGTH-1 downto 13));
when 14 => b := ("11111111111111" & a(a’LENGTH-1 downto 14));
when 15 => b := ("111111111111111" & a(a’LENGTH-1 downto 15));
when others => b := (others => ’1’);
end case;
end if;
return FP_S_3_14(b);
end Smi;
end;

corin.vhd

La prima cella dell’algoritmo CORDIC ha il compito di determinare la po-


sizione del vettore all’interno dei quattro quadranti e assegnare alle variabili
di controllo i valori corretti.
89

library IEEE;
use IEEE.STD_LOGIC_1164.all;
use WORK.fix_std.all;
use WORK.compl_func.all;
entity cor_in is
port(
R_in : in FP_S_1_14;
I_in : in FP_S_1_14;
Clk : in std_logic;
Reset : in std_logic;
R_out : out FP_S_3_14;
I_out : out FP_S_3_14;
Phase : out FP_S_3_31;
SIGN : out std_logic
);
end cor_in;
architecture cor_ina of cor_in is
begin
process (Clk,Reset)
variable Zero : FP_S_1_14 := (others => ’0’);
variable Zero2 : FP_S_3_14 := (others => ’0’);
variable R_sh : FP_S_3_14;
variable I_sh : FP_S_3_14;
variable R_next : FP_S_3_14;
variable I_next : FP_S_3_14;
variable R_tmp : FP_S_3_14;
variable I_tmp : FP_S_3_14;
begin
if(Reset = ’0’)then
Copy_S(R_out,Zero);
Copy_S(I_out,Zero);
Copy_S(Phase,Zero);
Sign<=’0’;
elsif (Clk’event AND Clk=’1’) then
Copy_V (Phase_Tmp, Zero);
if (R_in>=Zero) then
Copy_V (R_tmp, R_in);
else
Copy_V (R_tmp, -R_in);
end if;
if (I_in>=Zero) then
Copy_V (I_tmp, I_in);
else
Copy_V (I_tmp, -I_in);
end if;
if (I_tmp>R_tmp) then
Copy_V (R_next, I_tmp);
Copy_V (I_next, R_tmp);
Sign<=’0’;
else
Copy_V (R_next, R_tmp);
90

Copy_V (I_next, I_tmp);


Sign<=’1’;
end if;

Copy_S (R_out , R_next);


Copy_S (I_out, I_next);

end if;
end process;
end cor_ina;

cor2.vhd

Un sottoblocco di CORDIC che implementa un’iterazione dell’algoritmo.

library IEEE;
use IEEE.STD_LOGIC_1164.all;
use WORK.fix_std.all;
use WORK.compl_func.all;
entity cor_2 is
port(
R_tmp : in FP_S_3_14;
I_tmp : in FP_S_3_14;
Phase : in FP_S_3_31;
Clk : in std_logic;
Reset : in std_logic;
R_out : out FP_S_3_14;
I_out : out FP_S_3_14;
Phase_out : out FP_S_3_31
);
end cor_2;
architecture cor_2a of cor_2 is
begin
process (Clk,Reset)
variable Zero : FP_S_3_14 := (others => ’0’);
variable R_sh : FP_S_3_14;
variable I_sh : FP_S_3_14;
variable R_next : FP_S_3_14;
variable I_next : FP_S_3_14;
begin
if(Reset = ’0’)then
Copy_S(R_out,Zero);
Copy_S(I_out,Zero);
Copy_S(Phase_out,Zero);
elsif (Clk’event AND Clk=’1’) then
91

if (I_tmp>=Zero) then
Copy_V( R_next , R_tmp + Smi(2,I_tmp));
Copy_V( I_next , I_tmp - Smi(2,R_tmp));
Copy_S( Phase_out,Phase+fffase(2));
else
Copy_V( R_next , R_tmp - Smi(2,I_tmp));
Copy_V( I_next , I_tmp + Smi(2,R_tmp));
Copy_S( Phase_out,Phase-fffase(2));
end if;
Copy_S( R_out , R_next);
Copy_S( I_out , I_next);
end if;
end process;
end cor_2a;

corout.vhd

Si occupa di correggere il valore finale della fase, a seconda dell’ingresso


iniziale e dei segnali di controllo.

library IEEE;
use IEEE.STD_LOGIC_1164.all;
use WORK.fix_std.all;
use WORK.compl_func.all;
entity cor_out is
port(
R_in : in FP_S_1_14;
I_in : in FP_S_1_14;
R_tmp : in FP_S_3_14;
Phase : in FP_S_3_31;
Sign : in std_logic;
Clk : in std_logic;
Reset : in std_logic;
Fase : out FP_S_3_12
);
end cor_out;
architecture cor_outa of cor_out is
begin
process (Clk,Reset)
variable Zero : FP_S_1_14 := (others => ’0’);
variable Und : FP_S_1_14 := (others => ’U’);
variable Ics : FP_S_1_14 := (others => ’X’);
variable Zero2 : FP_S_3_14 := (others => ’0’);
variable Phase_Tmp : FP_S_3_31;
variable Pi : FP_S_3_14:= "001100100100010000"; --pigreco
92

variable Pim : FP_S_3_14:= "000110010010001000"; --pigreco mezzi


variable Piq : FP_S_3_14:= "000011001001000100";
begin
if(Reset = ’0’)then
Copy_S(Fase,Zero);
elsif (Clk’event AND Clk=’1’) then
if (sign=’0’) then
Copy_V(Phase_Tmp,Piq-Phase);
else
Copy_V(Phase_Tmp,Piq+Phase);
end if;
if (R_in>Zero) and (I_in>Zero) then
Copy_V(Phase_Tmp,Phase_Tmp);
elsif (R_in>Zero) and (I_in<Zero) then
Copy_V(Phase_Tmp,Zero-Phase_Tmp);
elsif (R_in<Zero) and (I_in>Zero) then
Copy_V(Phase_Tmp,Zero-Phase_Tmp+Pi);
elsif (R_in<Zero) and (I_in<Zero) then
Copy_V(Phase_Tmp,Phase_Tmp-Pi);
elsif (R_in=Zero) and (I_in>Zero) then
Copy_V(Phase_Tmp,Pim);
elsif (R_in=Zero) and (I_in<Zero) then
Copy_V(Phase_Tmp,Zero-Pim);
elsif (R_in>Zero) and (I_in=Zero) then
Copy_V(Phase_Tmp,Zero);
elsif (R_in<Zero) and (I_in=Zero) then
Copy_V(Phase_Tmp,Pi);
end if;
Copy_S(Fase,Phase_Tmp);
end if;
end process;
end cor_outa;

moltip.vhd

I moltiplicatori del FIR.

library IEEE;
use IEEE.STD_LOGIC_1164.all;
use WORK.fix_std.all;
entity moltip is
port(
clk : in std_logic;
Reset : in std_logic;
R_in : in FP_S_1_14;
I_in : in FP_S_1_14;
coeff_in : in FP_S_1_13;
93

R_out : out FP_S_3_18;


I_out : out FP_S_3_18
);
end moltip;
architecture moltipa of moltip is
begin
process (Clk,Reset)
begin
if(Reset = ’0’)then
R_out <= (others => ’0’);
I_out <= (others => ’0’);
elsif (Clk’event AND Clk=’1’) then
Copy_S(R_out,R_in * coeff_in);
Copy_S(I_out,I_in * coeff_in);
end if;
end process;
end moltipa;

psk.vhd

L’unità che implementa la codifica PSK; non è stata riportata completamen-


te, ma solo la struttura essenziale.

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_signed.all;
use IEEE.std_logic_arith.all;
use IEEE.numeric_std.all;
use WORK.fix_std.all;
entity psk is
port(
clk : in STD_LOGIC;
Reset : in STD_LOGIC;
Symbol :in std_logic_vector(2 downto 0);
R_out : out FP_S_1_14;
I_out : out FP_S_1_14
);
end psk;
architecture psk_a of psk is
begin
process (Clk,Reset)
variable Cnt: std_logic_vector(3 downto 0);
begin
if(Reset = ’0’)then
94

Cnt := "0000";
elsif (Clk’event AND Clk=’1’) then
Cnt := Cnt + "0001";
case Cnt is
when "0000" =>
case Symbol is
when "000" =>
R_out <= "0000000000000000";
I_out <= "0000001000101100";
when "001" =>
R_out <= "0000000000000000";
I_out <= "0000001000101100";
.....
end case;
when "0001" =>
case Symbol is
when "000" =>
R_out <= "0000000000000000";
I_out <= "0000001000101100";
when "001" =>
R_out <= "0000000000000000";
I_out <= "0000001000101100";
.....
end case;
........
when "1111" =>
case Symbol is
when "000" =>
R_out <= "0000000000000000";
I_out <= "0000001000101100";
when "001" =>
R_out <= "0000000000000000";
I_out <= "0000001000101100";
.......
end case;
end case;
end if;
end process;
end psk_a;
Elenco delle figure

2.1 Schema Funzionale - Sistema di comunicazione mobile . . . . . 14

2.2 Schema Funzionale - Trasmettitore LINC . . . . . . . . . . . . 15

2.3 Trasmettitore LINC - Schema fasoriale . . . . . . . . . . . . . 18

2.4 Schema Funzionale - Modulatore LINC . . . . . . . . . . . . . 19

95
ELENCO DELLE FIGURE 96

2.5 Traiettoria 1-3-7 . . . . . . . . . . . . . . . . . . . . . . . . . . 20

2.6 Traiettoria correttamente filtrata . . . . . . . . . . . . . . . . 22

2.7 Traiettoria non correttamente filtrata . . . . . . . . . . . . . . 23

2.8 Filtro FIR - Forma Canonica . . . . . . . . . . . . . . . . . . . 24

2.9 Traiettoria originale . . . . . . . . . . . . . . . . . . . . . . . . 25

2.10 Esempio CPS - figura 1 . . . . . . . . . . . . . . . . . . . . . . 26

2.11 Esempio CPS - figura 2 . . . . . . . . . . . . . . . . . . . . . . 27

2.12 Traiettoria con CPS . . . . . . . . . . . . . . . . . . . . . . . 28

2.13 Risposta in frequenza (modulo) del filtro . . . . . . . . . . . . 29

2.14 Risposta in frequenza (fase) del filtro . . . . . . . . . . . . . . 29

2.15 Risposta impulsiva del filtro . . . . . . . . . . . . . . . . . . . 30

2.16 Risposta allo scalino del filtro . . . . . . . . . . . . . . . . . . 30

2.17 Traiettoria filtrata . . . . . . . . . . . . . . . . . . . . . . . . 31

2.18 Schema Funzionale - Separazione del segnale . . . . . . . . . . 31

2.19 Spettro del segnale . . . . . . . . . . . . . . . . . . . . . . . . 34

2.20 Misura dell’EVM . . . . . . . . . . . . . . . . . . . . . . . . . 35

3.1 Trasmettitore LINC - Modello Simulink - Generale . . . . . . 37

3.2 Trasmettitore LINC - Modello Simulink - Sezione 1 . . . . . . 37


ELENCO DELLE FIGURE 97

3.3 Trasmettitore LINC - Modello Simulink - Sezione 2 . . . . . . 38

3.4 Trasmettitore LINC - Modello Simulink - Sezione 3 . . . . . . 39

3.5 Output del FIR senza quantizzazione . . . . . . . . . . . . . . 41

3.6 Output del FIR con quantizzazione a 12 bit . . . . . . . . . . 42

3.7 Output del FIR con quantizzazione a 8 bit . . . . . . . . . . . 42

3.8 Spettro del segnale - Confronto tra differenti quantizzazioni . . 43

3.9 Spettro del segnale - Artefatti di quantizzazione . . . . . . . . 44

3.10 Confronto fra segnale trasmesso e segnale filtrato - figura 1 . . 47

3.11 Confronto fra segnale trasmesso e segnale filtrato - figura 2 . . 47

4.1 VHDL - Struttura gerarchica . . . . . . . . . . . . . . . . . . . 49

4.2 VHDL - Data Flow - Entity TOP.VHD . . . . . . . . . . . . . 53

4.3 VHDL - Data Flow - Entity FIR.VHD . . . . . . . . . . . . . 55

4.4 VHDL - Data Flow - Entity SEPARATORE.VHD . . . . . . . 59

4.5 VHDL - Data Flow - Entity CORDIC.VHD - prima parte . . 64

4.6 VHDL - Data Flow - Entity CORDIC.VHD - seconda parte . 65

5.1 Risultati - Spettro del segnale - 16 it. CORDIC . . . . . . . . 67

5.2 Risultati - Spettro del segnale - 12 it. CORDIC . . . . . . . . 68


ELENCO DELLE FIGURE 98

B.1 CORDIC - Schema Correzione Quadrante . . . . . . . . . . . 77

B.2 CORDIC - Diagramma di Flusso - Correzione Quadrante . . . 78

B.3 CORDIC - Diagramma di Flusso - Iterazione . . . . . . . . . . 79


Bibliografia

(1998). A survey of cordic algorithms for fpga based computers. ACM/SIGDA


International Symposium on Field-Programmable Gate Arrays (FPGA
’98), ACM/SIGDA.

A.Th. Schwarzbacher, A. Brasching T. W.; Foley J. (1999). Optimisation of


trigonometric functions for low power cmos implementations. Relazione
tecnica.

Cannizzaro R. (2004). Trasmettitore multistandard LINC integrato in tec-

99
BIBLIOGRAFIA 100

nologia CMOS: studio architetturale e progetto dell’amplificatore e del


ricombinatore. Tesi di Dottorato di Ricerca, Università di Pavia.

Cox D. C. (1959). Linear amplification using non-linear components.


Relazione tecnica, IEEE.

Giacomantone J. O. (1992). Tradeoffs in arithmetic architectures for cordic


algorithm design. Relazione tecnica, CeTAD Fac de Ingenieria UNLP.

J.Volder (September 1959). The cordic computing technique. IRETrans


Computers, vol EC 8, 330-334.

Mashhour A. (1999). Understanding offset 8-psk modulation for gsm-edge.


Relazione tecnica.

Packard H. (1997). Digital modulation in communications systems an


introduction. Relazione tecnica, Hewlett Packard.

Proakis J. (1995). Digital communications.

Satish Ravichandran V. A. (2004). Pre-computation of rotation bits in unidi-


rectional cordic for trigonometric and hyperbolic computations. Relazione
tecnica, Hewlett Packard.

Schell S. V. (2000). Implementation effects on gsm’s edge modulation.


Relazione tecnica, Tropian, Inc.

Tso-Pin Chuang, Chao-Chuan Huang S.-F. H. (1998). Design of a


cordic-based sin/cos intellectual property (ip) using predictable sign bits.
Relazione tecnica.

Turkowski K. (January 17, 1990). Fixed-point trigonometry with cordic


iterations. Relazione tecnica, Apple Computer.