This shows you the differences between two versions of the page.
ac-is:lab:lab09 [2021/09/20 18:36] 127.0.0.1 external edit |
ac-is:lab:lab09 [2023/12/16 19:33] (current) teodor.dicu |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | =Laboratorul 9 - Calculatorul Didactic: Instrucțiuni cu doi operanzi= | + | ====== Laboratorul 9 - Calculatorul Didactic: Instrucțiuni cu doi operanzi ====== |
Scopul laboratorului este de a implementa execuția instrucțiunilor cu 2 operanzi (ADD, ADC, SUB, SBB, AND, OR, XOR, CMP și TEST) în unitatea de comandă. | Scopul laboratorului este de a implementa execuția instrucțiunilor cu 2 operanzi (ADD, ADC, SUB, SBB, AND, OR, XOR, CMP și TEST) în unitatea de comandă. | ||
- | ==Implementarea unei instrucțiuni în unitatea de comandă== | + | |
+ | |||
+ | ===== Implementarea unei instrucțiuni în unitatea de comandă ===== | ||
În [[.:lab08|laboratorul 8]] au fost enumerate cele patru etape de prelucrare a instrucțiunilor: | În [[.:lab08|laboratorul 8]] au fost enumerate cele patru etape de prelucrare a instrucțiunilor: | ||
Line 8: | Line 11: | ||
* //Decode// - decodificarea instrucțiunii | * //Decode// - decodificarea instrucțiunii | ||
* //Execute// - executarea instrucțiunii | * //Execute// - executarea instrucțiunii | ||
- | * //Write-back// - scrierea rezultatului (dacă este cazul) | + | * //Store// - scrierea rezultatului (dacă este cazul) |
<note tip>Ce trebuie să facă unitatea de comandă atunci când trebuie excutată o instrucțiune aritmetică logică cu doi operanzi? De exemplu ''ADC RA, RB''. | <note tip>Ce trebuie să facă unitatea de comandă atunci când trebuie excutată o instrucțiune aritmetică logică cu doi operanzi? De exemplu ''ADC RA, RB''. | ||
Line 27: | Line 30: | ||
- | ===Implementare=== | + | ==== Implementare ==== |
Unitatea de comandă este implementată ca un automat de stări. Modulul acesteia are următoarele semnale: | Unitatea de comandă este implementată ca un automat de stări. Modulul acesteia are următoarele semnale: | ||
- | * intrări: //clk//, //rst//, //ri// (codul instrucțiunii), //ind// (indicatorii de condiție) | + | * intrări: //clk//, //rst//, //ri// (codul instrucțiunii), //ind// (indicatorii de condiție) |
- | * ieșiri: | + | * ieșiri: |
- | * semnale //oe// (output-enable) și //we// (write-enable) pentru registre, bancul de registre, memorie și unitatea aritmetică logică (doar //oe//) | + | * semnale //oe// (output-enable) și //we// (write-enable) pentru registre, bancul de registre, memorie și unitatea aritmetică logică (doar //oe//) |
- | * //alu_opcode// - codul operației ce trebuie efectuată de unitatea aritmetică logică | + | * //alu_opcode// - codul operației ce trebuie efectuată de unitatea aritmetică logică |
- | * //alu_carry// - carry-ul folosit de UAL în cadrul operației ce trebuie să o execute | + | * //alu_carry// - carry-ul folosit de UAL în cadrul operației ce trebuie să o execute |
- | * //regs_addr// - indexul unui registru din bancul de registre | + | * //regs_addr// - indexul unui registru din bancul de registre |
- | * //ind_sel// - controlează sursa de scriere în registrul IND (0 = bus, 1 = alu flags) | + | * //ind_sel// - controlează sursa de scriere în registrul IND (0 = bus, 1 = alu flags) |
Automatul trebuie să ofere stări pentru: | Automatul trebuie să ofere stări pentru: | ||
* aducerea instrucțiunii din memorie în registrul //RI// | * aducerea instrucțiunii din memorie în registrul //RI// | ||
Line 47: | Line 51: | ||
</note> | </note> | ||
- | ==Codificarea instrucțiunilor== | ||
- | Formatul instrucțiunilor este același precum cel din [[.:lab08|laboratorul 8]], așa cum se observă din <imgref image1>. | + | === Codificarea instrucțiunilor === |
- | <imgcaption image1 center|Formatul instrucțiunilor calculatorului didactic>{{.:lab09:format-instructiune.png?900|}}</imgcaption> | ||
- | <hidden **Click AICI pentru explicarea câmpurilor din Fig. 1. **> | + | Formatul instrucțiunilor este același precum cel din [[.:lab08|laboratorul 8]], așa cum se observă din imaginea de mai jos. |
- | * //COP// - codul operației, 7 biți | + | |
- | * bitul [0] - separă instrucțiunile care folosesc o adresă efectivă de cele care nu folosesc: | + | {{ .:lab09:format-instructiune.png?700 |Formatul instrucțiunilor calculatorului didactic}} |
- | * 0 - instrucțiuni cu calcul de adresă efectivă | + | <html><p align="center">Formatul instrucțiunilor calculatorului didactic</p></html> |
- | * 1 - instrucțiuni fără calcul de adresă efectivă (salturi condiționate, ret etc.) | + | |
- | * bitul [1] - separă instrucțiunile care au 1 operand de cele cu 2 operanzi: | + | <spoiler **Click AICI pentru explicarea câmpurilor din figura anterioară. **> |
- | * 0 - un operand | + | * //COP// - codul operației, 7 biți |
- | * 1 - doi operanzi | + | * bitul [0] - separă instrucțiunile care folosesc o adresă efectivă de cele care nu folosesc: |
- | * bitul [2] - separă instrucțiunile cu operand imediat de cele fără operand imediat: | + | * 0 - instrucțiuni cu calcul de adresă efectivă |
- | * 0 - fără operand imediat | + | * 1 - instrucțiuni fără calcul de adresă efectivă (salturi condiționate, ret etc.) |
- | * 1 - cu operand imediat | + | * bitul [1] - separă instrucțiunile care au 1 operand de cele cu 2 operanzi: |
- | * bitul [3] - separă instrucțiunile de transfer de date/control de celelalte: | + | * 0 - un operand |
- | * 0 - transfer de date/control (mov, push, call etc.) sau care nu salvează rezultatul (cmp, test) | + | * 1 - doi operanzi |
- | * 1 - instrucțiuni aritmetico-logice cu salvarea rezultatului, salturi condiționate | + | * bitul [2] - separă instrucțiunile cu operand imediat de cele fără operand imediat: |
- | * biții [4][5][6] - cod operație | + | * 0 - fără operand imediat |
- | * //d// - pentru instrucțiunile cu doi operanzi, folosit pentru a ști care e primul și care e al doilea dintre cele două câmpuri REG și RM din codul instrucțiunii: | + | * 1 - cu operand imediat |
+ | * bitul [3] - separă instrucțiunile de transfer de date/control de celelalte: | ||
+ | * 0 - transfer de date/control (mov, push, call etc.) sau care nu salvează rezultatul (cmp, test) | ||
+ | * 1 - instrucțiuni aritmetico-logice cu salvarea rezultatului, salturi condiționate | ||
+ | * biții [4][5][6] - cod operație | ||
+ | * //d// - pentru instrucțiunile cu doi operanzi, folosit pentru a ști care e primul și care e al doilea dintre cele două câmpuri REG și RM din codul instrucțiunii: | ||
* 0 - RM = RM op REG | * 0 - RM = RM op REG | ||
* 1 - REG = REG op RM | * 1 - REG = REG op RM | ||
- | * //MOD// - modul de calcul al adresei efective (4 moduri - 2 biți) | + | * //MOD// - modul de calcul al adresei efective (4 moduri - 2 biți) |
- | * //REG// - indexul registrului care conține unul dintre operanzi | + | * //REG// - indexul registrului care conține unul dintre operanzi |
- | * //RM// - indexul registrului care conține unul dintre operanzi | + | * //RM// - indexul registrului care conține unul dintre operanzi |
- | </hidden> | + | </spoiler> |
\\ | \\ | ||
- | Instrucțiunile care vor fi implementate în acest laborator se regăsesc în <tabref table1>. Acestea sunt instrucțiuni aritmetice și logice cu doi operanzi ale căror valori sunt în registrele generale și fie pun un rezultat înapoi în registrul destinație, fie nu stochează rezultatul ci doar setează indicatorii de condiție (CMP și TEST). | + | Instrucțiunile care vor fi implementate în acest laborator se regăsesc în tabelul de mai jos. Acestea sunt instrucțiuni aritmetice și logice cu doi operanzi ale căror valori sunt în registrele generale și fie pun un rezultat înapoi în registrul destinație, fie nu stochează rezultatul ci doar setează indicatorii de condiție (CMP și TEST). |
- | <tabcaption table1 center| Instrucțiuni aritmetice-logice cu doi operanzi.> | ||
^Instrucțiune ^ Funcție ^ Cod RI[0:6] ^ | ^Instrucțiune ^ Funcție ^ Cod RI[0:6] ^ | ||
|ADD|op<sub>dst</sub> = op<sub>dst</sub> + op<sub>src</sub> |0101000 | | |ADD|op<sub>dst</sub> = op<sub>dst</sub> + op<sub>src</sub> |0101000 | | ||
Line 90: | Line 97: | ||
|CMP|op<sub>dst</sub> - op<sub>src</sub>, fără stocare rezultat, doar setare indicatori |0100010 | | |CMP|op<sub>dst</sub> - op<sub>src</sub>, fără stocare rezultat, doar setare indicatori |0100010 | | ||
|TEST|op<sub>dst</sub> & op<sub>src</sub>, fără stocare rezultat, doar setare indicatori |0100100 | | |TEST|op<sub>dst</sub> & op<sub>src</sub>, fără stocare rezultat, doar setare indicatori |0100100 | | ||
- | </tabcaption> | ||
- | <note important>Pentru **decodificarea** instrucțiunilor din acest laborator trebuie sa identificăm atât grupul instrucțiunilor aritm-logice cu doi operanzi, fără operand imediat și care stochează rezultatul (**RI<sub>0..3</sub> = 0101**) cât și cele care nu stochează rezultatul (**RI<sub>0..3</sub> = 0100**). | + | <html><p align="left">Instrucțiuni aritmetice-logice cu doi operanzi</p></html> |
+ | <note important>Pentru **decodificarea** instrucțiunilor din acest laborator trebuie sa identificăm atât grupul instrucțiunilor aritmetice-logice cu doi operanzi, fără operand imediat și care stochează rezultatul (**RI<sub>0..3</sub> = 0101**) cât și cele care nu stochează rezultatul (**RI<sub>0..3</sub> = 0100**). | ||
</note> | </note> | ||
- | ==Adresarea directă la registru== | + | === Adresarea directă la registru === |
- | Operanzii se găsesc în registrele specificate de câmpurile REG și RM. Pentru a selecta ordinea operanzilor din aceste două câmpuri, trebuie să ținem cont de valoarea din bitul //d//. Vom folosi adresarea directă la registru (câmpul mod trebuie să conțină valoarea 2'b11), așa cum se observă în <imgref image2>. | ||
- | <imgcaption image2 center|Adresarea directă la registru pentru instrucțiuni cu doi operanzi.> | + | Operanzii se găsesc în registrele specificate de câmpurile REG și RM. Pentru a selecta ordinea operanzilor din aceste două câmpuri, trebuie să ținem cont de valoarea din bitul //d//. Vom folosi adresarea directă la registru (câmpul mod trebuie să conțină valoarea 2'b11), așa cum se observă în imaginea de mai jos. |
- | {{.:lab09:adresare-directa-registru.png?600|Adresarea directă la registru pentru instrucțiuni cu doi operanzi.}} | + | |
- | </imgcaption> | + | {{ .:lab09:adresare-directa-registru.png?600 |Adresarea directă la registru pentru instrucțiuni cu doi operanzi}} |
+ | <html><p align="center">Adresarea directă la registru pentru instrucțiuni cu doi operanzi</p></html> | ||
<note tip> | <note tip> | ||
Instrucțiunea ''AND RA, RB'' efectuează ''ȘI'' logic între cei doi operanzi și pune rezultatul în registrul destinație (''RA''). Un exemplu de calcul al codului operației se regăsește mai jos: | Instrucțiunea ''AND RA, RB'' efectuează ''ȘI'' logic între cei doi operanzi și pune rezultatul în registrul destinație (''RA''). Un exemplu de calcul al codului operației se regăsește mai jos: | ||
- | * [0] = 0 - cu calcul de adresă efectivă | + | * [0] = 0 - cu calcul de adresă efectivă |
- | * [1] = 1 - doi operanzi | + | * [1] = 1 - doi operanzi |
- | * [2] = 0 - fără operand imediat | + | * [2] = 0 - fără operand imediat |
- | * [3] = 1 - operație aritmetică cu salvarea rezultatului | + | * [3] = 1 - operație aritmetică cu salvarea rezultatului |
- | * [4,5,6] = [1,0,0] - codul dat operației (stabilit de arhitectură) | + | * [4,5,6] = [1,0,0] - codul dat operației (stabilit de arhitectură) |
- | * [7] - selectează operandul destinație. Pentru exemplul acesta vom considera că acest bit ia valoarea 1 (destinația va fi registrul ''RA''): | + | * [7] - selectează operandul destinație. Pentru exemplul acesta vom considera că acest bit ia valoarea 1 (destinația va fi registrul ''RA''): |
* 1: REG = REG ''AND'' RM | * 1: REG = REG ''AND'' RM | ||
- | * [8,9] = [1,1] - modul de adresare (folosim adresarea directă la registru) | + | * [8,9] = [1,1] - modul de adresare (folosim adresarea directă la registru) |
- | * [10,11,12] = [0,0,0] - indexul registrului ''RA'' în bancul de registre | + | * [10,11,12] = [0,0,0] - indexul registrului ''RA'' în bancul de registre |
- | * [13,14,15] = [0,0,1] - indexul registrului ''RB'' în bancul de registre | + | * [13,14,15] = [0,0,1] - indexul registrului ''RB'' în bancul de registre |
^ 15 ^ 14 ^ 13 ^ 12 ^ 11 ^ 10 ^ 9 ^ 8 ^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 ^ | ^ 15 ^ 14 ^ 13 ^ 12 ^ 11 ^ 10 ^ 9 ^ 8 ^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 ^ | ||
| 1 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | | | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | | ||
</note> | </note> | ||
- | ==Exerciții== | ||
- | Modificați modulul //uc.v// din scheletul de cod al laboratorului, astfel încât să implementați instrucțiunile din tabelul <tabref table1>. Citiți secțiunea de [[.:lab09#implementare|implementare]]. | + | |
- | - (4p) Decodificați instrucțiunea ADD reg<sub>dst</sub> , reg<sub>src</sub>. | + | ===== Exerciții ===== |
+ | |||
+ | |||
+ | Modificați modulul //uc.v// din scheletul de cod al laboratorului, astfel încât să implementați instrucțiunile din tabelul prezentat anterior. Citiți secțiunea de [[.:lab09#implementare|implementare]]. | ||
+ | - **(4p)** Decodificați instrucțiunea ADD reg<sub>dst</sub>, reg<sub>src</sub>. | ||
- Identificați grupul de instrucțiuni în care se încadrează operația (ADD) și modul de adresare. | - Identificați grupul de instrucțiuni în care se încadrează operația (ADD) și modul de adresare. | ||
- | - Identificați operandul destinație. | + | - Identificați operandul destinație. |
- Transferați conținutul registrului reg<sub>src</sub> în registrul T2 | - Transferați conținutul registrului reg<sub>src</sub> în registrul T2 | ||
- Indicați UAL-ului să execute operația și puneți rezultatul în T1 | - Indicați UAL-ului să execute operația și puneți rezultatul în T1 | ||
- | * Registrul IND trebuie conectat la UAL ca să poată fi setate flagurile în urma execuției operației | + | * Registrul IND trebuie conectat la UAL ca să poată fi setate flagurile în urma execuției operației |
- | - (6p) Decodificați restul instrucțiunilor. | + | - **(6p)** Decodificați restul instrucțiunilor. |
+ | |||
+ | |||
+ | ===== Resurse ===== | ||
- | ==Resurse== | ||
* {{.:lab08:sol:lab9_skel.zip|Schelet de cod}} | * {{.:lab08:sol:lab9_skel.zip|Schelet de cod}} | ||
- | * {{.:lab09:sol:lab9_sol.zip|Soluție laborator}} (disponibilă începând cu 30.11.2019) | + | * <html><a class="media mediafile mf_pdf" href="https://ocw.cs.pub.ro/courses/ac-is/lab/lab09?do=export_pdf">PDF laborator</a></html> |
- | * <html><a class="media mediafile mf_pdf" href="/ac/wiki/lab/lab09?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}} | ||
+ | * {{.:lab09:sol:lab9_sol.zip|Soluție laborator}} | ||
- | <ifauth @user> | + | <ifauth @ac-is> |
---- | ---- | ||
- | * [[:internal:2op|Ghid asistent]] | + | * {{.:lab09:sol:lab9_sol.zip|Soluție laborator}} |
+ | * [[ac-is:internal:guidelines|Ghid asistent]] | ||
</ifauth> | </ifauth> | ||
+ |