This shows you the differences between two versions of the page.
|
soc:laboratoare:09 [2025/05/15 11:26] mihai_catalin.stan [Exercitii laborator] |
soc:laboratoare:09 [2026/05/15 13:22] (current) mihnea.popescu1811 [Unitatea de control] |
||
|---|---|---|---|
| Line 17: | Line 17: | ||
| ==== Unitatea de control ==== | ==== Unitatea de control ==== | ||
| - | La fiecare front negativ de ceas, deci la finalul fiecărui ciclu, controller-ul vaverifica semnalul de reset, care va reseta orice instrucțiune se execută și va trece înapoi în stage 0 (IF). | + | La fiecare front negativ de ceas, deci la finalul fiecărui ciclu, controller-ul va verifica semnalul de reset, care va reseta orice instrucțiune se execută și va trece înapoi în stage 0 (IF). |
| În orice alt caz el va trece circular (deci de la WB vom trece înapoi în IF) la următorul stagiu de execuție a instrucțiunii curente: | În orice alt caz el va trece circular (deci de la WB vom trece înapoi în IF) la următorul stagiu de execuție a instrucțiunii curente: | ||
| Line 44: | Line 44: | ||
| | MDR_EN | Incarca output-ul memoriei pe magistrala sistemului | | | MDR_EN | Incarca output-ul memoriei pe magistrala sistemului | | ||
| | MDR_LD | Incarca octetul inferior de pe magistrala in octetul inferior al MDR | | | MDR_LD | Incarca octetul inferior de pe magistrala in octetul inferior al MDR | | ||
| - | | MAR_LD_L | Incarca octetul superior al unei adrese aflate pe magistrala in octetul superior al MAR | | + | | MAR_LD_H | Incarca octetul superior al unei adrese aflate pe magistrala in octetul superior al MAR | |
| - | | MAR_LD_H | Incarca octetul inferior al unei adrese aflate pe magistrala in octetul inferior al MAR | | + | | MAR_LD_L | Incarca octetul inferior al unei adrese aflate pe magistrala in octetul inferior al MAR | |
| | PC_EN | Pune pe magistrala valoarea program counter-ului | | | PC_EN | Pune pe magistrala valoarea program counter-ului | | ||
| | PC_LD | Incarca in modulul de program counter valoare de pe magistrala (folosit in instructiunile de jump, care trebuie sa sara la o anumita instructiune) | | | PC_LD | Incarca in modulul de program counter valoare de pe magistrala (folosit in instructiunile de jump, care trebuie sa sara la o anumita instructiune) | | ||
| Line 63: | Line 63: | ||
| | HLT | Incheie executia programului | | | HLT | Incheie executia programului | | ||
| | END | Incheie executia instructiunii curente | | | END | Incheie executia instructiunii curente | | ||
| + | |||
| + | Toate aceste semnale sunt scrise in ctrl_rom_io.bin. Ne amintim din laboratorul 8 ca acesta contine cuvinte de control, in care fiecare valoarea reprezinta un semnal, spre exemplul cuvantul 100000000000000000000000000000000000000 indica faptul ca doar semnalul de END este activ. | ||
| + | |||
| + | Adresa din ROM este formata prin concatenarea opcode-ului (8 biti) cu stage-ului (4 biti). Spre exemplu, cuvantul de la adresa 000000010010 (al 18-lea cuvant de control) este format prin concatenarea opcode-ului 00000001 cu stage-ul 0010. Deci acest cuvant de control contine semnalele ce trebuiesc executate de instructiunea codificata cu 8'h01, in stage-ul 2 al executiei. | ||
| ==== Instrucțiuni ==== | ==== Instrucțiuni ==== | ||
| Line 103: | Line 107: | ||
| | ORI byte | F6 | 7 | S,Z | Immediate | 2 | A = A OR byte | | | ORI byte | F6 | 7 | S,Z | Immediate | 2 | A = A OR byte | | ||
| | RAL | 17 | 4 | - | Implied | 1 | A « 1, LSB becomes zero | | | RAL | 17 | 4 | - | Implied | 1 | A « 1, LSB becomes zero | | ||
| - | | RAR | 1F | 4 | - | Implied | 1 | A » 1, MSB goes to LSB | | + | | RAR | 1F | 4 | - | Implied | 1 | A » 1, LSB goes to MSB | |
| | RET | C9 | 5 | - | Implied | 1 | Return from function | | | RET | C9 | 5 | - | Implied | 1 | Return from function | | ||
| | STA addr | 32 | 9 | - | Direct | 3 | Store value in A at addr | | | STA addr | 32 | 9 | - | Direct | 3 | Store value in A at addr | | ||
| Line 114: | Line 118: | ||
| Instrucțiunile pot fi împărțite în 4 categorii în funcție de modul în care adresează memoria în opcode: | Instrucțiunile pot fi împărțite în 4 categorii în funcție de modul în care adresează memoria în opcode: | ||
| - | * Direct - Primește adresa de memorie pe care se operează în instrucțiune - ex. STA addr (Store la o anumită adresa) | + | * Direct - Primește adresa de memorie pe care se operează în instrucțiune - ex. STA addr (Store la o anumită adresa) |
| - | * Immediate - Primește o valoare constantă direct folosită în instrucțiune - ex. ORI byte (Aplica operatia de OR logic între registrul A și o valoare primită) | + | * Immediate - Primește o valoare constantă direct folosită în instrucțiune - ex. ORI byte (Aplica operatia de OR logic între registrul A și o valoare primită) |
| - | * Register - Funcționează pe datele dintr-un registru - ex. DCR A - Decrementează valoare registrului A | + | * Register - Funcționează pe datele dintr-un registru - ex. DCR A - Decrementează valoare registrului A |
| - | * Implied - Adresa/Registrul pe care se efectuează instrucțiunea este implicită și nu se modifică - ex. RAL (Shiftează la stânga valoarea din registrul A și o salvează înapoi tot în acesta) | + | * Implied - Adresa/Registrul pe care se efectuează instrucțiunea este implicită și nu se modifică - ex. RAL (Shiftează la stânga valoarea din registrul A și o salvează înapoi tot în acesta) |
| Sistemul nostru - SOC-1 - ia 3 ciclii de ceas pentru aducerea instrucțiunii de executat din memorie, deci cea mai scurtă instrucțiune va dura 3 ciclii (NOP). Cele mai lungi instrucțiuni sunt cele care lucrează cu adrese din memoria ROM și ajung până la 9-10 ciclii de ceas (STA - 9 ciclii, CALL - 9 ciclii, LDA - 10 ciclii) | Sistemul nostru - SOC-1 - ia 3 ciclii de ceas pentru aducerea instrucțiunii de executat din memorie, deci cea mai scurtă instrucțiune va dura 3 ciclii (NOP). Cele mai lungi instrucțiuni sunt cele care lucrează cu adrese din memoria ROM și ajung până la 9-10 ciclii de ceas (STA - 9 ciclii, CALL - 9 ciclii, LDA - 10 ciclii) | ||
| Instrucțiunile de jump durează 4 sau 8 ciclii de ceas în funcție de rezultatul comparației din controller. Dacă în controller condiția eșuează și jump-ul nu este executat, acesta durează 4 ciclii de ceas. În schimb, dacă acesta este executat, instrucțiunea de jump durează 8 ciclii. | Instrucțiunile de jump durează 4 sau 8 ciclii de ceas în funcție de rezultatul comparației din controller. Dacă în controller condiția eșuează și jump-ul nu este executat, acesta durează 4 ciclii de ceas. În schimb, dacă acesta este executat, instrucțiunea de jump durează 8 ciclii. | ||
| + | |||
| + | ==== Implementarea unei instructiuni ==== | ||
| + | |||
| + | Pentru implementarea unei instructiuni sunt necesari pasii urmatori: | ||
| + | - Intelegerea semnalelor de control | ||
| + | - Determinarea modulelor implicare in executia unei instructiuni si a flow-ului datelor prin acestea | ||
| + | - Prelucrarea datelor in modulele corespunzatoarea (spre exemplu, prelucrarea datelor in UAL in timpul instructiunii de ADD) | ||
| + | - Scrierea semnalelor pentru fiecare stage si modificarea ROM-ului controller-ului cu semnalele corespunzatoare | ||
| ==== Scrierea și execuția de cod pe SOC-1 ==== | ==== Scrierea și execuția de cod pe SOC-1 ==== | ||
| Line 159: | Line 171: | ||
| - (5p) (Branch Group Instructions): Observati cum este implementata instructiunea de JM (Jump Minus) si implementati similar si operatia de JP (Jump Positive) in modulul controller.v. Vom defini opcode-ul instructiunii JP ca fiind 8'hFB. Ulterior, modificati in sap2_ctrl_rom.xlsx semnalele de control necesare fiecarei etape de executie a instructiunii. Dupa ce le-ati modificat, copiati coloana cu semnalele concatenate si puneti-le in ctrl_rom_io.bin. | - (5p) (Branch Group Instructions): Observati cum este implementata instructiunea de JM (Jump Minus) si implementati similar si operatia de JP (Jump Positive) in modulul controller.v. Vom defini opcode-ul instructiunii JP ca fiind 8'hFB. Ulterior, modificati in sap2_ctrl_rom.xlsx semnalele de control necesare fiecarei etape de executie a instructiunii. Dupa ce le-ati modificat, copiati coloana cu semnalele concatenate si puneti-le in ctrl_rom_io.bin. | ||
| - (5p) (Arithmetic Group Instructions): Implementati in modulul UAL instrucțiunile CMP B si CMP C, care compara prin scadere valoarea lui A cu a lui B, respectiv C si modifica flag-urile pe baza acestor operatii. Opcode-urile pentru CMP B si CMP C in ALU sunt 8 si 9, iar in ROM si excel sunt 8'h92 si 8'h93. Modificati semnalele si adaugati-le in ctrl_rom_io.bin ca la task-ul de mai sus. | - (5p) (Arithmetic Group Instructions): Implementati in modulul UAL instrucțiunile CMP B si CMP C, care compara prin scadere valoarea lui A cu a lui B, respectiv C si modifica flag-urile pe baza acestor operatii. Opcode-urile pentru CMP B si CMP C in ALU sunt 8 si 9, iar in ROM si excel sunt 8'h92 si 8'h93. Modificati semnalele si adaugati-le in ctrl_rom_io.bin ca la task-ul de mai sus. | ||
| - | - (0p): Cum va usureaza munca instrucțiunile implementate la task 2 fata de utilizarea unor operatii normale de SUB | + | - (0p): Cum va usureaza munca instrucțiunile implementate la task 3 fata de utilizarea unor operatii normale de SUB? |
| - (Bonus) (I/O Group Instructions): Implementati instructiunea de I/O IN data, care se va primi prin intermediul switch-urilor o valoare pe 4 biti pe care o veti stoca in sectiunea LOW a registrului A. Instructiunea de IN poate fi gasita ca 0'hDB. Pentru ajutor puteti vedea si instructiunea de OUT ca 0'hD3. Modificati semnalele si ctrl_rom_io ca la primele 2 task-uri. | - (Bonus) (I/O Group Instructions): Implementati instructiunea de I/O IN data, care se va primi prin intermediul switch-urilor o valoare pe 4 biti pe care o veti stoca in sectiunea LOW a registrului A. Instructiunea de IN poate fi gasita ca 0'hDB. Pentru ajutor puteti vedea si instructiunea de OUT ca 0'hD3. Modificati semnalele si ctrl_rom_io ca la primele 2 task-uri. | ||