Tesi Robotica Analisi, progettazione e implementazione... | Page 154
i
i
“LP_Tesi” — 2013/10/17 — 18:27 — page 154 — #154
i
154
i
7. TERZA RELEASE
za, ma tale calo sarà ampiamente ripagato dalla possibilità di parallelizzare il
riempimento della matrice dei punteggi.
Prima di buttarsi a scrivere codice è stato necessario però capire il modo in cui la
matrice dei punteggi poteva essere riempita parallelamente, infatti esistono dei
vincoli sull’ordine in cui le celle vengono calcolate. Come ampiamente spiegato
in precedenza, una posizione della matrice può essere riempita solamente se le
posizioni di north, northwest e west sono state precedentemente riempite, ciò
implica che se si vogliono riempire contemporaneamente due righe adiacenti,
il riempimento della seconda deve essere ritardato di un ciclo di clock, ciclo
necessario al calcolo della casella di north relativo alla seconda riga. Inoltre se la
prima riga impiega n cicli di clock per essere completata, la seconda impiegherà
n + 2 cicli, questo perché un ciclo viene sprecato all’inizio per permettere il
calcolo dei north, mentre l’altro viene sprecato alla fine dato che il numero di
celle nelle righe aumenta di una unità ogni volte che si scende verso il basso.
Nel caso in cui si vogliano usare m riempitori, ammettendo che la prima riga
associata al primo riempitore sia lunga n, saranno necessari n + 2m cicli di
clock per riempirle tutte, questo perché gli m riempitori non si spostano alle
righe successive fino a quando l’ultimo ha finito. A questo punto ci si potrebbe
domandare perché non cominciare a riempire la riga m + 1 quando il riempitore
della prima riga ha terminato, c’è un motivo ben preciso, e va ritrovato nel modo
in cui le celle north vengono memorizzate.
Come detto in Sez:6.2.4 esiste una FIFO di nome ramNorth, questa coda è
di dimensioni pari alla larghezza dell’immagine. Volendo permettere al codice
di riempire m righe indipendentemente l’una dall’altra sarebbero necessarie m
ramNorth di dimensioni pari alla larghezza dell’immagine. L’obiettivo però è
quello di migliorare le prestazioni del sistema senza consumare ulteriore memoria, utilizzando quindi l’accorgimento di aspettare che tutte le righe finiscano
di essere scritte, solo una delle ramNorth richiederà uno spazio grande, ovvero
quella usata tra la comunicazione dall’ultimo a primo riempitore, tutte le righe
nel mezzo useranno invece delle FIFO al più grandi 2, questo perché il valore di
north per il riempimento di una cella viene utilizzato nel ciclo di clock successivo
a quello di creazione. Solo il primo e l’ultimo riempitore avranno a che fare con
la ramNorth grande, questo perché mentre l’ultimo crea valori per la fase successiva di riempimento, il primo utilizza i valori creati nella fase di riempimento
precedente.
Usando questa tecnica lo spazio di memoria su FPGA non viene utilizzato ulteriormente, certamente in questo modo la parallelizzazione non frazionerà in
maniera precisa il numero di cicli di clock impiegati, ma per immagini molto
i
i
i
i