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