This shows you the differences between two versions of the page.
ac-is:lab:lab08 [2021/09/20 18:36] 127.0.0.1 external edit |
ac-is:lab:lab08 [2023/12/13 11:09] (current) alexandru.predescu [Unitatea de comandă] |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | = Laboratorul 8 - Calculatorul Didactic: Instrucțiuni cu un operand = | + | ====== Laboratorul 8 - Calculatorul Didactic: Instrucțiuni cu un operand ====== |
+ | |||
+ | Obiectivul acestui laborator și al celor care urmează după el, îl reprezintă familiarizarea cu **formatul instrucțiunilor** calculatorului didactic și cu **modul de funcționare al unității de comandă**. În acest scop se vor implementa în Verilog **interpretarea** și **comandarea execuției** pentru instrucțiunile specificate în arhitectura calculatorului didactic studiat la curs. | ||
- | Obiectivul acestui laborator și al celor care urmează după el, îl reprezintă familiarizarea cu formatul instrucțiunilor calculatorului didactic și cu modul de funcționare al unității de comandă. În acest scop se vor implementa în Verilog interpretarea și comandarea execuției pentru instrucțiunile specificate în arhitectura calculatorului didactic studiat la curs. | ||
În laboratorul curent vom implementa unitatea de comandă pentru instrucțiunile aritmetice și logice cu un singur operand. | În laboratorul curent vom implementa unitatea de comandă pentru instrucțiunile aritmetice și logice cu un singur operand. | ||
- | == Unitatea de comandă == | ||
- | Componentele calculatorului didactic implementate în laboratoarele precedente ([[.:lab06| registre]], [[.:lab07| ual]]) formează unitatea de execuție a procesorului. Pentru ca acestea să rețină date și să execute instrucțiunile procesorului, avem nevoie de o logică hardware de comandă a acestora, logică implementată în unitatea de comandă. | + | |
+ | ===== Unitatea de comandă ===== | ||
+ | |||
+ | |||
+ | Componentele calculatorului didactic implementate în laboratoarele precedente ([[.:lab06|registre]], [[.:lab07|UAL]]) formează unitatea de execuție a procesorului. Pentru ca acestea să rețină date și să execute instrucțiunile procesorului, avem nevoie de o logică hardware de comandă a acestora, logică implementată în unitatea de comandă. | ||
În interiorul unui procesor, instrucțiunile trec prin mai multe etape. Pentru calculatorul didactic avem următoarele faze: | În interiorul unui procesor, instrucțiunile trec prin mai multe etape. Pentru calculatorul didactic avem următoarele faze: | ||
* //Fetch// - aducerea instrucțiunii din memorie în registrul instrucțiune (RI) | * //Fetch// - aducerea instrucțiunii din memorie în registrul instrucțiune (RI) | ||
* //Decode// - decodificarea instrucțiunii | * //Decode// - decodificarea instrucțiunii | ||
+ | * //Load// - încărcarea operanzilor | ||
* //Execute// - executarea instrucțiunii | * //Execute// - executarea instrucțiunii | ||
- | * //Write-back// - scrierea rezultatului (dacă este cazul) | + | * //Store// - scrierea rezultatului (dacă este cazul) |
Unitatea de comandă este implicată în toate etapele de mai sus: comandă prin semnalare aducerea codurilor instrucțiunilor din memorie, le decodifică și transmite semnale către unitățile (registre, ual, memorie) implicate în execuția acelor instrucțiuni. La terminarea execuției fiecărei instrucțiuni se comandă scrierea rezultatului (dacă este cazul) și se actualizează registrul //CP// (Contor Program) cu adresa instrucțiunii următoare. | Unitatea de comandă este implicată în toate etapele de mai sus: comandă prin semnalare aducerea codurilor instrucțiunilor din memorie, le decodifică și transmite semnale către unitățile (registre, ual, memorie) implicate în execuția acelor instrucțiuni. La terminarea execuției fiecărei instrucțiuni se comandă scrierea rezultatului (dacă este cazul) și se actualizează registrul //CP// (Contor Program) cu adresa instrucțiunii următoare. | ||
Line 26: | Line 32: | ||
</note> | </note> | ||
- | === Implementare === | ||
- | Unitatea de comandă este implementată ca un automat de stări. Modulul acesteia are următoarele semnale: | + | ==== Implementare ==== |
- | * intrări: //clk//, //rst//, //ri// (codul instrucțiunii), //ind// (indicatorii de condiție) | + | |
- | * ieșiri: | + | |
- | * semnale //oe// (output-enable) și //we// (write-enable) pentru registre, bancul de registre, memorie și unitatea aritmetică logică (doar //oe//) | + | Unitatea de comandă este implementată ca un **automat de stări**. Modulul acesteia are următoarele semnale: |
- | * //alu_opcode// - codul operației ce trebuie efectuată de unitatea aritmetică logică | + | * intrări: //clk//, //rst//, //ri// (codul instrucțiunii), //ind// (indicatorii de condiție) |
- | * //alu_carry// - carry-ul folosit de UAL în cadrul operației ce trebuie să o execute | + | * ieșiri: |
- | * //regs_addr// - indexul unui registru din bancul de registre | + | * semnale //oe// (output-enable) și //we// (write-enable) pentru registre, bancul de registre, memorie și unitatea aritmetică logică (doar //oe//) |
- | * //ind_sel// - controlează sursa de scriere în registrul IND (0 = bus, 1 = alu flags) | + | * //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 | ||
+ | * //regs_addr// - indexul unui registru din bancul de registre | ||
+ | * //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 46: | Line 54: | ||
</note> | </note> | ||
- | == Codificarea instrucțiunilor == | ||
- | <tabcaption table1 center| Instrucțiuni aritmetice-logice cu un operand> | + | === Codificarea instrucțiunilor === |
+ | |||
^Instrucțiune^ Funcție ^ Cod RI[0:6] ^ | ^Instrucțiune^ Funcție ^ Cod RI[0:6] ^ | ||
|INC|op = op + 1 |0001 000 | | |INC|op = op + 1 |0001 000 | | ||
Line 58: | Line 67: | ||
|SAR|op = op <nowiki>>>></nowiki> 1 |0001 110 | | |SAR|op = op <nowiki>>>></nowiki> 1 |0001 110 | | ||
- | </tabcaption> | + | <html><p align="left">Instrucțiuni aritmetice-logice cu un operand</p></html> |
<note tip> | <note tip> | ||
Line 64: | Line 73: | ||
</note> | </note> | ||
- | Pentru orice procesor, fiecare instrucțiune definită în arhitectura setului său de instrucțiuni, are un anumit //cod unic după care este identificată//. Atunci când se stochează o instrucțiune care lucrează cu cel puțin un operand, nu este suficient să avem doar codul său (care indică ce acțiune trebuie efectuată), ci trebuie să avem și niște biți care să ne indice de unde luăm operanzii, așa cum este ilustrat și în <imgref image1>. | + | Pentru orice procesor, fiecare instrucțiune definită în arhitectura setului său de instrucțiuni, are un anumit //cod unic după care este identificată//. Atunci când se stochează o instrucțiune care lucrează cu cel puțin un operand, nu este suficient să avem doar codul său (care indică ce acțiune trebuie efectuată), ci trebuie să avem și niște biți care să ne indice de unde luăm operanzii, așa cum este ilustrat și în imaginea de mai jos. |
- | <imgcaption image1| Formatul instrucțiunilor calculatorului didactic>{{.:lab08:format-instructiune.png?900| Formatul instrucțiunilor calculatorului didactic}}</imgcaption> | + | {{ .:lab08:format-instructiune.png?900 | Formatul instrucțiunilor calculatorului didactic}} |
+ | <html><p align="center">Formatul instrucțiunilor calculatorului didactic</p></html> | ||
- | * //COP// - codul operației, 7 biți | + | * //COP// - codul operației, 7 biți |
- | * bitul [0] - separă instrucțiunile care folosesc o adresă efectivă de cele care nu folosesc: | + | * bitul [0] - separă instrucțiunile care folosesc o adresă efectivă de cele care nu folosesc: |
- | * 0 - instrucțiuni cu calcul de adresă efectivă | + | * 0 - instrucțiuni cu calcul de adresă efectivă |
- | * 1 - instrucțiuni fără calcul de adresă efectivă (salturi condiționate, RET etc.) | + | * 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: | + | * bitul [1] - separă instrucțiunile care au 1 operand de cele cu 2 operanzi: |
- | * 0 - un operand | + | * 0 - un operand |
- | * 1 - doi operanzi | + | * 1 - doi operanzi |
- | * bitul [2] - separă instrucțiunile cu operand imediat de cele fără operand imediat: | + | * bitul [2] - separă instrucțiunile cu operand imediat de cele fără operand imediat: |
- | * 0 - fără operand imediat | + | * 0 - fără operand imediat |
- | * 1 - cu operand imediat | + | * 1 - cu operand imediat |
- | * bitul [3] - separă instrucțiunile de transfer de date/control de celelalte: | + | * 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) | + | * 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 | + | * 1 - instrucțiuni aritmetico-logice cu salvarea rezultatului, salturi condiționate |
- | * biții [4][5][6] - cod operație | + | * 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: | + | * //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 |
<note important> | <note important> | ||
Line 99: | Line 109: | ||
<note tip> | <note tip> | ||
Exemplu de calcul cod operație pentru instrucțiune ''DEC RB'': | Exemplu de calcul cod operație pentru instrucțiune ''DEC RB'': | ||
- | * [0] = 0 - cu calcul de adresă efectivă | + | * [0] = 0 - cu calcul de adresă efectivă |
- | * [1] = 0 - un operand | + | * [1] = 0 - un operand |
- | * [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] = [0,0,1] - codul dat operației (stabilit de arhitectură) | + | * [4,5,6] = [0,0,1] - codul dat operației (stabilit de arhitectură) |
- | * [7] = 0/1 - nu contează, îl putem pune 0 sau 1 | + | * [7] = 0/1 - nu contează, îl putem pune 0 sau 1 |
- | * [8,9] = [1,1] - modul de adresare (directă la registru) | + | * [8,9] = [1,1] - modul de adresare (directă la registru) |
- | * [10,11,12] = [0,0,0] - nu folosim REG, deci nu contează ce punem | + | * [10,11,12] = [0,0,0] - nu folosim REG, deci nu contează ce punem |
- | * [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 ^ | ||
Line 113: | Line 123: | ||
</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 [[.:lab08#implementare| implementare]]. | + | ===== Exerciții ===== |
- | - (4p) Decodificați instrucțiunea //INC RA//. | + | |
+ | |||
+ | Modificați modulul //uc.v// din scheletul de cod al laboratorului, astfel încât să implementați instrucțiunile din [[lab08#Codificarea instrucțiunilor|tabelul]] prezentat anterior. Citiți secțiunea de [[.:lab08#implementare| implementare]]. | ||
+ | - **(4p)** Decodificați instrucțiunea //INC RA//. | ||
- Identificați grupul de instrucțiuni în care se încadrează operația (inc) și operandul (RA). | - Identificați grupul de instrucțiuni în care se încadrează operația (inc) și operandul (RA). | ||
- Transferați conținutul registrului RA în registrul T1 | - Transferați conținutul registrului RA în registrul T1 | ||
Line 122: | Line 134: | ||
* 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 | ||
- Transferați conținutul registrului T1 în registrul RA | - Transferați conținutul registrului T1 în registrul RA | ||
- | - (1p) Generalizați instrucțiunea implementată la exercițiul anterior astfel încât să funcționeze cu orice registru general. | + | - **(1p)** Generalizați instrucțiunea implementată la exercițiul anterior astfel încât să funcționeze cu orice registru general. |
- | - (5p) Decodificați restul instrucțiunilor. | + | - **(5p)** Decodificați restul instrucțiunilor. |
Testați întâi corectitudinea implementării folosind testerul offline. Apoi testați pe placă. Ram-ul are încărcate instrucțiunile din //tests//->//one_operand//->//test.asm//. | Testați întâi corectitudinea implementării folosind testerul offline. Apoi testați pe placă. Ram-ul are încărcate instrucțiunile din //tests//->//one_operand//->//test.asm//. | ||
Line 138: | Line 150: | ||
* resetul sincron pe //BTN_NORTH//; | * resetul sincron pe //BTN_NORTH//; | ||
* switch-urile controlează factorul de divizare pentru generatorul de ceas de pe placă. Toate switch-urile în sus corespund factorului cel mai mare | * switch-urile controlează factorul de divizare pentru generatorul de ceas de pe placă. Toate switch-urile în sus corespund factorului cel mai mare | ||
- | |||
| | ||
- | == Resurse == | + | ===== Resurse ===== |
+ | |||
* {{.:lab07:sol:lab8_skel.zip|Schelet de cod}} | * {{.:lab07:sol:lab8_skel.zip|Schelet de cod}} | ||
- | * {{.:lab08:sol:lab8_sol.zip|Soluție laborator}} (disponibilă începând cu 23.11.2019) | + | * <html><a class="media mediafile mf_pdf" href="https://ocw.cs.pub.ro/courses/ac-is/lab/lab08?do=export_pdf">PDF laborator</a></html> |
- | * <html><a class="media mediafile mf_pdf" href="/ac/wiki/lab/lab08?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}} | ||
+ | * {{.:lab08:sol:lab8_sol.zip|Soluție laborator}} | ||
- | <ifauth @user> | + | <ifauth @ac-is> |
---- | ---- | ||
- | * [[:internal:1op|Ghid asistent]] | + | * {{.:lab08:sol:lab8_sol.zip|Soluție laborator}} |
+ | * [[ac-is:internal:guidelines|Ghid asistent]] | ||
</ifauth> | </ifauth> | ||
+ |