Differences

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

Link to this comparison view

soc:laboratoare:06 [2024/03/14 20:05]
mihnea.dinica signed integer example
soc:laboratoare:06 [2025/04/22 20:34] (current)
stefan.maruntis [Exerciții]
Line 5: Line 5:
 ==== 1. Scopul laboratorului ==== ==== 1. Scopul laboratorului ====
  
-Scopul acestui laborator este proiectarea unor module ce implementează operații aritmetice. În acest laborator vom implementa sumatoare simple și le vom examina performanțele.+Scopul acestui laborator este proiectarea unor module ce implementează operații aritmetice. În acest laborator vom implementa sumatoare simple și o Unitate Aritmetico-Logică.
 ==== 2. Mod de lucru ==== ==== 2. Mod de lucru ====
  
Line 32: Line 32:
 === 3.2. Full-adder === === 3.2. Full-adder ===
  
-{{ :​soc:​laboratoare:​06:382_fa_diagram.gif?400 |}}+{{ :​soc:​laboratoare:​08:full-adder.png?400 |}}
  
 Un full-adder este un circuit care realizează suma a doi operanzi ținând cont și de transportul din rangul inferior. Intrările sale sunt A, B (cei doi operanzi) și C<​sub>​in</​sub>​ (transportul de la rangul inferior). El generează la ieșire doua semnale: S (suma) și C<​sub>​out</​sub>​ (carry out - transportul către rangul următor). Tabela de adevăr pentru un full-adder este prezentată în figura 3.2. Un full-adder este un circuit care realizează suma a doi operanzi ținând cont și de transportul din rangul inferior. Intrările sale sunt A, B (cei doi operanzi) și C<​sub>​in</​sub>​ (transportul de la rangul inferior). El generează la ieșire doua semnale: S (suma) și C<​sub>​out</​sub>​ (carry out - transportul către rangul următor). Tabela de adevăr pentru un full-adder este prezentată în figura 3.2.
Line 54: Line 54:
 Cum în practică vom avea nevoie de numere mai mari decât 1, acestea vor fi reprezentate pe mai mulți biți. În acest caz avem o problemă: sumatoarele noastre nu pot aduna decât maxim un bit! Pentru a rezolva problema trebuie să creăm un circuit care să facă suma numerelor reprezentate pe mai mulți biți. ​ Cum în practică vom avea nevoie de numere mai mari decât 1, acestea vor fi reprezentate pe mai mulți biți. În acest caz avem o problemă: sumatoarele noastre nu pot aduna decât maxim un bit! Pentru a rezolva problema trebuie să creăm un circuit care să facă suma numerelor reprezentate pe mai mulți biți. ​
  
-Un astfel de circuit, și cel mai simplu, este sumatorul ripple-carry. Pentru a construi un astfel de sumator pe n biți avem nevoie de fie n sumatoare full-adder (dintre care primul va avea intrarea C<​sub>​in</​sub>​ legată la 0 întotdeauna),​ fie de n-1 sumatoare full-adder și un half-adder (care va înlocui ​acel prim full-adder și **NUMAI** ​pe acela). +Un astfel de circuit, și cel mai simplu, este sumatorul ripple-carry. Pentru a construi un astfel de sumator pe n biți avem nevoie de fie n sumatoare full-adder (dintre care primul va avea intrarea C<​sub>​in</​sub>​ legată la 0 întotdeauna),​ fie de n-1 sumatoare full-adder și un half-adder (care va înlocui **NUMAI** ​acel prim full-adder fără C<​sub>​in</​sub>​). 
  
 Conectarea lor, prezentată în figura 3.3, este una foarte simplă: ieșirea C<​sub>​out</​sub>​ a modulului de rang //i// va fi conectată la intrarea C<​sub>​in</​sub>​ a modulului de rang //i+1//. Acest fapt ne bucură în faza de proiectare, fiindcă nu avem mult de lucru, însă un astfel de sumator este încetinit de faptul că modulul de rang //i// trebuie să aştepte modulul de rang //i-1// sa îşi termine executia pentru a afla cât este C<​sub>​in</​sub>,​ iar cel de rang //i-1// la rândul său trebuie să îl aștepte pe cel de rang //i-2// s.a.m.d. ​ Conectarea lor, prezentată în figura 3.3, este una foarte simplă: ieșirea C<​sub>​out</​sub>​ a modulului de rang //i// va fi conectată la intrarea C<​sub>​in</​sub>​ a modulului de rang //i+1//. Acest fapt ne bucură în faza de proiectare, fiindcă nu avem mult de lucru, însă un astfel de sumator este încetinit de faptul că modulul de rang //i// trebuie să aştepte modulul de rang //i-1// sa îşi termine executia pentru a afla cât este C<​sub>​in</​sub>,​ iar cel de rang //i-1// la rândul său trebuie să îl aștepte pe cel de rang //i-2// s.a.m.d. ​
Line 63: Line 63:
 //Figura 3.3: Un sumator ripple-carry pe 4 biți// //Figura 3.3: Un sumator ripple-carry pe 4 biți//
  
 +==== 4. Unitatea Aritmetico-Logică ====
 +
 +{{ :​soc:​laboratoare:​08:​ual.jpg?​300 | }}
 +
 +Unitatea Aritmetico-Logică este o componentă care se ocupă de aproape toate calculele numerice necesare unui procesor. În ciclul de prelucrare a instrucţiunilor,​ în diverse etape procesorul are nevoie de rezultatele unor calcule, fie că sunt solicitate de o intrucţiune explicită cum este //add// din limbajul de asamblare, fie dintr-un motiv intern (de exemplu adresa absolută a unei date se calculează în funcţie de //segment// şi //offset//, ceea ce implică nevoia unor calcule).
 +
 +O UAL poate fi proiectată să execute, în principiu, orice operație. Totuși, cu cât operațiile devin mai complexe, UAL devine mai scumpă, ocupă mai mult loc și disipă mai multă căldură. Operațiile care sunt, în general, suportate de toate UAL sunt:
 +  * Operații logice: AND, OR, NOT, XOR, NOR, NAND, etc.
 +  * Operații de shift: shift stânga, shift dreapta, shift circular, etc.
 +  * Operații aritmetice: adunare, scădere, înmulțire (nu toate), împărțire (nu toate).
 ===== TL;DR ===== ===== TL;DR =====
-  * Cuvintele calculatorului sunt compuse din biți, prin urmare, cuvintele sunt de fapt niște valori.+  * Cuvintele calculatorului sunt compuse din biți, prin urmare, cuvintele sunt doar niște valori.
     * Convenție ([[https://​en.wikipedia.org/​wiki/​Two%27s_complement|Complement față de 2]]):     * Convenție ([[https://​en.wikipedia.org/​wiki/​Two%27s_complement|Complement față de 2]]):
         * **pozitive** - primul bit este 0         * **pozitive** - primul bit este 0
Line 74: Line 84:
       * C<​sub>​in<​sup>​(i+1)</​sup></​sub>​ = C<​sub>​out<​sup>​(i)</​sup></​sub>​       * C<​sub>​in<​sup>​(i+1)</​sup></​sub>​ = C<​sub>​out<​sup>​(i)</​sup></​sub>​
       * C<​sub>​in<​sup>​(0)</​sup></​sub>​ = 0       * C<​sub>​in<​sup>​(0)</​sup></​sub>​ = 0
 +  * **Unitatea Aritmetică Logică** se ocupă de aproape toate calculele cerute de procesor, solicitate de o instrucțiune explicită sau necesară intern. 
 +  * Instrucțiuni uzuale: 
 +    * Operații Logice: AND, OR, NOT, XOR, NOR, NAND, etc. 
 +    * Operații de shift: shift stânga, shift dreapta, shift circular, etc. 
 +    * Operații aritmetice: ADD, SUB, MUL (nu toate), DIV (nu toate).
 ===== Exerciții ===== ===== Exerciții =====
 <note important>​ <note important>​
Line 81: Line 95:
  
   - (4p) Implementați un half-adder și un full-adder fără să folosiți operatorul '​+'​ din Verilog.   - (4p) Implementați un half-adder și un full-adder fără să folosiți operatorul '​+'​ din Verilog.
-    - (2p) Implementarea half-adder se va face la oricare dintre din următoarele nivele:+    - (2p) Implementarea half-adder se va face în fișierul ''​task0.v'' ​la oricare dintre din următoarele nivele:
       * la nivel structural       * la nivel structural
       * la nivel flux de date       * la nivel flux de date
       * la nivel procedural       * la nivel procedural
-    - (2p) Implementarea full-adder se va face utilizând două instanțe ale half-adder-ului implementat la subpunctul anterior. +    - (2p) Implementarea full-adder se va face în fișierul ''​task1.v'' ​utilizând două instanțe ale half-adder-ului implementat la subpunctul anterior. 
-  - (2p) Implementați un sumator ripple-carry pe 8 biți.+  - (2p) Implementați un sumator ripple-carry pe 8 biți în fișierul ''​task2.v''​.
     * !!! Pentru implementare folosiți modulele de la punctul precedent.     * !!! Pentru implementare folosiți modulele de la punctul precedent.
-  - (2p) Implementați un scăzător pe 8 biti, pornind de la modulul de la punctul precedent. +  - (2p) Implementați un scăzător pe 8 biti în fișierul ''​task3.v''​, pornind de la modulul de la punctul precedent. 
-  - (4p) Implementați un sumator/scăzător ​pe 8 biți cu ajutorul plăcii de laborator. +  - (2.5p) Implementați un modul UAL ''​task4.v''​ cu intrări pe 8 biți. ​Modulul va primi la intrare ​numere (i_w_a și i_w_b) și indicatorul unei operații ce se va efectua asupra numerelor (i_w_op_sel). Ieșirea modului (o_w_result) va fi un număr ​pe 8 bițce reprezintă rezultatul aplicării operației asupra numerelor i_w_a și_w_b. Pentru valorile lui i_w_op_sel avem următoarele operații: 
-    - Caracteristici:​ +      ​*  **(0.5p)** 0 ''​AND''​ 
-      - operanzi ​pe 8 biţi +      ​*  **(0.5p)** ​: ''​XOR''​ 
-      - Afişare operanzi şrezultat pe afişajul cu 7 segmente +      ​*  **(0.5p)** ​: ''​OR''​ 
-      ​- Afişare progres pe cele 8 LED-uri +      *  **(0.5p)** 3 : ''​ADD''​ (folosiți ''​task2''​) 
-    - Mod de operare+      *  **(0.5p)** 4 : ''​SUB''​ (folosiți ''​task3''​) 
-      ​- Preluare operand ​-> prin apăsarea unui 'push-button+===== Resurse ===== 
-      ​- Preluare operand ​-> prin apăsarea aceluiaşi ​'push-button' +  * [[https://​github.com/​cs-pub-ro/​SOC/​tree/​main/​lab06|Scheletul de laborator]]
-        * !!! Până la apăsarea butonului, pe afişajul cu 7 segmente va fi afişată valoarea operandului +
-      ​- Afişare: +
-        ​rezultat -> dacă este ţinut apăsat butonul corespunzător unei operaţii +
-        ​* 'APAS' ​-> dacă nu este apăsat niciun buton +
-      ​- La apăsarea butonului de reset, circuitul se întoarce la preluarea primului operand +
-    ​*  **Citiţi comentariile din modul şi urmăriţi TODO-urile!**+
  
-<​hidden>​ +  ​[[https://​digilent.com/​reference/​_media/​reference/​programmable-logic/nexys-a7/nexys-a7_rm.pdf|Datasheet Digilent Nexys A7]] 
-**EXERCITIU PENTRU PREDAT ONLINE* +  * [[https://digilent.com/reference/​_media/​reference/​programmable-logic/nexys-a7/nexys-a7-sch.pdf|Schema Digilent Nexys A7]]
-  - (4p) Implementați un calculator de buzunar care oferă suport pentru operația de **adunare** și de **scădere**,​ **folosind modulele implementate anterior**. +
-    ​Caracteristici:​ +
-      ​Operația poate avea **oricâți operanzi** și operatori +
-      ​Operanzii și operatorii **se introduc alternativ** în mod secvențial +
-      - **Afișarea rezultatului** se face doar la primirea operatorului = +
-    - Cazuri specifice:​ +
-      - Introducerea **unui singur operand** urmat de operatorul = va afișa valoarea operandului +
-      - Verificarea **corectitudinii secvenței** de operatori și operanzi +
-        * 13 ADD 14 EQL      -> 27 +
-        * 13 17 ADD 14 EQL   -> 27 +
-      - **Utilizați semnalul ready** pentru a semnala că starea curentă așteaptă o intrare +
-        * ready = 1, cand este in starea de asteptare a unui operand/​operator +
-        * ready = 0, altfel +
- +
- <​note important>​ +
-In scheletul de laborator consideram ca operatori:​ +
-  * ADD = 0 +
-  * SUB = 1 +
-  * EQL = 2 +
-  * ERR = 3 +
- +
-Ca operanzi putem sa folosim doar numere **mai mari strict** ca 3 +
- +
-</​note>​ +
-</​hidden>​ +
-===== Resurse ===== +
-  * [[https://gitlab.cs.pub.ro/calculatoare-numerice/soc-public/-/​tree/​main/​lab06|Scheletul de laborator]]+
  
  
soc/laboratoare/06.1710439510.txt.gz · Last modified: 2024/03/14 20:05 by mihnea.dinica
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