Esercizio Rete Combinatoria ALU a un ingresso di 32 bit

Clauc87
Qualcuno saprebbe darmi una mano per questo esercizio?
Sono sicura che sarà sicuramente una fesseria, e magari scandalosamente facile, ma lo sto fissando da due giorni e giuro che non riesco a capire come posso farlo... :-S

"Si consideri la rete combinatoria con la seguente specifica (ingresso A di 32 bit, uscita Z di 32 bit):
Z= A , se A pari e A>0
A+1 , se A dispari e A>0
|A|, altrimenti

1. Sintetizzare la rete combinatoria
2. Calcolare il tempo di stabilizzazione della rete, assumendo Nc=4 e Talu=5Tp"

So fare gli esercizi sulle reti combinatorie con qualsiasi altra porta logica, ma adesso che mi ritrovo dinanzi ad una ALU non so che fare!
Non so come fare capire in termini informatici il valore da assegnare all'uscita quando A è pari o dispari o altro...

Aiuto!

Risposte
Rggb1
Un problema più ingegneristico che informatico...

Comunque assumo (andrà bene?) che A/32 sia rappresentato con segno. Quindi se bit31=1 sommo zero a A/31, se bit31=0 && bit0=1 sommo 1 a A/31, se bit31=0 && bit0=0 sommo zero a A/31... quindi una rete di due ingressi a un bit, alla quale aggiungi un sommatore. No?

apatriarca
@Rggb: Immagino che con |A| si intenda il valore assoluto del numero. In questo caso è certamente falso che "se bit31=1 sommo zero a A/31". Direi piuttosto che in questo caso è necessario invertire il numero. Nel caso di complemento a due sarebbe necessario invertire i bit del numero e sommare uno. Si può ad esempio fare con delle porte XOR e usando il sommatore già implementato per i numeri positivi.

Clauc87
???

Non ho mai visto una risoluzione che scrive cosi il bit...
No, non credo che sia quello che devo fare io :-(

Rggb1
@apatriarca
Certo, certo: assumevo modulo e segno, e probabilmente il complemento è l'assunzione corretta.

@Clauc87
Ho solo scritto una notazione 'inline', per così dire, ma ignoriamola: è corretto dire che devi disegnare uno schema con le linee che collegano gli ingressi alle porte logiche, alle uscite e così via? Perché se così non è, magari spiega più approfonditamente quel che devi fare ché io non ho capito... :?

Clauc87
Eh si, penso proprio di dover fare la rete combinatoria !
Ma non saprei come "dire" al sistema che l'uscita deve valere a quando pari e positivo, a+1 quando dispari e positivo e modulo di a negli altri casi...

apatriarca
Che cosa non ti è chiaro delle nostre risposte? Suppongo che \(A\) e \(Z\) siano numeri a \(32\)-bit con segno a complemento a due. La funzione che devi implementare è la seguente (\(a_i\) e \(z_i\) sono rispettivamente gli \(i\)-esimi bit di \(A\) e \(Z\)):
\[ Z = \begin{cases} |A| & \text{se } A < 0 \\ A + a_0 & \text{altrimenti} \end{cases} \]
Infatti \(a_0 = 0\) quando \(A\) è pari e \(a_0 = 1\) quando \(A\) è dispari. A questo punto posso osservare che \(A\) è uguale a \(NOT(A) + 1\) (nego cioè tutti i bit e aggiunto uno). Ricordando che \(a_{31} = 1\) quando \(A < 0\), che \(a_{31} = 0\) negli altri casi, che \(XOR(A, 1) = NOT(A)\) e che \(XOR(A, 0) = A\), posso infine riscrivere tutto nella seguente forma (or piccolo agisce sul singolo bit mentre quello tutto maiuscolo su tutti e 32 bit):
\[ Z = XOR(A, a_{31}) + or(a_{31}, a_{1}) \]
A questo punto non resta che scrivere un sommatore a 32 bit e mandargli in ingresso quei valori. Di fatto non stai realmente sommando due numeri ma è sufficiente implementare la parte che si occupa del calcolo del carry bit. E' scritto un po' male ma spero si capisca. In altri termini dovresti ottenere il seguente:
\[ c_0 = or(a_{31}, a_1), \quad b_i = xor(a_i, a_{31}), \quad z_{i} = xor(b_i, c_i), \quad c_i = and(b_{i-1}, c_{i-1}) \]

Rggb1
@apatriarca
Esattamente quel che intendevo.
[ot]Però! In poche righe, una spiegazione - per me - chiarissima. Mai pensato di insegnare? Perché se le tue capacità orali son anche solo la metà delle tue capacità di scrittura, direi ci sei portato.[/ot]
@Clauc87
Ti è più chiaro adesso?

Clauc87
Si adesso mi è più chiaro, la spiegazione di apatriarca l'ho quasi capita :-P
Però c'è una cosa che non capisco, il testo mi chiede di prendere A quando è pari e positivo, A+1 quando è dispari e positivo, e |A| negli altri casi; infatti apatriarca scrive di prendere |A| se è negativo e A+a0 negli altri casi, dove a0 (che a quel che ho capito è il primo bit di A) può valere o 0 se A è pari, oppure 1 se è dispari.
Ma praticamente è come se stessi sommando un bit?

E poi non capisco la parte finale... dove ci sono le formule risultanti...

Scusatemi tantissimo se magari sto chiedendo cose stupide, ma queste esercizio il docente ce l'ha dato cosi, diverso da tutti gli altri, senza spiegarci come svolgere le operazioni tra bit (che è probabile debbano essere tra i prerequisiti che gli altri studenti hanno, ma io sto seguendo il corso singolo e potrei non averli...)

Grazie mille per l'aiuto che mi state dando!

apatriarca
Ci sono certamente alcune imprecisioni a livello di notazione. In particolare, quando ho scritto \(A + a_0\) intendevo dire che devi sommare ad \(A\) il valore corrispondente al suo bit meno significativo visto come intero a \(32\)-bit. Devi quindi calcolare la somma tra \(A\) e \(0000\,0000\,0000\,0000\,0000\,0000\,0000\,000a_0\).

D'altra parte, quando ho scritto \(XOR(A, a_{31})\), \(a_{31}\) non rappresenta il numero intero a \(32\)-bit che vale \(0\) o \(1\) a seconda del valore del bit, ma al numero a \(32\) bit composto da \(32\) bit uguali ad \(a_{31}\). Cioè a \(0000\,0000\,0000\,0000\,0000\,0000\,0000\,0000\) oppure a \(1111\,1111\,1111\,1111\,1111\,1111\,1111\,1111\) a seconda del valore di \(a_{31}\). In altre parole, \(B = XOR(A, a_{31})\) è equivalente nella notazione del post precedente a \(b_i = xor(a_i, a_31)\).

Le formule finali sono ottenute "implementando" un sommatore che sommi \(B\), definito nel capoverso precedente, e il valore a \(32\) bit il cui valore è uguale a \(or(a_{31}, a_0)\). È cioè uguale a \(1\) se almeno uno tra \(a_31\) e \(a_0\) è uguale a \(1\). Ho quindi operato alcune semplificazioni dovute al fatto che la maggior parte dei bit del secondo addendo sono nulli.. Nota che \(c\) sta per carry..

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.