Tesina di fine corso Argomento: Arithmetic Logic Unit (1 bit ALU e 8 bit ALU) Corso: Fondamenti di informatica Professore: Gregorio Cosentino Autori: Enrico Santorio Luca Macchi Matteo Langeli Pierluigi Abiuso Alessio Calicchia Carlo Marchetti Prima di iniziare: È importante ricordare le funzioni degli operatori di base; in particolare: •Il NOT complementa la variabile in entrata •L’AND esegue il prodotto tra variabili in entrata •L’OR esegue la somma tra variabili in entrata •Il NAND complementa le funzioni in uscita dell’AND •Il NOR complementa le funzioni in uscita dell’OR •L’OR esclusivo rimanda 1 in uscita se e solo se le variabili in entrata sono diverse. L'unità aritmetica logica (spesso noto come arithmetic logic unit o ALU) è un'unità digitale preposta all'esecuzione di operazioni aritmetiche o logiche. L'ALU è un elemento fondamentale dei moderni microprocessori che contengono almeno un'unità ALU al suo interno. Le moderne CPU e GPU sono dotate di unità ALU molto sofisticate, un singolo processore spesso contiene più ALU. Il matematico John von Neumann propose il concetto di ALU nel 1945 mentre sviluppava le basi del computer EDVAC. Nel 1946 von Neumann lavorò con i suoi colleghi allo sviluppo di un computer per il Princeton Institute of Advanced Studies (IAS). L'IAS machine fu un sistema che fu utilizzato come esempio dalla maggior parte dei computer successivi. Durante lo sviluppo delineò l'architettura generica della macchina che comprendeva il concetto di ALU. Egli ideò inoltre il concetto di ALU in modo da consentire al computer di eseguire le operazioni aritmetiche elementari come somma, sottrazione, divisione e moltiplicazione ritenendo ragionevole sviluppare un'unità specializzata allo scopo. Sistema numerico : L'ALU deve processare i numeri utilizzando lo stesso sistema numerico utilizzato dai rimanenti componenti del computer. Nei moderni computer questa è praticamente sempre la notazione binaria in complemento a due. I primi computer invece utilizzavano una varietà molto ampia di sistemi di numerazione come la notazione decimale la notazione con segno e il complemento a uno. A seconda del sistema di rappresentazione utilizzato lo schema deLL'ALU può variare significativamente. Operazioni basilari: La maggior parte delle ALU sono in grado di eseguire: Operazioni aritmetiche su numeri intero (addizione, sottrazione, e spesso moltiplicazione e divisione a volte tramite l'utilizzo di sottrazioni o somme multiple). Operazioni logiche (AND, OR, NOT). Operazioni di scorrimento binarie tramite registri a scorrimento. Operazioni complesse : Un ingegnere elettronico può progettare un'ALU in grado di eseguire tutte le operazioni logiche e matematiche immaginabili ma questo comporterebbe degli enormi problemi dato che l'unita sarebbe molto costosa e lenta. Quindi gli ingegneri devono effettuare delle scelte cercando di realizzare delle unità potenti ma nello stesso tempo non troppo complesse. Anche le ALU semplici sono in grado di eseguire operazioni complesse ma richiedono molti cicli di clock per svolgere le operazioni mentre le ALU complesse eseguono le operazioni in un solo ciclo di clock. Input e Output: Gli input (ingressi) dell'ALU sono i dati da processare (gli operandi) e il codice che attiva l'unità di controllo che gestisce l'ALU. L'output sono i risultati delle operazioni. Spesso le ALU sono progettate per generare ingressi e uscite in funzione dei dati elaborati. Questi dati vengono usualmente raccolti in un registro di stato e sono utilizzati per indicare la presenza di resto, la divisione per zero, l'overflow etc. 1 1 1 1 Le funzioni F0 e F1 determinano quale operazione dovrà svolgere l’ALU (in questo caso somma), disabilitando i fili che vanno negli AND degli altri operatori (AND, OR, NOT) 10 1 0 1 0 10 1 1 1 1 Essendo operatori “and” che in input ricevono uno zero, indipendentemente dal secondo input, il risultato sarà zero. 0 0 0 1 0 Il decodificare (decoder) ha così svolto il compito che gli avevamo assegnato, ovvero quello di disabilitare operatori che non fossero di somma. 0 1 0 1 1 1 Supponiamo di calcolare la somma tra le variabili in ingresso: A=1 B=1 Ricordiamo che di default: 1 EnA=1 EnB=1 InvA=0 0 1 1 1 0 Ricordiamo che i valori entranti dei tre operatori della logical unit possono essere trascurati, perché disabilitati. 1 0 1 1 0 1 1 0 0 111 1 1 Il full adder, valutando le variabili in ingresso e non dimenticandosi del carry in, elabora i risultati relativi al carry out e sum che andrà nell’OR finale. 0 1 0 1 1 11 1 1 1 Ecco così i nostri risultati! Carry in: 1 Output: 1 + 1 = 1 Carry out 1 + 1 = La tavola di verità Con la tavola di verità si rappresentano tutte le possibili combinazioni in uscita a partire dalle diverse variabili in entrata, tenendo conto di eventuali carry in. In particolare, studiamo il caso in cui il valore delle variabili in ingresso non cambia, ma il carry in è uguale a “0”. 0 0 0 111 1 1 0 0 0 1 1 10 0 1 0 Carry in: 0 Output (1 + 1)= 1 Carry out (1 + 1)= C.V.D. 8 bit ALU VERSO DI LETTURA Segnali di controllo (F0 F1 ) Ad ogni ALU arrivano le stesse istruzioni dei segnali di controllo Variabili in ingresso ( A, B ) Le variabili in ingresso A e B si dividono in due famiglie che rappresentano i due numeri da 8 digit che noi stiamo , per esempio, sommando. Tra tre slide vedremo come ognuno di questi digit avrà un peso diverso nella funzione in uscita. I Valori di default: EnA, EnB, InvA Tali valori vengono assunti di default come: InvA=0 EnA=1 EnB=1 Carry Out e Carry In L’overflow è generato delle operazioni aritmetiche che danno un risultato troppo grande per essere memorizzato nello spazio che il programmatore aveva messo a disposizione per il risultato stesso. Le funzioni di Carry in e Carry out si muovono tra coppie consecutive di ALU, una volta che il primo Carry in è stato introdotto (di default=0). Variabili in uscita (output) Il valore finale delle variabili in uscita compone un numero di otto digit che, per esempio, è il risultato di una somma. Ogni cifra, l’output di ciascun ALU, ha un peso diverso all’interno del numero, ovvero rappresenta una diversa potenza di due in codice binario. Quindi è importante il verso di lettura di un 8-bit ALU, perché ci da l’ordine delle potenze.