Tesi Robotica Un co-processore per Stereo-Matching: Architettura | Page 66
i
i
“LP_Tesi” — 2011/9/9 — 21:20 — page 66 — #66
i
4.2. MODULO TOP
i
66
Implementazione
Per iniziare a descrivere l’implementazione abbiamo bisogno innanzitutto di
descrivere le variabili utilizzate, in Alg:(4.11) osserviamo:
Algoritmo 4.11 Top: storage
1
2
3
4
5
6
7
8
9
FIFOF#(BitPD) sorter <- mkSizedFIFOF(width);
FIFOF#(DispAddr) fout <- mkSizedFIFOF(width);
SizedVector#(Processor_Ifc) processor <- replicateM(mkProcessor);
RegPar free <- mkReg(unpack({’1}));
RegBitR row <- mkReg(1);
Reg#(BitPD) index <- mkReg(0);
Reg#(BitPD) preIndex <- mkReg(0);
Reg#(Bool) deque <- mkReg(False);
Reg#(Bool) shift <- mkReg(False);
sorter: FIFO che tiene traccia dell’ordine in cui i processor sono stati caricati,
e quindi dell’ordine in cui, alla fine dell’elaborazione, devono essere letti;
fout: FIFO per mantenere il modulo asincrono;
processor: vettore di Processor;
free: registro contenente tanti bit quanti sono i processor del vettore, registra
nell’i-esima posizione lo stato dell’i-esimo processor, 1=libero 0=occupato;
row: contatore di riga;
index, preindex: rispettivamente indice del processor attivo e indice al ciclo
di clock precedente, lo shift di un ciclo di clock è indispensabile per mantenere
sincronizzati il metodo di put e quello di manager;
Il primo metodo ad essere chiamato è put (r:13 Alg:4.12), questi non fa altro
che inviare i pixel in arrivo sul processor che risulta attivo (un processor si dice
attivo quando è pronto per essere scritto o è in fase di scrittura).
Successivamente viene invocato il metodo manager (r:1 Alg:4.12) a cui è assegnata il compito di individuare quali processor sono liberi e quindi quale di
questi può diventare “attivo”. La condizione di fire impone che l’indice di riga
sia diverso da 0 (se la riga è uguale a 0 l’immagine è stata completamente elaborata) e che il flag deque (successivamente descritto) sia falso, questo succede
solo quando un processor passa da attivo a pronto per la riscrittura. Il ciclo
i
i
i
i