45
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:

Projektovanje jednostavnog procesora µP1

  • Upload
    knyazs

  • View
    290

  • Download
    7

Embed Size (px)

Citation preview

Page 1: Projektovanje jednostavnog procesora µP1

UNIVERZITET U NOVOM SADUFAKULTET TEHNIČKIH NAUKAOdsek za elektrotehniku i računarstvoInstitut za računarstvo i automatikuKatedra za računarsku tehniku i računarske komunikacije

JEDNOSTAVAN RAČUNARSKI DIZAJNPROCESOR µP1

- projektna dokumentacija -

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

Asistent:Mihajlo KATONA

SADRŽAJ :

Page 2: Projektovanje jednostavnog procesora µP1

1. Upoznavanje sa procesorom računarskog sistema1.1 Uvod1.2 Računarski programi i instrukcije 1.3 Ciklus procesorske obrade instrukcije

1.3.1 Dobavljanje1.3.2 Dekodiranje1.3.3 I z vršavanje

2. VHDL model procesora µP1

3. Laboratorijski zadaci3.1 I zvršavanje programa A = (B+C)+D 3.2 Dodavanje instrukcije JNEG3.3 Dodavanje instrukcija SUBT, XOR, OR, AND, JPOS,

JZERO i ADDI3.4 Dodavanje instrukcija SHL i SHR3.5 Prikaz registra PC na led displeju3.6 Dodavanje instrukcija IN i OUT3.11 Proširivanje adrese smanjivanjem opkoda3.12 Dodavanje nove memorije3.13 Dodavanje instrukcija CALL i RETURN3.14 Dodavanje instrukcija PUSH i POP3.15 Spajanje svih instrukcija u jednu celinu

4. Dodaci4.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 - CLOCK4.4.2 Resetovanje - RESET4.4.3 Stanje - STATE4.4.4 Programski brojač - PC4.4.5 Instrukcioni registar - IR4.4.6 Memorijski adresni registar - MAR4.4.7 Memorijski registar podatak - MDR4.4.8 Akumulatorski registar - AC

5. Skraćenice

6. Literatura1 UPOZNAVANJE SA PROCESOROM

RAČUNARSKOG SISTEMA

Page 3: Projektovanje jednostavnog procesora µP1

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.

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

Page 4: Projektovanje jednostavnog procesora µP1

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.

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 OPKOD1 ADD Adresa AC = AC + MDR 002 STORE Adresa MDR = AC 013 LOAD Adresa AC = MDR 024 JUMP Adresa PC = adresa 035 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

Page 5: Projektovanje jednostavnog procesora µP1

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 jezikLOAD B 0211ADD C 0012STORE 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

Page 6: Projektovanje jednostavnog procesora µP1

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.

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

Page 7: Projektovanje jednostavnog procesora µP1

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 = PC2. ćitanje memorije, MDR = vrednost instrukcije iz memorije3. IR = MDR4. 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.

Page 8: Projektovanje jednostavnog procesora µP1

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.

Page 9: Projektovanje jednostavnog procesora µP1

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) INSTRUKCIJEPRVI CIKLUS RAZMENE PODATAKA IZMEĐU REGISTARA

1. MAR = PC prethodni za dobavljanje2. Čitanje memorije3. IR = MDR4. 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.

Page 10: Projektovanje jednostavnog procesora µP1

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.

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

1.3.2. DEKODIRANJE INSTRUKCIJEDRUGI CIKLUS RAZMENE PODATAKA IZMEĐU REGISTARA

1. dekodiranje opkoda radi pronalaženja sledećeg stanja2. MAR = IR3. Č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

Page 11: Projektovanje jednostavnog procesora µP1

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.

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

1.3.3. IZVRŠAVANJE INSTRUKCIJETREĆI CIKLUS RAZMENE PODATAKA IZMEĐU REGISTARA

1. AC = AC + MDR2. 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

Page 12: Projektovanje jednostavnog procesora µP1

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.

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.

Page 13: Projektovanje jednostavnog procesora µP1

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

Page 14: Projektovanje jednostavnog procesora µP1

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

Page 15: Projektovanje jednostavnog procesora µP1

[00..FF] : 0000;

00 : 0210;01 : 0011;02 : 0012;05 : 0305;-- test podaci10 : 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

Page 16: Projektovanje jednostavnog procesora µP1

JNEG. Testirajte novu instrukciju sledećim test programom koji implementira operaciju – [ IF A >= 0 THEN B = C ].

Asembler Mašinski Memorijska adresaLOAD A 0210 00JNEG End: 0404 01LOAD C 0212 02STORE B 0111 03End: 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.

Page 17: Projektovanje jednostavnog procesora µP1

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 OpkodSUBT adresa AC = AC - MDR 05XOR adresa AC = AC XOR MDR 06OR adresa AC = AC OR MDR 07AND adresa AC = AC AND MDR 08JPOS adresa IF AC>0 THEN PC = adresa 09JZERO adresa IF AC=0 THEN PC = adresa 0AADDI 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: 052711: 0AC412: 08CB13: 0000

SUBT:

- Test program:00 : 021101 : 051002 : 0302

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

Page 18: Projektovanje jednostavnog procesora µP1

- 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 : 021101 : 061002 : 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 10 0 11 1 0

ac4 = 101011000100527 = 010100100111

-----------------111111100011 = fe3

Page 19: Projektovanje jednostavnog procesora µP1

Kada su vrednosi iste tada je rezultat 0 u suprotnom 1.

OR:

- Test program:00 : 021101 : 071002 : 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 10 0 11 1 1

ac4 = 101011000100527 = 010100100111

-----------------111111100111 = fe7

Kada su pojavi 1 tada je 1, 0 je jedino kada su obe 0.

AND:

- Test program:00 : 021101 : 081002 : 0302

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

- Izvršavanje programa:

Page 20: Projektovanje jednostavnog procesora µP1

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 10 0 01 0 1

ac4 = 101011000100527 = 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 : 021001 : 090402 : 021203 : 011104 : 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.

Page 21: Projektovanje jednostavnog procesora µP1

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 : 021301 : 0a0402 : 021203 : 011104 : 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 : 021101 : 0a0402 : 021203 : 011104 : 0304

- Izvršavanje programa:

Page 22: Projektovanje jednostavnog procesora µP1

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 : 021001 : 0b1102 : 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|00100111MAR (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 OpkodSHL adresa AC = AC siftovano levo za »adresa«

bita0C

Page 23: Projektovanje jednostavnog procesora µP1

SHR adresa AC = AC siftovano desno za »adresa« bita

Rešenje:

SHL:

- Test program:00 : 021001 : 0c0502 : 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) = 0000010100100111MAR (05) = 00000101

Početno stanje unutar registra AC:

Svaki bit pomeramo za 5 mesta u levo.

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.

Registar AC posle operacije SHL bi trebalo da izgleda ovako:1010010011100000 = a4e0

SHR:

- Test program:

Page 24: Projektovanje jednostavnog procesora µP1

00 : 021001 : 0d0302 : 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) = 0000010100100111MAR (03) = 00000011

Početno stanje unutar registra AC:

Svaki bit pomeramo za 3 mesta u desno.

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.

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:

Page 25: Projektovanje jednostavnog procesora µP1

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 OpkodIN I/O adresa AC = FLEX DIP switch (nižih 8 bita) 0EOUT I/O adresa 7 segmentni displej prikazuje heksa

vrednost registra AC0F

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:

Page 26: Projektovanje jednostavnog procesora µP1

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 0001Pa je rezultujuća vrednost: 0000 0100 0010 0001 = 0421.

3.12

Page 27: Projektovanje jednostavnog procesora µP1

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

Page 28: Projektovanje jednostavnog procesora µP1

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

Page 29: Projektovanje jednostavnog procesora µP1

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 mP1ARCHITECTURE mP1_architecture OF mP1 IS-- stanja procesoraTYPE 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

Page 30: Projektovanje jednostavnog procesora µP1

memory:LPM_RAM_DQGENERIC 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' THENCASE 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 opcodeCASE 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;

Page 31: Projektovanje jednostavnog procesora µP1

-- instrukcija smestanja (3 ciklusa) ***********************************WHEN execute_store =>

-- upisujemo registar AC u memorijumemory_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;

Page 32: Projektovanje jednostavnog procesora µP1

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 OPKOD1 ADD address AC = AC + MDR 002 STORE address MDR = AC 013 LOAD address AC = MDR 024 JUMP address PC = address 035 JNEG address IF AC < 0 THEN PC = address 046 SUBT address AC = AC – MDR 057 XOR address AC = AC XOR MDR 068 OR address AC = AC OR MDR 079 AND address AC = AC AND MDR 0810 JPOS address IF AC > 0 THEN PC = address 0911 JZERO address IF AC = 0 THEN PC = address 0A12 ADDI address AC(15-8) = AC(15-8) + address 0B13 SHL address AC = AC šiftovano u levo za address 0C14 SHR address AC = AC šiftovano u desno za address 0D15 IN I/0 address AC = FLEX DIP SWITCH 0E16 OUT I/0 address 7-segmentni displej prikazuje AC 0F17 CALL address RAR = PC 1018 RETURN address MAR = RAR 1119 PUSH address Smešta AC u memoriju 1220 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)

Page 33: Projektovanje jednostavnog procesora µP1

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)

Page 34: Projektovanje jednostavnog procesora µP1

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 IRprogramski 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.

Page 35: Projektovanje jednostavnog procesora µP1

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)

Page 36: Projektovanje jednostavnog procesora µP1

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.

Page 37: Projektovanje jednostavnog procesora µP1

6 LITERATURA

1. Logičko projektovanje računarskih sistemaDr Vladimir Kovačević

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