Sunteți pe pagina 1din 6

1. Intrebare: De ce program counter-ul nostru este pe 6 biti?

Raspuns: Conform datasheet-ului, microprocesorul PIC24 are un program counter pe 23


de biti, unde bitul 0 are mereu valoarea 0, iar incrementarea se face cu 2 in urma
executiei unei instructiuni normale(nu de branch). In cadrul proiectului, s-a hotarat
minimizarea program counter-ului la 6 biti. Deoarece incrementarea este cu 2, primul bit
ramane mereu 0, iar adresarea memoriei ROM se face doar cu 5 biti. Combinatiile
posibile cu 5 biti sunt de 32, adica cat este dimensiunea memoriei ROM32X24.

2. Intrebare: Ce este program counter-ul?

Raspuns: Program counter-ul, la baza lui este un registru paralel-paralel cu inscrierea pe


front ridicator al semnalului de tact. Program counter-ul selecteaza instructiunea ce va
trebui executata, adresand memoria ROM32X24. In mod normal program counter-ul
este incrementat cu 2, insa pentru instructiunile de branch este incrementat cu 2 si cu
offset-ul specificat in instructiune, ce se afla pe bitii 4:0.
In mod normal, program counter-ul este incrementat direct de catre ALU, insa pentru simplitatea
proiectului program counter-ul a fost impartit in 2 blocuri: ProgCnt si PC_Update. La fiecare
impuls de tact, ProgCnt este actualizat de catre PC_Update. PC_Update primeste de la unitatea
de control semnalul Bra ce semnifica executia unei instructiuni de Branch. Instr(4:0) nu sunt
altceva decat bitii 4:0 din instructiunea de branch, ce reprezinta primii 5 biti din Slit16 conform
datasheet-ului(in cazul nostru, ca si analogie, Slit16 devine Slit5). Cum am specificat,
incrementarea este cu 2, iar daca trebuie sa executam instructiune de branch va fi necesar
offset-ului sa ii concatenam un 0 la dreapta(bitul cel mai nesemnificativ) pentru a executa
adunarea conform formulei: PC = PC + 2 + Slit5. Exemplu: Slit5 este 00111, insa nu putem sa-l
adunam direct, va trebui sa concatenam un 0 la dreapta, adica: 00111 -> 001110. De
asemenea, OPCODE-ul instructiunilor de branch este la fel(considerand ca opcode-ul nostru
este pe bitii 23:19). Program counter-ul nu citeste opcode! El trebuie sa fie controlat si sa
primeasca ordinele de la unitatea de control, de aceea el primeste semnalul Bra de la unitatea
de control. Astfel, se poate vedea in tabel bitii 18:16 la instructiunile de branch ca difera, astfel
putem urma pasii urmatori pentru executia unei instructiuni de branch:
- Primeste semnalul Bra de la unitatea de control ce semnifica comanda ca trebuie sa fie
executata o instructiune de branch.
- Citeste bitii 18:16 si vezi tipul de branch.
- Citeste flag-urile de la ALU din registrul de control si vezi conditia de branch.
In alte cuvinte, se citesc tot timpul bitii 18:16 insa sunt luati in considerare doar daca se
primeste clar semnalul de branch, si daca flagurile sunt activate. Daca executam Bra Ovf
0x4 inseamna ca semnalul Bra este 1, bitii 18:16 sunt 000, iar flagul de OVF este 1.
Altfel, nu se executa si gata.
3. Intrebare: Ce este memoria ROM32X24?

Raspuns: Memoria ROM32X24 este o memorie read-only cu 32 de locatii de memorie a


cate 24 de biti fiecare. Memoria ROM contine instructiunile ce sunt executate de
procesor. Deoarece se afla 32 de locatii de memorie, sunt necesari 5 biti pentru
adresarea memoriei(toate valorile de 5 biti rezulta 32 de combinatii).

4. Intrebare: Ce sunt MUX2V4??

Raspuns: Multiplexorul este un circuit combinational ce actioneaza ca un comutator. El


primeste 2^N intrari si din aceste intrari scoate o iesire, folosind N selectoare. Adica,
daca avem 4 intrari si o iesire, avem nevoie de 2 biti, deoarece toate combinatiile de 2
biti sunt 4. Pt 00, pe iesire se afla prima intrare, pt 01 pe iesire se afla a doua intrare, pe
10 pe iesire se afla a treia intrare si pe 11 pe iesire se afla a patra intrare. Conform
tabelului cu instructiuni, se pot observa de ex la instructiunea ADD Wb, Ws, Wd ca bitii
pentru adresarea registrului destinatie (Wd) sunt de la 10:7. Insa pentru instructiunea
MOV f, Wnd se observa ca bitii pentru adresarea registrului destinatie(Wnd) sunt de la
3:0. Din aceasta cauza, este necesar sa punem un multiplexor care sa selecteze bitii
necesari pentru adresarea filei de registrii. De asemenea, Pentru instructiunea ADD Wb,
Ws, Wd, se observa ca bitii pentru adresarea registrului baza(Wb) se afla de la 18:15, pe
cand la instructiunea ASR Wb, #lit4, Wnd se afla de la 14:11. In concluzie, avem nevoie,
in acest caz, de doua multiplexoare ce sa selecteze bitii necesari instructiunii. Unitatea
de control decodifica opcode-ul si observa de exemplu ca urmeaza instructiunea ADD
Wb, Ws, Wd si el stie ca pe bitii 10:7 sunt bitii pentru registrul destinatie asa ca da un
semnal de 1 la selectorul multiplexorului. Altfel, daca este instructiunea Mov f, Wnd ,
unitatea de control stie ca pe bitii 3:0 se afla bitii pentru adresarea registrului destinatie
asa ca da semnalul 0 la selectorul multiplexorului.
5. Intrebare: Ce este File_Regs?
Raspuns: File_Regs sunt registrii procesorului. Fila de registre se actualizeaza la fiecare
semnal de tact pe front ridicator, si cu semnalul RegWr activ, ce vine de la unitatea de
control. Unitatea de control cand decodifica instructiunea stie care instructiune se scrie
pe registru si care se scrie in memoria RAM sau ce instructiune nu se scrie nicaieri, ca
de exemplu Brach. In cazul nostru, toate instructiunile normale se scriu in registrii, de
exemplu ADD Wb, Ws, Wd aduna registrul sursa(Ws) cu registrul baza(Wb) si le muta in
registrul destinatie(Wd). Instructiunea MOV f, Wnd muta informatia din memoria RAM in
registrul destinatie specificat. MOV Wns, f muta informatia din registrul sursa in memoria
RAM. Bitii 8:4 din instructiunile de MOV specifica adresa memoriei RAM.

6. Intrebare: Ce este DataMem?


Raspuns: DataMem reprezinta memoria RAM. Memoria RAM specificata are zone de
adrese de la 0x1000 la 0x101E. Pe pozitiile 0x1020, 0x1022 si 0x1024 se afla zone
speciale de memorie, cu utilitate speciala. 0x1020 este read-only, la 0x1022 este
read-only iar la 0x1024 este write-only.

Se observa ca in instructiune 0x1020 este in cod masina 0x810, adica


0x1020 / 2 = 0x810, adica 0b10000. Echivalent si pentru 0x1022 si
0x1024.(Comentarii suplimentare in fisierul din proiect DataMem.vhdl)

7. Intrebare: Ce este ALU?


Raspuns: ALU este unitatea aritmetica si logica a procesorului. ALU se ocupa cu
executarea instructiunilor aritmetice si logice(add, sub, and, ior etc…). ALU are
incorporat registrul de stare ce cuprinde flag-urile, de aceea ALU are ca si semnal de
intrare Clk(tact). ALU primeste semnalul ALUOP ce reprezinta tipul de instructiune ce
trebuie executat si semnalele de enable pentru flag-uri(Unitatea de control ia opcode-ul
si decodifica, si ii da lui ALU toate semnalele necesare ca ALU sa faca ce trebuie bine).
8. Intrebare: Ce este ctrl?
Raspuns: CTRL este unitatea de control ce da semnale la blocurile din procesor.
Unitatea de control decodifica instructiunea si da informatiile necesare ca de exemplu
enable-urile pt registrii si memorie, selectoarele pentru multiplexoare, ALUOP pentru
ALU, enable-urile pt flaguri etc.

9. Intrebare: Ce este MUX2V16?


Raspuns: Multiplexorul are 2 intrari a cate 16 biti, si se ocupa cu stabilirea caii catre
FileRegs. De exemplu, daca avem instructiunea ADD Wb, Ws, Wd, va fi executata de
ALU si rezultatul trebuie stocat in registrul destinatie Wd. Astfel, multiplexorul trebuie sa
permita calea rezultatului de la ALU catre FileRegs. Pentru asta, unitatea de control
ofera semnalul MemToReg = 0. Insa, daca se executa instructiunea MOV f, Wnd data
din DataMem trebuie scrisa in registrul destinatie iar multiplexorul trebuie sa selecteze
calea de la DataMem la FileRegs.

10. Intrebare: Ce este lit ?


Raspuns: Literalul este un numar imediat fara semn ce este adaugat direct la operatie.
De exemplu, SUB Wb, #lit5, Wd inseamna scaderea continutului din registru de baza
Wb cu literalul pe 5 biti #lit5 si punerea rezultatului in registrul destinatie Wd. In situatia
acestui proiect, avem 3 instructiuni cu literal si anume ASR Wb, #lit4, Wnd, SUB Wb,
#lit5, Wd si AND #lit10, Wn.
Dupa cum se poate vedea din poza, k reprezinta valoarea literalului. La ASR avem literal
pe 4 biti (cercul rosu), la SUB avem literal pe 5 biti(cercul albastru) si la AND avem literal pe 10
biti (cercul negru). Am avea nevoie de 3 semnale ce sa semnifice literalii, si sa intre in ALU.
Insa, dupa cum se poate vedea, ASR si SUB au literalul aproximativ pe aceeasi biti. Asa ca, am
hotarat crearea semnalului Lit4or5 care, in functie de instructiune semnifica ori Lit4 ori Lit5.
Daca este Lit4, nu se ia in calcul bitul din stanga si aia e(si daca se ia nu e nicio treaba ca bitul
din stanga e 0 deci nu isi schimba numarul forma). Insa literalul 10 are alte pozitii asa ca am
folosit alt semnal. Aceste semnale intra continuu in ALU insa le ia ALU in considerare doar daca
corespund cu instructiunile specificate. De exemplu daca se executa ADD, o sa intre bitii de k
de la ASR SUB si AND care o sa aiba valori garbage sau cine stie insa nu le ia in calcul pt ca
ALU trb sa faca ADD si gata.

11. Intrebare: Cum se face diferentierea intre SUB Wb, Ws, Wd si SUB Wb, #lit5, Wd ?
Raspuns: Foarte simplu. Au acelasi OPCODE, ceea ce e o problema. Insa instructiunea
SUB Wb, #lit5, Wd are 2 biti speciali pe pozitiile 6:5.

Asa ca, ALU va primi ALUOP de la unitatea de control, plus bitii 6:5 numiti SUBOP si
daca opcode-ul corespunde cu 01010 si pe pozitiile 6:5 se afla 11 atunci instructiunea e Sub
Wb, #lit5, Wd. Altfel, daca e doar opcode-ul 01010 si pe bitii 6:5 nu se afla 11 atunci
instructiunea e SUB Wb, Ws, Wd.

S-ar putea să vă placă și