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: