Tesi Robotica Algoritmi ed architetture per la risoluzione di... | Page 79
4.4. HARDWARE ARCHITECTURE
79
li altsyncram per ogni variabile in ciascun modulo , che sarebbe rapidamente
diventato ingombrante. Così il controller di memoria serve per astrarre la ram
e ridurre i segnali di memoria passati tra i moduli . Abbiamo un controller di
memoria diverso per gestire le strutture . In una struttura, i singoli elementi
possono avere dimensioni non uniforme . Inoltre le strutture devono essere byte
indirizzabile. Per gestire questo occorre un ulteriore mem_size ingresso a 2 bit
che indica la dimensione dell’elemento struct stiamo accedendo . mem_size è
0 per byte , 1 in breve, 2 per intero, 3 per lungo tempo . Per ogni struttura
un montone fuori 64 bit viene creata un’istanza . Utilizzando il mem_addr e
mem_size possiamo usare il byte abilitazione della ram di scrivere solo la sezione corretta del ram . Durante la lettura dei dati , dobbiamo orientare i bit
corretti della parola a 64 bit per bit più bassi al di mem_data_out .
Un MIF , file di inizializzazione della memoria , viene generato per ogni altsyncram .
Solo un carico dalla memoria possono verificarsi nello stesso stato . Dal momento che le variabili sono in ram separate potremmo potenzialmente permettere un
carico simultaneo se sono a diverse variabili . Inoltre potremmo utilizzare ram
a due porte in futuro . Se una posizione di memoria viene utilizzato solo all’interno di un modulo , allora non abbiamo bisogno di memorizzare la posizione
nel controller di memoria globale . Potremmo creare un’istanza di un altsyncram locale direttamente all’interno del modulo . Questo non è attualmente
implementata.
4.4.4
Function Calls
Ogni chiamata funzione richiede due stati. Uno stato iniziale per impostare
start = 1 per la funzione chiamata, poi un secondo stato che loop fino a ricevere
un finish = 1 dalla funzione chiamata. Chiamate di funzione non sono ammessi
nello stesso stato come un load / store memoria.
4.4.5
Signed/Unsigned
In LLVM, tutti gli interi vengono considerati unsigned se non passato a un’istruzione firmata (sdiv, Srem). Dal momento che gli interi sono firmati, prima di
essere passato a un’operazione di aggiunta devono essere adeguatamente firmare
o pari a zero estese. Per a rontare estensione del segno LLVM ha due istruzioni: