Differences

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

Link to this comparison view

ac-is:lab:lab07 [2021/09/20 18:36]
127.0.0.1 external edit
ac-is:lab:lab07 [2023/12/03 12:09] (current)
ioana.dinu0810 [Resurse]
Line 1: Line 1:
-= Laboratorul 7 - Calculatorul Didactic: Unitatea Aritmetică-Logică =+====== Laboratorul 7 - Calculatorul Didactic: Unitatea Aritmetică-Logică ​======
  
 În cadrul acestui laborator se continuă implementarea în Verilog a procesorului didactic prezentat la  {{..:​resurse:​ac5.pdf| curs}} și în [[.:lab06| laboratorul 6]]. În cadrul acestui laborator se continuă implementarea în Verilog a procesorului didactic prezentat la  {{..:​resurse:​ac5.pdf| curs}} și în [[.:lab06| laboratorul 6]].
  
  
-== Unitatea aritmetică-logică ==+===== Unitatea aritmetică-logică ​=====
  
-Unitatea aritmetică-logică (<imgref ual>) este responsabilă de efectuarea operațiilor aritmetice și logice în timpul execuției instrucțiunilor. Operațiile primesc unul sau doi operanzi, iar UAL-ul în afară de producerea rezultatului setează și o serie de indicatori de condiții (eng. //flags//) rezultați în urma operațiilor. Operațiile disponibile în UAL derivă din instrucțiunile prezente în setul de instrucțiuni al procesorului didactic, însă nu au neapărat o corespondență 1-la-1 cu acestea. Unele operații sunt folosite în mai multe instrucțiuni,​ iar unele instrucțiuni folosesc mai multe operații. UAL-ul trebuie însă proiectat în așa fel astfel încât să cuprindă toate operațiile necesare în execuția instrucțiunilor disponibile în procesorul didactic. 
  
-<​imgcaption ual| Unitatea aritmetică-logică>{{ .:​lab07:​fig_ual.png?​300 | Unitatea aritmetică-logică}}</​imgcaption>+Unitatea aritmetică-logică ​este responsabilă de efectuarea operațiilor aritmetice și logice în timpul execuției instrucțiunilor. Operațiile primesc unul sau doi operanzi, iar UAL-ul în afară de producerea rezultatului setează și o serie de indicatori de condiții (eng. //flags//) rezultați în urma operațiilor. Operațiile disponibile în UAL derivă din instrucțiunile prezente în setul de instrucțiuni al procesorului didactic, însă nu au neapărat o corespondență 1-la-1 cu acestea. Unele operații sunt folosite în mai multe instrucțiuni,​ iar unele instrucțiuni folosesc mai multe operații. UAL-ul trebuie însă proiectat în așa fel astfel încât să cuprindă toate operațiile necesare în execuția instrucțiunilor disponibile în procesorul didactic. 
 + 
 +{{ .:​lab07:​fig_ual.png?​300 | Unitatea aritmetică-logică}} 
 +<​html><​p align="​center">​ Unitatea aritmetică-logică </p></html>
  
 Operanzii pe 16 biți sunt //op1// și //op2//, iar cei 4 biți //S// selectează operația ce va fi efectuată. Rezultatul este pus pe magistrală prin activarea semnalului //Enable//. Acesta este dezactivat de instrucțiunile care nu au nevoie de fapt de rezultatul operației, ci doar de indicatori (ex: //cmp//, //test//). Operațiile de adunare și scădere folosesc și un bit de carry/​borrow reprezentat prin semnalul //Carry//. Acesta este activat selectiv de instrucțiunile ADD/ADC (//add with carry//) și SUB/SBB (//​substract with borrow//), precum și alte instrucțiuni,​ pentru a obține rezultatul dictat de semantica instrucțiunii. Operanzii pe 16 biți sunt //op1// și //op2//, iar cei 4 biți //S// selectează operația ce va fi efectuată. Rezultatul este pus pe magistrală prin activarea semnalului //Enable//. Acesta este dezactivat de instrucțiunile care nu au nevoie de fapt de rezultatul operației, ci doar de indicatori (ex: //cmp//, //test//). Operațiile de adunare și scădere folosesc și un bit de carry/​borrow reprezentat prin semnalul //Carry//. Acesta este activat selectiv de instrucțiunile ADD/ADC (//add with carry//) și SUB/SBB (//​substract with borrow//), precum și alte instrucțiuni,​ pentru a obține rezultatul dictat de semantica instrucțiunii.
  
-=== Descrierea generală a registrului care conține indicatorii de condiţii (''​IND''​) === + 
 +==== Descrierea generală a registrului care conține indicatorii de condiţii (''​IND''​) ===
  
 Registrul de indicatori constituie o grupare a unor bistabili cu funcţii individuale,​ pozitionaţi la execuţia instrucţiunilor,​ în funcţie de rezultatul din unitatea aritmetică logică. Registrul ''​IND''​ permite alegerea unei secvenţe de execuţie următoare unei instrucțiuni aritmetice/​logice,​ în funcţie de rezultatul operației. Registrul de indicatori constituie o grupare a unor bistabili cu funcţii individuale,​ pozitionaţi la execuţia instrucţiunilor,​ în funcţie de rezultatul din unitatea aritmetică logică. Registrul ''​IND''​ permite alegerea unei secvenţe de execuţie următoare unei instrucțiuni aritmetice/​logice,​ în funcţie de rezultatul operației.
  
-=== Descrierea detaliată a indicatorilor de condiții ===  + 
-  * ''​T/​C''​ //​(transport,​ eng: carry)//: Este setat (poziţionat în "​1"​ ) dacă în urma unei adunări rezultă un transport dinspre rangul cel mai semnificativ,​ altfel ''​T''​ este şters (trecut în "​0"​). ​Transportul ''​T''​ este setat dacă în urma unei scăderi rezultă un împrumut în cel mai semnificativ bit al rezultatului,​ altfel este şters. Poate fi interpretat ca depăşire în instrucțiunile cu numere întregi fără semn. Poate fi utilizat în instrucțiunile ''​ADC''​ şi ''​SBB''​ pentru a efectua operaţii aritmetice în precizie multiplă. Poate fi testat cu instrucțiuni de salt condiţionat.+==== Descrierea detaliată a indicatorilor de condiții ===
 + 
 + 
 +  * ''​T/​C''​ //​(transport,​ eng: carry)//: Este setat (poziţionat în "​1"​ ) dacă în urma unei adunări rezultă un transport dinspre rangul cel mai semnificativ,​ altfel ''​T''​ este şters (trecut în "​0"​). 
 +    * Este setat dacă în urma unei scăderi rezultă un împrumut în cel mai semnificativ bit al rezultatului,​ altfel este şters. 
 +    * Poate fi interpretat ca depăşire în instrucțiunile cu numere întregi fără semn. Poate fi utilizat în instrucțiunile ''​ADC''​ şi ''​SBB''​ pentru a efectua operaţii aritmetice în precizie multiplă. Poate fi testat cu instrucțiuni de salt condiţionat.
   * ''​S''​ //​(semn)//: ​   * ''​S''​ //​(semn)//: ​
     * La execuţia operațiilor aritmetice şi logice, indicatorul S este setat la valoarea bitului cel mai semnificativ al rezultatului (bitul de semn). ​     * La execuţia operațiilor aritmetice şi logice, indicatorul S este setat la valoarea bitului cel mai semnificativ al rezultatului (bitul de semn). ​
Line 45: Line 54:
   * unele operații au efect asupra tutoror indicatorilor de condiție (exemplu ''​ADD''​),​ altele însă afectează doar o parte dintre aceștia.   * unele operații au efect asupra tutoror indicatorilor de condiție (exemplu ''​ADD''​),​ altele însă afectează doar o parte dintre aceștia.
  
-=== Descriere operații=== ​+ 
 +==== Descriere operații ====  
 + 
   * ''​ADC'':​   * ''​ADC'':​
     * ''​ADC''​ este un Full Adder, în care intrările sunt cei doi operanzi și carry-ul. ​     * ''​ADC''​ este un Full Adder, în care intrările sunt cei doi operanzi și carry-ul. ​
Line 55: Line 67:
     * ''​SBB2''​ scade operandul //op1// și bitul //Carry// din operandul //op2//.     * ''​SBB2''​ scade operandul //op1// și bitul //Carry// din operandul //op2//.
     * Flag-uri setate: T/C, S, Z, P, D/O.     * Flag-uri setate: T/C, S, Z, P, D/O.
- * ''​NOT'':​+  ​* ''​NOT'':​
     * ''​NOT''​ inversează individual fiecare bit al operandului.     * ''​NOT''​ inversează individual fiecare bit al operandului.
     * Flag-uri setate: S, Z, P (T/C si D/O sunt întotdeauna 0 în cazul operațiilor logice).     * Flag-uri setate: S, Z, P (T/C si D/O sunt întotdeauna 0 în cazul operațiilor logice).
Line 79: Line 91:
     * Flag-uri setate: S, Z, P, T (conține întotdeauna bitul deplasat în afară), D (e setat pe ''​1''​ doar dacă în urma operației bitul cel mai semnificativ - de semn - și-a schimbat valoarea, altfel e 0)     * Flag-uri setate: S, Z, P, T (conține întotdeauna bitul deplasat în afară), D (e setat pe ''​1''​ doar dacă în urma operației bitul cel mai semnificativ - de semn - și-a schimbat valoarea, altfel e 0)
  
-Sintaxa Verilog pentru operatorii artimetici și logici este prezentată în [[.:lab02| laboratorul 2]].+Sintaxa Verilog pentru operatorii artimetici și logici este prezentată în [[.:lab02#operatori| laboratorul 2]]. 
 + 
 + 
 +==== Operațiile de shiftare ====
  
-=== Operațiile de shiftare === 
  
 Operațiile de shiftare se împart în: shiftare logică, shiftare aritmetică,​ shiftare circulară fără carry, shiftare circulară cu carry. În acest laborator vom trata primele două tipuri de operații. Operațiile de shiftare se împart în: shiftare logică, shiftare aritmetică,​ shiftare circulară fără carry, shiftare circulară cu carry. În acest laborator vom trata primele două tipuri de operații.
  
-** Shiftare logică ​**+ 
 +=== Shiftare logică ​=== 
  
 O shiftare logică nu ține cont de semnul operandului. În cazul shiftării logice se ține cont doar de ordinea biților, iar pozițiile care rămân libere sunt umplute cu zerouri. O shiftare logică nu ține cont de semnul operandului. În cazul shiftării logice se ține cont doar de ordinea biților, iar pozițiile care rămân libere sunt umplute cu zerouri.
  
-În <imgref shl> și <imgref shr> ​se poate observa modul de execuție ​al shiftărilor logice. ​+În imaginile de mai jos se poate observa modul de execuție ​shiftărilor logice. ​
  
-<​imgcaption shl| Shiftare logică/​aritmetică la stânga>{{ .:​lab07:​shl.png?​200 |}}</imgcaption> +{{ .:​lab07:​shl.png?​200 | Shiftare logică la stânga}} 
-<imgcaption shr| Shiftare logică la dreapta>{{ .:​lab07:​shr.png?​200 |}}</imgcaption>+<html><p align="​center">​Shiftare logică la stânga</​p></html>
  
-Iar în <imgref shl_sal_exși <imgref shr_exgăsiți un exemplu practic de efectuare a shiftărilor logice spre stânga (''​SHL''​) și spre dreapta ​(''​SHR''​).+{{ .:​lab07:​shr.png?​200 | Shiftare logică la dreapta}} 
 +<html><p align="​center"​>Shiftare logică la dreapta</​p></​html>​
  
-<​imgcaption shl_sal_ex| Exemplu ​de shiftare logică/aritmetică la stânga>{{ .:​lab07:​shl_sal_example.png?​200 |}}</imgcaption> +Iar în figurile ​de mai jos găsiți un exemplu practic de efectuare a shiftărilor logice spre stânga ​(''​SHL''​) și spre dreapta (''​SHR''​). 
-<imgcaption shr_ex| ​Exemplu de shiftare logică la dreapta>{{ .:​lab07:​shr_example.png?​200 |}}</imgcaption>+ 
 +{{ .:​lab07:​shl_sal_example.png?​200 | Exemplu de shiftare logică la stânga}} 
 +<html><p align="​center">​Exemplu de shiftare logică la stânga</​p></​html>​ 
 + 
 +{{ .:​lab07:​shr_example.png?​200 | Exemplu de shiftare logică la dreapta}} 
 +<​html><​p align="​center">​Exemplu de shiftare logică la dreapta</​p>​</html>
  
 În Verilog, operatorii de shiftare logică sunt %%''<<''​%% și %%''>>''​%%. În Verilog, operatorii de shiftare logică sunt %%''<<''​%% și %%''>>''​%%.
  
-** Shiftare aritmetică ** 
  
-Spre deosebire de shiftarea logică spre dreapta (''​SHR''​),​ shiftarea aritmetică spre dreapta (''​SAR''​) nu umple spațiile rămase libere cu zerouri. În cazul ''​SAR'',​ spațiile rămase libere se umplu cu valoarea bitului cel mai semnificativ,​ care se replică de câte ori este nevoie (vezi <​imgref ​sar>).+=== Shiftare aritmetică === 
 + 
 + 
 +Spre deosebire de shiftarea logică spre dreapta (''​SHR''​),​ shiftarea aritmetică spre dreapta (''​SAR''​) nu umple spațiile rămase libere cu zerouri. În cazul ''​SAR'',​ spațiile rămase libere se umplu cu valoarea bitului cel mai semnificativ,​ care se replică de câte ori este nevoie (vezi imaginea de mai jos). 
 + 
 +{{ .:lab07:sar.png?200 | Exemplu de shiftare aritmetică la dreapta}} 
 +<html><p align="​center">​Exemplu de shiftare aritmetică la dreapta</​p></​html>​ 
 + 
 +{{ .:​lab07:​sar_2.png?​200 | Exemplu de shiftare aritmetică la dreapta}} 
 +<​html><​p align="​center">​Exemplu de shiftare aritmetică la dreapta</​p></​html>​
  
-<​imgcaption sar| Exemplu ​de shiftare aritmetică ​la dreapta>​{{ .:​lab07:​sar.png?​200 |}}</imgcaption>+În Verilog, operatorii ​de shiftare aritmetică ​sunt %%''​<<<''​%% și %%''​>>>''​%%. ​
  
-În Verilog, operatorii de shiftare aritmetică sunt %%''<<<''​%% și %%''>>>''​%%. ​:!: Aceștia au efectul scontat doar dacă variabila a fost declarată ''​signed''​ (ex: ''​reg signed [15:0] a;''​).+:!: Aceștia au efectul scontat doar dacă variabila a fost declarată ''​signed''​ (ex: ''​reg signed [15:0] a;''​).
  
-<note important>​Shiftarea logică spre stânga (''​SHL''​) și shiftarea aritmetică spre stânga (''​SAL''​) se efectuează în același mod (vezi <imgref shr>). Se păstrează,​ însă, ambele mnemonici (''​SHL''​ / ''​SAL''​) pentru a se putea păstra contextul folosirii acestora, logic sau aritmetic.</​note>​+<note important>​Shiftarea logică spre stânga (''​SHL''​) și shiftarea aritmetică spre stânga (''​SAL''​) se efectuează în același mod. Se păstrează,​ însă, ambele mnemonici (''​SHL''​ / ''​SAL''​) pentru a se putea păstra contextul folosirii acestora, logic sau aritmetic.</​note>​
  
 <note important>​Rezultatul shiftării cu ''​n''​ biți la stânga este echivalent cu înmulțirea cu 2<​sup>​n</​sup>​. Shiftarea la dreapta cu ''​n''​ biți este echivalentă cu împărțirea la 2<​sup>​n</​sup></​note>​ <note important>​Rezultatul shiftării cu ''​n''​ biți la stânga este echivalent cu înmulțirea cu 2<​sup>​n</​sup>​. Shiftarea la dreapta cu ''​n''​ biți este echivalentă cu împărțirea la 2<​sup>​n</​sup></​note>​
  
  
-== Modulul UAL ==+===== Modulul UAL =====
  
-Descărcați scheletul de cod și completați conținutul **modulului alu.v**, folosind intrările și ieșirile prezentate mai jos și în <imgref ual>.+ 
 +Descărcați scheletul de cod și completați conținutul **modulului alu.v**, folosind intrările și ieșirile prezentate mai jos.
  
 <code verilog> <code verilog>
Line 146: Line 177:
  
  
-== Exerciții ==+===== Exerciții ===== 
  
 Exercițiile din acest laborator constau în implementarea operațiilor și indicatorilor de condiții în modulul //alu.v// și apoi folosirea acestuia pentru a executa faza de trecere la instrucțiunea următoare. Exercițiile din acest laborator constau în implementarea operațiilor și indicatorilor de condiții în modulul //alu.v// și apoi folosirea acestuia pentru a executa faza de trecere la instrucțiunea următoare.
Line 152: Line 184:
   - **(2p)** Implementați operația //ADC// (eng. //ADd with Carry//) în cadrul unității aritmetice-logice. :!: **Nu uitați indicatorii de condiții!**.   - **(2p)** Implementați operația //ADC// (eng. //ADd with Carry//) în cadrul unității aritmetice-logice. :!: **Nu uitați indicatorii de condiții!**.
     * Implementarea operației fără indicatorii de condiții oferă un punctaj de 50%.     * Implementarea operației fără indicatorii de condiții oferă un punctaj de 50%.
-    * Hint: descrierea indicatorilor se găsește în tabelul de la pag. 9 din  {{..:​resurse:​ac5.pdf|curs}} sau în [[.:lab07#descrierea-detaliata-a-indicatorilor-de-conditii|textul]] ​laboratorului.+    * Hint: descrierea indicatorilor se găsește în tabelul de la pag. 9 din  {{..:​resurse:​ac5.pdf|curs}} sau în [[.:lab07#Descrierea detaliată ​a indicatorilor de condiții|textul ​laboratorului]].
   - **(2p)** Implementați în unitatea de comandă faza de trecere la instrucțiunea următoare, prin incrementarea Contorului Program. Folosiți-vă de operația implementată la exercițiul anterior.   - **(2p)** Implementați în unitatea de comandă faza de trecere la instrucțiunea următoare, prin incrementarea Contorului Program. Folosiți-vă de operația implementată la exercițiul anterior.
-    * Hint: pentru realizarea de către UC a unui transfer de date între resursele calculatorului revedeți ​{{.:​lab06:​sol:​lab6_sol.zip|soluția}} laboratorului anterior. +    * Hint: pentru realizarea de către UC a unui transfer de date între resursele calculatorului revedeți soluția laboratorului anterior. 
-  - **(4x1.5p)** Implementați următoarele operații în cadrul unității aritmetice-logice. :!: **Nu uitați indicatorii de condiții!**.+  - **(6x1.5p)** Implementați următoarele operații în cadrul unității aritmetice-logice. :!: **Nu uitați indicatorii de condiții!**.
     - //SBB1// (eng. //SuBstract with Borrow//; calculează //in1// - //in2// - //carry//)     - //SBB1// (eng. //SuBstract with Borrow//; calculează //in1// - //in2// - //carry//)
     - //NOT//     - //NOT//
 +    - //OR//
     - //XOR// (eng. //eXclusive OR//)     - //XOR// (eng. //eXclusive OR//)
 +    - //SHL// (eng. //Shift Left//)
     - //SAR// (eng. //Shift Arithmetic Right//)     - //SAR// (eng. //Shift Arithmetic Right//)
     * Implementarea operației fără indicatorii de condiții oferă un punctaj de 50%.     * Implementarea operației fără indicatorii de condiții oferă un punctaj de 50%.
     * Demonstrarea funcționării corecte pentru acordarea punctajului se face prin crearea unui fișier de test pentru modulul ''​alu''​ asemănător [[..:​tutoriale:​2-ise-simulare| tutorialului]].     * Demonstrarea funcționării corecte pentru acordarea punctajului se face prin crearea unui fișier de test pentru modulul ''​alu''​ asemănător [[..:​tutoriale:​2-ise-simulare| tutorialului]].
-    * Hint: descrierea indicatorilor pentru fiecare operație se găsește în tabelul de la pag. 9 și descrierile de la pag. 10 și 11 din  {{..:​resurse:​ac5.pdf|curs}} sau în [[.:lab07#descrierea-detaliata-a-indicatorilor-de-conditii|textul]] [[.:​lab07#​descriere-operatii|laboratorului]].+    * Hint: descrierea indicatorilor pentru fiecare operație se găsește în tabelul de la pag. 9 și descrierile de la pag. 10 și 11 din  {{..:​resurse:​ac5.pdf|curs}} sau în [[.:lab07#Descrierea detaliată ​a indicatorilor de condiții|textul laboratorului]]. 
 + 
 + 
 +===== Resurse =====
  
  
-== Resurse == 
   * {{.:​lab06:​sol:​lab7_skel.zip|Schelet de cod}}   * {{.:​lab06:​sol:​lab7_skel.zip|Schelet de cod}}
-  ​* {{.:​lab07:​sol:​lab7_sol.zip|Soluție laborator}} (disponibilă începând cu 16.11.2019) +  * <​html><​a class="​media mediafile mf_pdf"​ href="https://ocw.cs.pub.ro/courses/​ac-is/​lab/​lab07?​do=export_pdf">​PDF laborator</​a></​html> ​
-  ​* <​html><​a class="​media mediafile mf_pdf"​ href="/​ac/wiki/​lab/​lab07?​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}}
 +  * {{.:​lab07:​sol:​lab8_skel.zip|Soluție laborator}}
  
  
-<ifauth @user>+<ifauth @ac-is>
 ---- ----
-  * [[:​internal:​alu|Ghid asistent]]+  ​* {{.:​lab07:​sol:​lab8_skel.zip|Soluție laborator}} 
 +  ​* [[ac-is:internal:guidelines|Ghid asistent]]
 </​ifauth>​ </​ifauth>​
 +
ac-is/lab/lab07.1632152205.txt.gz · Last modified: 2021/09/27 16:37 (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