Diferență între revizuiri ale paginii „Laboratorul 2”

De la WikiLabs
Jump to navigationJump to search
Linia 13: Linia 13:
 
!mnemonică!! detalii!!
 
!mnemonică!! detalii!!
 
|-
 
|-
| <code>ADD</code> || <code> R[dest] <- R[sursa1] + R[sursa2] </code>||
+
| <code>ADD</code> || <code> R[dest] <- R[sursa1] + R[sursa2] </code> ||
 
|-
 
|-
| <code>SUB</code> || R[dest] <- R[sursa1] - R[sursa2]||
+
| <code>SUB</code> || <code> R[dest] <- R[sursa1] - R[sursa2] </code> ||
 
|-
 
|-
| <code>AND</code> || R[dest] <- R[sursa1] & R[sursa2] ||
+
| <code>AND</code> || <code> R[dest] <- R[sursa1] & R[sursa2] </code> ||
 
|-
 
|-
| <code>OR</code>  || R[dest] <- R[sursa1] | R[sursa2] ||
+
| <code>OR</code>  || <code> R[dest] <- R[sursa1] | R[sursa2] </code> ||
 
|-
 
|-
| <code>XOR</code> || R[dest] <- R[sursa1] ^ R[sursa2] ||
+
| <code>XOR</code> || <code> R[dest] <- R[sursa1] ^ R[sursa2] </code> ||
 
|-
 
|-
| <code>CMP</code> || Z <- R[sursa1] == R[sursa2], N <- R[sursa1] >= R[sursa2]||
+
| <code>CMP</code> || <code> Z <- R[sursa1] == R[sursa2], N <- R[sursa1] >= R[sursa2] </code> ||
 
|-
 
|-
| <code>LOADC</code> || R[dest] <- instr_data||   
+
| <code>LOADC</code> || <code> R[dest] <- instr_data </code> ||   
 
|-
 
|-
| <code>LOAD</code> || R[dest] <- memorie[R[sursa1]]||
+
| <code>LOAD</code> || <code> R[dest] <- memorie[R[sursa1]] </code> ||
 
|-  
 
|-  
| <code>STORE</code> || memorie[R[sursa1]] <- R[sursa2]||
+
| <code>STORE</code> || <code> memorie[R[sursa1]] <- R[sursa2] </code> ||
 
|-  
 
|-  
| <code>HALT</code> || halt||
+
| <code>HALT</code> || <code> halt </code> ||
 
|}
 
|}
  

Versiunea de la data 10 octombrie 2019 08:41

Arhitectura von Neumann

Arhitectura de calculator von Neumann este caracterizată printr-o memorie unică, în care se află atât programul cât și datele, și o magistrală unică, folosită pentru transferul instrucțiunilor de la memorie la procesor, a datelor între procesor și memorie sau între procesor și oricare din dispozitivele de intrare/ieșire conectate la magistrală.

În această lucrare de laborator se va realiza un calculator simplu, având doar procesorul și memoria.

Asc lab1 neumann.png

Setul de instrucțiuni

Tabelul 1
mnemonică detalii
ADD R[dest] <- R[sursa1] + R[sursa2]
SUB R[dest] <- R[sursa1] - R[sursa2]
AND R[dest] <- R[sursa1] & R[sursa2]
OR R[sursa2]
XOR R[dest] <- R[sursa1] ^ R[sursa2]
CMP Z <- R[sursa1] == R[sursa2], N <- R[sursa1] >= R[sursa2]
LOADC R[dest] <- instr_data
LOAD R[dest] <- memorie[R[sursa1]]
STORE memorie[R[sursa1]] <- R[sursa2]
HALT halt

Procesorul

Având o singură cale de acces atât pentru instrucțiuni, cât și pentru date, arhitectura von Neumann procesează o instrucțiune în mai mulți pași, în fiecare pas magistrala comună fiind configurată pentru un anumit transfer între blocurile și registrele conectate la aceasta. Secvențierea procesării instrucțiunilor se face cu ajutorul unității de control al procesorului (UCP), aceasta fiind implementată fie ca o mașină de stări, fie ca o structură microprogramabilă.

Pentru a menține simplitatea la un nivel adecvat unui laborator introductiv, se va considera o arhitectură de procesor cu acumulator, fără set de registre, ale cărui instrucțiuni folosesc cel mult un operand din memorie, prin adresare imediată sau adresare directă.

Schema bloc a procesorului conține o unitate aritmetico-logică (ALU), un contor de program (PC) ce se poate incrementa sau încărca cu o valoare dată, un registru pentru adresarea memoriei (ADDR), registrul instrucțiunii (IR) ce păstrează codul instrucțiunii pe toată durata procesării acesteia, un registru pentru operandul adus din memorie (DATAIN), registrul acumulator (ACC), câțiva biți pentru indicații despre rezultatul ultimei operații efectuate de ALU (F) și unitatea de control a procesorului (UCP). Pentru a nu complica desenul, în schema bloc au fost schițate doar traseele principale (magistrala de date, calea de adresare):

Asc lab2 microneumann.png


PC

Contorul de program este folosit pentru citirea instrucțiunilor din memorie. Acesta poate fi incrementat sau încărcat cu valoarea de pe magistrala de date, dar numai la comanda UCP.

always @(poosedge clk) begin
    if(rst)
        pc <= 0;
    else begin
        if(pc_load)
            // PC ia valoarea de pe magistrala comună de date
        else if (pc_incr)
            pc <= pc + 1;
        else
            pc <= pc;
    end
end

ADDR

Registrul de adresare a memoriei pentru citirea datelor este un registru elementar ce poate fi doar încărcat:

always @(poosedge clk) begin
    if(rst)
        raddr <= 0;
    else begin
        if(raddr_load)
            // ADDR ia valoarea de pe magistrala comună de date
        else
            raddr <= raddr;
    end
end

UCP

Unitatea de control a procesorului controlează actualizarea fiecărui registru din procesor, accesul la magistrala comună de date și multiplexarea adreselor spre memorie. Ea se implementează ca un FSM cu câteva stări și tranziții ce depind de tipul instrucțiunii. Pentru o instrucțiune aritmetico-logică secvența de procesare are 4 pași, necesitând 4 cicuri de ceas:

Asc lab1 fsmneumann.png