Differences

This shows you the differences between two versions of the page.

Link to this comparison view

ac-is:lab:lab10 [2021/09/20 18:36]
127.0.0.1 external edit
ac-is:lab:lab10 [2024/01/11 20:03] (current)
teodor.dicu
Line 1: Line 1:
-= Laboratorul 10 - Calculatorul Didactic: Adresarea indirectă ​ =+====== 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//. 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//.
Line 7: Line 7:
 Detaliile referitoare la componentele calculatorului didactic, codificarea instrucțiunilor (registrul RI) și modurile de adresare le găsiți în {{..:​resurse:​ac5.pdf| curs}} și în {{..:​resurse:​cheat-sheet.pdf| cheat sheet}}. Detaliile referitoare la componentele calculatorului didactic, codificarea instrucțiunilor (registrul RI) și modurile de adresare le găsiți în {{..:​resurse:​ac5.pdf| curs}} și în {{..:​resurse:​cheat-sheet.pdf| cheat sheet}}.
  
-== Moduri de adresare ==+ 
 +===== Moduri de adresare ===== 
  
 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. 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.
Line 13: Line 15:
 Î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. Î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.
  
-=== Adresarea indirectă prin registru === 
  
-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>​.+==== Adresarea indirectă prin registru ==== 
 + 
 + 
 +Adresa efectivă se găsește într-unul din registrele //XA//, //XB//, //BA// sau //BB//. Modul de determinare a acesteia este prezentat în imaginea de mai jos.
  
 Ex: ''​mov RA, [BA]''​ Ex: ''​mov RA, [BA]''​
  
-<​imgcaption addr_reg center | Adresare indirectă prin registru>​{{.:​lab10:​addr_reg.png?​nolink | Adresare indirectă prin registru}}</​imgcaption>+{{ .:​lab10:​addr_reg.png?​nolink | Adresare indirectă prin registru}} 
 +<​html><​p align="​center">​Adresare indirectă prin registru</​p>​</html> 
  
 === Adresarea indirectă prin sumă de registre === === Adresarea indirectă prin sumă de registre ===
  
-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>​+ 
 +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 imaginea de mai jos
  
 Ex: ''​mov RA, [BA + XA]''​ Ex: ''​mov RA, [BA + XA]''​
  
-<​imgcaption addr_sum center | Adresare indirectă prin sumă de registre>​{{.:​lab10:​addr_sum.png?​nolink | Adresare indirectă prin sumă de registre}}</​imgcaption>+{{ .:​lab10:​addr_sum.png?​nolink | Adresare indirectă prin sumă de registre}} 
 +<​html><​p align="​center">​Adresare indirectă prin sumă de registre</​p>​</html>
  
-== Implementare == 
  
-Automatul care trebuie implementat în UC este descris în diagrama de stări din <imgref state_diagram>​.+==== Implementare ====
  
-<​imgcaption state_diagram center | Diagrama ​de stări ​a unității ​de comandă>​{{.:​lab10:​mod_00_states.png?​700| Diagrama de stări a unității de comandă}}</​imgcaption>+ 
 +Automatul care trebuie implementat în UC este descris în diagrama ​de stări ​din figura ​de mai jos. 
 + 
 +{{ .:​lab10:​mod_00_states.png?​700 | Diagrama de stări a unității de comandă}} 
 +<​html><​p align="​center">​Diagrama de stări a unității de comandă</​p>​</html>
  
 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. 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>​+<spoiler ​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. 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>{{.:​lab10:​change_coe.png?​nolink&​437 | Fisierul ​ram.coe}}</​imgcaption>+{{ .:​lab10:​change_coe.png?​nolink&​437 | Fișierul ​ram.coe}} 
 +<​html><​p align="​center">​Fișierul ram.coe</​p>​</html>
  
 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//. 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>+</spoiler>
  
-== Exerciții ==+ 
 +===== Exerciții ​=====
  
   - **(4p)** Încărcarea operandului sursă folosind modul de adresare indirectă prin registru.   - **(4p)** Încărcarea operandului sursă folosind modul de adresare indirectă prin registru.
     - Adăugați starea //​addr_reg//​ de determinare a adresei în cazul adresării indirecte prin registru.     - Adăugați starea //​addr_reg//​ de determinare a adresei în cazul adresării indirecte prin registru.
-      * Hint: Stocați adresa determinată în registrul temporar corespunzător operandului (operandul destinație -> //T1//, operandul sursă -> //T2//).+      * //Hint//: Stocați adresa determinată în registrul temporar corespunzător operandului (operandul destinație -> //T1//, operandul sursă -> //T2//).
     - Adăugați stările //​load_src_mem//​ de încărcare a operandului sursă din memorie.     - Adăugați stările //​load_src_mem//​ de încărcare a operandului sursă din memorie.
-      * Hint: Adresa operandului a fost calculată și se află în registrul temporar corespunzător operandului sursă (//T2//). +      * //Hint//: Adresa operandului a fost calculată și se află în registrul temporar corespunzător operandului sursă (//T2//). 
-      * Hint: Urmăriți stările //fetch// pentru un exemplu de citire a unei valori din memorie.+      * //Hint//: Urmăriți stările //fetch// pentru un exemplu de citire a unei valori din memorie.
     - Adăugați condițiile de decodificare a modului de calcul al adresei și a locației operandului sursă     - Adăugați condițiile de decodificare a modului de calcul al adresei și a locației operandului sursă
     - După implementarea corectă se vor executa instrucțiunile 1-13 din test.     - După implementarea corectă se vor executa instrucțiunile 1-13 din test.
   - **(2p)** Încărcarea operandului sursă folosind modul de adresare indirectă prin sumă de registre.   - **(2p)** Încărcarea operandului sursă folosind modul de adresare indirectă prin sumă de registre.
     - Adăugați stările //​addr_sum//​ de calculare a adresei în cazul adresării indirecte prin sumă de registre.     - Adăugați stările //​addr_sum//​ de calculare a adresei în cazul adresării indirecte prin sumă de registre.
-      * Hint: Stocați adresa calculată în registrul temporar corespunzător operandului (operandul destinație -> //T1//, operandul sursă -> //T2//).+      * //Hint//: Stocați adresa calculată în registrul temporar corespunzător operandului (operandul destinație -> //T1//, operandul sursă -> //T2//).
     - După implementarea corectă se vor executa instrucțiunile 1-15 din test.     - După implementarea corectă se vor executa instrucțiunile 1-15 din test.
   - **(2p)** Încărcarea operandului destinație folosind cele două moduri de adresare.   - **(2p)** Încărcarea operandului destinație folosind cele două moduri de adresare.
     - Adăugați stările //​load_dst_mem//​ de încărcare a operandului destinație din memorie.     - Adăugați stările //​load_dst_mem//​ de încărcare a operandului destinație din memorie.
-      * Hint: Adresa operandului a fost calculată și se află în registrul temporar corespunzător operandului destinație (//T1//).+      * //Hint//: Adresa operandului a fost calculată și se află în registrul temporar corespunzător operandului destinație (//T1//).
     - Adăugați condițiile de decodificare a locației operandului destinație.     - Adăugați condițiile de decodificare a locației operandului destinație.
     - După implementarea corectă se vor executa instrucțiunile 1-18 din test.     - După implementarea corectă se vor executa instrucțiunile 1-18 din test.
   - **(2p)** Salvarea rezultatului folosind cele două moduri de adresare.   - **(2p)** Salvarea rezultatului folosind cele două moduri de adresare.
     - Adăugați stările //​store_mem//​ de stocare a rezultatului în memorie.     - Adăugați stările //​store_mem//​ de stocare a rezultatului în memorie.
-      * Hint: Adresa destinației se află încă stocată în registrul //AM//. De ce? +      * //Hint//: Adresa destinației se află încă stocată în registrul //AM//. De ce? 
-      * Hint: Memoria are nevoie de un ciclu de ceas pentru a face scrierea după ce a primit adresa, valoarea si semnalul de scriere. Introduceți o întârziere de 1 ciclu.+      * //Hint//: Memoria are nevoie de un ciclu de ceas pentru a face scrierea după ce a primit adresa, valoarea si semnalul de scriere. Introduceți o întârziere de 1 ciclu.
     - Adăugați condițiile de decodificare a locației rezultatului.     - Adăugați condițiile de decodificare a locației rezultatului.
     - După implementarea corectă se vor executa toate instrucțiunile (40) din test.     - După implementarea corectă se vor executa toate instrucțiunile (40) din test.
   - **(1p)** Testați corectitudinea implementării pe FPGA.   - **(1p)** Testați corectitudinea implementării pe FPGA.
-    * Hint: Urmăriți comentariile din programul de test (aflat în //​tests/​mod_00/​test.asm//​) pentru a vedea rezultatele așteptate.+    * //Hint//: Urmăriți comentariile din programul de test (aflat în //​tests/​mod_00/​test.asm//​) pentru a vedea rezultatele așteptate. 
 + 
 + 
 +===== Resurse ===== 
  
-== Resurse == 
   * {{.:​lab09:​sol:​lab10_skel.zip|Schelet de cod}}   * {{.:​lab09:​sol:​lab10_skel.zip|Schelet de cod}}
-  ​* {{.:​lab10:​sol:​lab10_sol.zip|Soluție laborator}} (disponibilă începând cu 7.12.2019) +  * <​html><​a class="​media mediafile mf_pdf"​ href="https://ocw.cs.pub.ro/courses/​ac-is/​lab/​lab10?​do=export_pdf">​PDF laborator</​a></​html>​
-  ​* <​html><​a class="​media mediafile mf_pdf"​ href="/​ac/wiki/​lab/​lab10?​do=export_pdf">​PDF laborator</​a></​html>​+
   * {{..:​resurse:​cheat-sheet.pdf|Cheat-sheet calculator didactic}}   * {{..:​resurse:​cheat-sheet.pdf|Cheat-sheet calculator didactic}}
   * {{..:​resurse:​ac5.pdf|Arhitectura calculatorului didactic}}   * {{..:​resurse:​ac5.pdf|Arhitectura calculatorului didactic}}
 +  * {{.:​lab10:​sol:​lab10_sol_tester.zip|Solutie laborator 10 + tester}}
  
  
-<ifauth @user>+<ifauth @ac-is>
 ---- ----
-  * [[:​internal:​mod00|Ghid asistent]]+  * [[ac-is:internal:guidelines|Ghid asistent]] 
 +  * {{.:​lab10:​sol:​lab10_sol_tester.zip|Solutie laborator 10 + tester}} 
 +  * {{.:​lab10:​sol:​lab10_sol.zip|Solutie laborator 10}}
 </​ifauth>​ </​ifauth>​
ac-is/lab/lab10.1632152205.txt.gz · Last modified: 2021/09/27 17:10 (external edit)
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0