This is an old revision of the document!
= Laboratorul 10 - Calculatorul Didactic: Adresarea indirectă =
Scopul laboratorului este de a completa instrucțiunile implementate până acum cu noi moduri de adresare, și anume: adresarea indirectă prin registru și adresarea indirectă prin sumă de registre. După cum știm, specificarea modului de adresare a unui operand se face în câmpul MOD din codificarea instrucțiunii. Modurile de adresare pe care le vom implementa în cadrul acestui laborator sunt identificate prin valoarea 00 a câmpului MOD.
Ca și în cazul laboratorului anterior, veți avea de modificat modulul unității de comandă pentru a introduce decodificarea și comandarea prin semnale a execuției instrucțiunilor cu modurile de adresare menționate mai sus.
Detaliile referitoare la componentele calculatorului didactic, codificarea instrucțiunilor (registrul RI) și modurile de adresare le găsiți în curs și în cheat sheet.
Procesorul calculatorului didactic suportă mai multe moduri de adresare a operanzilor. Până acum am tratat doar cazul operanzilor aflați în registre (adresare directă la registru), identificat prin câmpul MOD având valoarea 11. Cu acest mod de adresare suntem însă limitați la a lucra numai cu cele 8 registre generale. Pentru a putea lucra și cu date aflate în memoria RAM, procesorul calculatorului didactic oferă o serie de alte moduri de încărcare a operanzilor.
Încărcarea unui operand din memoria RAM necesită determinarea adresei la care se află stocat acel operand. Aceasta poate fi stocată direct în instrucțiune, cum se întâmplă în cazul adresării directe, unde instrucțiunea este formată din 2 cuvinte (pe 16 biți), iar al doilea cuvânt conține valoarea adresei (numită și deplasament), sau poate fi calculată folosind diferite combinații de registre cu/fără deplasament. Calculul se face prin adunarea valorilor curente ale unor registre (nu toate combinațiile sunt suportate) și folosirea valorii rezultate ca o adresă pentru memorie.
Adresa efectivă se găsește într-unul din registrele XA, XB, BA sau BB. Modul de determinare a acesteia este prezentat în <imgref addr_reg>.
Ex: mov RA, [BA]
<imgcaption addr_reg center | Adresare indirectă prin registru></imgcaption>
Adresa efectivă se obține prin sumarea conținutului unui registru de bază (BA sau BB) cu conținutul unui registru index (XA sau XB). Modul de determinare a acesteia este prezentat în <imgref addr_sum>.
Ex: mov RA, [BA + XA]
<imgcaption addr_sum center | Adresare indirectă prin sumă de registre></imgcaption>
Automatul care trebuie implementat în UC este descris în diagrama de stări din <imgref state_diagram>.
<imgcaption state_diagram center | Diagrama de stări a unității de comandă></imgcaption>
După cum puteți observa, la stările deja implementate în laboratoarele anterioare au fost adăugate o serie de stări noi, necesare pentru adresarea indirectă prin registru sau sumă de registre. În cadrul acestui laborator va trebui să implementați aceste noi stări și să completați condițiile corecte pentru decodificarea noilor moduri de adresare.
<hidden Modificarea conținutului memoriei RAM a calculatorului didactic>
Memoria calculatorului didactic este implementată cu ajutorul unui IP Core Xilinx de tipul Block Memory. Parametrii unui core sunt stocați într-un fișier .xco. Acest fișier este folosit de utilitarul de generare a IP Core-urilor pentru a genera o instanță a core-ului selectat. Core-ul de tip Block Memory oferă o serie de parametri care pot fi configurați, precum dimensiunea cuvântului, numărul de cuvinte și semnalele disponibile. Block Memory oferă și posibilitatea inițializării memoriei în momentul generării. Conținutul memoriei poate fi specificat într-un fișier .coe referențiat apoi de fișierul .xco. În figura de mai jos puteți observa formatul fișierul .coe. Valorile din fișier sunt mapate în memoria generată începând de la adresa 0.
<imgcaption ram_coe center |Fisierul ram.coe></imgcaption>
Conținutul inițial al memoriei calculatorului didactic se găsește în cadrul acestui fișier. După fiecare modificare a fișierului .coe, memoria care folosește acel fișier trebuie regenerată. În cazul nostru, după modificarea fișierului ram.coe trebuie regenerat modulul ram pentru ca modificările să aibă efect. Pentru aceasta, se selectează din fereastra Sources modulul ram, iar din fereastra Processes se inițiază regenerarea, cu opțiunea Regenerate Core. </hidden>