You are on page 1of 38

UNIVERZITET U NOVOM SADU

FAKULTET TEHNIČKIH NAUKA


Odsek za elektrotehniku i računarstvo
Institut za računarstvo i automatiku
Katedra za računarsku tehniku i računarske
komunikacije

JEDNOSTAVAN RAČUNARSKI DIZAJN


PROCESOR µP1

- projektna dokumentacija -

Profesor: Student:
Vladimir KOVAČEVIĆ Miljan RADOVIĆ E8774

Asistent:
Mihajlo KATONA
SADRŽAJ:

1. Upoznavanje sa procesorom računarskog sistema


1.1 Uvod
1.2 Računarski programi i instrukcije
1.3 Ciklus procesorske obrade instrukcije
1.3.1 Dobavljanje
1.3.2 Dekodiranje
1.3.3 Izvršavanje

2. VHDL model procesora µP1

3. Laboratorijski zadaci
3.1 Izvršavanje programa A = (B+C)+D
3.2 Dodavanje instrukcije JNEG
3.3 Dodavanje instrukcija SUBT, XOR, OR, AND, JPOS,
JZERO i ADDI
3.4 Dodavanje instrukcija SHL i SHR
3.5 Prikaz registra PC na led displeju
3.6 Dodavanje instrukcija IN i OUT
3.11 Proširivanje adrese smanjivanjem opkoda
3.12 Dodavanje nove memorije
3.13 Dodavanje instrukcija CALL i RETURN
3.14 Dodavanje instrukcija PUSH i POP
3.15 Spajanje svih instrukcija u jednu celinu

4. Dodaci
4.1 Dodatak A - VHDL kod procesora µP1
4.2 Dodatak B - Datoteka za inicijalizaciju memorije
4.3 Dodatak C - Kompletan spisak instrukcija procesora µP1
4.4 Dodatak D - Zavisnosti između signala
4.4.1 Takt - CLOCK
4.4.2 Resetovanje - RESET
4.4.3 Stanje - STATE
4.4.4 Programski brojač - PC
4.4.5 Instrukcioni registar - IR
4.4.6 Memorijski adresni registar - MAR
4.4.7 Memorijski registar podatak - MDR
4.4.8 Akumulatorski registar - AC

5. Skraćenice

6. Literatura
1 UPOZNAVANJE SA PROCESOROM
RAČUNARSKOG SISTEMA

1.1 Uvod

Tradicionalni digitalni računar se sastoji od tri glavna dela:


procesora ili centralne procesorske jedinice (CPU), memorije u koju se
smeštaju programske instrukcije i podaci i ulazno/izlaznog hardvera
koji omogućava komunikaciju sa drugim uređajima. Kao što vidimo na
slici 1.1, ove tri jedinice su povezane skupom paralelnih digitalnih
signala nazvanih magistralom. Signali na magistrali su memorijska
adresa, memorijski podaci i status magistrale. Signali statusa
magistrale označavaju trenutnu operaciju magistrale: čitanje
memorije, pisanje u memoriju, ili ulazno/izlazna operacija.

Procesor

Memorija U /I
PC IR

AC
MAR
Adresna magistrala

ALU MDR
Magistrala podataka

Upravljacka
jedinica

Slika 1.1 - Arhitektura jednostavnog računarskog sistema

Interno, procesor sadrži mali broj registara koji se koriste za


smeštanje podataka unutar procesora. Registri kao sto su PC, IR, AC,
MAR i MDR su izgrađeni tehnologijom D flip-flopova za smeštanje
podataka. Jedna ili više Aritmeticko Logickih Jedinica (ALU) se takođe
nalaze unutar procesora. ALU se koristi za izvođenje aritmetičkih i
logičkih operacija nad podacima. Proste operacije ALU su: sabiranje,
oduzimanje i logičke operacije i/ili. Spojevi registra i magistrale su
ostvareni jednostavnom point-to-point konekcijom. Kad jedan od
nekoliko registara može da “pristupi” magistrali, konekcija se
uspostavlja koristeći multipleksere, kontroler izlaza ili upotrebom izlaza
sa tri stanja. Kontrolna jedinica je složena mašina koja kontroliše
interne operacije procesora.
Primarna operacija koju izvodi procesor je izvršenje sekvenci
instrukcija smeštenih u glavnoj memoriji. CPU ili procesor čita tj.
dobavlja instrukciju iz memorije, dekodira instrukciju da ustanovi koje
operacije su potrebne za njeno izvršavanje i izvršava instrukciju.
Kontrolna jedinica kontroliše ovu sekvencu operacija u procesoru.

1.2 Računarski programi i instrukcije

Računarski program predstavlja sekvencu instrukcija koje izvode


željenu operaciju. Instrukcije su smeštene u memoriji. Za naš primer
µP1 instrukcija se sastoji od 16 bita. Kao što vidimo na slici 1.2 viših 8
bita instrukcije sadrži operacioni kod instrukcije - opkod.

Opkod Adresa

15 87 0

Slika 1.2 - Format instrukcija procesora µP1

Opkod opisuje operaciju, kao što je saberi ili oduzmi, koja će biti
izvršena od strane instrukcije. Obično instrukcija šalje jedan paket
podataka kroz ALU za izvršavanje ove operacije. Nižih 8 bita svake
instrukcije sadrži adresu memorije. U zavisnosti od vrednosti opkoda,
ova adresa može pokazivati na mesto gde se nalaze podaci ili na
mesto gde se nalazi druga instrukcija. Osnovne instrukcije procesora
µP1 su prikazane u tabeli 1.1.

INSTRUKCIJA MNEMONIK OPERACIJA OPKOD


1 ADD Adresa AC = AC + MDR 00
2 STORE Adresa MDR = AC 01
3 LOAD Adresa AC = MDR 02
4 JUMP Adresa PC = adresa 03
5 JNEG Adresa IF AC < 0 THEN PC = adresa 04

Tabela 1.1 - Osnovne instrukcije procesora µP1

Primer programa koji računa A = B + C je prikazan u tabeli 1.2.


Ovaj program je sekvenca tri instrukcije. Programske promenljive A, B
i C su smeštene na rezervisane memorijske lokacije. Simbolička
reprezentacija instrukcija, zvana asembler, je prikazana u prvoj koloni.
Druga kolona sadrži isti program na mašinskom jeziku (binarni obrazac
koji je ustvari učitan u računarsku memoriju).
Mašinski jezik može se napisati koristeći format instrukcija sa
slike 1.2. Prvo, nađemo opkod za svaku instrukciju u poslednjoj koloni
iz tabele 1.1. Ovim dobijamo prve dve heksadecimalne cifre na
mašinskom jeziku. Drugo, obezbedimo da vrednosti A, B, C budu
smeštene na heksadecimalne adrese 10, 11, 12 u memoriji.
Adresiranje omogućuju zadnje dve heksadecimalne cifre svake
mašinske instrukcije.

Asemblerski jezik Mašinski jezik


LOAD B 0211
ADD C 0012
STORE A 0110

Tabela 1.2 - Primer programa za A = B + C

Dodeljivanje adresa podacima ne sme doći u konflikt sa


adresama instrukcija. Normalno je da su podaci smešteni u memoriji
posle svih programskih instrukcija. U ovom slučaju, ako pretpostavimo
da program startuje sa adrese 0, tri instrukcije će zauzeti memorijske
adrese 0, 1, 2.
Sve instrukcije u ovom primeru programa obavljaju operacije
nad podacima i izvršavaju ih u striktno sekvencijalnom redu.
Instrukcije kao sto su JUMP i JNEG se koriste za prenošenje kontrole
na drugu adresu. Instrukcije skoka i grananja se ne izvršavaju u
sekvencijalnom redu. Instrukcije skoka i grananja moraju se koristiti
kada želimo da implementiramo kontrolne strukture tipa IF...THEN
izraza ili programskih petlji (LOOP).
Asembleri su računarski programi koji automatski konvertuju
simbolički asemblerski jezički program u binarni mašinski jezik.
Kompajleri su programi koji automatski prevode jezike višeg nivoa (C
ili Pascal) u sekvencu mašinskih instrukcija. Mnogi kompajleri takođe
imaju mogućnost da prikažu asemblerski jezik radi pomoći u
debegovanju.
Sa programerskog gledišta na računar, vide se samo registri
(kao što je programski brojac - PC) i detalji koji su potrebni za
razumevanje funkcija asemblerskog ili mašinskog jezika instrukcija.
Drugi registri i kontrolni hardver, kao što su instrukcijski registar - IR,
memorijski adresni registar - MAR, memorijski registar podataka
-MDR, su unutrašnji delovi CPU-a i nisu opisani u asembleskom jeziku
modela računara. Računarski inženjeri koji dizajniraju procesor moraju
razumeti funkcije i operacije ovih unutrašnjih registara i dodatnog
kontrolnog hardvera.

1.3 Ciklus procesorske obrade instrukcije

Procesor čita tj. dobavlja instrukcije iz memorije, dekodira ih da


bi ustanovio koja operacija treba da se izvrši i onda izvršava
instrukciju kao što je prikazano na slici 1.3. Kontrolna jedinica
kontroliše ove sekvence operacija u procesoru. Ciklus dobavljanja,
dekodiranja i izvršavanja se koristi i u procesorima PC-ja i u
superračunarima. Implementacija ciklusa dobavljanja, dekodiranja i
izvršavanja zahteva nekoliko operacija penosa podataka između
registrara i takt (u ovom primeru).
Programski brojač sadrži adresu tekuće instrukcije. Da bi se
dobavila sledeća instrukcija, normalno je da procesor mora uvećati
programski brojač. Nakon toga, procesor mora poslati vrednost adrese
iz PC u memoriju preko magistrale tako što će postaviti MAR (MAR <=
PC) i obaviti operaciju čitanja. Nakon male pauze podaci instrukcije će
se pojaviti na magistrali podataka i biće zapamćeni u MDR.

Zahvatanje
sledece
instrukcije

Dekodiranje
instrukcije

Izvršav anje
instrukcije

SLIKA 1.3 - Procesorsko dobavljanje, dekodiranje i izvršavanje ciklusa


Izvršavanje instrukcije može zahtevati dodatni memorijski ciklus
tako da se instrukcija čuva u instrukcijskom registru -IR. Koristeći
vrednost iz IR instrukcija sada može biti dekodirana. Izvršavanje
instrukcije će zahtevati dodatne operacije procesora i možda dodatne
operacije nad memorijom. Akumulator - AC je osnovni registar koji se
koristi za računanja nad podacima i za čuvanje privremenih podataka
programa u procesoru. Nakon završetka izvršavanja instrukcije
procesor ponovo počinje ciklus dobavljanjem sledece instrukcije.
Detaljne operacije računara su često uprošćene prikazom
prenosa podataka između registara. Podvrsta jezika “razmene na nivou
registara” (RTL) kao što su VHDL ili Verilog su dizajnirani za ovakve
aplikacije. Za razliku od tradicionalnih jezika, RTL jezici mogu da
modeluju paralelno operacije i mape u hardverski dizajn.
Za detaljno objašnjenje funkcija i operacija CPU, razmotrimo
sliku 1.1. CPU poseduje registar opšte namene zvani akumulator - AC i
programski brojač - PC. Aritmetičko logička jedinica se koristi za
aritmetičke i logičke operacije.
Dobavljanje, dekodiranje i izvršavanje ciklusa može biti urađeno
korišćenjem sekvence operacija nad registrima kao što je prikazano na
slici 1.4. Sledeća instrukcija se dobavlja iz memorije sledećim
operacijama nad registrima:

1. MAR = PC
2. ćitanje memorije, MDR = vrednost instrukcije iz memorije
3. IR = MDR
4. PC = PC + 1

Nakon ove sekvence operacija, tekuća instrukcija se nalazi u IR. Ova


instrukcija je jedna od nekoliko dozvoljenih mašinskih instrukcija kao
što su dodaj, učitaj, smesti,... Vrednost opkod polja se proverava radi
dekodiranja specifične mašinske instrukcije. Adresno polje
instrukcijskog registra sadrži adresu mogućih operanada. Koristeći
adresno polje, čitanje memorije se pokreće u stanju dekodiranja.
Stanje dekodiranja premešta kontrolu na jedno od nekoliko
mogućih sledećih stanja u zavisnosti od vrednosti opkoda. Svaka
instrukcija zahteva kratku sekvencu razmene podataka između
registara radi sprovođenja iliti izvršavanja te instrukcije. Svako
izvršavanje instrukcije zahteva operacije razmene podataka između
registara. Nekoliko mogućih izvršenja instrukcije su prikazani na slici
6. Kada se završi tekuća instrukcija, ciklus se ponavlja novim čitanjem
iz memorije i vraćanjem u stanje dobavljanja. Kontrolna jedinica se
koristi za kontrolu ovih internih procesorskih stanja i kontrolnih
signala.
ZAHVATANJE
*MAR = PC
Citanje iz memorije
IR = MDR
PC = PC + 1

DEKODIRANJE

*MAR = IR
Citanje iz memorije

IZVRSAVANJE
Op kod =ADD Op kod=LOAD Op kod=STORE

MDR = AC
AC = AC + MDR AC = MDR
Pisanje u memoriju

Slika 1.4 - Detaljni prikaz dobavljanja, dekodiranja i izvršavanja za


µP1

Slika 1.5 prikazuje način implementacije µP1. Prikaz putanje


podataka sadrži registre, memorijski interfejs, ALU i magistrale koje ih
povezuju. Vertikalne linije su tri najvažnije magistrale koje se koriste
za uspostavljanje veza između registara. Sa “/” i brojem se označava
broj bita na magistrali. Vrednosti podataka koje se trenutno nalaze na
magistrali su prikazani heksadecimalno. MW predstavlja kontrolnu
liniju čitanja iz memorije.
Reset se koristi da bi se procesor doveo u poznato stanje nakon
uključenja napajanja. Inicijalni sadržaj registara i memorije
uzrokovanih resetovanjem može se videti na slici 1.5. Pošto su PC i
MAR resetovani na 00, izvršenje programa počinje od 00.
Primećuje se da memorija sadrži mašinski kod za primer
programa koji je ranije predstavljen. Ponovno pozivanje programa se
sastoji od čitanja (LOAD), dodavanja (ADD) i skladištenja (STORE)
instrukcija počevši od adrese 00. Vrednosti podataka za ovaj primer
programa su smeštene u memorijske lokacije 10, 11, 12.
IR 0000

ALU

registar AC 0000
0211

+1 PC 00 16

8
MAR 00
Memory:
00: 0211 10: 0000
01: 0012 11: 0004
02: 0110 12: 0003
03: 0303
MW='0 '
MDR 0211

Slika 1.5 - Putanje podataka u µP1 nakon resetovanja

Razmotrimo detaljno izvršavanje mašinske instrukcije dodavanja


(0012) smeštene na programskoj lokaciji 01. Instrukcija dodaj adresa,
dodaje sadržaj memorijske lokacije na adresi 12 na sadržaj AC i
smešta rezultat u AC. Sledeća sekvenca razmene podataka između
registara je potrebna za dobavljanje i izvršavanje ove instrukcije.

1.3.1 ZAHVATANJE (DOBAVLJANJE) INSTRUKCIJE


PRVI CIKLUS RAZMENE PODATAKA IZMEĐU REGISTARA

1. MAR = PC prethodni za dobavljanje


2. Čitanje memorije
3. IR = MDR
4. PC = PC + 1

Prvo se u MAR učitava vrednost PC. U našem primeru, instrukcija


dodavanja (0012) se nalazi na lokaciji 01 u memoriji, tako da ce i PC i
MAR sadržati 01. U ovakvoj predstavi računara, operacija MAR = PC će
biti pomerena na kraj petlje dobavljanja, dekodiranja i izvršavanja u
cilju uštede takta. Da bi dobavili instrukciju, pokrećemo operaciju
čitanja memorije. Nakon kratke pauze zbog vremena pristupa
memoriji, instrukcija dodavanja je raspoloživa na ulazu IR. Da bi sve
postavili za sledeće dobavljanje instrukcije, dodajemo 1 na PC.
Poslednje dve operacije se dešavaju paralelno tokom jednog takta
koristeći dve različite magistrale podataka. Na uzlaznu ivicu takta
ulazimo u stanje dekodiranja. Blok dijagram operacija razmene
podataka između registara u fazi dobavljanja instrukcije je prikazan na
slici 1.6. Neaktivne magistrale nisu prikazane.

IR 0211

ALU

ragistar AC 0004
0211

+1 PC 01

16
MAR 01
Memory:
00: 0211 10: 0000
01: 0012 11: 0004
02: 0110 12: 0003
03: 0303
MDR 0012

Slika 1.6 - Razmene podataka između registara u stanju dobavljanja


instrukcije dodavanja

1.3.2. DEKODIRANJE INSTRUKCIJE


DRUGI CIKLUS RAZMENE PODATAKA IZMEĐU REGISTARA

1. dekodiranje opkoda radi pronalaženja sledećeg stanja


2. MAR = IR
3. Čitanje memorije

Koristeći novu vrednost iz IR, kontrolni hardver procesora dekodira


instrukcijski opkod 00 i zaključuje da je to instrukcija dodavanja. Zbog
toga će sledeće stanje u narednom taktu biti stanje izvršavanja za
instrukcije dodavanja.
Instrukcije se obično dekodiraju hardverski koristeći
kombinatorna kola kao što su dekoderi, programabilni logički kontroleri
(PLA) ili čak mali ROM. Ciklus čitanja memorije uvek počinje
dekodiranjem jer instrukcija može zahtevati memorijski operand ili
stanje izvršavanja.
Instrukcija dodavanja zahteva operand sa memorijske adrese
12. Na slici 1.7, nižih 8 bita adresnog polja je preuzeto iz instrukcije
koja se nalazi u IR i prebačeno u MAR. U sledećem taktu, nakon male
pauze zbog vremena pristupa memoriji, vrednost operanda instrukcije
dodavanja iz memorije (0003) će biti raspoloživa u MDR.

IR 0012

0012
ALU

registar AC 0004

8
+1 PC 02

MAR 01
Memory:
00: 0211 10: 0000
01: 0012 11: 0004
02: 0110 12: 0003
03: 0303
MDR 0012

Slika 1.7 - Razmene podataka između registara u stanju dekodiranja


instrukcije dodavanja

1.3.3. IZVRŠAVANJE INSTRUKCIJE


TREĆI CIKLUS RAZMENE PODATAKA IZMEĐU REGISTARA

1. AC = AC + MDR
2. MAR = PC*
3. prelazak na izvršavanje dobavljanja

Dve vrednosti se sada mogu sabrati. Ulaz ALU je podešen za


dodavanje od strane kontrolne jedinice. Kao što je prikazano na slici
1.8, vrednost registra MDR (0003) je prosleđena na ulaz ALU. Sadržaj
registra AC (0004) na drugi ulaz ALU. Posle kratke pauze za
sumiranje, suma 0007 je proizvedena u ALU i bice učitana u AC u
sledećem taktu. Za obezbeđivanje adrese za sledeći ciklus dobavljanja,
u MAR se učitava tekuća vrednost PC (02). Primetimo da se
pomeranjem operacije MAR = PC na kraj izvršenja svake instrukcije,
stanje dobavljanja može izvršiti u jednom taktu. Instrukcija dodavanja
je sada završena i procesor počinje sa dobavljanjem sledeće
instrukcije u sledećem taktu. Pošto su bila potrebna tri stanja,
instrukcija dodavanja će zahtevati tri takta za završetak operacije.

IR 0012

0003 0004

ALU

0004
02
0007
registar AC 0004
0003

PC 02 16

8
02
16 MAR 12

Memory:
00: 0211 10: 0000
01: 0012 11: 0004
02: 0110 12: 0003
03: 0303
MDR 0003

Slika 1.8 - Razmena podataka između registara u instrukciji dodavanja

Nakon razmatranja ovog primera, trebalo bi da je jasna svaka


instrukcija, hardverska organizacija, magistrale, kontrolni signali i
taktovi potrebni za dizajniranje procesora. Neke operacije mogu se
izvršavati paralelno, dok ostale moraju sekvencijalno. Magistrala može
da prenosi samo jednu vrednost u jednom taktu i ALU može da
izračuna samo jednu vrednost u taktu, tako da će ALU, magistrale i
prenos podataka ograničavati operacije koje mogu biti rađene
paralelno tokom jednog takta. U ispitanim slučajevima, maksimalno tri
magistrale su korišćene za prenos podataka između registara.
Vremenski intervali u kritičnim trenucima, kao što su čekanje na ALU i
pristup memoriji, će odrediti brzinu takta pod kojim ove operacije
mogu biti izvršene.
Pristup sa više ciklusa po instrukciji je korišćen u ranijim
generacijama mikroprocesora. Ovi računari su imali ograničen hardver,
jer je VLSI tehnologija u to vreme imala mnogo manje tranzistora na
čipu nego što je na danačnjim uređajima. Procesori novije generacije,
kao što su oni u PC-ima, imaju stotine i više instrukcija i koriste
dodatne načine za ubrzavanje izvršenja programa. Format instrukcije
je složeniji, do 32 registra podataka i sa dodatnim instrukcijskim
bitima koji se koriste za duža adresna polja i moćnije adresiranje.
Princip pipelining-a prebacuje dobavljanje, dekodiranje i
izvršavanje iz sekvencijalnog u paralelno izvršavanje. Kao primer
pipelining-a sa tri stanja, jedinica za dobavljanje dobavlja instrukciju
n+2, dok jedinica za dekodiranje dekodira instrukciju n+1, a jedinica
za izvršavanje izvršava instrukciju n. Sa ovakvim brzim pristupom,
instrukcija se završava na svakom taktu za razliku od pristupa na
svaka tri takta iz našeg primera.
Superskalarne mašine su pipeline računari koji sadrže više
jedinica za dobavljanje, dekodiranje i izvršavanje. Superskalarni
računari mogu izvršavati više instrukcija u jednom taktu. Većina PC
procesora današnje generacije su superskalarni.

2 VHDL MODEL PROCESORA µP1

Za demonstraciju operacija računara koristi se VHDL model


procesora µP1 (vidi Dodatak A). Ovakav dizajn je prikladan za uređaje
FLEX 10K20. Računarski RAM je izveden koristeći funkciju
LPM_RAM_DQ.
Programski mašinski jezik se učitava u memoriju koristeći
datoteku za inicijalizaciju memorije *.mif (vidi Dodatak B). To nam
omogućava 256 16-bitnih reči memorije za instrukcije i podatke.
Datoteka za inicijalizaciju memorije, “Program.mif”, može se menjati
da bi se promenio program koji se učitava. Pisanje u memoriju se
izvršava samo kada je signal MW (Memory Write) na visokom nivou -
‘1’. Na uređaju FLEX 10K20, vreme pristupa memoriji je u opsegu od
20 - 50ns.
Ostali deo računarskog modela predstavlja jednostavnu mašinu
sa više stanja baziranu na VHDL-u, koja obezbeđuje ciklus
dobavljanja, dekodiranja i izvršavanja. Prvih par linija deklariše interne
procesorske registre pored kojih je stanje potrebno za ciklus
dobavljanja, dekodiranja i izvršavanja. Dugački CASE izraz se koristi
za implementaciju kontrolne jedinice. Reset je potreban za
inicijalizaciju procesora. U stanju resetovanja, nekoliko registara se
postavlja na 0 i pokreće se čitanje prve instrukcije iz memorije. Ovo
tera procesor da počne izvršavanje instrukcija sa lokacije 00 po
predviđenom redu nakon reseta.
Stanje dobavljanja dodaje 1 na PC i učitava instrukciju u IR.
Nakon rastuće ivice takta, počinje dekodiranje. U stanju dekodiranja,
nižih 8 bita IR se koriste za početak čitanja memorije u slučaju da je
instrukciji potreban operand iz memorije. Stanje dekodiranja sadrži jos
jedan CASE izraz za dekodiranje instrukcije koristeći vrednost opkoda
iz viših 8 bita instrukcije. Ovo znači da računar može imati do 256
različitih instrukcija, mada je samo 4 odrađeno u našem modelu.
Nakon rastuće ivice takta, kontrola se prenosi na stanje izvršenja koje
je specifično za svaku instrukciju.
Neke instrukcije se mogu izvršiti u jednom taktu, dok neke mogu
oduzeti više taktova. Instrukcije koje pišu u memoriju će zahtevati
više od jednog stanja za izvršavanje zbog kašnjenja memorije. Kao što
vidimo na primeru instrukcije smeštanja, memorijska adresa i podatak
moraju biti stabilni pre i nakon sto MW signal pređe na visoki nivo,
dakle, moraju se koristiti dodatna stanja da bi se izbeglo narušavanje
podataka u memoriji i vreme čekanja. Kada se svaka instrukcija izvrši,
u MAR se učitava vrednost iz PC radi početka dobavljanja sledeće
instrukcije. Posle završetka izvršenja svih instrukcija, kontrola se vraća
na stanje dobavljanja. Nakon završtka izvršavanja svih instrukcija
program se završava instrukcijom skoka koja prelazi na svoju adresu
čineci beskonačnu petlju.

3 LABORATORIJSKI ZADACI

3.1

Kompajlirajte i simulirajte VHDL model. Prepravite mašinski program iz


datoteke “Program.mif” da računa A = (B + C) + D. Smestite D na
lokaciju 13 u memoriji. Završite program instrukcijom skoka koji skače
na sebe (beskonačnom petljom). Izaberite uređaj FLEX 10K20 zato što
je računarski model prevelik za MAX uređaje. Pronađite maksimalnu
brzinu takta za µP1. Ispitajte projekat *.rpt i nađite iskorišćenost
logičkih ćelija (LC) u procentima. Pomnožite taj broj sa 20000 (tj. sa
70000 za UP 1X ploču) da ispitate broj tranzistora na µP1.

Rešenje:

Datoteka Program.mif bi trebala da sadrži sledeće:



CONTENT BEGIN
[00..FF] : 0000;

00 : 0210;
01 : 0011;
02 : 0012;
05 : 0305;
-- test podaci
10 : 027C;
11 : 0901;
12 : 0BE3;
13 : 0000;
END;

U mp1.rpt datoteci se nalazi podatak da je ukupan broj logičkih ćelija


249 što predstavlja 6% iskorišćenosti. Broj tranzistora je 249*20000 =
4.980.000 ~ 5 miliona.

- Krajnji rezultat koji bi trebao da se nadje u registru AC je:


27c + 901+be3 = 1760.

- Izvršavanje programa:

Kao što vidimo, nakon zahvatanja instrukcije ona se upisuje u IR


(0210). Dekodiranje postavlja vrednost 10 na MAR (sa ove adrese se
učitava prvi operand). Sledeće stanje je učitavanje (load) sa adrese
koja se nalazi u MAR (10).
EXECUTE_LOAD - smešta u registar AC vrednost iz MDR koja je
učitana iz memorije, zatim postavlja MAR na vrednost PC radi
zahvatanja sledeće instrukcije i konačno postavlja sledeće stanje -
fetch. Zatim se zahvata sledeća instrukcija (0011) koja predstavlja
dodavanje (add).
EXECUTE_ADD - na vrednost u registru AC (27c) dodaje tj. sabira
vrednost iz MDR (901) zatim postavlja MAR na vrednost PC (02) i
konačno menja stanje u zahvatanje (fetch).
Isti postupak se radi i za sledeću instrukciju dodavanja tako da na
kraju (kada program uđe u beskonačnu petlju) u registru AC imamo
vrednost 1760 tj. očekivani zbir.

3.2

Dodajte stanje izvršavanja JNEG u CASE izraz. JNEG je skok ako je AC


< 0. Ako je A >= 0 sledeća instrukcija po redu se izvršava. U većini
slučajeva, nova instrukcija će zahtevati samo novo stanje izvršenja u
stanju dekodiranja u CASE izrazu. Koristite vrednost opkoda 04 za
JNEG. Testirajte novu instrukciju sledećim test programom koji
implementira operaciju – [ IF A >= 0 THEN B = C ].

Asembler Mašinski Memorijska adresa


LOAD A 0210 00
JNEG End: 0404 01
LOAD C 0212 02
STORE B 0111 03
End: JMP End: 0304 04

End: je primer oznake, to je simbolička reprezentacija za lokaciju u


programu. Oznake se koriste u asembleru za označavanje pozicija u
programu. Poslednja linija koja počinje oznakom End: će biti 04.
Testirajte instrukciju JNEG za oba slučaja, A < 0 i A >= 0. Postavite
vrednosti različite od nule u *.mif datoteci za B i C tako da možete
proveriti valjanost programa.

Rešenje:

U datoteku Program.mif unesemo program iz tabele. Dodamo novo


stanje JNEG u deo programa gde je state_type, zatim dodamo stanju
dekodiranja to stanje i napokon dodamo kod koji će se izvršavati kada
se prepozna instrukcija JNEG. Jednostavno proverimo vrednost
registra AC i odradimo operaciju opisanu u zadatku.

- Izvršavanje programa:
Prvo učitavamo vrednost sa adrese 10 a to je 027C (IR = 0210) i
ubacujemo je u AC. Zatim proveravamo da li je AC manje od 0. Pošto
kod nas nije program se nastavlja dalje izvršavanjem preostalih
instrukcija (0212, 0111, 0304 u petlji). U principu, instrukcije skoka
(JPOS, JNEG, JZERO) u MAR i PC upisuju vrednost iz nižih 8 bita IR
čime postavljaju menjaju redosled izvršavanja programa. Menjaju tako
što postave PC na bilo koju adresu unutar programa a znamo da PC
određuje koja će instrukcija biti zahvaćena.

3.3

Dodajte instrukcije iz tabele u VHDL model i napravite test program za


svaku instrukciju, kompajlirajte i simulirajte da potvrdite valjanost
operacija. U instrukcijama JPOS i JZERO oba slučaja moraju biti
testirana.U logičkoj instrukciji XOR svaki bit je OR-ovan sa
odgovarajućim bitom u svakoj operaciji za ukupno 16 nezavisnih
ekskluzivnih OR operacija. Ovo se naziva “pametno-bitna” (smart)
logička operacija. OR i AND su takođe

Instrukcija Funkcija Opkod


SUBT adresa AC = AC - MDR 05
XOR adresa AC = AC XOR MDR 06
OR adresa AC = AC OR MDR 07
AND adresa AC = AC AND MDR 08
JPOS adresa IF AC>0 THEN PC = adresa 09
JZERO adresa IF AC=0 THEN PC = adresa 0A
ADDI adresa AC = AC +adresa 0B

smart logičke operacije. Instrukcija ADDI proširuje 8-bitno adresno


polje na 16-bitno (dodaje predznak). Za ovakvo proširenje treba
kopirati predznak u viših 8 bita. Ovo omogućuje korišćenje pozitivnih i
negativnih dvokomplementarnih brojeva za 8-bitnu neposrenu
vrednost smeštenu u instrukciji.
Rešenje:

Potrebno je sva nova stanja uneti u state_type i stanje dekodiranja, a


takođe treba uneti kod koji se izvršava. Pri testiranju ćemo koristiti
sledeće test podatke iz memorije (Program.mif):

10: 0527
11: 0AC4
12: 08CB
13: 0000

SUBT:

- Test program:
00 : 0211
01 : 0510
02 : 0302

- Rezultat bi trebao biti AC = ac4 SUBT 527 = 59d.

- Izvršavanje programa:

Prva zahvaćena instrukcija je 0211 što znači da se učitava vrednost sa


adrese 11 (ac4). Ona se pojavljuje na MDR nakon dekodiranja i
vremena kašnjenja. Ta vrednost se na uzlaznu ivicu takta ubacuje u
AC. Nakon toga se učitava vrednost sa adrese 10 (527). Ta vrednost
se oduzima od trenutne vrednost unutar AC i dobijamo 59d.

XOR:

- Test program:
00 : 0211
01 : 0610
02 : 0302

- Rezultat bi trebao biti AC = ac4 XOR 527 = fe3


- Izvršavanje programa:

U AC se učitava ac4 a kasnije na tu vrednost primeni XOR (ekskluzivno


ILI) sa 527 (sa adrese 10).

- Način XOR-ovanja:
XOR 0 1
0 0 1
1 1 0

ac4 = 101011000100
527 = 010100100111
-----------------
111111100011 = fe3
Kada su vrednosi iste tada je rezultat 0 u suprotnom 1.

OR:

- Test program:
00 : 0211
01 : 0710
02 : 0302

- Rezultat bi trebao biti AC = ac4 OR 527 = fe7

- Izvršavanje programa:

Slično kao i u prethodnom primeru. Radimo opraciju ILI nad podacima


ac4 (adresa 11) koji se nalazi u AC i 527 (adresa 10) koji je u MDR.
- Način OR-ovanja:
OR 0 1
0 0 1
1 1 1

ac4 = 101011000100
527 = 010100100111
-----------------
111111100111 = fe7
Kada su pojavi 1 tada je 1, 0 je jedino kada su obe 0.

AND:

- Test program:
00 : 0211
01 : 0810
02 : 0302

- Rezultat bi trebao biti AC = ac4 AND 527 = 4

- Izvršavanje programa:

Slično kao i u prethodnom primeru. Radimo opraciju AND nad


podacima ac4 (adresa 11) I 527 (adresa 10).

- Način AND-ovanja:
AND 0 1
0 0 0
1 0 1

ac4 = 101011000100
527 = 010100100111
-----------------
000000000100 = 4
Kada su pojavi 0 tada je 0, 1 je jedino kada su obe 1.
JPOS:
Za proveru instrukcije koristićemo program iz zadatka 3.2 samo
što ćemo umesto 0404 uneti vrednost 0904.

- Test program:
00 : 0210
01 : 0904
02 : 0212
03 : 0111
04 : 0304

- Izvršavanje programa:

Prvo smo učitali vrednost sa lokacije 10 a to je 527. Zatim je


instrukcija JPOS utvrdila da je AC = 527 veće od nule i usledio je skok
na adresu 04. Posle toga sledi beskonačna petlja.

JZERO:

Proveru JZERO ćemo vršiti za oba slučaja: kada je vrednost koja


se proverava jednaka nuli i kada je različita od nule.

U slučaju MDR = 0

- Test program:
00 : 0213
01 : 0a04
02 : 0212
03 : 0111
04 : 0304

- Izvršavanje programa:
Sa lokacije 13 smo učitali vrednost 0000 i upisali je u AC. JZERO
proverava ovu vrednost i nakon što utvrdi da je jednaka nuli, skače na
adresu 04.

U slučaju MDR <> 0

- Test program:
00 : 0211
01 : 0a04
02 : 0212
03 : 0111
04 : 0304

- Izvršavanje programa:

Sa lokacije 11 smo učitali vrednost 0ac4 i upisali je u AC. JZERO


proverava ovu vrednost i nakon što utvrdi da nije jednaka nuli,
nastavlja se izvršavanjem sledeće instrukcije (0212).

ADDI:

- Test program:
00 : 0210
01 : 0b11
02 : 0302

- Izvršavanje programa:
Prvo učitamo vrednost sa lokacije 10 u AC (527) a zatim na tu
vrednost (viših 8 bita) dodamo vrednost iz MAR (u našem slučaju 11) i
dobijamo konačno vrednost adresno proširenu - 1627.

- Način rada ADDI:


AC (527) = 00000101|00100111
MAR (11) =00010001|
-----------|-----------
00010111|00100111 = 1627
Viših 8 bita AC I MAR se saberu a ostalih 8 nižih bita AC registra se
samo prepišu.

3.4

Dodajte sledeće instrukcije pomeranja u model i proverite ih test


programom i simulacijom. Funkcija LPM_CLSHIFT je korisna za
implementaciju pomeranja više bita. SHL i SHR se mogu koristiti ako
su osobine 1993 VHDL omogućene kompajlerom. Samo nižih 4 bita
adresnog polja imaju vrednost. Ostala 4 bita su uvek nula.

Instrukcija Funkcija Opkod


SHL adresa AC = AC siftovano levo za »adresa« 0C
bita
SHR adresa AC = AC siftovano desno za »adresa«
bita

Rešenje:

SHL:

- Test program:
00 : 0210
01 : 0c05
02 : 0302
- Izvršavanje programa:

Prvo učitamo vrednost sa lokacije 10 u AC (527) a zatim tu vrednost


šiftujemo u levo za 5 mesta (vrednost iz MAR).

- Način rada SHL:


AC (527) = 0000010100100111
MAR (05) =00000101

Početno stanje unutar registra AC:


0000010100100111

Svaki bit pomeramo za 5 mesta u levo.


0000010100100111

Oni koji ispadnu levo od najznačajnijeg bita se ne uzimaju više u


obzir. Pošto su ostala prazna mesta desno u AC ona se popunjavaju
sa nulama.
000001010010011100000

Registar AC posle operacije SHL bi trebalo da izgleda ovako:


1010010011100000 = a4e0

SHR:

- Test program:
00 : 0210
01 : 0d03
02 : 0302

- Izvršavanje programa:
Prvo učitamo vrednost sa lokacije 10 u AC (527) a zatim tu vrednost
šiftujemo u desno za 3 mesta (vrednost iz MAR).

- Način rada SHR:


AC (527) = 0000010100100111
MAR (03) =00000011

Početno stanje unutar registra AC:


0000010100100111

Svaki bit pomeramo za 3 mesta u desno.


0000010100100111

Oni koji ispadnu desno od najmanje značajnog bita se ne uzimaju


više u obzir. Pošto su ostala prazna mesta levo u AC ona se
popunjavaju sa nulama.
0000000010100100111

Registar AC posle operacije SHR bi trebalo da izgleda ovako:


0000000010100100 = a4

3.5

Pokrenite µP1 računar koristeći FLEX 10K20 čip na UP 1 ploči ili 10K70
na UP 1X. Koristite taster za takt i taster za reset. Sedmosegmentnim
dekoderom, prikažite vrednost registra PC u heksadecimalnom obliku
na sedmosegmentni displej FLEX-a. Pokrenite test program na ploči i
potvrdite valjanost vrednosti u registru PC prolaskom kroz program
koristeći takt taster.

Rešenje:

Potrebno je dodati dekoder koji će na osnovu vrednosti registra PC


upaliti potrebne led diode na 7. segmentnom displeju. Kod koji je
dodat nalazi se u rešenju zadatka 3.5 nakon opisa rada svih
instrukcija.
3.6

Dodajte dve ulazno/izlazne instrukcije (I/O) na µP1. Ove instrukcije


modifikuju ili koriste samo nižih 8 bita registra AC. Uklonite ispis PC na
displej iz prethodnog zadatka. Testirajte nove I/O instrukcije tako što
ćete napisati program koji čita prekide (switches), dodaje jedan na
vrednost prekida i ispisuje tu vrednost na LED displej. Ponavljajte ulaz,
dodavanje i izlaz u beskonačnoj petlji skokom na početak programa.
Dodajte novi registar (register_output_RO) na ulaz sedmosegmentnog
dekodera koji izlazi na LED displej. U registar se učitava vrednost iz AC
samo kad se izvrši instrukcija OUT. Kompajlirajte i izvršite program na
ploči UP1. Kada je prisutno nekoliko ulazno/izlaznih uređaja, trebali bi
da odgovaraju samo na njihove jedinstvene ulazno/izlazne adrese, isto
kao i memorija.

Instrukcija Funkcija Opkod


IN I/O adresa AC = FLEX DIP switch (nižih 8 bita) 0E
OUT I/O adresa 7 segmentni displej prikazuje heksa 0F
vrednost registra AC

Rešenje:

Potrebno je ubaciti nova stanja IN i OUT u state_type. Takođe


treba dodati jedan 16-bitni registar - led_digits i jedan 8-bitni registar
flex_switch_in. Registar led_digits je direktno povezan sa izlazima
pločice na dva sedmosegmentna led displeja. To su izlazi numerisani
sa: 6, 7, 8, 9, 11, 12, 13, 14, 17, 18, 19, 20, 21, 23, 24, 25.
Flex_switch_in je direktno povezan sa ulaznim pinovima FLEX DIP
SWITCH-a koji se nalazi na pločici. Ti pinovi su numerisani sa: 33, 34,
35, 36, 38, 39, 40, 41. Znači ako želimo da aktiviramo ili deaktiviramo
neku diodu postavimo željenu vrednost u registar led_digits, a ako
želimo da očitamo vrednost FLEX DIP SWITCH-a (radi neke
inicijalizacije ili učitavanja neke vrednosti) tada jednostavno očitamo
odgovarajuću vrednost iz flex_switch_in registra. Povezivanje registra
led_digits sa sedmo-segmentnim displejima (ovde je povezan samo
jedan pošto je drugi simetrično vezan kao i prvi) na pločici je odrađeno
na sledeći način:
15 REGISTER LED _D IGITS 0

6 17

12 7 23 18

13 24

11 8 21 19

9 14 20 25

3.11

Proširite memorijski adresni prostor µP1 sa 8 bita na 9. Neki registri će


takođe trebati dodatni bit. Koristite 512 lokacija 16-bitne memorije.
Proširite adresno polje za 1 bit smanjujući veličinu opkod polja za 1
bit. Ovo će ograničiti broj instrukcija na 128 ali će maksimalna veličina
programa biti povećana sa 256 na 512 lokacija.

Rešenje:

Potrebno je proširiti registre PC I MAR sa 8 na 9 bita. Takođe je


potrebno u memoriji proširiti parametar LPM_WIDTHAD sa 8 na 9.
Ovim proširenjima smo odradili postavljeni zadatak. Sada je potrebno
samo obratiti pažnju na dalju upotrebu programa. Pri dekodiranju
treba iz IR prepisati nižih 9 (a ne 8) bita u MAR. U principu treba voditi
računa kada se vrednost upisuje u PC i MAR pošto su oni prošireni i
obratiti pažnju na sve operacije koje se izvode nad njima.
Takođe se menja format instrukcije pa treba voditi računa pri
zadavanju instrukcija. Ako želimo npr. da učitamo vrednost sa adrese
21H (ranije smo zadavali sa 0221) dok će sada to biti 0421 zato što je
opkod 7 bita a adresa 9

Opkod - 000 0010


Adresa - 0 0010 0001
Pa je rezultujuća vrednost: 0000 0100 0010 0001 = 0421.
3.12

Modifikujte µP1 tako da koristi dve različite memorije. Koristite jednu


memoriju za instrukcije a novu memoriju za podatake. Nova memorija
će imati 256 lokacija 16-bitnih reči.

Rešenje:

Potrebno je dodati još jednu memoriju koju ćemo nazvati


instruction_memory, a staru ćemo preimenovati u data_memory.
Samim tim nam je potreban još jedan registar -
memory_instruction_register - MIR (kao što data_memory ima
memory_data_register). U ovom registru će se čuvati očitani podatak
iz memorije.
Treba obratiti pažnju da sada pri zahvatanju instrukcije iz
memorije instrukciju učitavamo u novi registar (MIR). Zato se pri
zahvatanju IR puni iz MIR a ne iz MDR koji nam sada služi samo za
učitavanje podataka ne i instrukcija.

3.13

Dodajte rutinu poziva (CALL) i instrukciju vraćanja (RETURN) u µP1.


Koristite posvećeni registar za smeštanje povratne adrese ili koristite
stek sa pokazivačem. Stek bi trebalo da počinje na višim adresama i
da raste prema nižim adresama (u memoriji).

Rešenje:

Pored ubacivanja novih stanja CALL i RETURN u state_type i


ubacivanje za obradu u stanju dekodiranja, potrebno je dodati novi
registar return_address_register - RAR.
RAR pri pozivu instrukcije CALL pamti trenutnu vrednost PC. To
se radi da bi se zapamtilo gde je program prekinut da bi se mogao,
posle završetka pozvanog podprograma, nastaviti. Povratak se vrši
pozivom instrukcije RETURN koja postavlja PC na vrednost RAR (koji
sadrži vrednost sledeće instrukcije programa koji je pozvao
podprogram).
U realizaciji ovog zadatka korišćena je tehnika sa registrom dok
je tehnika sa stekom iskorišćena u sledećem zadatku. Ovako je
odrađeno zato što je u sledećem zadatku obavezna upotreba steka, pa
da su ovako pokrivena oba slučaja.
3.14

Odradite registar kao sto je predviđeno u prethodnom zadatku i


dodajte instrukcije učitavanja (PUSH) i izbacivanja (POP) registra AC
u/iz stek/a. Pri resetovanju, postavite pokazivač na stek na najvišu
adresu memorije.

Rešenje:

Dodavanje ove dve instrukcije zahteva da se pre toga doda novi


registar: stack_pointer. Kao što mu samo ime kaže, on pokazuje na
poslednje unetu (zapamćenu) adresu pre pozivanja podprograma.
Svako novo ubacivanje (PUSH) ili izbacivanje (POP) adrese iz
memorije menja vrednost ovog registra. Pošto registar kreće od
najviše adrese u memoriji (u ovo primeru FF) svako dodavanje će
umanjiti vrednost za 1 a svako izbacivanje će ga uvećati.
Same instrukcije PUSH i POP se realizuju u tri ciklusa (takta)
zato što se radi sa memorijom i postavljanjem signala memory_write
pa moramo sačekati sledeći takt da taj signal promeni stanje (ako je
bio u različitom stanju) slično kao i instrukcija STORE. Sada ćemo
objasniti obe instrukcije detaljno, korak po korak.

PUSH - instrukcija smeštanja AC u memoriju


 MAR se pozicionira na prvu praznu lokaciju na koju treba
upisati AC (ta adresa se iščitava iz stack_pointer-a)
 Pomeramo stack_pointer na novu (praznu) lokaciju (pošto
stack_pointer uvek stoji na praznoj lokaciji)
 Postavimo memory_write na 1 (pisanje)
 U narednom taktu, registar AC će biti upisan na
memorijsku lokaciju iz MAR
 Vratimo memory_write na 0 (čitanje)
 Ovim je završeno upisivanje (PUSH) registra AC u
memoriju, sada samo treba da
 Postavimo MAR na vrednost PC radi zahvatanja sledeće
instrukcije

POP - instrukcija očitavanja iz steka


 Vratimo stack_pointer za jedno mesto unazad (tu se nalazi
poslednje upisana adresa)
 U sledećem taktu upišemo adresu iz stack_pointer-a u
MAR tako da se u sledećem taktu
 Na linijama MDR nađe podatak sa te adrese koji samo
upišemo u registar AC
 Naravno, potrebno je postaviti MAR na adresu sledeće
instrukcije

3.15

Spojite sve instrukcije koje ste odradili do sada u jedno tj.


kompletirajte procesor µP1.

Rešenje:

Sada samo treba sve opisane nove registre, stanja, instrukcije i


ostalo objediniti u jednu celinu jednostavnim kopiranjem koda i
prebacivanjem u zajednički. U ovom slučaju zadatak je urađen na dva
načina: u prvom je objedinjeno sve osim zadatka 11 (proširivanje
memorije) a u drugom je ubačeno i to.

4. DODACI

4.1 Dodatak A - VHDL kod procesora µP1

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;

LIBRARY LPM;
USE LPM.LPM_COMPONENTS.ALL;

ENTITY mP1 IS PORT (


clock, reset : IN STD_LOGIC;
program_counter_out : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
register_AC_out : OUT STD_LOGIC_VECTOR(15 DOWNTO 0);
memory_data_register_out : OUT STD_LOGIC_VECTOR(15 DOWNTO 0)
);
END mP1;

-- arhitektura procesora mP1


ARCHITECTURE mP1_architecture OF mP1 IS
-- stanja procesora
TYPE state_type IS (
reset_pc,
fetch,
decode,
execute_add,
execute_load,
execute_store,
execute_store2,
execute_store3,
execute_jump
);

SIGNAL state : state_type;


SIGNAL instruction_register, memory_data_register : STD_LOGIC_VECTOR(15 DOWNTO 0);
SIGNAL register_AC : STD_LOGIC_VECTOR(15 DOWNTO 0);
SIGNAL program_counter : STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL memory_address_register : STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL memory_write : STD_LOGIC;

BEGIN
-- memorija
memory:LPM_RAM_DQ
GENERIC MAP (
LPM_WIDTHAD => 8,
LPM_OUTDATA => "UNREGISTERED",
LPM_INDATA => "REGISTERED",
LPM_ADDRESS_CONTROL => "UNREGISTERED",
LPM_FILE => "Program.mif",
LPM_WIDTH => 16
)
PORT MAP (
data => register_AC,
address => memory_address_register,
we => memory_write,
inclock => clock,
q => memory_data_register
);

program_counter_out <= program_counter;


register_AC_out <= register_AC;
memory_data_register_out <= memory_data_register;

PROCESS(clock, reset)
BEGIN
IF reset = '1' THEN
state <= reset_pc;
ELSIF clock'EVENT AND clock = '1' THEN
CASE state IS
-- resetovanje ***************************************************
WHEN reset_pc =>
program_counter <= "00000000";
memory_address_register <= "00000000";
register_AC <= "0000000000000000";
memory_write <= '0';
state <= fetch;

-- dobavljanje instrukcije*******************************************
WHEN fetch =>
instruction_register <= memory_data_register;
program_counter <= program_counter + 1;
memory_write <= '0';
state <= decode;

-- dekodiranje instrukcije *******************************************


WHEN decode =>
memory_address_register <= instruction_register(7 DOWNTO 0);
-- u zavisnosti od opcode
CASE instruction_register(15 DOWNTO 8) IS
WHEN "00000000" =>
state <= execute_add;

WHEN "00000001" =>


state <= execute_store;

WHEN "00000010" =>


state <= execute_load;

WHEN "00000011" =>


state <= execute_jump;

WHEN OTHERS =>


state <= fetch;
END CASE;

-- instrukcija dodavanja (add) ***************************************


WHEN execute_add =>
register_AC <= register_AC + memory_data_register;
memory_address_register <= program_counter;
state <= fetch;

-- instrukcija smestanja (3 ciklusa) ***********************************


WHEN execute_store =>
-- upisujemo registar AC u memoriju
memory_write <= '1';
state <= execute_store2;
WHEN execute_store2 =>
memory_write <= '0';
state <= execute_store3;
WHEN execute_store3 =>
memory_address_register <= program_counter;
state <= fetch;

-- instrukcija ucitavanja ********************************************


WHEN execute_load =>
register_AC <= memory_data_register;
memory_address_register <= program_counter;
state <= fetch;

-- instrukcija skoka ***********************************************


WHEN execute_jump =>
memory_address_register <= instruction_register(7 DOWNTO 0);
program_counter <= instruction_register(7 DOWNTO 0);
state <= fetch;

-- u ostalim slucajevima ********************************************


WHEN OTHERS =>
memory_address_register <= program_counter;
state <= fetch;

END CASE;
END IF;
END PROCESS;
END mP1_architecture;

4.2 Dodatak B - Datoteka za inicijalizaciju memorije


(Program.mif)

Datoteka za inicijalizaciju memorije služi da se u memoriju upišu


podaci i instrukcije koje će se izvršavati. Na početku definišemo
veličinu memorije. Width predstavlja širinu tj. Koliko bitna memorija će
biti. U našem slučaju ona je šesnaestobitna (16-bitna). Depth
predstavlja broj memorijskih lokacija koje se mogu adresirati. Radix
predstavlja bazu po kojoj će se unositi vrednosti (heksadecimalna,
decimalna, oktalna, binarna ili bilo koja druga).
NAPOMENA: Voditi računa da se adresni prostor za podatke ne
preklopi sa adresnim prostorom za instrukcije !!!

WIDTH = 16;
DEPTH = 256;

ADDRESS_RADIX = HEX;
DATA_RADIX = HEX;

CONTENT BEGIN
[00..FF] : 0000;

00 : 0210;
01 : 0011;
02 : 0112;
03 : 0212;
04 : 0304;

10 : 5555;
11 : AAAA;
12 : 0000;

END;

4.3 Dodatak C - Kompletan spisak instrukcija


procesora µP1

INSTRUKCIJA MNEMONIK OPERACIJA OPKOD


1 ADD address AC = AC + MDR 00
2 STORE address MDR = AC 01
3 LOAD address AC = MDR 02
4 JUMP address PC = address 03
5 JNEG address IF AC < 0 THEN PC = address 04
6 SUBT address AC = AC – MDR 05
7 XOR address AC = AC XOR MDR 06
8 OR address AC = AC OR MDR 07
9 AND address AC = AC AND MDR 08
10 JPOS address IF AC > 0 THEN PC = address 09
11 JZERO address IF AC = 0 THEN PC = address 0A
12 ADDI address AC(15-8) = AC(15-8) + address 0B
13 SHL address AC = AC šiftovano u levo za address 0C
14 SHR address AC = AC šiftovano u desno za address 0D
15 IN I/0 address AC = FLEX DIP SWITCH 0E
16 OUT I/0 address 7-segmentni displej prikazuje AC 0F
17 CALL address RAR = PC 10
18 RETURN address MAR = RAR 11
19 PUSH address Smešta AC u memoriju 12
20 POP address Učitava AC iz memorije 13
4.4 Dodatak D - Zavisnosti između signala

U ovom dodatku ćemo pokušati da objasnimo zavisnosti među


signalima unutar našeg računarskog sistema. Ovde ćemo se ograničiti
na međuzavisnost signala kada nema instrukcije koja treba da se izvrši
već samo kako promena nekog signala utiče na ostale signale u
sistemu. Uticaj instrukcije na signale je objašnjen u projektnim
zadacima kako su uvođene. U daljem tekstu biće opisani redom sledeći
signali: clock, reset, program_counter, state, instruction_register.

4.4.1 CLOCK (Takt)

Predstavlja takt signal u sistemu tj. brzinu kojom se dešavaju


promene unutar samog. Na osnovu ovog signala se rašuna frekvencija
(brzina promena) celog sistema.

Ako bi se npr. svaka uzlazna ivica signala sa slike pojavljivala na


svakih 100ns (nano sekundi) tada bi frekvencija sistema bila 1/100ns
= 10MHz.
Sve promene unutar sistema koje su sinhronizovane sa taktom
dešavaju se na uzlaznu ivicu takt signala. To znači da ako se u
trenutku između dve uzlazne ivice takt signala dogodi promena koja
utiče na neki signal, taj signal će se promeniti tek po dolasku uzlazne
ivice (uz neizbežno kašnjenje sistema). Signali, registri i sve ostalo što
nije u sinhronizaciji sa taktom, menja se nezavisno od takta. Njihova
promena je vezana jedino za brzinu odziva sistema. Takt signal je
najvažniji signal u hijerarhiji sistema jer ako nema takta sistem ne
može ni da radi.

4.4.2 RESET (Resetovanje)

Sistem je u stanju reseta dok god je signal reset na jedinici.


Signal reseta nam služi da se sistem dovede u poznato, početno stanje
pošto program može biti loš ili neki drugi problem može da se desi i
sistem onda uđe u nepoznato stanje. Kada reset pređe u stanje
neaktivno (0) tada sistem počinje sa radom (u našem slučaju prelazi u
stanje zahvatanja prve instrukcije - fetch). Signal reset je po hijerarhiji
drugi posle takta. Njegovo aktiviranje (postavljanje na 1) može da
prekine bilo koju instrukciju koja se izvršavala u tom trenutku a takođe
može da prekine i zahvatanje i dekodiranje.
Sa slike vidimo da je sistem na početku bio u stanju reseta. Kada je
reset postao neaktivan (0) i kada je naišla uzlazna ivica tada je sistem
počeo sa radom.

4.4.3 STATE (Stanje)

State signal predstavlja stanje u kojem se trenutno nalazi


sistem. On se menja na svaku uzlaznu ivicu takt signala ako sistem
nije u stanju reseta uz naravno kašnjenje na odziv sistema.

Pretpostavimo da sistem radi (nije u resetu). Prvo se izvrši zahvatanje


instrukcije - fetch, zatim njeno dekodiranje - decode pa se instrukcija
izvršava. Nakon toga postupak se ponavlja. Svako od ovih stanja na
kraju svog izvršavanja (pošto se nekad instrukcija izvršava više od
jednog takta) postavlja signal state na sledeće stanje. Čak i aktiviranje
reset signala menja signal state na vrednost reset_pc.
Osnovna stanja sistema su:
 fetch - zahvata se instrukcija iz memorije i upisuje u IR
programski brojač se uvećava za 1,
stanje se postavlja na decode,
MW (memory_write) se postavlja na 0
 decode - u MAR upisuje vrednost nižih 8 bita IR,
novo stanje se postavlja u zavisnosti od rezultata
dekodiranja
 reset_pc - postavlja PC na početnu vrednost (0),
postavlja MAR na 0,
postavlja AC na 0,
postavlja MW na 0,
postavlja state na fetch

Ostala stanja su opisana kako su uvođena u sistem u zadacima.


4.4.4 PROGRAM COUNTER (Programski brojač - PC)

Programski brojač je registar u kojem se čuva adresa sledeće


instrukcije koja treba da se zahvati iz memorije. Ovaj signal se menja
posle svakog zahvatanja instrukcije i to tako da se vrednost uveća za
1 (u našem primeru). Na ovaj signal pored zahvatanja mogu da utiču i
neke instrukcije (obično su to instrukcije skoka) koje postavljaju
vrednost PC na adresu zadatu instrukcijom iz IR.

Na početku rada vrednost PC je 0. Inače, ova vrednost može da počne


i završi se bilo kojom ali je zbog preglednosti i ljudske intuicije ovde
uzeto 0.

4.4.5 INSTRUCTION REGISTER (Instrukcioni registar - IR)

IR nam služi za čuvanje zahvaćene instrukcije. Svaka operacija


nad instrukcijom (čitanje adrese, dekodiranje, …) se izvodi nad ovim
registrom.

Registar IR se puni iz registra MDR (iz memorije). Prebacivanje u IR se


vrši iz razloga što će nam instrukcija možda zahtevati obraćanje sa
memorijom pa samim tim i MDR. Ako jednom odradimo obraćanje
memoriji (a da nismo zapamtili instrukciju) tada bi zauvek izgubili
instrukciju. Ovaj registar znači menja vrednost samo posle zahvatanja
instrukcije.

4.4.6 MEMORY ADDRESS REGISTER (Memorijski adresni


registar - MAR)

MAR je direktno povezan sa adresnom magistralom. Promenom


vrednost MAR menja se adresa na adresnoj magistrali. MAR možemo
zamisliti kao neku vrstu ”pokazivača” na memorijsku lokaciju koji nam
pokazuje koji podatak treba učitati ili na koje mesto treba upisati neki
podatak.
Ovaj registar može da menja vrednost u bilo kom delu izvršavanja
programa u zavisnosti od njegovih potreba za podacima iz/u
memorije/i.

4.4.7 MEMORY DATA REGISTER (Memorijski registar podataka -


MDR)

MDR radi sinhrono sa MAR. Ako nam je bio potreban podatak iz


memorije, postavili smo MAR na željenu adresu a u sledećem trenutku
ćemo u registru MDR imati vrednost sa te adrese. I obrnuto, ako
želimo da upišemo neki podatak u memoriju prvo ga smestimo u MDR
pa nakon toga postavimo MAR na adresu na koju želimo da ga
upišemo.

MDR takođe može biti postavljen u bilo kom delu programa.

4.4.8 REGISTER AC (Akumulatorski registar)

Kao što mu samo ime kaže, AC služi za smeštanje međurezultata


obrade u toku izvršavanja programa.

5. Skraćenice

AC - (ACcumulator) Akumulatorski registar. Koristi se za


smeštanje međurezultata i/ili rezultata obrade
podataka unutar procesora.
MAR - (Memory Address Register) Memorijski adresni registar.
Koristi se da se adresa sa koje želimo očitati ili na
koju želimo snimiti podatke postavi na magistralu.
MDR - (Memory Data Register) Memorijski registar podataka.
Koristi se za smeštanje podataka koji treba da se
snime ili za smeštanje podataka očitanih sa magistrale.
PC - (Program Counter) Programski brojač. Sadrži adresu
lokacije sa koje treba da se zahvati sledeća
instrukcija.

ADDI - (ADD Immediate). Neposredno dodavanje. U našem


slučaju se radi o proširivanju adrese sa 8 na 16 bita.
JNEG - (Jump if NEGative). Skok ako je negativna vrednost.
JPOS - (Jump if POSitive). Skok ako je pozitivna vrednost.
JZERO - (Jump if ZERO). Skok ako je vrednost nula.
XOR - (EXclusive OR). Ekskluzivno ili.
SHL - (SHift Left). Šiftovanje u levo.
SHR - (SHift Right). Šiftovanje u desno.
SUBT - (SUBTract). Oduzimanje.

6 LITERATURA

1. Logičko projektovanje računarskih sistema


Dr Vladimir Kovačević
2. Odabrana poglavlja iz projektovanja računara
Dr Vladimir Kovačević, Dr Nikola Teslić

You might also like