===== Unità Firmware Divisore di interi ===== === Descrizione unità === L'unità riceve una coppia di interi X e Y e restituisce in Q ed R il risultato ed il resto della divisione intera. Le richieste avvengono da una unità esterna tramite un protocollo a domanda-risposta che utilizza indicatori a transizione di livello. === Microprogramma di controllo === // RDY è l'indicatore a transiz. di livello in ingresso, ACK è quello in uscita // la comunicazione avviene a domanda/risposta // INX registro del dividendo // INY registro del divisore // Q registro per il risultato/quoziente // OUTR registro per comunicare il resto // OUTQ registro per comunicare il risultato // prima microistruzione: attesa di arrivo di una richiesta di divisione 0. (RDY=0) nop, 0, (=1) INX -> X, INY -> Y, 0 -> Q, 1. // continuo a sottrarre il divisore dal dividendo e ad incrementare il risultato // fino a che il divisore è maggiore o uguale a ciò che resta del dividendo // quando ho finito, mando il segnale di fine, resetto il segnale di richiesta // e trasferisco risultato e resto nei registri di interfaccia in uscita 1. (segno(X-Y)=0) X - Y -> X, Q + 1 -> Q, 1 (=1) X -> OUTR, Q -> OUTQ, reset RDY, set ACK, 0. === Schema della PO === {{:informatica:ae:schema.png?400|schemaPO}} {{ :informatica:ae:schemapo.pdf |Schema logico PO}} ==== Codice Verilog ==== I ritardi nel codice sono forzati. La compilazione del codice su una FPGA vera avrebbe determinato automaticamente la lunghezza del ciclo di clock ottenibile. * [[componentiDivisoreVerilog|componenti]] * [[ufDivisoreVerilog|Unità firmware]] * [[testDivisoreVerilog|test]] === Esempio di output === Esempio del risultato quando X=9 e Y=5. Le prime righe sono relative ai registri e wire del modulo di test. L'ultima riga rappresenta lo stato della PC. {{ :informatica:ae:gtkwave.png?600 |output GtkWave (9/5)}}