This is an old revision of the document!
= Laboratorul 8 - Calculatorul Didactic: Instrucțiuni cu un operand =
Obiectivul acestui laborator și al celor care urmează după el, îl reprezintă familiarizarea cu formatul instrucțiunilor calculatorului didactic și cu modul de funcționare al unității de comandă. În acest scop se vor implementa în Verilog interpretarea și comandarea execuției pentru instrucțiunile specificate în arhitectura calculatorului didactic studiat la curs. În laboratorul curent vom implementa unitatea de comandă pentru instrucțiunile aritmetice și logice cu un singur operand.
Componentele calculatorului didactic implementate în laboratoarele precedente ( registre, ual) formează unitatea de execuție a procesorului. Pentru ca acestea să rețină date și să execute instrucțiunile procesorului, avem nevoie de o logică hardware de comandă a acestora, logică implementată în unitatea de comandă.
În interiorul unui procesor, instrucțiunile trec prin mai multe etape. Pentru calculatorul didactic avem următoarele faze:
Unitatea de comandă este implicată în toate etapele de mai sus: comandă prin semnalare aducerea codurilor instrucțiunilor din memorie, le decodifică și transmite semnale către unitățile (registre, ual, memorie) implicate în execuția acelor instrucțiuni. La terminarea execuției fiecărei instrucțiuni se comandă scrierea rezultatului (dacă este cazul) și se actualizează registrul CP (Contor Program) cu adresa instrucțiunii următoare.
INC RA
.
Unitatea de comandă este implementată ca un automat de stări. Modulul acesteia are următoarele semnale: * intrări: clk, rst, ri (codul instrucțiunii), ind (indicatorii de condiție) * ieșiri:
Automatul trebuie să ofere stări pentru:
<tabcaption table1 center| Instrucțiuni aritmetice-logice cu un operand>
Instrucțiune | Funcție | Cod RI[0:6] |
---|---|---|
INC | op = op + 1 | 0001 000 |
DEC | op = op - 1 | 0001 001 |
NEG | op = -op | 0001 010 |
NOT | op = ~op | 0001 011 |
SHL/SAL | op = op << 1 | 0001 100 |
SHR | op = op >> 1 | 0001 101 |
SAR | op = op >>> 1 | 0001 110 |
</tabcaption>
INC RA
grupul este cel al operațiilor cu calcul de adresă efectivă (RI[0] = 0), cu un singur operand (RI[1] = 0), fără operand imediat (RI[2] = 0) și cu salvarea rezultatului (RI[3] = 1).
Pentru orice procesor, fiecare instrucțiune definită în arhitectura setului său de instrucțiuni, are un anumit cod unic după care este identificată. Atunci când se stochează o instrucțiune care lucrează cu cel puțin un operand, nu este suficient să avem doar codul său (care indică ce acțiune trebuie efectuată), ci trebuie să avem și niște biți care să ne indice de unde luăm operanzii, așa cum este ilustrat și în <imgref image1>.
<imgcaption image1| Formatul instrucțiunilor calculatorului didactic></imgcaption>
* COP - codul operației, 7 biți
* d - pentru instrucțiunile cu doi operanzi, folosit pentru a ști care e primul și care e al doilea dintre cele două câmpuri REG și RM din codul instrucțiunii:
* MOD - modul de calcul al adresei efective (4 moduri - 2 biți) * REG - indexul registrului care conține unul dintre operanzi * RM - indexul registrului care conține unul dintre operanzi
DEC RB
:
* [0] = 0 - cu calcul de adresă efectivă
* [1] = 0 - un operand
* [2] = 0 - fără operand imediat
* [3] = 1 - operație aritmetică cu salvarea rezultatului
* [4,5,6] = [0,0,1] - codul dat operației (stabilit de arhitectură)
* [7] = 0/1 - nu contează, îl putem pune 0 sau 1
* [8,9] = [1,1] - modul de adresare (directă la registru)
* [10,11,12] = [0,0,0] - nu folosim REG, deci nu contează ce punem
* [13,14,15] = [0,0,1] - indexul registrului RB în bancul de registre
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 |
Modificați modulul uc.v din scheletul de cod al laboratorului, astfel încât să implementați instrucțiunile din tabelul <tabref table1>. Citiți secțiunea de implementare.
Testați întâi corectitudinea implementării folosind testerul offline. Apoi testați pe placă. Ram-ul are încărcate instrucțiunile din tests→one_operand→test.asm.
Fișierul calc_didatic→ram.coe conține instrucțiunile programului din fișierul de test reprezentate în sistem hexazecimal. Adresa fiecărei instrucțiuni este dată de indicele instrucțiunii respective în vectorul de inițializare al memoriei.
Pentru a schimba programul rulat pe placă este suficient să modificați fișierul calc_didatic→ram.coe, urmând ca apoi să dați yes la regenerate core.
Pentru a schimba programul rulat de către tester modificați fișierul tests→one_operand→test.coe.
Interacțiunea cu butoanele de pe placă pentru afișajul pe display-ul LCD: