Tesi Robotica Analisi, progettazione e implementazione... | Page 158
i
i
“LP_Tesi” — 2013/10/17 — 18:27 — page 158 — #158
i
158
i
7. TERZA RELEASE
0,0 0,0 0,0 0,0 0,0 0,0
0,0 1,0 1,1 0,0 0,0 0,0
0,0 0,0 2,0 2,1 2,2 0,0
3,0 3,1 3,2 3,3 0,0 0,0 0,0 0,0
0,0 4,0 4,1 4,2 4,3 4,4 0,0 0,0
0,0 0,0 0,0 0,0 0,0 0,0 0,0 0,0
Figura 7.1.2: Sfruttamento dei pacchetti di coppie
coppie vengano utilizzate, le linee diagonali rosse prima e blu poi indicano le
terzine di coppie presenti in Tab:7.1. Con i bordi continui vengono rappresentate le celle effettivamente presenti in matrice, con i bordi tratteggiati vengono
rappresentate le celle con valori inutili.
A questo punto bisogna risolvere ancora un problema, una BRAM può essere
scritta/letta al più 2 volte in un ciclo di clock, così come per i Raster è stato
necessario trovare un modo per superare l’ostacolo. Per fare ciò è stata adottata una tecnica già presente nella seconda release, ovvero stipare 16 direzioni
in un solo elemento da 32bit della matrice. In questo modo è possibile scrivere più elementi contemporaneamente, ad ogni riga è associata una porzione
della BRAM, quando una riga ha prodotto 16 direzioni queste vengono scritte
all’indirizzo relativo. Dato che ogni riempitore riesce a calcolare 16 direzioni in
momenti diversi l’uno dall’altro è possibile alternare le scritture senza perdere
cicli di clock per colpa di risorse occupate da direzioni non ancora memorizzate.
Come si può vedere da Fig:7.1.3 la BRAM a questo punto assume una forma
più compatta dovuta alla semplicità con cui può essere scritta, ma se la scrittura è diventata semplice, la lettura ne ha risentito parecchio, durante la fase di
Backtrack infatti è necessario tenere conto di dove è posizionata la riga superiore a quella attualmente considerata, per semplicità di lavoro è stato necessario
scrivere un programma in grado non solo di dare un offset alla posizione iniziale
dello storage di ogni riga (ovvero dove in Fig:7.1.3 i colori delle celle cambiano),
ma anche di calcolare lo slack fra una riga e la sua precedente, in questo modo
è stato possibile permettere la parallelizzazione del codice in modo parametrico, quindi oltre al numero di riempitori è necessario introdurre le variabili che
i
i
i
i