Differences

This shows you the differences between two versions of the page.

Link to this comparison view

soc:laboratoare:09 [2025/05/15 11:10]
mihai_catalin.stan [Resurse]
soc:laboratoare:09 [2025/05/27 17:37] (current)
stefan.maruntis [Semnale de control]
Line 37: Line 37:
  
 ^ Semnal ^ Explicatie ^ ^ Semnal ^ Explicatie ^
-| RET |  +| RET | Folosit doar in instructiunea de RET 
-| CALL |  |+| CALL | Folosit doar in instructiunea de CALL addr |
 | RAM_EN_H | Pune octetul superior din RAM[mar] in registrul de date | | RAM_EN_H | Pune octetul superior din RAM[mar] in registrul de date |
 | RAM_EN_L | Pune octetul inferior din RAM[mar] in registrul de date | | RAM_EN_L | Pune octetul inferior din RAM[mar] in registrul de date |
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 ====
Line 183: Line 195:
 Pentru fiecare task studentii vor avea de implementat logica instructiunii in modulul corespunzator si de modificat semnalele de control din excel. Mai jos aveti atasata arhiva solutiei. Pentru fiecare task studentii vor avea de implementat logica instructiunii in modulul corespunzator si de modificat semnalele de control din excel. Mai jos aveti atasata arhiva solutiei.
  
-Pentru operatia de JP (Jump Positive), semnalele vor fi identice cu cele de la Jump Minus, fiind primul task vrem sa vedem ca studentii macar inteleg sumar ce se intampla cu acele semnale.+Pentru operatia de **JP (Jump Positive)**, semnalele vor fi identice cu cele de la Jump Minus, fiind primul task vrem sa vedem ca studentii macar inteleg sumar ce se intampla cu acele semnale
 + 
 +Pentru operatiile de **CMP**, implementarea va fi identica cu cea a operatiei de SUB, iar semnalele vor fi similare. CMP B difera de SUB B prin faptul ca nu vom mai activa semnalul de A_LOAD (nu vom scrie rezultatul in registrul A). Similar si pentru CMP C. 
 + 
 +In **simulare**,​ daca operatiile au fost implementate cu succes, se va efectua A = 3, B = 2, CMP, JP, HLT, iar simularea se va opri dupa 280.000ns. Daca nu este recunoscuta instructiunea,​ va ramane blocat pe aceasta. Daca sunt implementate gresit, nu se va executa JP la adresa 0x0B (HLT) ci se va executa JMP 0x00 (inapoi la inceputul programului).
  
-Pentru ​operatiile ​de CMP, implementarea va fi identica ​cu cea a operatiei ​de SUB, iar semnalele vor fi similare. CMP B difera de SUB B prin faptul ​ca nu vom mai activa semnalul de A_LOAD (nu vom scrie rezultatul in registrul A)Similar si pentru CMP C.+Pentru ​a verifica doar functionalitatea lui JP, studentii pot inlocui opcode-ul instructiunii ​de CMP cu cel al instructiunii ​de SUB B. Daca JP e implementata corectsimularea se va opri ca mai sus, dupa 280.000ns.
  
-Operatia de IN byte este similara cu cea de OUT pe care am dat-o ca referinta. Primele 3 etape sunt identice la toate instructiunile,​ a 4-a etapa va pune pe magistrala datele din MDR, iar in etapa urmatoare vrem sa le incarcam in IOA (adresa registrului de IO). In urmatoarea (si ultima etapa) vrem sa trimitem datele din IO module (cu IO_EN) si sa le incarcam in registrul A (A_LD).+Operatia de **IN byte** este similara cu cea de OUT pe care am dat-o ca referinta. Primele 3 etape sunt identice la toate instructiunile,​ a 4-a etapa va pune pe magistrala datele din MDR, iar in etapa urmatoare vrem sa le incarcam in IOA (adresa registrului de IO). In urmatoarea (si ultima etapa) vrem sa trimitem datele din IO module (cu IO_EN) si sa le incarcam in registrul A (A_LD).
 </​hidden>​ </​hidden>​
  
soc/laboratoare/09.1747296608.txt.gz · Last modified: 2025/05/15 11:10 by mihai_catalin.stan
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0