OBBIETTIVO:
Realizzare un moltiplicatore binario associato ad una control unit.
PROCEDIMENTO:
Per prima cosa realizziamo la CONTROL UNIT necessaria per l’automatizzazione del moltiplicatore.
La Control Unit la creiamo seguendo il modello di Moore, automa a stato finito che risolve il sistema in modo automatico, in esso lo stato successivo (stato_s) dipende solo dallo corrente (stato_c) e dall’ingresso. L’uscita invece dipende solo dallo stato. Per stato s’intende la condizione in cui si trova il sistema in un certo istante.
Nel nostro caso abbiamo ben 7 stati diversi:
- Reset, (da non confondere con la variabile “reset_in”) che rappresenta lo stato iniziale.
- Load, che rappresenta lo stato nel quale vengono richieste le sequenze di bit da moltiplicare, si passa dallo stato reset a questo stato solamente se la variabile mol_in è uguale a 1.
- Shift (1, 2, 3, 4), rappresentano le traslazioni dei bit nella fase della moltiplicazione, questa sequenza di stati è automatica, ad ogni colpo di clock viene controllato solamente se il pulsante reset (variabile), è attivato o meno e se la variabile moltiplicazione è sempre uguale ad 1 perché se così non fosse, si bloccherebbe allo stato corrente e il processo non andrebbe avanti.
- Risultato, che rappresenta lo stato finale, si raggiunge questo stato solamente se si è passati attraverso tutti gli altri.
Realizziamo prima il diagramma a stati sulla piattaforma di www.draw.io:
Con il quale possiamo scrivere il codice in VHDL: (screen di notepad++)
Testiamo il codice VHDL attraverso il Testbench:
Attraverso il Testbench possiamo notare il corretto funzionamento della Control Unit, perché se attiviamo il reset_in si ricomincia da capo (si riparte dallo stato inziale) , se attiviamo mol_in si verificano i cambiamenti di stati e se durante i cambiamenti di stati spegnamo mol_in si blocca tutto.
La control unit funziona perfettamente.
Bene, arrivati a questo punto possiamo procedere con la realizzazione del vero e proprio MOLTIPLICATORE.
Partiamo come sempre dallo schema che ho realizzato sempre sulla piattaforma www.draw.io:
Come possiamo notare il moltiplicatore è composto da quattro registri:
- mld e mlr che corrispondono ai due numeir in binario da moltiplicare.
- reg_acc (registro accomulatore), che man mano fa la somma.
- reg_ris (registro risultato) che quando gli arriva il risultato finale, e il ris_ready è a 1, lo mette in uscita (uscita del moltiplicatore).
Con questo schema possiamo scrivere il codice in VHDL: (screen di notepad++)
Testiamo il codice VHDL attraverso il Testbench:
Attraverso il Testbench possiamo notare il corretto funzionamento del moltiplicatore a 4 bit, perché con l’attivazione del “reset” si azzera tutto, con l’attivazione del bit “onoff” (ovvero il bit che attiva la moltiplicazione) il moltiplicatore inizia a “lavorare”, carica i dati nei registri mlr e mld (in questo caso 1010 e 0001), e inizia il ciclo, quando il risultato è pronto si attiva il bit ris_ready che è collegato alla control unit e gli dice che il risultato è pronto.
Ed anche il moltiplicatore sembra funzionare, per vedere se realmente funziona, implementiamolo sulla scheda (nexys 4).
Implementiamolo in questo modo:
- le variabili “onoff” e il “reset” le impostiamo con dei pulsanti.
- per impostare i due numeri in binario da moltiplicare usiamo gli switch (partendo da destra verso sinistra, i quattro bit mld e gli altri quattro per mlr).
- per l’uscita del risultato finale (“ris_finale”) utilizziamo otto led, se i led si accendono corrisponderanno a 1, saranno uguali a zero nel caso contrario.
- per visualizzare il bit che ci dice che il risultato (“ris_ready”) è pronto utilizziamo un altro led, per comodità lontano dai precendeti.
Una volta implementato il tutto, testiamolo con una qualsiasi moltiplicazione in binario:
in questo caso 1011 x 1100 (mld x mlr), assegnamo questi valori tramite gli switch posti nella parte bassa della scheda (tasto verso l’alto = 1, verso il basso = 0):
Premiamo il tasto “onoff” e vediamo cosa succede:
Il moltiplicatore a 4 bit funziona perfettamente, perché:
- 1011 x 1100 = 10000100 (11 x 12 = 132).
- i led si accendono perfettamente in base al risultato.
- il led che corrisponde a “ris_ready” viene acceso solo quando il risultato è pronto.
- premendo il tasto “reset” si spengono tutti i led perché si azzera tutto.
- solo quando si preme il tasto “onoff” la moltiplicazione viene effettuata.
Romano Mirko 4G
Nessun commento:
Posta un commento