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 [2025/05/27 17:37] (current) stefan.maruntis [Semnale de control] |
||
---|---|---|---|
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 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 ==== |