This shows you the differences between two versions of the page.
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 a 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_ex> gă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> | ||
+ |