Table of Contents

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.

Unitatea de comandă

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.

Ce trebuie să facă unitatea de comandă atunci când trebuie executată o instrucțiune aritmetică logică cu un operand? De exemplu INC RA.

  1. Semnale către CP și AM: valoarea din CP e pusă pe magistrală și scrisă în AM;
  2. Semnale către AM și memorie pentru a lua valoarea (codul instrucțiunii) de la adresa specificată de AM;
  3. Semnal către RAM pentru a pune valoarea pe magistrală și către RI pentru a pune codul instrucțiunii în el;
  4. Decodificare instrucțiune;
  5. Semnal către blocul de registre generale pentru a determina activarea conținutului lui RA pe magistrală și semnal către T1 pentru a încărca valoarea aflata în acest moment pe magistrală;
  6. Semnal către UAL ce indică operația INC;
  7. Semnal către IND pentru ca UAL-ul să poată scrie flagurile;
  8. Semnal către blocul de registre generale pentru a încărca în RA valoarea de pe magistrală;
  9. Incrementarea CP pentru adresa instrucțiunii următoare - semnal către CP pentru a scrie în el.

Implementare

Unitatea de comandă este implementată ca un automat de stări. Modulul acesteia are următoarele semnale:

Automatul trebuie să ofere stări pentru:

În implementarea unității de comandă vom considera că UAL-ul va pune rezultatul în T1, și de acolo va fi transferat în registre sau în memorie. Această convenție face mai simple și mai clare stările care comandă execuția operațiilor aritmetice-logice.

Codificarea instrucțiunilor

Instrucțiune Funcție Cod RI[0:6]
INCop = op + 1 0001 000
DECop = op - 1 0001 001
NEGop = -op 0001 010
NOTop = ~op 0001 011
SHL/SALop = op << 1 0001 100
SHRop = op >> 1 0001 101
SARop = op >>> 1 0001 110

Instrucțiuni aritmetice-logice cu un operand

De exemplu, pentru instrucțiunea 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 imaginea de mai jos.

 Formatul instrucțiunilor calculatorului didactic

Formatul instrucțiunilor calculatorului didactic

Dacă MOD = 3 (adresare directă la registru) și instrucțiunea are un singur operand, acesta este pus în RM.

Se poate observa că în cadrul unora din grupurile de operații au rămas codificări nefolosite pe biții 4:6. Dacă se extinde setul de instrucțiuni cu noi operații (vedeți în curs :!:), atunci codul acestora poate fi unul din cele nefolosite (atâta timp cât se încadrează în acel grup).

Exemplu de calcul cod operație pentru instrucțiune 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

Exerciții

Modificați modulul uc.v din scheletul de cod al laboratorului, astfel încât să implementați instrucțiunile din tabelul prezentat anterior. Citiți secțiunea de implementare.

  1. (4p) Decodificați instrucțiunea INC RA.
    1. Identificați grupul de instrucțiuni în care se încadrează operația (inc) și operandul (RA).
    2. Transferați conținutul registrului RA în registrul T1
    3. Indicați UAL-ului să execute operația și puneți rezultatul în T1
      • registrul IND trebuie conectat la UAL ca să poată fi setate flagurile în urma execuției operației
    4. Transferați conținutul registrului T1 în registrul RA
  2. (1p) Generalizați instrucțiunea implementată la exercițiul anterior astfel încât să funcționeze cu orice registru general.
  3. (5p) Decodificați restul instrucțiunilor.

Testați întâi corectitudinea implementării folosind testerul offline. Apoi testați pe placă. Ram-ul are încărcate instrucțiunile din testsone_operandtest.asm.

Fișierul calc_didaticram.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_didaticram.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 testsone_operandtest.coe.

Interacțiunea cu butoanele de pe placă pentru afișajul pe display-ul LCD:

Resurse