Upload
others
View
3
Download
0
Embed Size (px)
Citation preview
ELEKTRONSKI FAKULTET U NIŠUKATEDRA ZA ELEKTRONIKU
SEMINARSKI RAD
VHDL OPIS SAYEH PROCESORA Predmet: Mikroprocesorski sistemi
Profesor:Prof.dr. Mile Stojčev
Studenti:Nikola Sekulović (10963)Lazar Velimirović (11017)
Niš, jul 2007.SADRŽAJ
Uvod ……………………………………………………………………………….. 4
1. Procesor…………………………………………………………………………… 51.1. Arhitektura računarskih sistema…………………………………………… 51.2. Funkcije procesora…………………………………………………………. 51.3. Struktura procesora………………………………………………………… 61.4. Istorijski pregled……………………………………………………………. 8
2. Sayeh………………………………………………………………………………. 92.1. Sayeh dizajn i testiranje…………………………………………………….. 92.2. Komponente CPU-a……………..………………………………………… 102.3.Sayeh instrukcija……...………………………....…………………………..112.4. Sayeh staza podataka……..……………………………………………….. 12
2.4.1. Komponente staze podataka…………………………………………...14
3. Računarski sistem…………………………………………………………………..16
4. Registri……………………………………………………………………………..184.1. Registri SAYEH-a……………………………………………………………19
•••Način testiranja komponenti •••………………………………………..194.1.1. VHDL opis registara …………………………………………………...35
4.1.1.1. VHDL opis bloka IR………………………………………….35 4.1.1.1.1.Testiranje bloka IR..............................................................37
4.1.1.2. VHDL opis bloka PC……...………………………………….38 4.1.1.2.1. Testiranje bloka PC ...........................................................40
4.1.1.3. VHDL opis bloka WP………..……………………………….46 4.1.1.3.1. Testiranje bloka WP...........................................................48
4.1.1.4. VHDL opis bloka FR………...………………………………51 4.1.1.4.1. Testiranje bloka FR............................................................54
4.1.1.5. VHDL opis bloka Register File…..………………………… 58 4.1.1.5.1. Testiranje bloka Register File............................................62
5. Aritmetičko-logička jedinica………………………………………………………....675.1. VHDL opis ALU jedinice……………………………………………………….67
5.1.1. Testiranje ALU jedinice .....................................................................71
6. Memorija………………………………………………………..……………………836.1. VHDL opis bloka memorija……………………………………………………83
2
7. Multiplekser………………………………………………………………………… 85
7.1. VHDL opis multipleksera……………………………………………………...867.1.1. Testiranje multipleksera…………………………………….................87
8. Trostatički bafer………………………………………………………………………91 8.1. VHDL opis trostatičkog bafera 1……………………………………………….91 8.1.1. Testiranje trostatičkog bafera 1..............................................................92 8.2. VHDL opis trostatičkog bafera 2……………………………………………….94 8.2.1. Testiranje trostatičkog bafera 2.............................................................95
8.3. VHDL opis trostatičkog bafera 3……………………………………………….97 8.3.1. Testiranje trostatičkog bafera 3............................................................98
8.4. VHDL opis trostatičkog bafera 4………………………..…………………….100 8.4.1. Testiranje trostatičkog bafera 4..........................................................101
8.5. VHDL opis trostatičkog bafera 5 ………...………………………...…………103 8.5.1.Testiranje trostatičkog bafera 5..........................................................104
8.6. VHDL opis trostatičkog bafera 6………………………………..…………….106 8.6.1.Testiranje trostatičkog bafera 6.........................................................107
8.7. VHDL opis trostatičkog bafera 7……………………………..……………….109 8.7.1.Testiranje trostatičkog bafera 7..........................................................110
9. Upravljačka jedinica…………………….…………………………………………1129.1. Instrukcije procesora SAYEH…………………………….…………………..1129.2. VHDL opis bloka CU (upravljačka jedinica)………………………………....116
10. Procesor SAYEH………………...………………………………………………..157
11. Budućnost procesora………….………………..………………………………….179
12. Testiranje sintetizovanog procesora………………………………………….……182 12.1. Pozivanje programa…….………………………………………………...184
12.2. Inicijalizacija memorije…………………...……………………………...186 12.3. Inicijalizacija registarskig polja…………………………………………..191
12.4. Testiranje procesora………………………………………………………196
13. Laboratorijska vežba................................................................................................213
14. Literatura..................................................................................................................244
3
UVOD
Predmet ovog seminarskog rada je VHDL opis SAYEH procesora (Simple Architecture, Yet Enough Hardware). Sayeh procesor je dizajniran u edukacione svrhe i svrhe testiranja. Predstavlja primer jednostavnog 16-bitnog procesora.
Seminarski rad je rađen u okviru predmeta “Mikroprocesorski sistemi”, iz VII semestra nastavnog programa Elektronskog fakulteta u Nišu.
4
1. PROCESOR
1.1. Arhitektura računarskih sistema
Pod arhitekturom računarskog sistema podrazumeva se njegovo predstavljanje pomoću osnovnih funkcionalnih jedinica (modula).Arhitektura odražava sledeće aspekte strukture računarskog sistema vidljive korisniku: skup instrukcija realizovanih u procesoru, načine adresiranja operanada,načine predstavljanja i formate podataka, skup registara procesora vidljivih korisniku i dr. Drugim rečima, termin arhitektura se koristi za opis mogućnosti računarskog sistema.
Struktura ili strukturna organizacija odražava sastav i uzajamne veze elemenata sistema. Struktura računarskog sistema predstavlja model računarskog sistema na osnovu strukturnih (konstrukcionih) komponenata (elemenata), a odražava uzajamne veze elemenata u procesu funkcionisanja sistema.
U sastav računarskog sistema ulaze sledeće osnovne komponente: proceor (centralna procesorska jedinica) koji se sastoji od aritmetičko-logičke jedinice, operativna (osnovna,glavna) memorija i periferni uredjaji (ulazni i izlazni uredjaji).Sve ove komponente se povezuju pomoću magistrala.
Za vezu (komunikaciju) korisnika sa računarskim sistemom predvidjen je tzv.upravljački pult koji omogućava uključivanje računara, njegovo puštanje u rad, zaustavljanje izvršenja programa, poziv (punjenje) programa za izvršenje i dr.
1.2. Funkcije procesora
Procesor predstavlja programski upravljan digitalni uredjaj koji obavlja sledeće funkcije:
- na osnovu instrukcija obradjuje podatke izvršavanjem nad njima odredjenih relativno prostih operacija - mašinskih operacija;
- donosi odluke u procesu obrade o toku odvijanja izvršenja instrukcija programa:- upravlja ostalim komponentama računara;- obezbedjuje prenos podataka izmedju komponenata računara, kao i razmenu podataka sa
spoljnim okruženjem.
Procesor radi izvršavajuci program smešten u operativnu memoriju, koji se sastoji od sledećih aktivnosti:
5
- prenos (povezivanje) svake instrukcije iz operativne memorije u upravljacku jedinicu;- prenos podataka iz operativne memorije ili registara procesora u aritmetičko-logičku
jedinicu;- izvrsenje (realizacija) operacije predvidjene tom intrukcijom;- pamćenje rezultata u operativnoj memoriji ili registrima.
Tako se izvršavanje programa odvija u neprekidnoj komunikaciji izmedju operativne memorije, aritmetičko-logičke jedinice i upravljačke jedinice.
1.3. Struktura procesora
Uprošćena strukturna šema procesora prikazana je na slici 1. Na šemi su prikazane samo sledeće najvažnije komponente:
-upravljačka (komandna) jedinica služi za prepoznavanje instrukcija (naredbi) koje treba izvršiti, kao i za formiranje upravljačkih signala za izvršenje tih instrukcija;
- aritmetičko-logička jedinica realizuje aritmetičke i logičke operacije;
- red instrukcija služi za pripremu I predobradu instrukcija;
- skup upravljačkih (radnih) registara služe za čuvanje informacija koje se koriste za upravljanje radom procesora;
- skup registara opšte namene imaju višestruku ulogu. Mogu se koristiti kao upravljački registri, na primer kao brojači instrukcija, pokazivači steak-a, indeksni registri itd. Medjutim, njihova osnovna namena je privremeno čuvanje podataka i medjurezultata pri izvršenju operacija u procesoru;
- unutrašnje magistrale povezuju sve komponente procesora u jednu celinu;
- generator sinhronizacionih signala služi za formiranje impulsa kojima se definišu odredjeni vremenski intervali za izvršenje operacija u procesoru;
-sprežna kola (intrfejs) za povezivanje procesora sa operativnom memorijom i periferijama; blok za spregu sadrži sprežna kola (interfejs) kojima se organizuje razmena podataka izmedju procesora i operativne memorije, kao i veza procesora sa perifernim uredjajima, drugim racunarima i sl.
6
Slika 1. Uprošćena strukturna šema procesora
Osim toga procesor može sadržati i keš-memoriju, stek-memoriju i niz blokova namenjenih organizaciji procesa obrade (blok prekida programa, blok zaštite memorije, blok za kontrolu ispravnosti rada i dijagnostiku procesora i dr.).
. U procesor se dovode signali spoljnih zahteva kojima se od procesora traži neka usluga, preduzimanje akcije i sl. Ovi signali dolaze od blokova samog procesora, od drugih jedinica računara i iz spoljašnjeg okruženja. U procesoru se takodje formiraju i prenose različiti signali koji se mogu svrstati u sledeće grupe: - signali za upravljanje procesorom - signali za upravljanje prenosom podataka - signali adresne magistrale i magistrale podataka - signali stanja procesora - signali za upravljanje prekidima - signali za sinhronizaciju itd.Izlazni signali procesora predstavljaju sinhronizacione (taktne) signale, razne upravljačke signale, signale koji saopštavaju stanje procesora i dr.
Moderniji procesori imaju i jedinice za rad sa brojevima u pokretnom zarezu, brzu internu memoriju itd. Superskalarni procesori imaju i po više operacionih jedinica što im omogućava da izvršavaju nekoliko insrukcija istovremeno ( kada one nisu medjusobno zavisne).
7
1.4. Istorijski pregled
Prvi procesori su bili mehanički i praktično nisu bili zaseban deo racunara (na primer kakve je projektovao Charls Bebig).Zatim su usledili elektro-mehanički na bazi elektronskih vakumskih cevi koji su bili jako veliki. Obično su računari zauzimali cele prostorije ili čak spratove. Do značajnijeg smanjenja dimenzija i povećanja performansi došlo je upotrebom trasnzistora i integrisanih kola u drugoj polovini XX veka.
Svaki procesor spolja izgleda veoma jednostavno, alion je u svojoj unutrašnjosti jako kompleksan, jer se radi o stotinama miliona tranzistora koji su smešteni u jednom čipu. Prvi put takvo nešto je uspelo 1971. kada je napravljen prvi procesor Intel 4004, koji je mogao samo sabirati i oduzimati, ali su naučnici po prvi put uspeli da u jedan čip smeste silna integrisana kola i tranzistore, što je dalo osnovu za dalji razvoj procesora koji su tim napretkom počeli da troše mnogo manje el.energije.Prvi mikroprocesor koji se našao u kućnim računarima bio je Intel 8080, 8-bitni procesor nastao 1974. godine. Od tada do danas mikroprocesori su dobili na brzini, efikasnosti i kompleksnosti.
Veoma često se spominje i Moore-ov zakon koji objašnjava da se svakih 18 meseci broj tranzistora i brzina udvostručava, a glasi ovako: The complexity of an integrated circuit, with respect to minimum component cost will double in about 18 months.
8
2. SAYEH
2.1. SAYEH dizajn i testiranje
U delu koji sledi prikazaćemo dizajn i opis procesora. CPU je SAYEH (Simple Architecture, Yet Enough Hardware-jednostavna arhitektura, ali sa dovoljno hardvera) koji je dizajniran za svrhe učenja i testiranja.
Detalji funkcionalnosti procesora
Jednostavan CPU primer koji je ovde razmatran ima registarsko polje koje se koristi za instrukcije za obradu podataka. CPU ima 16-bitnu magistralu podataka i 16-bitnu adresnu magistralu. Procesor ima 8-bitne i 16-bitne instrukcije. Kratke instrukcije sadrže instrukcije prikrivanja (shadow instructions), koje efikasno spajaju dve takve instrukcije u jednu 16-bitnu reč. Slika 1 prikazuje signale SAYEH interfejsa.
Slika 1. SAYEH Interfejs
9
2.2. Komponenete CPU-a
SAYEH koristi svoje polje registara za većinu svojih instrukcija. Adresiranje kod ovog procesora takodje koristi prednosti ove strukture. Zbog ovoga, hardver za adresiranje SAYEH-a je jednostavan i izlaz polja registara se koristi u proračunima adrese. SAYEH komponente koje se koriste od strane instrukcija uključuju standardne registre kao što su programski brojač, instrukcioni registar, aritmetičko-logička jedinica i statusni registar. Osim toga, ovaj procesor ima registre koji čine polje registara R0,R1, R2, R3, kao i pokazivač prozora (Window Pointer) koji definiše R0, R1, R2, R3 unutar polja registara. CPU komponente i kratak opis svake su pokazani ispod. - PC: Programski brojač, 16 bitova
- R0, R1, R2, R3 registri opšte namene koji su deo polja registara, 16 bita - RegFile: Registri opšte namene koji čine prozor od 4 registra u registarskom polju
od 8 registara . - WP: Pokazivač prozora ukazuje polju registara da definiše RO, R1, R2, R3, 3 bita
- IR: Instrukcijski registar koji je napunjen sa jednom 16-bitnom, 8-bitnom ili dve 8-bitne instrukcije, 16 bita
- ALU: ALU može da obavlja sledeće aritmetičke i logičke operacije nad svojim 16-bitnim operandima: sabiranje, oduzimanje, množenje, AND, OR, NOT, Shiftleft, Shiftright i upoređivanje
- Z flag: Postaje 1 kada je izlaz iz ALU 0
- C flag: Postaje 1 kada ALU ima izlaz sa prenosom
10
InstructionMnemonic andDefinition
Bits15:0
RTL notation:comments orcondition
nop No operation 0000-00-00 No operationhlt Halt 0000-00-01 Halt, fetching stopsszf Set zero flag 0000-00-10 Z <= 1'czf Clr zero flag 0000-00-11 Z <= '0'scf Set carry flag 0000-01-00 C<='1'ccf Clr carry flag 0000-01-01 C <= '0'cwp Clr
Window pointer0000-01-10 WP <= "000"
mvr Move Register 0001-D-S RD <= RsIda Load Addressed 0010-D-S RD <= (Rs)sta Store Addressed 0011-D-S (RD) <= Rsinp Input from port 0100-D-S In from Rs write to RDoup Output to port 0101-D-S Out to port RD from Rsand AND Registers 0110-D-S RD <= RD & Rsor OR Registers 0111-D-S RD <= RD I Rsnot NOT Register 1000-D-S RD <= ~Rsshl Shift Left 1001-D-S RD <= sla Rsshr Shift Right 1010-D-S RD <= sra Rsadd Add Registers 1011-D-S RD <= RD + RS + Csub Subtract
Registers1100-D-S RD <= RD - RS - C
mul MultiplyRegisters
1101-D-S RD <= RD * Rs :8-bitmultiplication
cmp Compare 1110-D-S RD, RS (if equal:Z=1; ifRD<RS: C=1)
mil Move Immd Low 1111-D-00-I RDL <= {8'bZ, I}mih Move Immd High 1111-D-01-I RDH <= {I, 8'bZ }spc Save PC 1111-D-10-I RD <= PC + Ijpa Jump Addressed 1111-D-ll-I PC <= RD + Ijpr Jump Relative 0000-01-11-I PC <= PC + Ibrz Branch if Zero 0000-10-00-I PC <= PC + I :if Z is 1brc Branch if Carry 0000-10-01-I PC <= PC + I :if C is 1awp Add Win pntr 0000-10-10-I WP <= WP + I
Tabela 1. Skup instrukcija SAYEH procesora
2.3. SAYEH instrukcije
Opšti format 8-bitnih i 16-bitnih SAYEH instrukcija je prikazan na slici 2. 16-bitne instrukcije imaju Immediate polje, a 8-bitne instrukcije nemaju. OPCODE polje je 4-bitni kod koji odredjuje tip instrukcije. Polja Left (levo) i Right (desno) su 2-bitni kodovi koji biraju registre R0 do R3 za izvor i/ili odredište instrukcije. Obično, Left se koristi za
11
odredište, a Right za izvor. Immediate polje se koristi za trenutne podatke, ili ako su dve 8-bitne instrukcije zapakovane koristi se za drugu instrukciju.
15 12 11 10 09 08 07 00OPCODE Left Right Immediate
Slika 2. Format instrukcije
Naš procesor ima ukupno 29 instrukcija kao što je pokazano u tabeli 1. Instrukcije sa I trenutnim poljem su 16-bitne instrukcije a ostale su 8-bitne instrukcije. Instrukcije koje koriste polja Destination (odredište) i Source (izvor) (označeni sa D i S u tabeli seta instrukcija) imaju OPCODE koji je ograničen na 4 bita. Instrukcije koje ne zahtevaju specifikaciju izvornih i odredišnih registara korise ova polja kao OPCODE ekstenzije.
U setu instrukcija, adresirane lokacije u memoriji su naznačene zatvaranjem adrese u zagrade. Za ove instrukcije, procesor izdaje ReadMem ili WriteMem signale memoriji. Kada se instrukcije ulaza i izlaza (inp, oup) izvrše, SAYEH izdaje ReadIO signale ili WriteIO signale svojim UI uredjajima.
2.4. SAYEH staza podataka
Glavne komponente ovog procesora koji je prikazan na slici 3 su Addressing Unit(adresna jedinica) koja se sastoji od PC (Program Counter-programski brojač) i Address Logic(adresna logika), IR (instrukcioni registar), WP (Window Pointer), Register File koji se sastoji od Left Decoder 1 i Right Decoder 2, ALU (aritmetičko-logička jedinica) i Flags (zastavice). Kao što je pokazano na slici 3, ove komponente su ili povezane žicom ili povezane kroz trostatičke magistrale. Ulazi komponenata sa više izvora, kao što je ulaz sa leve strane ALU, koriste trostatičke magistrale. Trostatičke magistrale u ovoj strukturi su Databus i OpndBus. Na ovoj slici, signali koji su zakošeni (Italic) su kontrolni signali koje izdaje kontroler.
12
Slika 3. SAYEH staza podataka
13
2.4.1. Komponente staze podataka (Datapath Components)
Slika 4 pokazuje hijerarhijsku strukturu SAYEH komponenti. Procesor se sastoji iz datapath(staza podataka) i kontroler. Datapath komponente su Addressing Unit, IR, WR, Register File, Arithmetic Unit i registri Flags. Addressing Unit se dalje deli na PC i Address Logic.
Addressing Logic(adresna logika) je kombinaciono kolo koje je sposobno dodavati svoje ulaze u cilju generisanja 16-bitnog izlaza koji formira adresu za memoriju procesora. Program Counter i Instruction Register su 16-bitni registri. Register File je dvoportna memorija i polje od 8 šesnaestobitnih registara. Window Pointer je trobitni registar koji se koristi kao osnova Register File. Specifični registri za čitanje i upis (R0, R1, R2 ili R3) u Register File su određeni svojim 4-bitnim magistralama koje dolaze iz Instruction Registera. 2 bita se koriste za izbor izvornog registra, a druga 2 bita biraju odredišni registar.
Slika 4. Hijerarhijska struktura SAYEH-a
14
Kada je Window Pointer aktivan, dodaje svoj trobitni ulaz na svoje trenutne podatke. Flags registar je dvobitni registar koji čuva flag izlaze iz Aritmetic Unit. Aritmetic Unit je 16-bitna aritmetička i logička jedinica koja ima funkcije prikazane u tabeli 2. 9-bitni ulaz bira funkciju ALU-a prikazanu u ovoj tabeli. Ovaj kod je obezbedjen od strane kontrolera procesora.
Operacije Opis KodBl5to0H Operand B smestiti na izlaz 1000000000
AandBH Na izlaz smestiti rezultat logičke operacije A' I ' B
0100000000
AorBH Na izlaz smestiti rezultat logičke operacije A' ILI ' B
0010000000
notBH Na izlaz smestiti komplement operanda B
0001000000
shlBH Pomeranje bitova operanda B za jedno mesto ulevo
0000100000
shrBH Pomeranje bitova operanda B za jedno mesto udesno
0000010000
AaddBH Zbir operanada A I B smestiti na izlaz
0000001000
AsubBH Razliku operanada A I B smestiti na izlaz
0000000100
AmulBH Proizvod operanada A I B smestiti na izlaz
0000000010
AcmpBH Z=1 ako je A=B; C=1 ako je A<B
0000000001
Tabela 2. ALU operacije
SAYEH sekvencijalne komponente podataka i njihov kontroler se okidaju
silaznom ivicom glavnog sistemskog takta. Kontrolni signali ostaju aktivni nakon jedne opadajuće ivice do druge. Ovaj period omogućava prostiranje signala kroz magistrale i logičke jedinice u putu podataka.
15
3. Računarski sistem
Prilikom dizajna jednog računarskog sistema, ima se u vidu pet osnovnih elemenata od kojih se sastoji hardver (računar). To su : operaciona, odnosno aritmetičko-logička jedinica,upravljačka jedinica,memorija,ulazni i izlazni delovi.Aritmetičko-logička jedinica obavlja aritmetičke operacije i uporedjuje numeričke vrednosti. Upravljačka jedinica ili kontrolna jedinica upravlja funkcionisanjem računara primajući instrukcije od korisnika i transformišući ih u električne signale,koje računar može da shvati. Kombinacija aritmetičko-logičke i kontrolne jedinice čine mikroprocesor u savremenim računarima (CPU,skraćenica na engleskom). Memorija čuva instrukcije i podatke. Uopšteno gledano, instrukcije se čuva u primarnu , a podaci u sekundarnu memoriju. Delovi ulaza i izlaza respektivno, omogućavaju primanje i slanje podataka, odnosno komunikaciju korisnika i računara.
Kao što je već rečeno, procesor izvršava kompjuterski program, koji predstavlja skup mašinskih instrukcija kojima korisnik opisuje zadatke koje daje računaru. Međutim, program nije smešten u procesoru. Program je smešten u memoriji. Instrukcije i podaci definisani u okviru programa nalaze se u memorijskim lokacijama i procesor im selektivno pristupa.
Slika Računar sa memorisanim programom
Slika 1. Računar sa memorisanim programom
Procesor koji je odgovarajućim magistralama povezan sa memorijom predstavlja računarski sistem. Sistem sa slike se naziva računar sa memorisanim programom (eng. Stored program computer). Ovakav sistem često se naziva i von Neumann-ov računar, po matematičaru John von Neumann-u koji je još 1945. razvio ovu strukturu na Prinston
16
procesor
memorija
adrese
instrukcije i podaci
registri
instrukcije
podaci
Institutu za napredne nauke. Još uvek je osnova za gotovo sve računare i do današnjih dana.
17
4. Registri Registar,u računarstvu procesorski registar, je poseban deo procesora koji služi za čuvanje informacija koje su potrebne procesoru tokom izvršavanja programa. Osnovne karakteristike su velika brzina, ali mali kapacitet. Brzina je posledica rada na taktu centralnog procesora, što je u današnjim primenama značajno više od takta operativne memorije. Kapacitet je posledica činjenice da procesor ima mali deo izdvojen za skladištenje podataka u odnosu na operativnu memoriju koja je ogromna.Većina današnjih računara radi na sledeći način-podatak se iz operativne memorije učita u registar, obradi, potom vrati u operativnu memoriju-to se zove čitaj-piši arhitektura.
Procesorski registri su na vrhu memorijske hijerarhije i najbrži su način za pristup podatku u računaru. Veličina registra se izražava u bitima,na primer 8-bitni registar (kod 8-bitnih procesora), 32-bitni registar (kod većine današnjih procesora) ili 64-bitni registar kod najnovije generacije procesora.
Registri su realizovani na istom komadu poluprovodnika kao i ostatak procesora, i organizovani kao tablica registara. Nekada su bili pravljeni kao diskretni elementi od flip-flopova ili u tehnologiji tankog filma, a pre toga od magnetnih prstenova.
Pojam registar se obično odnosi samo na one registre koji se mogu neposredno navesti kao ulazni ili izlazni za naredbe,prema skupu naredbi procesora. Ovi registri su, u stvari, arhitekturni registri. Na primer, x86 skup naredbi radi sa osam 32-bitnih registara, dok sam procesor ima jos registara koji služe za neke druge svrhe.
Postoji više vrsta registara:- Registri podataka se koriste za smeštanje celih brojeva i karaktera (za brojeve
u pokretnom zarezu postoje drugi registri). Kod starijih i jednostavnijih procesora postoji poseban registar akumulator koji učestvuje implicitno u mnogim operacijama;
- Adresni registri sadrže memorijske adrese i služe za pristup operativnoj memoriji računara.Kod nekih procesora postoji poseban indeksni registar koji se često koristi za kompleksna kombinovanja radi računanja adrese;
- Registri opšte namene mogu čuvati i podatke i adrese;- Registri podataka u pokretnom zarezu su posebni registri koji se koriste
prilikom računa u pokretnom zarezu od strane specijalizovanog procesora (FPU-procesor za račun u pokretnom zarezu) odnosno dela procesora koji se bavi takvim računarom;
- Registri konstanti služe samo za čitanje i to neke unapred izabrane,često korišćene vrednosti.Često se tako tretira nula,mada postoje primeri i za 1 ili pi;
- Vektorski registri sadrže podatke za vektorski račun kod posebne vrste procesora (SIMD-jedna instrukcija više podataka).
- Registri posebne namene sadrže stanje programa i procesora i obično su to:∙ Programski brojač ili pokazatelj instrukcija sadrži adresu sledeće instrukcije programa koju treba izvršiti;
18
∙ Pokazivač steka je takodje vrsta adresnog registra koji pokazuje na vrh strukture podataka organizovane u memoriji;∙ Statusni registar ili statusna reč sadrži podatke koji opisuju stanje procesora, izvršavanja tekuće instrukcije ili poslednjih značajnih promena;
- Registar instrukcija sadrži tekuću instrukciju koju izvršava procesor;- Indeks registri služe kombinovanju sa adresnim registrima radi ostvarivanja
složenijih načina dobijanja adrese podataka,operanada ili instrukcija;
Hardverski registri su slični registrima opšte namene, ali nisu smešteni na procesoru vec na drugim čipovima i služe za privremeni smeštaj podataka, adresa i statusa.
Procesor SAYEH se sastoji od sledećih registara:
IR- Instrukcioni registar (eng. Instruction Register): 16-bitni registar koji čuva instrukciju koja se trenutno izvršavaPC- Programski brojač (eng. Program Counter): 16-bitni registar koji sadrži adresu naredne instrukcije koju treba izvršitiWP- Pokazivač prozora (eng. Window Pointer): 3-bitni registar koji pokazuje na jedan od osam registara u registarskom polju (eng.Register File)R0, R1, R2 i R3 registri: 16-bitni registri opšte namene koji predstavljaju deo registarskog poljaFR- Statusni registar (eng. Flags Register): 2-bitni registar koji označava stanje ALU jedinice
***** Način testiranja komponenti*****
Korak 1: U prozoru DESIGN BROWSE izabrati komponentu koju treba testirati.
19
4.1. REGISTRI SAYEH-a-a
Korak 2: Levi klik mišem na izabranu komponentu.
20
Korak 3: Desni klik na fajl označen crvenom ikonicom i levi klik na opciju Set as Top-Level.
21
Korak 4: Ponovo desni klik na fajl označen crvenom ikonicom i levi klik na opciju Generate TestBench.
22
Korak 5: Na prozoru koji se otvara levi klik mišem na opciju Next.
23
Korak 6: Na prozoru koji se otvara ponovo levi klik na opciju Next.
24
Korak 7: Na prozoru koji se otvara još jednom levi klik na opciju Next.
25
Korak 8: Levi klik na opciju Finish
26
Korak 9: Levi klik na ikonicu označenu crvenom bojom.
27
Korak 10: Desni klik na belo polje otvorenog prozora i levi klik na opciju Add Signals.
28
Korak 11: U desnom delu novodobijenog prozora nalaze se signali izabrane komponente. Levim klikom na opciju Add dodajemo signale.
29
Korak 12: Signali dodati preko opcije Add pojavljuju se kao na slici.
30
Korak 13: Dodeljivanje vrednosti signalima vrši se desnim klikom na odgovarajući i izborom opcije Stimulators.
31
Korak14: U novootvorenom prozoru Stimulators biraju se konkretne vrednosti potrebne za simulaciju.
32
Korak 15: Testiranje se startuje ikonicom koja je označena crvenom bojom.
33
Korak 16: Nakon testiranja prozor treba izgledati kao na sledećoj slici.
34
4.1.1.VHDL opis registara
4.1.1.1. VHDL opis bloka IR
Blok IR predstavlja 16-bitni registar koji se u okviru izvršne jedinice koristi kao instrukcioni registar.
Blok IR ima sledeće portove:- Clk – ulaz taktnog signala (kad je =1 registar pamti sadržaj na ulazu),- Load – ulaz za dozvolu izlaza podataka (kada je =0 registar je otkačen sa
magistrale, a kada je =1 memorisani sadržaj registra se pojavljuje na izlazu),- 16-bitni ulaz Data – ulaz na koji se dovodi instrukcija,
35
- 16-bitni izlaz Q – izlaz iz instrukcionog registra usmeren ka upravljačkoj jednici (kontroleru),
- 8-bitni izlaz Q1– izlaz koji predstavlja gornjih 8 bitova iz 16-bitnog ulaza Data.
CLK Q(15:0) DATA(15:0)
Q1(7:0)
LOAD
U1
ir-------------------------------------------------------------------------------------- Design unit generated by Aldec IP Core Generator, version 6.3.-- Copyright (c) 2003-2004 by Aldec, Inc. All rights reserved.------------------------------------------------------------------------------------------ Created on Saturday 2007-03-31, 14:02:33---------------------------------------------------------------------------------------- Details:-- Type: D type flip-flop register-- Data width: 16-- Clock input CLK active high-- Load input LOAD active high------------------------------------------------------------------------------------
--{{ Section below this comment is automatically maintained-- and may be overwritten--{entity {ir} architecture {ir_arch}}
library IEEE;use IEEE.std_logic_1164.all;
entity ir isport (
LOAD : in std_logic;CLK : in std_logic;DATA : in std_logic_vector(15 downto 0);Q: out std_logic_vector(15 downto 0);Q1: out std_logic_vector(7 downto 0)
);end entity;
architecture ir_arch of ir is
36
begin
process (CLK) variable TEMP_Q: std_logic_vector(15 downto 0);
begin
if rising_edge(CLK) thenif LOAD = '1' then
TEMP_Q :=DATA;end if;
end if; Q <= TEMP_Q; Q1<= TEMP_Q(15 downto 8);
end process;end ir_arch;
4.1.1.1.1. Testiranje bloka IR
Izabrali smo taktni impuls periode 100 ns (prvih 50 ns je logička '0' , a narednih 50 ns je logička'1'). Ako je kontrolni signal Load=1, šesnaestobitni uzlazDATA=1100101001011010 = CA5A, nailaskom prednje ivice takta Clk na šesnaestobitnom izlazu se javlja Q=1100101001011010=CA5A ,a na osmobitnom izlazu se javljaju osam viših bitova sa ulaza Q1=11001010=CA.
37
Slika: Test primer za instrukcioni registar IR
4.1.1.2. VHDL opis bloka PC
PC predstavlja blok koji određuje adresu naredne instrukcije koju treba izvršiti.Blok PC ima sledeće portove:
- Clk – ulaz taktnog signala (kad je =1 registar pamti sadržaj na ulazu),- PC -16-bitni ulaz- 16-bitni ulaz RSide – ulaz koji se dovodi iz registarskog polja,- 8-bitni ulaz IR– ulaz koji se dovodi iz instrukcionog registra,- Izl –16-bitni izlaz koji se vodi na memoriju i na ulaz PC-a,- Reset PC – ulaz koji postavlja izlaz na nula vektor,- PCplus1– kontrolni signal (ako je =1 sadržaj brojača se uvećava za 1) ,
38
- PCplusI– kontrolni signal (ako je =1 sadržaj brojača se uvećava za vrednost IR),
- R0plusI– kontrolni signal (ako je =1 na izlazu brojača je zbir ulaza RSide i ulaza IR ),
- R0plus0– kontrolni signal (ako je =1 na izlazu brojača je ulaz RSide ), - Jmp – kontrolni signal (ako je =1 ulaz PC se samo prosleđuje na izlaz Izl).
IR(7:0)
izl(15:0)
PC(15:0)
PCplus1
PCplusI
R0plus0
R0plusI
RSide(15:0)
ResetPCclk
jmp
U1
adr_unt
library IEEE;use IEEE.STD_LOGIC_1164.all;use IEEE.STD_LOGIC_UNSIGNED.all;entity adr_unt is
port( clk : in STD_LOGIC; ResetPC : in STD_LOGIC;
PCplus1 : in std_logic;PCplusI : in std_logic;R0plusI : in std_logic;R0plus0 : in std_logic;jmp : in std_logic;RSide : in std_logic_vector(15 downto 0);IR : in std_logic_vector(7 downto 0);PC : in std_logic_vector(15 downto 0);
izl : out std_logic_vector(15 downto 0) );
end adr_unt;
--}} End of automatically maintained section
39
architecture adr_unt of adr_unt isbegin
main:process (ResetPC,PCplus1,PCplusI,R0plusI,R0plus0,RSide,PC,IR,clk) variable PC_Buff : std_logic_vector(15 downto 0);begin
if rising_edge(clk)then
if jmp ='1'thenPC_Buff:=PC;izl<=PC_Buff;
end if;
if ResetPC ='1'thenPC_Buff:="0000000000000000";izl<=PC_Buff;
end if;if PCplus1 ='1'
thenPC_Buff:=PC_Buff + "0000000000000001";izl<=PC_Buff;
end if;if PCplusI ='1'
thenPC_Buff:=PC_Buff + IR;izl<=PC_Buff;
end if;if R0plusI ='1'
thenPC_Buff:=RSide + IR;izl<=PC_Buff;
end if;if R0plus0 ='1'
thenizl<=RSide;
end if;end if;
end process;end adr_unt;
4.1.1.2.1. Testiranje bloka PC
U primerima koji slede ulazni signali su sledeći:
40
RSide=1000111100001100=8F0CIR=01110111=77PC=0000000011110000=00F0.
Izabrali smo taktni impuls periode 100 ns (prvih 50 ns je logička '0' , a narednih 50 ns je logička'1'). Ako je kontrolni signal PCplus1=1, nailaskom prednje ivice takta Clk sadržaj brojača se poveća za jedanizl=0000000011110001=00F1.
Slika: Test primer za brojač čiji se sadržaj uvećava za 1
Ako je kontrolni signal PCplusI=1, nailaskom prednje ivice takta Clk na izlazu se dobija zbir ulaza PC i IR tj.izl=0000000101100111=0167.
41
Slika: Test primer za brojač čiji se sadržaj uvećava za vrednost koja je na ulazu IR
Ako je kontrolni signal R0plus0=1, nailaskom prednje ivice takta Clk ulaz RSide se propušta na izlazizl=1000111100001100=8F0C.
42
Slika: Test primer za brojač kod koga se ulaz RSide propušta na izlaz
Ako je kontrolni signal R0plusI=1, nailaskom prednje ivice takta Clk na izlazu se dobija zbir ulaza RSide i IR tj. izl=1000111110000011=8F03.
43
Slika: Test primer za brojač kod koga se na izlaz vodi zbir vrednosti sa ulaza Ride i IR
Ako je kontrolni signal ResetPC=1, nailaskom prednje ivice takta Clk sadržaj brojača se resetujeizl=0000000000000000=0000.
44
Slika: Test primer za resetovanje brojača
Ako je kontrolni signal jmp=1, nailaskom prednje ivice takta Clk ulaz PC se prosleđuje na izlazizl=0000000011110000=00F0.
45
Slika: Test primer za brojač kod koga se ulaz PC prosleđuje na izlaz
4.1.1.3. VHDL opis bloka WP
WP je 3-bitni registar koji ukazuje na jedan od osam registara u polju Register File.Blok WP ima sledeće portove:
- Clk – ulaz taktnog signala (kad je =1 registar pamti sadržaj na ulazu),- Data – trobitni ulaz- Q – trobitni izlaz koji definiše registar u registarskom polju,- WPreset – kontrolni ulaz (ako je =1 izlaz Q je nula vektor),- WPadd – kontrolni ulaz (ako je =1 ulaz se dodaje na trenutno stanje WP-a).
46
CLK
Q(2:0)DATA(2:0)
WP
add
WP
reset
U1
WP---------------------------------------------------------------------------------------- Design unit generated by Aldec IP Core Generator, version 6.3.-- Copyright (c) 2003-2004 by Aldec, Inc. All rights reserved.------------------------------------------------------------------------------------------ Created on Friday 2007-06-08, 21:57:26---------------------------------------------------------------------------------------- Details:-- Type: D type flip-flop register-- Data width: 3-- Clock input CLK active high-- Clock enable input WPadd active high-- Asynchronous clear input WPreset active high------------------------------------------------------------------------------------
--{{ Section below this comment is automatically maintained-- and may be overwritten--{entity {ffd} architecture {ffd_arch}}
library IEEE;use IEEE.std_logic_1164.all;use IEEE.STD_LOGIC_SIGNED.all;entity WP is
port (WPreset : in std_logic;WPadd : in std_logic;CLK : in std_logic;DATA : in std_logic_vector(2 downto 0);Q : out std_logic_vector(2 downto 0)
);end entity;
47
--}} End of automatically maintained section
architecture WP_arch of WP is
signal TEMP_Q: std_logic_vector(2 downto 0);
begin
process (CLK, WPreset)begin
if rising_edge(CLK) then if WPreset = '1' then
TEMP_Q <= (others => '0'); elsif WPadd = '1' then
TEMP_Q <= TEMP_Q + DATA;else
TEMP_Q <= DATA;end if;
end if;
end process;
Q <= TEMP_Q;
end WP_arch;
4.1.1.3.1. Testiranje bloka WP (pokazivač prozora)
U primeru koji sledi, za kontrolne signaleWPadd=0 WPreset=0, nailaskom prednje ivice takta Clk signal sa ulaza DATA=010=2 vodi se na izlaz tj.Q=DATA=010=2.
48
Slika: Test primer za blok WP u kome se vrednost sa ulaza prosleđuje na izlaz
U primeru koji sledi, za kontrolne signaleWPadd=1 WPreset=0, nailaskom prednje ivice takta Clk, signal sa ulazaDATA=010=2dodaje se trenutnom stanju bloka WP Q=Q+DATA=010+010=100=4.
49
Slika: Test primer za blok WP u kojem se vrednost sa ulaza DATA dodaje trenutnom stanju WP-a
Za kontrolne signaleWPadd=0 WPreset=1, nailaskom prednje ivice takta Clk, izlaz se resetuje tj.Q=000=0.
50
Slika: Test primer u kojem se resetuje sadržaj bloka WP
4.1.1.4. VHDL opis bloka FR
FR je 2-bitni registar koji opisuje stanje aritmetičko-logičke jedinice. Blok FR ima sledeće portove:
- Clk – ulaz taktnog signala (kad je =1 registar pamti sadržaj na ulazu),
51
- Cout, Zout – 1-bitni ulazi,- C,Z – 1-bitni izlazi,- Cset – kontrolni ulaz (ako je =1 izlaz C se postavlja na 1),- Creset – kontrolni ulaz (ako je =1 izlaz C se postavlja na 0),- Zset – kontrolni ulaz (ako je =1 izlaz Z se postavlja na 1),- Zreset – kontrolni ulaz (ako je =1 izlaz Z se postavlja na 0).
CLK
C
CReset
Z
CSet
Cout
ZResetZSetZout
U2
flags
------------------ -- -- ---------------------------------------------------------------- Design unit generated by Aldec IP Core Generator, version 6.3.-- Copyright (c) 2003-2004 by Aldec, Inc. All rights reserved.------------------------------------------------------------------------------------------ Created on Tuesday 2007-06-12, 12:42:08---------------------------------------------------------------------------------------- Details:-- Type: D type flip-flop-- Data width: 1-- Clock input CLK active high-- Asynchronous clear input CLR active high-- Asynchronous set input SET active high------------------------------------------------------------------------------------
--{{ Section below this comment is automatically maintained-- and may be overwritten--{entity {flags} architecture {flags_arch}}
library IEEE;use IEEE.std_logic_1164.all;
entity flags is
52
port (CReset,ZReset : in std_logic;CSet,ZSet : in std_logic;CLK : in std_logic;Cout,Zout : in std_logic;C,Z : out std_logic
);end entity;
--}} End of automatically maintained section
architecture flags_arch of flags is
begin
process (CLK, CReset,ZReset,CSet,ZSet) variable TEMP_QC: std_logic;
variable TEMP_QZ: std_logic;begin
if rising_edge(CLK) thenif CReset = '1' and ZReset = '1'and CSet = '0' and ZSet= '0' then
TEMP_QC := '0';TEMP_QZ := '0';
elsif CReset = '0' and ZReset = '1' and CSet = '0' and ZSet= '0' then TEMP_QC := Cout;TEMP_QZ := '0';
elsif CReset = '1' and ZReset = '0' and CSet = '0' and ZSet= '0' then TEMP_QC := '0';TEMP_QZ := Zout;
elsif CReset = '0' and ZReset = '0' and CSet = '0' and ZSet= '0' then TEMP_QC := Cout;TEMP_QZ := Zout;
elsif CReset = '0' and ZReset = '0'and CSet = '1' and ZSet= '1' then TEMP_QC := '1';TEMP_QZ := '1';
elsif CReset = '0' and ZReset = '0' and CSet = '0' and ZSet= '1' then TEMP_QC := Cout;TEMP_QZ := '1';
elsif CReset = '0' and ZReset = '0' and CSet = '1' and ZSet= '0' then TEMP_QC := '1';TEMP_QZ := Zout;
elsif CReset = '0' and ZReset = '0' and CSet = '0' and ZSet= '0' then TEMP_QC := Cout;
53
TEMP_QZ := Zout;end if;
end if;C <= TEMP_QC;Z <= TEMP_QZ;
end process;
end flags_arch;
4.1.1.4.1. Testiranje bloka FR
Za ulaze Cout=1Zout=0i kontrolni signal Zset=1, nailaskom prednje ivice takta Clk, izlazi iz bloka FR suC=1Z=1.
54
Slika: Test primer za blok FR u kojem se setuje zastavica Z
Za ulaze Cout=1Zout=0i kontrolni signal Zreset=1, nailaskom prednje ivice takta Clk, izlazi iz bloka FR suC=1Z=0.
55
Slika: Test primer za blok FR u kojem se resetuje zastavica Z
Za ulaze Cout=1Zout=0i kontrolni signal Cset=1, nailaskom prednje ivice takta Clk, izlazi iz bloka FR suC=1Z=0.
56
Slika: Test primer za blok FR u kojem se setuje zastavica C
Za ulaze Cout=1Zout=0i kontrolni signal Creset=1, nailaskom prednje ivice takta Clk, izlazi iz bloka FR suC=0Z=0.
57
Slika: Test primer za blok FR u kojem se resetuje zastavica C
4.1.1.5. VHDL opis bloka Register File
Register File predstavlja polje od osam 16-bitnih registara. Blok Register File ima sledeće portove:
- Clk – ulaz taktnog signala (kad je =1 registar pamti sadržaj na ulazu),- Data -16-bitni ulaz- Rd, Rs –16-bitni izlazi koji predstavljaju operande za aritmetičko-logičku
jedinicu,- WP– 3-bitni kontrolni signal koji definiše registar,- Sel– 4-bitni kontrolni signal (donja dva bita se koriste za definisanje
izvora(source), a gornja dva za definisanje odredišta (destination) ),- WEL– kontrolni signal (ako je =1 na mestu osam nižih bitova u registru koji
je definisan kontrolnim signalom WP upisaće se nižih osam bitova sa ulaza DATA),
- WEH– kontrolni signal (ako je =1 na mestu osam viših bitova u registru koji je definisan kontrolnim signalom WP upisaće se osam viših bitova sa ulaza DATA).
58
---------------------------------------------------------------------------------------- Design unit generated by Aldec IP Core Generator, version 6.3.-- Copyright (c) 2003-2004 by Aldec, Inc. All rights reserved.------------------------------------------------------------------------------------------ Created on Sunday 2007-04-01, 23:19:26---------------------------------------------------------------------------------------- Details:-- Type: Synchronous single port Random Access Memory (RAM)-- Word size: 16 bits-- Memory depth: 8 words-- Clock input CLK active high-- Write enable input WE active high------------------------------------------------------------------------------------
--{{ Section below this comment is automatically maintained-- and may be overwritten--{entity {ram} architecture {ram_arch}}
library IEEE;use IEEE.std_logic_1164.all;
entity registar_file isport (
WEL,WEH : in std_logic;CLK : in std_logic;WP : in std_logic_vector(2 downto 0);DATA : in std_logic_vector(15 downto 0);Sel : in std_logic_vector(3 downto 0); RD , RS : out std_logic_vector(15 downto 0)
);end entity;
59
CLK
RD(15:0)
DATA(15:0)
RS(15:0)
Sel(3:0)
WEHWEL
WP(2:0)
U3
registar_file
--}} End of automatically maintained section
library IEEE;use IEEE.std_logic_unsigned.all;
architecture registar_file_arch of registar_file is
type ram_mem_type is array (7 downto 0) of std_logic_vector(15 downto 0);
begin
process (CLK)variable ADDR_TEMP: integer range 7 downto 0; variable ram_mem : ram_mem_type;begin
if rising_edge(CLK) thenif (WEL = '1' and WEH = '1') then
ADDR_TEMP := CONV_INTEGER(WP);ram_mem(ADDR_TEMP)(15 downto 0) := DATA
(15 downto 0);elsif (WEL = '1' and WEH = '0') then
ADDR_TEMP := CONV_INTEGER(WP);ram_mem(ADDR_TEMP)(7 downto 0) := DATA
(7 downto 0);elsif (WEL = '0' and WEH = '1') then
ADDR_TEMP := CONV_INTEGER(WP);ram_mem(ADDR_TEMP)(15 downto 8) := DATA
(15 downto 8);end if;
end if;
case Sel is when "0000" =>
RD <= ram_mem(0);RS <= ram_mem(4);
when "0001" =>RD <= ram_mem(0);RS <= ram_mem(5);
when "0010" =>RD <= ram_mem(0);RS <= ram_mem(6);
when "0011" =>RD <= ram_mem(0);RS <= ram_mem(7);
when "0100" =>
60
RD <= ram_mem(1);RS <= ram_mem(4);
when "0101" =>RD <= ram_mem(1);RS <= ram_mem(5);
when "0110" =>RD <= ram_mem(1);RS <= ram_mem(6);
when "0111" =>RD <= ram_mem(1);RS <= ram_mem(7);
when "1000" =>RD <= ram_mem(2);RS <= ram_mem(4);
when "1001" =>RD <= ram_mem(2);RS <= ram_mem(5);
when "1010" =>RD <= ram_mem(2);RS <= ram_mem(6);
when "1011" =>RD <= ram_mem(2);RS <= ram_mem(7);
when "1100" =>RD <= ram_mem(3);RS <= ram_mem(4);
when "1101" =>RD <= ram_mem(3);RS <= ram_mem(5);
when "1110" =>RD <= ram_mem(3);RS <= ram_mem(6);
when "1111" =>RD <= ram_mem(3);RS <= ram_mem(7);
when others =>end case;
end process;
end architecture;
61
4.1.1.5.1. Testiranje bloka Register File
Neka je sadržaj polja RegFileram_mem(7)=1111111111110000=FFF0, ram_mem(6)=1111111111111111=FFFF, ram_mem(5)=0000000000000000=0000, ram_mem(4)=1011101001010000=BA50, ram_mem(3)=1111111111110000=FFF0, ram_mem(2)=0000111100001111=0F0F, ram_mem(1)=0000111100000011=0F03, ram_mem(0)=0001000100010001=1111.
Slika: Sadržaj polja RegFile
Na adresi koja je određena ulaznim signalom WP = 000=0, nailaskom prednje ivice takta Clk, upisuje se vrednost sa ulaza DATA. To znači da jeram_mem(0)=DATA=1111111111110000=FFF0.
62
Slika: Upis vrednosti sa ulaza DATA u registar određen ulazom WP
Na adresi koja je određena ulaznim signalom WP = 100=4, nailaskom prednje ivice takta Clk, upisuje se vrednost sa ulaza DATA. To znači da jeRam_mem(4)=DATA=1000000010000000=8080.
63
Slika: Upis vrednosti sa ulaza DATA u registar određen ulazom WP
Na adresi koja je određena ulaznim signalom WP = 000=0, za kontrolne signale WEH=1 i WEL=0, nailaskom prednje ivice takta Clk, na mesto osam viših bitova upisuju se osam viših bitova sa ulaza DATA. Prema tome,Ram_mem(0)=0000100000010001=0811.
64
Slika: Test primer za blok RegFile u kojem se osam viših bitova sa ulaza DATAupisuje na mesto osam viših bitova registra određen ulazom WP
Na adresi koja je određena ulaznim signalom WP = 110=6, za kontrolne signaleWEH=0 i WEL=1, nailaskom prednje ivice takta Clk, na mesto osam nižih bitova upisuju se osam nižih bitova sa ulaza DATA. Prema tome,Ram_mem(6)=1111111100010001=FF11.
65
Slika: Test primer za blok RegFile u kojem se osam nižih bitova sa ulaza DATAupisuje na mesto osam nižih bitova registra određen ulazom WP
66
5. ARITMETIČKO-LOGIČKA JEDINICA
Aritmetičko-logička jedinica (Arithmetic Logic Unit – ALU) je deo centralnog procesora koji služi za obavljanje aritmetičkih i logičkih operacija nad ulaznim podacima. Pored ulaza za podatke, ALU sadrži i upravljačke (kontrolne) ulaze pomoću kojih se bira određena operacija, iz skupa operacija ALU-a, koja će se obaviti. Aritmetičko-logička jedinica procesora SAYEH izvršava sledeće operacije nad 16-bitnim ulaznim podacima: sabiranje, oduzimanje, množenje, AND (logička operacija 'i' ), OR (logička operacija 'ili'), NOT (negacija), Shift Left (pomeranje ulevo), Shift Right (pomeranje udesno) i Compare (poređenje).
U sledećoj tabeli prikazane su operacije koje podržava aritmetičko-logička jedinica procesora SAYEH:
Oznaka Operacija ALUsel RTLand Logička ' I ' operacija 0110 RD <= RD & Rs
or Logička ' ILI ' operacija 0111 RD <= RD I Rs
not Negacija 1000 RD <= ~Rs
shl Pomeranje ulevo 1001 RD <= sla Rs
shr Pomeranje udesno 1010 RD <= sra Rs
add Sabiranje 1011 RD <= RD + RS
sub Oduzimanje 1100 RD <= RD - RS
mul Množenje 1101 RD <= RD * Rs :8-bitnomnoženje
cmp Poređenje 1110 RD, RS (ako su jednaki:Z=1; ako je RD<RS: C=1)
5.1.VHDL opis ALU jedinice
Aritmetičko-logička jedinica ima sledeće portove: - Clk – ulaz taktnog signala,
- B15to0 – ulazni kontrolni signal (ako je =1 ulaz B se propusti na izlaz ALUout),
- AandB – ulazni kontrolni signal (ako je =1 izvršava se logička operacija 'i' ),- AorB – ulazni kontrolni signal (ako je =1 izvršava se logička operacija 'ili' ),- NotB – ulazni kontrolni signal (ako je =1 vrši se komplementiranje ulaza B),
67
- AaddB – ulazni kontrolni signal (ako je =1 izvršava se sabiranje nad ulaznim operandima),
- AsubB – ulazni kontrolni signal (ako je =1 ALU jedinica od operanda na ulazu A oduzima operand na ulazu B),
- AmulB – ulazni kontrolni signal (ako je =1 izvršava se množenje ulaznih operanada),
- AcmpB – ulazni kontrolni signal (ako je =1 ulaz A se poredi sa ulazom B),- ShrB– ulazni kontrolni signal (ako je =1 sadržaj ulaza B se pomera za jedno
mesto ulevo),- ShlB– ulazni kontrolni signal (ako je =1 sadržaj ulaza B se pomera za jedno
mesto udesno),- 16-bitni ulaz A – ulaz podataka,- 16-bitni ulaz B – ulaz podataka,- 16-bitni izlaz ALUout – izlaz rezultata operacije,- jednobitni izlazi Cout, Zout – izlazi statusnih markera.
A(15:0)
ALUout(15:0)
AaddB
Cout AandB
Zout
AcmpB
AmulB
AorB
AsubB
B(15:0)
B15to0
Clk
NotB
ShlB
ShrB
U1
ALU
--------- ---------------------------------------------------------------------------------------------- Title : alu-- Design : nikola 1-- Author : Nikola Sekulovic-- Company : SekulaCo--------------------------------------------------------------------------------------------------------- File : alu.vhd
68
-- Generated : Thu Jun 7 22:31:59 2007-- From : interface description file-- By : Itf2Vhdl ver. 1.20--------------------------------------------------------------------------------------------------------- Description : -----------------------------------------------------------------------------------------------------
--{{ Section below this comment is automatically maintained-- and may be overwritten--{entity {alu} architecture {alu}}
library IEEE;use IEEE.STD_LOGIC_1164.all;use IEEE.STD_LOGIC_UNSIGNED.all;entity ALU is
port(Clk,B15to0,AandB,AorB,NotB,AaddB,AsubB,AmulB,AcmpB,ShrB,ShlB : in
STD_LOGIC;A,B : in STD_LOGIC_VECTOR (15 downto 0);Cout,Zout : out STD_LOGIC; ALUout: out STD_LOGIC_VECTOR (15 downto 0));
end ALU;architecture ALU_arch of ALU is
begin process
(Clk,B15to0,AandB,AorB,NotB,AaddB,AsubB,AmulB,AcmpB,ShrB,ShlB)variable ALUouttmp,Asig,Bsig,Csig,pom: STD_LOGIC_VECTOR (16 downto
0);
begin if rising_edge(Clk)
thenAsig:='0'& A;Bsig:='0'& B;
if AaddB = '1' then ALUouttmp := Asig + Bsig; Cout<= ALUouttmp(16); if ALUouttmp(16)='0' then
Zout<='1' ; else Zout<='0';
end if;
69
--Cout<=(Cin and B(15)) or (Cin and A(15)) or (A(15) and B(15)); elsif B15to0 = '1' then
ALUouttmp(15 downto 0) := Bsig(15 downto 0);Cout<= '0';Zout<='1' ; elsif AandB = '1' then
ALUouttmp := Asig and Bsig; Cout<='0';
Zout<='1' ; elsif AorB = '1' then
ALUouttmp := Asig or Bsig; Cout<= '0';Zout<='1' ; elsif NotB = '1' then
ALUouttmp := Not Bsig; Cout<= '0';Zout<='1' ; elsif AsubB = '1' then
ALUouttmp := Asig - Bsig;Cout<= ALUouttmp(16);if ALUouttmp(16)='0' then
Zout<='1' ;else Zout<='0';
end if; elsif AmulB = '1' then
ALUouttmp(15 downto 0) := Asig(7 downto 0) * Bsig(7 downto 0); Cout<='0';
Zout<='1' ;if ALUouttmp(16)='0' then
Zout<='1' ;else Zout<='0';
end if;elsif ShrB = '1' then
ALUouttmp(15 downto 0 ) := Bsig(0) & Bsig(15 downto 1) ; Cout<= '0';Zout<= '1';
elsif ShlB = '1' then ALUouttmp (15 downto 0 ):= Bsig(14 downto 0) & Bsig(15);
Cout<='0';Zout<= '1'; elsif AcmpB='1' then
pom:=Asig-Bsig;if pom(15)='1' then
Cout<='1'; Zout<= '0';
elsif pom="0000000000000000" then Cout<='0';
70
Zout<= '1';else
Cout<='0'; Zout<= '0';
end if;
end if;end if;ALUout <= ALUouttmp(15 downto 0); end process;
end ALU_arch;
5.1.1. Testiranje ALU jedinice
U test primerima koji slede ulazima (operandima) zadali smo sledeće vrednosti:A=1111000011110000=F0F0B=0000111100001111=0F0F . Pokazali smo da ako je kontrolni signal B15to0=1, nailaskom prednje ivice Clk, na izlaz ALU jedinice je operand B tj.ALUout=0000111100001111=0F0F.
71
Slika: Test primer za ALU jedinicu u kojem se operand B prosleđuje na izlaz Za logičku ' I ' operaciju kontrolnom signalu AandB treba dodeliti vrednost 1AandB=1. Za date ulaze, , nailaskom prednje ivice Clk, na izlazu ALU jedinice dobija seALUout=0000000000000000=0000.
72
Slika: Test primer za ALU jedinicu u kojem se obavlja logička ' I ' operacija nad operandima A i B Za logičku operaciju ' ILI ' kontrolnom signalu AorB treba dodeliti vrednost 1AorB=1. Za date ulaze, nailaskom prednje ivice takta Clk, na izlazu ALU jedinice dobija seALUout=1111111111111111=FFFF.
73
Slika: Test primer za ALU jedinicu u kojem se obavlja logička ' ILI ' operacija nad operandima A i B
Za logičku ' Not ' operaciju kontrolnom signalu NotB treba dodeliti vrednost 1NotB=1. Za navedene ulaze, nailaskom prednje ivice takta Clk, na izlazu ALU jedinice dobija seALUout=1111000011110000=F0F0.
74
Slika: Test primer za ALU jedinicu u kojem se obavlja logička operacija negacije nad operandom B
Za aritmetičku operaciju sabiranja kontrolnom signalu AaddB treba dodeliti vrednost 1AaddB=1. Za date ulaze A i B, nailaskom prednje ivice takta Clk, na izlazu ALU jedinice dobija seALUout=1111111111111111=FFFF.
75
Slika: Test primer za ALU jedinicu u kojem se obavlja aritmetička operacija sabiranje nad operandima A i B
Za aritmetičku operaciju oduzimanja kontrolnom signalu AsubB treba dodeliti vrednost 1AsubB=1. Za date ulaze A i B, nailaskom prednje ivice takta Clk, na izlazu ALU jedinice dobija seALUout=1110000111100001=E1E1.
76
Slika: Test primer za ALU jedinicu u kojem se obavlja aritmetička operacija oduzimanje nad operandima A i B
Za aritmetičku operaciju množenja kontrolnom signalu AmulB treba dodeliti vrednost 1AmulB=1. Na izlazu ALU jedinice, nailaskom prednje ivice takta Clk, dobija se proizvod osam nižih bitova operanada A i B ALUout=0000111000010000=0E10.
77
Slika: Test primer za ALU jedinicu u kojem se obavlja aritmetička operacija množenje nad operandima A i B
Za operaciju poređenja kontrolnom signalu AcmpB treba dodeliti vrednost 1AcmpB=1. Ako je operand A veći od operanda B, nailaskom prednje ivice takta Clk, zastavica Cout se postavlja na jedinicuCout=1.
78
Slika: Test primer za ALU jedinicu u kojem se porede operandi A i B
U primeru koji sledi operandi A i B su jednakiA=B=1111000011110000=F0F0. Zastavica Zout se postavlja na jedinicu, nailaskom prednje ivice takta ClkZout=1.
79
Slika: Test primer za ALU jedinicu u kojem se porede operandi A i B
Za operaciju pomeranja udesno, kontrolnom signalu ShrB treba dovesti vrednost 1ShrB=1. Izlaz ALU jedinicedobija se pomeranjem bitova operanda B za jedno mesto udesno nailaskom prednje ivice takta ClkALUout=1000011110000111=8787.
80
Slika: Test primer za ALU jedinicu u kojem se obavlja logička operacija pomeranje udesno Shr nad operandom B
Za operaciju pomeranja ulevo, kontrolnom signalu ShlB treba dovesti vrednost 1ShlB=1. Izlaz ALU jedinice dobija se pomeranjem bitova operanda B za jedno mesto ulevo nailaskom prednje ivice takta ClkALUout=0001111000011110=1E1E.
81
Slika: Test primer za ALU jedinicu u kojem se obavlja logička operacija pomeranje ulevo Shl nad operandom B
82
6. MEMORIJA
Procesor zajedno sa memorijom čini osnovu računarskog sistema. Memorija je element koji je sposoban da pamti veći broj podataka, kojima se može selektivno pristupati. RAM (eng. Random Access Memory) je memorija iz koje se mogu čitati i u koju se mogu upisivati podaci.
Memorija koju ovde opisujemo je RAM memorija koja koristi 16-bitne adrese, što znači da ima maksimalno do 65535 memorijskih lokacija. U svakoj lokaciji može se zapamtiti podatak dužine 16 bita.
6.1. VHDL opis bloka Memory
Blok memorije ima sledeće portove:- 16-bitni ulaz Addr – adresni ulaz memorije,- jednobitni ulaz RE – kontrolni signal (ako je =1 dozvoljeno je iščitavanje
podataka iz memorije),- jednobitni ulaz WE – kontrolni signal (ako je =1 dozvoljeno je upisivanje
podataka u memoriju),- Data – 16-bitni ulaz podataka,- Q– 16-bitni izlaz podataka.
ADDR(15:0)
Q(15:0)
DATA(15:0)REWE
U1
memorija
---------------------------------------------------------------------------------------- Design unit generated by Aldec IP Core Generator, version 6.3.-- Copyright (c) 2003-2004 by Aldec, Inc. All rights reserved.
83
------------------------------------------------------------------------------------------ Created on Saturday 2007-03-31, 17:00:21---------------------------------------------------------------------------------------- Details:-- Type: Asynchronous single port Random Access Memory (RAM)-- Word size: 16 bits-- Memory depth: 256 words-- Write enable input WE active high------------------------------------------------------------------------------------
--{{ Section below this comment is automatically maintained-- and may be overwritten--{entity {memorija} architecture {memorija_arch}}
library IEEE;use IEEE.std_logic_1164.all;
entity memorija isport ( WE : in std_logic; RE : in std_logic;
ADDR : in std_logic_vector(15 downto 0);DATA : in std_logic_vector(15 downto 0);Q : out std_logic_vector(15 downto 0)
);end entity;
--}} End of automatically maintained section
library IEEE;use IEEE.std_logic_unsigned.all;
architecture memorija_arch of memorija is
type memorija_mem_type is array (1023 downto 0) of std_logic_vector(15 downto 0);
begin
process (WE, RE, ADDR, DATA)variable ADDR_TEMP: integer range 1023 downto 0;variable memorija_mem : memorija_mem_type;begin
if (WE = '1') then
84
ADDR_TEMP := CONV_INTEGER(ADDR);memorija_mem(ADDR_TEMP) := DATA;
end if;if (RE = '1') thenQ <= memorija_mem(CONV_INTEGER(ADDR));else
Q <= "0000000000000000";end if;
end process;
end architecture;
85
7. MULTIPLEKSER
Multiplekser je kombinaciono kolo koje vrši ulogu elektronskog prekidača. U svakom stanju se ostvaruje veza između izlaza i samo jednog odabranog ulaza. Multiplekser se sastoji iz jednog izlaza, n selekcionih ulaza i 2n informacijskih ulaza.
7.1. VHDL opis Multipleksera
Multiplekser SAYEH procesora ima sledeće portove:- I0 i I1– 4-bitni ulazi,- O - 4-bitni izlaz,- Shadow – kontrolni signal (ako je =1 na izlaz se vodi I0, a ako je =0 na izlaz
se vodi I1).
I0(11:8)O(3:0)
I1(3:0)
Shadow
U2
mux
--- - - --------------------------------------------------------------------------------- Design unit generated by Aldec IP Core Generator, version 6.3.-- Copyright (c) 2003-2004 by Aldec, Inc. All rights reserved.------------------------------------------------------------------------------------------ Created on Saturday 2007-03-31, 14:08:09---------------------------------------------------------------------------------------- Details:-- Type: Multiplexer-- Code style: Case statement-- Inputs and output width: 4-- Number of inputs: 2-- Defalut output bits value '0'------------------------------------------------------------------------------------
86
--{{ Section below this comment is automatically maintained-- and may be overwritten--{entity {mux} architecture {mux_arch}}
library IEEE;use IEEE.std_logic_1164.all;
entity mux isport (
I0 : in std_logic_vector(11 downto 8);I1 : in std_logic_vector(3 downto 0);Shadow: in std_logic;O : out std_logic_vector(3 downto 0)
);end entity;
--}} End of automatically maintained section
library IEEE;use IEEE.std_logic_unsigned.all;
architecture mux_arch of mux isbegin
process (Shadow, I0, I1)begin
if Shadow = '1' then O <= I0;
else O <= I1;
end if;end process;
end architecture;
7.1.1. Testiranje multipleksera
U ovom test primeru ulazima multipleksera dodelili smo sledeće vrednosti:I0=0000=0I1=0001=1. Ako je kontrolni signal Shadow = 1, onda se na izlazu multipleksera vodi ulaz I0.O=0000=0.
87
Slika: Test primer za multiplekser u kojem je kontrolni signal Shadow=1 Ako je kontrolni signal Shadow = 0, onda se na izlazu multipleksera vodi ulaz I1.O=0001
88
Slika: Test primer za multiplekser u kojem je kontrolni signal Shadow=0
89
8. TROSTATIČKI BAFERI
Trostatički bafer je kombinaciono kolo koje vrši ulogu elektronskog prekidača. Ako je kontrolni signal jednak 1, onda se ulaz prosleđuje na izlaz. Ako je kontrolni signal jednak 0, izlaz je u stanju visoke impedanse. Procesor SAYEH sadrži 7 trostatičkih bafera. Sledi njihov opis.
8.1. VHDL opis Trostatičkog bafera 1
Bafer 1 SAYEH procesora ima sledeće portove:- I– 8-bitni ulaz,- O - 8-bitni izlaz,- IR_on_LOpndBus – kontrolni signal (ako je =1 ulaz I se vodi na izlaz O koji
se dalje upisuje na mesto nižih 8 bitova operanda Rs).
O(7:0)
I(7:0)
IR_on_LOpndBus
U1
buff1
-- Design unit generated by Aldec IP Core Generator, version 6.3.-- Copyright (c) 2003-2004 by Aldec, Inc. All rights reserved.------------------------------------------------------------------------------------------ Created on Saturday 2007-03-31, 14:21:31---------------------------------------------------------------------------------------- Details:-- Type: Tristate buffer-- Enable input EN active high-- Output O is not inverted-- Data width : 8------------------------------------------------------------------------------------
--{{ Section below this comment is automatically maintained-- and may be overwritten--{entity {buff1} architecture {buff1_arch}}
library IEEE;
90
use IEEE.std_logic_1164.all;
entity buff1 isport (
IR_on_LOpndBus : in std_logic;I : in std_logic_vector(7 downto 0);O : out std_logic_vector(7 downto 0)
);end entity;
--}} End of automatically maintained section
architecture buff1_arch of buff1 isbegin
O <= I when IR_on_LOpndBus = '1' else (others => 'Z');
end buff1_arch;
8.1.1. Testiranje trostatičkog bafera 1
Osmobitnom ulazu trostatičkog bafera 1 dodelili smo sledeću vrednostI=00000000=00. Ako je kontrolni signal jednak jedinici IR_on_LOpndBus=1, onda je na izlazu bafera njegov ulazO=00000000=00.
91
Slika: Test primer za bafer u kojem je kontrolni signal IR_on_LOpndBus=1
Ako je kontrolni signal jednak nuli IR_on_LOpndBus=0, onda je izlaz bafera u stanju visoke impedanseO=ZZZZZZZZ=ZZ.
92
Slika: Test primer za bafer u kojem je kontrolni signal IR_on_LOpndBus=0
8.2. VHDL opis Trostatičkog bafera 2
Bafer 2 SAYEH procesora ima sledeće portove:- I– 8-bitni ulaz,- O - 8-bitni izlaz,- IR_on_HOpndBus – kontrolni signal (ako je =1 ulaz I se vodi na izlaz O koji
se dalje upisuje na mesto viših 8 bitova operanda Rs).
93
I(7:0)O
(7:0)
IR_on_HOpndBus
U2
buff2
-- Design unit generated by Aldec IP Core Generator, version 6.3.-- Copyright (c) 2003-2004 by Aldec, Inc. All rights reserved.------------------------------------------------------------------------------------------ Created on Saturday 2007-03-31, 14:21:31---------------------------------------------------------------------------------------- Details:-- Type: Tristate buffer-- Enable input EN active high-- Output O is not inverted-- Data width : 8------------------------------------------------------------------------------------
--{{ Section below this comment is automatically maintained-- and may be overwritten--{entity {buff1} architecture {buff1_arch}}
library IEEE;use IEEE.std_logic_1164.all;
entity buff2 isport (
IR_on_HOpndBus : in std_logic;I : in std_logic_vector(7 downto 0);O : out std_logic_vector(7 downto 0)
);end entity;
--}} End of automatically maintained section
architecture buff2_arch of buff2 isbegin
O <= I when IR_on_HOpndBus = '1' else (others => 'Z');
end buff2_arch;
94
8.2.1. Testiranje trostatičkog bafera 2
Osmobitnom ulazu trostatičkog bafera 2 dodelili smo sledeću vrednostI=00000001=01. Ako je kontrolni signal jednak jedinici IR_on_HOpndBus=1, onda je na izlazu bafera njegov ulazO=00000001=01.
Slika: Test primer za bafer u kojem je kontrolni signal IR_on_HOpndBus=1
Ako je kontrolni signal jednak nuli IR_on_HOpndBus=0, onda je izlaz bafera u stanju visoke impedanseO=ZZZZZZZZ=ZZ.
95
Slika: Test primer za bafer u kojem je kontrolni signal IR_on_HOpndBus=0
8.3. VHDL opis Trostatičkog bafera 3
Bafer 3 SAYEH procesora ima sledeće portove:- I– 16-bitni ulaz,- O - 16-bitni izlaz,- RFright_on_OpndBus – kontrolni signal (ako je =1 ulaz I se vodi na izlaz O
koji se dalje vodi na ulaz B aritmetičko-logičke jedinice).
96
I(15:0)
O(15:0)
RFright_on_OpndBus
U3
buff3
-- Design unit generated by Aldec IP Core Generator, version 6.3.-- Copyright (c) 2003-2004 by Aldec, Inc. All rights reserved.------------------------------------------------------------------------------------------ Created on Saturday 2007-03-31, 14:21:31---------------------------------------------------------------------------------------- Details:-- Type: Tristate buffer-- Enable input EN active high-- Output O is not inverted-- Data width : 8------------------------------------------------------------------------------------
--{{ Section below this comment is automatically maintained-- and may be overwritten--{entity {buff1} architecture {buff1_arch}}
library IEEE;use IEEE.std_logic_1164.all;
entity buff3 isport (
RFright_on_OpndBus : in std_logic;I : in std_logic_vector(15 downto 0);O : out std_logic_vector(15 downto 0)
);end entity;
--}} End of automatically maintained section
architecture buff3_arch of buff3 isbegin
O <= I when RFright_on_OpndBus = '1' else (others => 'Z');
97
end buff3_arch;
8.3.1. Testiranje trostatičkog bafera 3
Šesnaestobitnom ulazu trostatičkog bafera 3 dodelili smo sledeću vrednostI=0000000000000010=0002. Ako je kontrolni signal jednak jedinici RFright_on_OpndBus=1, onda je na izlazu bafera njegov ulazO=0000000000000010=0002.
Slika: Test primer za bafer u kojem je kontrolni signal RFright_on_OpndBus=1
Ako je kontrolni signal jednak nuli RFright_on_OpndBus=0, onda je izlaz bafera u stanju visoke impedanseO=ZZZZZZZZZZZZZZZZ=ZZZZ.
98
Slika: Test primer za bafer u kojem je kontrolni signal RFright_on_OpndBus=0
8.4. VHDL opis Trostatičkog bafera 4
Bafer 4 SAYEH procesora ima sledeće portove:- I– 16-bitni ulaz,- O - 16-bitni izlaz,- Rs_on_AddressUnitRside – kontrolni signal (ako je =1 ulaz I (odnosno
operand Rs) se vodi na izlaz O koji se dalje vodi na ulaz Rside bloka PC).
I(15:0)O(15:0)
Rs_on_AdressUnitRSide
U4
buff4
99
-- Design unit generated by Aldec IP Core Generator, version 6.3.-- Copyright (c) 2003-2004 by Aldec, Inc. All rights reserved.------------------------------------------------------------------------------------------ Created on Saturday 2007-03-31, 14:21:31---------------------------------------------------------------------------------------- Details:-- Type: Tristate buffer-- Enable input EN active high-- Output O is not inverted-- Data width : 8------------------------------------------------------------------------------------
--{{ Section below this comment is automatically maintained-- and may be overwritten--{entity {buff1} architecture {buff1_arch}}
library IEEE;use IEEE.std_logic_1164.all;
entity buff4 isport (
Rs_on_AdressUnitRSide : in std_logic;I : in std_logic_vector(15 downto 0);O : out std_logic_vector(15 downto 0)
);end entity;
--}} End of automatically maintained section
architecture buff4_arch of buff4 isbegin
O <= I when Rs_on_AdressUnitRSide = '1' else (others => 'Z');
end buff4_arch;
8.4.1. Testiranje trostatičkog bafera 4
Šesnaestobitnom ulazu trostatičkog bafera 4 dodelili smo sledeću vrednostI=0000000000001000=0008. Ako je kontrolni signal jednak jedinici Rs_on_AddressUnitRSide=1, onda je na izlazu bafera njegov ulaz
100
O=0000000000001000=0008.
Slika: Test primer za bafer u kojem je kontrolni signal Rs_on_AddressUnitRSide=1
Ako je kontrolni signal jednak nuli Rs_on_AddressUnitRSide=0, onda je izlaz bafera u stanju visoke impedanseO=ZZZZZZZZZZZZZZZZ=ZZZZ.
101
Slika: Test primer za bafer u kojem je kontrolni signal Rs_on_AddressUnitRSide=0
8.5. VHDL opis Trostatičkog bafera 5 Bafer 5 SAYEH procesora ima sledeće portove:
- I– 16-bitni ulaz,- O - 16-bitni izlaz,- Rd_on_AddressUnitRside – kontrolni signal (ako je =1 ulaz I (odnosno
operand Rd) se vodi na izlaz O koji se dalje vodi na ulaz Rside bloka PC).
I(15:0) O(15:0)
Rd_on_AdressUnitRSide
U5
buff5
-- Design unit generated by Aldec IP Core Generator, version 6.3.-- Copyright (c) 2003-2004 by Aldec, Inc. All rights reserved.--
102
---------------------------------------------------------------------------------------- Created on Saturday 2007-03-31, 14:21:31---------------------------------------------------------------------------------------- Details:-- Type: Tristate buffer-- Enable input EN active high-- Output O is not inverted-- Data width : 8------------------------------------------------------------------------------------
--{{ Section below this comment is automatically maintained-- and may be overwritten--{entity {buff1} architecture {buff1_arch}}
library IEEE;use IEEE.std_logic_1164.all;
entity buff5 isport (
Rd_on_AdressUnitRSide : in std_logic;I : in std_logic_vector(15 downto 0);O : out std_logic_vector(15 downto 0)
);end entity;
--}} End of automatically maintained section
architecture buff5_arch of buff5 isbegin
O <= I when Rd_on_AdressUnitRSide = '1' else (others => 'Z');
end buff5_arch;
8.5.1. Testiranje trostatičkog bafera 5
Šesnaestobitnom ulazu trostatičkog bafera 5 dodelili smo sledeću vrednostI=0000000010000001=0081. Ako je kontrolni signal jednak jedinici Rd_on_AddressUnitRSide=1, onda je na izlazu bafera njegov ulazO=0000000010000001=0081.
103
Slika: Test primer za bafer u kojem je kontrolni signal Rd_on_AddressUnitRSide=1 Ako je kontrolni signal jednak nuli Rd_on_AddressUnitRSide=0, onda je izlaz bafera u stanju visoke impedanseO=ZZZZZZZZZZZZZZZZ=ZZZZ.
104
Slika: Test primer za bafer u kojem je kontrolni signal Rd_on_AddressUnitRSide=0
8.6. VHDL opis Trostatičkog bafera 6
Bafer 6 SAYEH procesora ima sledeće portove:- I– 16-bitni ulaz,- O - 16-bitni izlaz,- ALUout_on_Databus – kontrolni signal (ako je =1 ulaz I (odnosno izlaz iz
aritmetičko-logičke jedinice) se vodi na izlaz O tj. na magistralu podataka).
ALUout_on_Databus
O(15:0)
I(15:0)
U6
buff6
105
-- Design unit generated by Aldec IP Core Generator, version 6.3.-- Copyright (c) 2003-2004 by Aldec, Inc. All rights reserved.------------------------------------------------------------------------------------------ Created on Saturday 2007-03-31, 14:21:31---------------------------------------------------------------------------------------- Details:-- Type: Tristate buffer-- Enable input EN active high-- Output O is not inverted-- Data width : 8------------------------------------------------------------------------------------
--{{ Section below this comment is automatically maintained-- and may be overwritten--{entity {buff1} architecture {buff1_arch}}
library IEEE;use IEEE.std_logic_1164.all;
entity buff6 isport (
ALUout_on_Databus : in std_logic;I : in std_logic_vector(15 downto 0);O : out std_logic_vector(15 downto 0)
);end entity;
--}} End of automatically maintained section
architecture buff6_arch of buff6 isbegin
O <= I when ALUout_on_Databus = '1' else (others => 'Z');
end buff6_arch;
8.6.1. Testiranje trostatičkog bafera 6
Šesnaestobitnom ulazu trostatičkog bafera 6 dodelili smo sledeću vrednostI=1000000000000000=8000. Ako je kontrolni signal jednak jedinici ALUout_on_DataBus=1, onda je na izlazu bafera njegov ulaz
106
O=1000000000000000=8000.
Slika: Test primer za bafer u kojem je kontrolni signal ALUout_on_DataBus=1
Ako je kontrolni signal jednak nuli ALUout_on_DataBus=0, onda je izlaz bafera u stanju visoke impedanseO=ZZZZZZZZZZZZZZZZ=ZZZZ.
107
Slika: Test primer za bafer u kojem je kontrolni signal ALUout_on_DataBus=0
8.7. VHDL opis Trostatičkog bafera 7
Bafer 7 SAYEH procesora ima sledeće portove:- I– 16-bitni ulaz,- O - 16-bitni izlaz,- Address_on_Databus – kontrolni signal (ako je =1 ulaz I (odnosno adresa
koju generiše blok PC) se vodi na magistralu podataka).
Address_on_Databus
O(15:0)
I(15:0)
U7
buff7
108
-- Design unit generated by Aldec IP Core Generator, version 6.3.-- Copyright (c) 2003-2004 by Aldec, Inc. All rights reserved.------------------------------------------------------------------------------------------ Created on Saturday 2007-03-31, 14:21:31---------------------------------------------------------------------------------------- Details:-- Type: Tristate buffer-- Enable input EN active high-- Output O is not inverted-- Data width : 8------------------------------------------------------------------------------------
--{{ Section below this comment is automatically maintained-- and may be overwritten--{entity {buff1} architecture {buff1_arch}}
library IEEE;use IEEE.std_logic_1164.all;
entity buff7 isport (
Address_on_Databus : in std_logic;I : in std_logic_vector(15 downto 0);O : out std_logic_vector(15 downto 0)
);end entity;
--}} End of automatically maintained section
architecture buff7_arch of buff7 isbegin
O <= I when Address_on_Databus = '1' else (others => 'Z');
end buff7_arch;
8.7.1. Testiranje trostatičkog bafera 7
Šesnaestobitnom ulazu trostatičkog bafera 7 dodelili smo sledeću vrednostI=000000000000011=0003.
109
Ako je kontrolni signal jednak jedinici Adress_on_Databus=1, onda je na izlazu bafera njegov ulazO=0000000000000011=0003.
Slika: Test primer za bafer u kojem je kontrolni signal Adress_on_Databus=1
Ako je kontrolni signal jednak nuli Adress_on_Databus =0, onda je izlaz bafera u stanju visoke impedanseO=ZZZZZZZZZZZZZZZZ=ZZZZ.
110
Slika: Test primer za bafer u kojem je kontrolni signal Adress_on_Databus=0
111
9. UPRAVLJAČKA JEDINICA
Upravljačka jedinica služi da na osnovu trenutne instrukcije izvrši generisanje upravljačkih signala. Postoje dva osnovna koncepta realizacije upravljačke jedinice:
- koncept upravljačke jedinice sa direktnim upravljanjem (eng. hardwired control)
- koncept upravljačke jedinice sa mikroprogramskim upravljanjem (eng. microprogrammed control)
Kod koncepta direktnog upravljanja upravljačka jedinica se realizuje kao sekvencijalno logičko kolo. Glavna prednost ovakve upravljačke jedinice je velika brzina rada sa minimalnim hardverom, a nedostatak u tome što kada se jednom isprojektuje, svaka izmena zahteva redizajn kola. Zato se ovaj tip upravljačke jedinice često sreće kod RISC procesora i neprogramabilnih kontrolera.
Koncept upravljačke jedinice sa mikroprogramskim upravljanjem zahteva realizaciju upravljačke jedinice na bazi ROM ili RAM memorije u kojoj se smeštaju vrednosti upravljačkih signala, koji će biti aktivirani u odgovarajućem trenutku. Glavne prednosti ovakvog načina realizacije upravljačke jedinice su lako uvođenje dodatnih instrukcija, a i ukupno projektovanje procesora je pojednostavljeno.Glavni nedostatak ovog pristupa je manja brzina rada.
Upravljačka jednica procesora SAYEH je realizovana kao upravljačka jedinica sa direktnim upravljanjem.
9.1. Instrukcije procesora SAYEH
Zadatak svakog procesora je da izvršava program koji je smešten u memoriji. Program predstavlja skup instrukcija. Instrukcije sa kojima radi procesor SAYEH su 16-bitne. Opšti format 8-bitnih i 16-bitnih SAYEH instrukcija je prikazan na slici . 16-bitne instrukcije imaju Immediate polje, a 8-bitne instrukcije nemaju. OPCODE polje je 4-bitni kod koji odredjuje tip instrukcije. Polja Left (levo) i Right (desno) su 2-bitni kodovi koji biraju registre R0 do R3 za izvor i/ili odredište instrukcije. Obično, Left se koristi za odredište, a Right za izvor. Immediate polje se koristi za trenutne podatke, ili ako su dve 8-bitne instrukcije zapakovane koristi se za drugu instrukciju.
15 12 11 09 07 00OPCODE Left Right Immediate
112
Slika . SAYEH Instruction FormatU sledećoj tabeli prikazana je lista svih intrukcija procesora SAYEH zajedno sa
rutinama na RTL (eng. Register Transfer Level) nivou.
InstructionMnemonic andDefinition
Bits15:0
RTL notation:comments orcondition
fch Fetch IR←[ M [PC] ]CU← [IR]
nop No operation 0000-00-00 No operation(PCplus1=' 1' , RE=' 1' , Load=' 1' )
hlt Halt 0000-00-01 Halt, fetching stops( WPreset= '1' , CReset = '1' , ZReset = '1' ,ResetPC= '1' )
szf Set zero flag 0000-00-10 Z ← ' 1'(PCplus1=' 1' , Zset=' 1' , RE=' 1' , Load=' 1' )
czf Clr zero flag 0000-00-11 Z ← '0'(PCplus1=' 1' , Zreset=' 1' , RE=' 1' , Load=' 1')
scf Set carry flag 0000-01-00 C← ‘1'(PCplus1=' 1' , Cset=' 1' , RE=' 1' , Load=' 1' )
ccf Clr carry flag 0000-01-01 C ← '0'(PCplus1=' 1' , Creset=' 1' , RE=' 1' , Load=' 1' )
cwp ClrWindow pointer
0000-01-10 WP ← "000"(PCplus1=' 1' , WPreset=' 1' , RE=' 1' , Load=' 1' )
mvr Move Register 0001-D-S B← [Rs]ALUout = [B] Rd← [ALUout](PCplus1=' 1' ,B15to0t=' 1' , RE=' 1' , Load=' 1' , WEL=' 1' , WEH=' 1' , Shadow=' 1' , ALUout_on_Databus=' 1' , Rfright_on_OpndBus=' 1' )
Ida Load Addressed 0010-D-S PC←[ Rs ]Rd← [M [PC] ](PCplus1='1' , R0plus0=' 1' ,K=' 1' , RE=' 1' , Load=' 1' , WEL=' 1' , WEH=' 1' , Shadow=' 1' , Rs_on_AddressUnitRside = '1'; )
113
sta Store Addressed 0011-D-S B← [Rs]ALUout = [B] PC←[ Rd ]M[ PC ] ←[ALUout] (PCplus1='1' , R0plus0=' 1' ,B15to0=' 1' , RE=' 1' , WE= ' 1'Load=' 1' , Shadow=' 1' ,ALUout_on_Databus= '1' ,Rl_on_AddressUnitRside= '1' , RFright_on_OpndBus <= '1' )
inp Input from port 0100-D-S ReadIO← ‘1’ PC← [Rs] Rd←[ PC ](R0plus0 ='1' , PCplus1='1' , ReadIO = '1' ,B15to0= '1' , RE=' 1' , Load=' 1' , WEL=' 1' , WEH=' 1' ,Adress_on_Databus= '1' , Shadow = '1' , Rs_on_AddressUnitRside = '1' )
oup Output to port 0101-D-S WriteIO← ‘1’B← [Rs]ALUout = [B] Rd←[ ALUout ]( PCplus1='1' , WriteIO = '1' , RE=' 1' , Load=' 1' , WEL=' 1' , WEH=' 1' ,ALUout_on_Databus= '1' , Shadow = '1' , RFright_on_OpndBus = '1' )
and AND Registers 0110-D-S A← [Rd]B← [Rs]ALUout = [A] & [B]Rd← [ALUout](PCplus1='1' , AandB= '1' , WEL= '1' , WEH= '1' , RE= '1' , Load = '1' ,Shadow = '1' , ALUout_on_Databus= '1' , RFright_on_OpndBus = '1' )
or OR Registers 0111-D-S A← [Rd]B← [Rs]ALUout = [A] I [B]Rd← [ALUout](PCplus1='1' , AorB= '1' , WEL= '1' , WEH= '1' , RE= '1' , Load = '1' ,Shadow = '1' , ALUout_on_Databus= '1' , RFright_on_OpndBus = '1' )
not NOT Register 1000-D-S B← [Rs]ALUout = ~ [B]Rd← [ALUout](PCplus1='1' , NotB= '1' , WEL= '1' , WEH= '1' , RE= '1' , Load = '1' ,Shadow = '1' , ALUout_on_Databus= '1' , RFright_on_OpndBus = '1' )
114
shl Shift Left 1001-D-S B← [Rs]ALUout = [B] <<1Rd← [ALUout](PCplus1='1' , ShlB= '1' , WEL= '1' , WEH= '1' , RE= '1' , Load = '1' ,Shadow = '1' , ALUout_on_Databus= '1' , RFright_on_OpndBus = '1' )
shr Shift Right 1010-D-S B← [Rs]ALUout = [B] >>1Rd← [ALUout](PCplus1='1' , ShrB= '1' , WEL= '1' , WEH= '1' , RE= '1' , Load = '1' ,Shadow = '1' , ALUout_on_Databus= '1' , RFright_on_OpndBus = '1' )
add Add Registers 1011-D-S A← [Rd]B← [Rs]ALUout = [A] + [B]Rd← [ALUout] (PCplus1='1' , AaddB= '1' , WEL= '1' , WEH= '1' , RE= '1' , Load = '1' ,Shadow = '1' , ALUout_on_Databus= '1' , RFright_on_OpndBus = '1' )
sub SubtractRegisters
1100-D-S A← [Rd]B← [Rs]ALUout = [A] - [B]Rd← [ALUout](PCplus1='1' , AsubB= '1' , WEL= '1' , WEH= '1' , RE= '1' , Load = '1' ,Shadow = '1' , ALUout_on_Databus= '1' , RFright_on_OpndBus = '1' )
mul MultiplyRegisters
1101-D-S A← [Rd]B← [Rs]ALUout = [A (7:0)] * [B (7:0)]Rd← [ALUout](PCplus1='1' , AmulB= '1' , WEL= '1' , WEH= '1' , RE= '1' , Load = '1' ,Shadow = '1' , ALUout_on_Databus= '1' , RFright_on_OpndBus = '1' )
cmp Compare 1110-D-S A← [Rd]B← [Rs]ALUout = [A] - [B] (if equal:Z=1; ifRD<RS: C=1)(PCplus1='1' , AcmpB= '1' , RE= '1' , Load = '1' ,Shadow = '1' , RFright_on_OpndBus = '1' )
mil Move Immd Low 1111-D-00-I B[15:8) ← Rs(15:8) B(7:0) ← IR(15:8)ALUout = [B] Rd(7:0)← [ALUout (7:0)] (PCplus1='1' , B15to0= '1' , WEL= '1' , RE= '1' , Load = '1' , Shadow= '1' ,IR_on_LOpndBus= '1' , ALUout_on_Databus= '1' )
115
mih Move Immd High 1111-D-01-I B[15:8) ← IR(15:8) B(7:0) ← Rs(7:0)ALUout = [B] Rd(15:8)← [ALUout (15:8)](PCplus1='1' , B15to0= '1' , WEH= '1' , RE= '1' , Load = '1' , Shadow= '1' ,IR_on_HOpndBus= '1' , ALUout_on_Databus= '1' )
spc Save PC 1111-D-10-I RD ← PC + I(PCplusI= '1' , WEL= '1' , WEH= '1' , RE= '1' , Load = '1' , Adress_on_Databus= '1' , Shadow = '1' )
jpa Jump Addressed 1111-D-11-I PC ← RD + I(R0plusI = '1' , RE= '1' , Load = '1' , Shadow = '1' , Rl_on_AddressUnitRside = '1' )
jpr Jump Relative 0000-01-11-I PC ← PC + I(PCplusI ='1' , RE= '1' , Load = '1' )
brz Branch if Zero 0000-10-00-I PC ←PC + I :if Z is 1(if Z is 1 : PCplusI='1' , RE= '1' , Load = '1' if Z is 0 : PCplus1='1' , RE= '1' , Load = '1' )
brc Branch if Carry 0000-10-01-I PC ← PC + I :if C is 1(if C is 1 : PCplusI='1' , RE= '1' , Load = '1'if C is 0 : PCplus1='1' , RE= '1' , Load = '1' )
awp Add Win pntr 0000-10-10-I WP ← WP + I(PCplusI1='1' , Wpadd='1' , RE= '1' , Load = '1' )
9.2. VHDL opis bloka CU (Upravljačka jedinica)
Blok CU ima sledeće portove: - Clock – taktni signal procesora,- IR – tekuća instrukcija,- External Reset – signal kojim se resetuje stanje procesora,- MemDataReady – signali dozvole (ako je =1 moguće je čitanje podataka iz
memorije ili upis podataka u memoriju),- jednobitni ulazi C, Z – statusni markeri ALU-a,- ReadIO, WriteIO – signali koji se šalju ulazno-izlaznim jedinicama,- 36-bitni izlaz Control – upravljački signali izvršne jedinice.
116
C
ALUout_on_DatabusClk
AaddBExternal_Reset
AandB
IR(15:0)
AcmpB
MemDataReady
Adress_on_DatabusZ
AmulB
AorB
AsubB
B15to0
CReset
CSet
IR_on_HOpndBus
IR_on_LOpndBus
K
Load
NotB
PCplus1
PCplusI
R0plus0
R0plusI
RE
RFright_on_OpndBus
ResetPC
Rl_on_AddressUnitRside
Rs_on_AddressUnitRside
Shadow
ShlB
ShrB
WE
WEH
WEL
WPadd
WPreset
ZReset
ZSet
jmp
ReadIO
WriteIO
U1
control
---------------------------------------------------------------------------------------- Design unit generated by Aldec IP Core Generator, version 6.3.-- Copyright (c) 2003-2004 by Aldec, Inc. All rights reserved.------------------------------------------------------------------------------------------ Created on Tuesday 2007-06-26, 18:10:01---------------------------------------------------------------------------------------- Details:-- Type: C-16450 serial asynchronous transceiver
117
Control
-- Blocks included:-- Interrupt Control Logic-- Modem Control Logic-- Baud Generator
library IEEE;use IEEE.std_logic_1164.all;
entity control isport(IR: in STD_LOGIC_VECTOR(15 downto 0); External_Reset,MemDataReady,Z,C,Clk : in STD_LOGIC;
ResetPC : out STD_LOGIC;PCplus1 : out std_logic;PCplusI : out std_logic;R0plusI : out std_logic;R0plus0 : out std_logic;jmp : out std_logic;K : out STD_LOGIC;ReadIO,WriteIO : out STD_LOGIC;
WPreset : out std_logic;WPadd : out std_logic; CReset,ZReset : out std_logic;
CSet,ZSet : out std_logic; B15to0,AandB,AorB,NotB,AaddB,AsubB,AmulB,AcmpB,ShrB,ShlB : out STD_LOGIC;
WEL,WEH : out std_logic; WE : out std_logic; RE : out std_logic; Load : out std_logic;
Adress_on_Databus,Shadow,IR_on_LOpndBus,IR_on_HOpndBus,ALUout_on_Databus,RFright_on_OpndBus,Rs_on_AddressUnitRside, Rl_on_AddressUnitRside : out std_logic
);end control;
architecture control_ARCH of control isbegin
process (Clk) begin
if rising_edge(CLK) then if MemDataReady= '1' then
if External_Reset= '1' thenWPreset<= '1';
CReset <= '1';
118
ZReset <= '1';ResetPC<= '1';
PCplus1<='0' ;PCplusI <='0';R0plusI <='0';R0plus0 <='0';jmp <= '0' ; WPadd <= '0';CSet <= '0';ZSet <= '0'; K <= '0';ReadIO <= '0';WriteIO <= '0';
B15to0 <= '0';AandB <= '0';AorB <= '0';NotB <= '0';AaddB <= '0';AsubB <= '0';AmulB <= '0';AcmpB <= '0';ShrB <= '0';ShlB <= '0';
WEL<= '0';WEH <= '0';
WE <= '0'; RE <= '1';
Load <= '1';
Adress_on_Databus <= '0'; Shadow <= '0'; IR_on_LOpndBus <= '0'; IR_on_HOpndBus <= '0'; ALUout_on_Databus <= '0'; RFright_on_OpndBus <= '0'; Rs_on_AddressUnitRside <= '0'; Rl_on_AddressUnitRside <= '0';
else
119
if IR (15 downto 12)= "0000" then if IR (11 downto 8)= "0000" then --nop
--nop--WPreset<= '0';
-- CReset <= '0';--ZReset <= '0';--ResetPC<= '0';
PCplus1<='1' ;PCplusI<='0';R0plusI <='0';R0plus0 <='0';jmp <='0' ; WPadd <= '0';--CSet <= '0';--ZSet <= '0'; K <= '0';ReadIO <= '0';WriteIO <= '0';
B15to0 <= '0';AandB <= '0';AorB <= '0';NotB <= '0';AaddB <= '0';AsubB <= '0';AmulB <= '0';AcmpB <= '0';ShrB <= '0';ShlB <= '0';
WEL<= '0';WEH <= '0';
WE <= '0'; RE<= '1';
Load <= '1';
Adress_on_Databus <= '0'; Shadow <= '0'; IR_on_LOpndBus <= '0';
120
IR_on_HOpndBus <= '0'; ALUout_on_Databus <= '0'; RFright_on_OpndBus <= '0'; Rs_on_AddressUnitRside <= '0'; Rl_on_AddressUnitRside <= '0';
end if; if IR (11 downto 8)= "0001" then
--halt WPreset<= '1';
CReset <= '1';ZReset <= '1';ResetPC<= '1';
PCplus1<='0' ;PCplusI<='0';R0plusI <='0';R0plus0 <='0';jmp <='0' ; WPadd <= '0';CSet <= '0';ZSet <= '0';K <= '0';ReadIO <= '0';WriteIO <= '0';
B15to0 <= '0';AandB <= '0';AorB <= '0';NotB <= '0';AaddB <= '0';AsubB <= '0';AmulB <= '0';AcmpB <= '0';ShrB <= '0';ShlB <= '0';
WEL<= '0';WEH <= '0';
WE <= '0'; RE<= '0';
Load <= '0';
121
Adress_on_Databus <= '0'; Shadow <= '0'; IR_on_LOpndBus <= '0'; IR_on_HOpndBus <= '0'; ALUout_on_Databus <= '0'; RFright_on_OpndBus <= '0'; Rs_on_AddressUnitRside <= '0'; Rl_on_AddressUnitRside <= '0';
end if;
if IR (11 downto 8)= "0010" then --szf
WPreset<= '0'; CReset <= '0';
ZReset <= '0'; ResetPC<= '0';
PCplus1<='1' ;PCplusI<='0';R0plusI <='0';R0plus0 <='0';jmp <='0'; WPadd <= '0';CSet <= '0';ZSet <= '1'; K <= '0';ReadIO <= '0';WriteIO <= '0';
B15to0 <= '0';AandB <= '0';AorB <= '0';NotB <= '0';AaddB <= '0';AsubB <= '0';AmulB <= '0';AcmpB <= '0';ShrB <= '0';ShlB <= '0';
122
WEL<= '0';WEH <= '0';
WE <= '0'; RE <= '1';
Load <= '1';
Adress_on_Databus <= '0'; Shadow <= '0'; IR_on_LOpndBus <= '0'; IR_on_HOpndBus <= '0'; ALUout_on_Databus <= '0'; RFright_on_OpndBus <= '0'; Rs_on_AddressUnitRside <= '0'; Rl_on_AddressUnitRside <= '0';
end if; --czf
if IR (11 downto 8)= "0011" then WPreset<= '0';
CReset <= '0';ZReset <= '1';ResetPC<= '0';
PCplus1<='1' ;PCplusI<='0';R0plusI <='0';R0plus0 <='0';jmp <='0' ; WPadd <= '0';CSet <= '0';ZSet <= '0';K <= '0';ReadIO <= '0';WriteIO <= '0';
B15to0 <= '0';AandB <= '0';AorB <= '0';NotB <= '0';AaddB <= '0';AsubB <= '0';AmulB <= '0';AcmpB <= '0';ShrB <= '0';ShlB <= '0';
123
WEL<= '0'; WEH <= '0'; WE <= '0';
RE <= '1'; Load <= '1';
Adress_on_Databus <= '0'; Shadow <= '0'; IR_on_LOpndBus <= '0'; IR_on_HOpndBus <= '0'; ALUout_on_Databus <= '0'; RFright_on_OpndBus <= '0'; Rs_on_AddressUnitRside <= '0'; Rl_on_AddressUnitRside <= '0';
end if; --scf
if IR (11 downto 8)= "0100" then
WPreset<= '0'; CReset <= '0';
ZReset <= '0';ResetPC<= '0';
PCplus1<='1' ;PCplusI <='0';R0plusI <='0';R0plus0 <='0';jmp <='0'; WPadd <= '0';CSet <= '1';ZSet <= '0';K <= '0';ReadIO <= '0';WriteIO <= '0';
B15to0 <= '0';AandB <= '0';AorB <= '0';NotB <= '0';AaddB <= '0';
124
AsubB <= '0';AmulB <= '0';AcmpB <= '0';ShrB <= '0';ShlB <= '0';
WEL<= '0';WEH <= '0';
WE <= '0'; RE <= '1';
Load <= '1';
Adress_on_Databus <= '0'; Shadow <= '0'; IR_on_LOpndBus <= '0'; IR_on_HOpndBus <= '0'; ALUout_on_Databus <= '0'; RFright_on_OpndBus <= '0'; Rs_on_AddressUnitRside <= '0'; Rl_on_AddressUnitRside <= '0';
end if;
--ccf if IR (11 downto 8)= "0101" then
WPreset<= '0';
CReset <= '1';ZReset <= '0';ResetPC<= '0';
PCplus1<='1' ;PCplusI <='0';R0plusI <='0';R0plus0 <='0';jmp <='0'; WPadd <= '0';CSet <= '0';ZSet <= '0'; K <= '0';ReadIO <= '0';WriteIO <= '0';
125
B15to0 <= '0';AandB <= '0';AorB <= '0';NotB <= '0';AaddB <= '0';AsubB <= '0';AmulB <= '0';AcmpB<= '0';ShrB <= '0';ShlB <= '0';
WEL<= '0';WEH <= '0';
WE <= '0'; RE <= '1';
Load <= '1';
Adress_on_Databus <= '0'; Shadow <= '0'; IR_on_LOpndBus <= '0'; IR_on_HOpndBus <= '0'; ALUout_on_Databus <= '0'; RFright_on_OpndBus <= '0'; Rs_on_AddressUnitRside <= '0'; Rl_on_AddressUnitRside <= '0';
end if; --cwp
if IR (11 downto 8)= "0110" then
WPreset<= '1'; CReset <= '0';
ZReset <= '0';ResetPC<= '0';
PCplus1<='1' ;PCplusI<='0';R0plusI <='0';R0plus0 <='0';jmp <='0'; WPadd <= '0';
126
CSet <= '0';ZSet <= '0';K <= '0';ReadIO <= '0';WriteIO <= '0';
B15to0 <= '0';AandB <= '0';AorB <= '0';NotB <= '0';AaddB <= '0';AsubB <= '0';AmulB <= '0';AcmpB<= '0';ShrB <= '0';ShlB <= '0';
WEL<= '0';WEH <= '0';
WE <= '0'; RE <= '1';
Load <= '1';
Adress_on_Databus <= '0'; Shadow <= '0'; IR_on_LOpndBus <= '0'; IR_on_HOpndBus <= '0'; ALUout_on_Databus <= '0'; RFright_on_OpndBus <= '0'; Rs_on_AddressUnitRside <= '0'; Rl_on_AddressUnitRside <= '0';
end if; --jpr
if IR (11 downto 8)= "0111" then
WPreset<= '0'; CReset <= '0';
ZReset <= '0'; ResetPC<= '0';
PCplus1<='0' ;
127
PCplusI<='1';R0plusI <='0';R0plus0 <='0';jmp <='0' ; WPadd <= '0';CSet <= '0';ZSet <= '0';K <= '0';ReadIO <= '0';WriteIO <= '0';
B15to0 <= '0';AandB <= '0';AorB <= '0';NotB <= '0';AaddB <= '0';AsubB <= '0';AmulB <= '0';AcmpB<= '0';ShrB <= '0';ShlB <= '0';
WEL<= '0';WEH <= '0';
WE <= '0'; RE <= '1';
Load <= '1';
Adress_on_Databus <= '0'; Shadow <= '0'; IR_on_LOpndBus <= '0'; IR_on_HOpndBus <= '0'; ALUout_on_Databus <= '0'; RFright_on_OpndBus <= '0'; Rs_on_AddressUnitRside <= '0'; Rl_on_AddressUnitRside <= '0';
end if; --brz
if IR (11 downto 8)= "1000" then if Z = '1' then
128
WPreset<= '0'; CReset <= '0';
ZReset <= '0';ResetPC<= '0';
PCplus1<='0' ;PCplusI<='1';R0plusI <='0';R0plus0 <='0';jmp <= '0'; WPadd <= '0';CSet <= '0';ZSet <= '0';K <= '0';ReadIO <= '0';WriteIO <= '0';
B15to0 <= '0';AandB <= '0';AorB <= '0';NotB <= '0';AaddB <= '0';AsubB <= '0';AmulB <= '0';AcmpB <= '0';ShrB <= '0';ShlB <= '0';
WEL<= '0';WEH <= '0';
WE <= '0'; RE <= '1';
Load <= '1';
Adress_on_Databus <= '0'; Shadow <= '0'; IR_on_LOpndBus <= '0'; IR_on_HOpndBus <= '0'; ALUout_on_Databus <= '0'; RFright_on_OpndBus <= '0'; Rs_on_AddressUnitRside <= '0'; Rl_on_AddressUnitRside <= '0';
129
else WPreset<= '0';
CReset <= '0';ZReset <= '0';ResetPC<= '0';
PCplus1<='1' ;PCplusI<='0';R0plusI <='0';R0plus0 <='0';jmp <= '0' ; WPadd <= '0';CSet <= '0';ZSet <= '0'; K <= '0';ReadIO <= '0';WriteIO <= '0';
B15to0 <= '0';AandB <= '0';AorB <= '0';NotB <= '0';AaddB <= '0';AsubB <= '0';AmulB <= '0';AcmpB <= '0';ShrB <= '0';ShlB <= '0';
WEL<= '0';WEH <= '0';
WE <= '0'; RE <= '1';
Load <= '1';
Adress_on_Databus <= '0'; Shadow <= '0'; IR_on_LOpndBus <= '0'; IR_on_HOpndBus <= '0'; ALUout_on_Databus <= '0'; RFright_on_OpndBus <= '0'; Rs_on_AddressUnitRside <= '0';
130
Rl_on_AddressUnitRside <= '0'; end if;
end if; --brc
if IR (11 downto 8)= "1001" then if C = '1' then
WPreset<= '0'; CReset <= '0';
ZReset <= '0';ResetPC<= '0';
PCplus1<='0' ;PCplusI<='1';R0plusI <='0';R0plus0 <='0';jmp <='0'; WPadd <= '0';CSet <= '0';ZSet <= '0'; K <= '0';ReadIO <= '0';WriteIO <= '0';
B15to0 <= '0';AandB <= '0';AorB <= '0';NotB <= '0';AaddB <= '0';AsubB <= '0';AmulB <= '0';AcmpB <= '0';ShrB <= '0';ShlB <= '0';
WEL<= '0';WEH <= '0';
WE <= '0'; RE <= '1';
Load <= '1';
131
Adress_on_Databus <= '0'; Shadow <= '0'; IR_on_LOpndBus <= '0'; IR_on_HOpndBus <= '0'; ALUout_on_Databus <= '0'; RFright_on_OpndBus <= '0'; Rs_on_AddressUnitRside <= '0'; Rl_on_AddressUnitRside <= '0'; else
WPreset<= '0'; CReset <= '0';
ZReset <= '0';ResetPC<= '0';
PCplus1<='1' ;PCplusI<='0';R0plusI <='0';R0plus0 <='0';jmp <= '0' ; WPadd <= '0';CSet <= '0';ZSet <= '0'; K <= '0';ReadIO <= '0';WriteIO <= '0';
B15to0 <= '0';AandB <= '0';AorB <= '0';NotB <= '0';AaddB <= '0';AsubB <= '0';AmulB <= '0';AcmpB <= '0';ShrB <= '0';ShlB <= '0';
WEL<= '0';WEH <= '0';
WE <= '0'; RE <= '1';
132
Load <= '1';
Adress_on_Databus <= '0'; Shadow <= '0'; IR_on_LOpndBus <= '0'; IR_on_HOpndBus <= '0'; ALUout_on_Databus <= '0'; RFright_on_OpndBus <= '0'; Rs_on_AddressUnitRside <= '0'; Rl_on_AddressUnitRside <= '0'; end if;
end if; --awp
if IR (11 downto 8)= "1010" then
WPreset<= '0'; CReset <= '0';
ZReset <= '0';ResetPC<= '0';
PCplus1<='1' ;PCplusI<='0';R0plusI <='0';R0plus0 <='0';jmp <= '0' ; WPadd <= '1';CSet <= '0';ZSet <= '0'; K <= '0';ReadIO <= '0';WriteIO <= '0';
B15to0 <= '0';AandB <= '0';AorB <= '0';NotB <= '0';AaddB <= '0';AsubB <= '0';AmulB <= '0';AcmpB<= '0';ShrB <= '0';ShlB <= '0';
133
WEL<= '0';WEH <= '0';
WE <= '0'; RE <= '1';
Load <= '1';
Adress_on_Databus <= '0'; Shadow <= '0'; IR_on_LOpndBus <= '0'; IR_on_HOpndBus <= '0'; ALUout_on_Databus <= '0'; RFright_on_OpndBus <= '0'; Rs_on_AddressUnitRside <= '0'; Rl_on_AddressUnitRside <= '0';
end if;end if;
if IR (15 downto 12)= "0001" then
--mvr
WPreset<= '0'; CReset <= '0';
ZReset <= '0';ResetPC<= '0';
PCplus1<='1' ;PCplusI<='0';R0plusI <='0';R0plus0 <='0';jmp <= '0' ;
WPadd <= '0';CSet <= '0';ZSet <= '0';K <= '1';ReadIO <= '0';WriteIO <= '0';
B15to0 <= '1';AandB <= '0';AorB <= '0';NotB <= '0';AaddB <= '0';AsubB <= '0';
134
AmulB <= '0';AcmpB <= '0';ShrB <= '0';ShlB <= '0';
WEL<= '1';WEH <= '1';
WE <= '0'; RE <= '0';
Load <= '1';
Adress_on_Databus <= '0'; Shadow <= '1'; IR_on_LOpndBus <= '0'; IR_on_HOpndBus <= '0'; ALUout_on_Databus <= '1'; RFright_on_OpndBus <= '1'; Rs_on_AddressUnitRside <= '0'; Rl_on_AddressUnitRside <= '0';
end if;
--lda if IR (15 downto 12)= "0010" then
WPreset<= '0'; CReset <= '0';
ZReset <= '0';ResetPC<= '0';
PCplus1<='0' ;PCplusI<='0';R0plusI <='0';R0plus0 <='1';jmp <='0';
WPadd <= '0';CSet <= '0';ZSet <= '0';K <= '1';ReadIO <= '0';WriteIO <= '0';
135
B15to0 <= '0';AandB <= '0';AorB <= '0';NotB <= '0';AaddB <= '0';AsubB <= '0';AmulB <= '0';AcmpB <= '0';ShrB <= '0';ShlB <= '0';
WEL<= '1';WEH <= '1';
WE <= '0'; RE <= '1';
Load <= '1';
Adress_on_Databus <= '0'; Shadow <= '1'; IR_on_LOpndBus <= '0'; IR_on_HOpndBus <= '0'; ALUout_on_Databus <= '0'; RFright_on_OpndBus <= '0'; Rs_on_AddressUnitRside <= '1'; Rl_on_AddressUnitRside <= '0';
end if; if IR (15 downto 12)= "0011" then
--sta
WPreset<= '0'; CReset <= '0';
ZReset <= '0';ResetPC<= '0';
PCplus1<='0' ;PCplusI<='0';R0plusI <='0';R0plus0 <='1';
136
jmp <= '0' ; WPadd <= '0';
CSet <= '0';ZSet <= '0'; K <= '1';ReadIO <= '0';WriteIO <= '0';
B15to0 <= '1';AandB <= '0';AorB <= '0';NotB <= '0';AaddB <= '0';AsubB <= '0';AmulB <= '0';AcmpB <= '0';ShrB <= '0';ShlB <= '0';
WEL<= '0';WEH <= '0';
WE <= '1'; RE <= '0';
Load <= '1';
Adress_on_Databus <= '0'; Shadow <= '1'; IR_on_LOpndBus <= '0'; IR_on_HOpndBus <= '0'; ALUout_on_Databus <= '1'; RFright_on_OpndBus <= '1'; Rs_on_AddressUnitRside <= '0'; Rl_on_AddressUnitRside <= '1';
end if;
if IR (15 downto 12)= "0100" then --inp
WPreset<= '0';
CReset <= '0';ZReset <= '0';
137
ResetPC<= '0';
PCplus1<='0' ;PCplusI<='0';R0plusI <='0';R0plus0 <='1';jmp <='0' ;
WPadd <= '0';CSet <= '0';ZSet <= '0';K <= '1';ReadIO <= '1';WriteIO <= '0';
B15to0 <= '0';AandB <= '0';AorB <= '0';NotB <= '0';AaddB <= '0';AsubB <= '0';AmulB <= '0';AcmpB<= '0';ShrB <= '0';ShlB <= '0';
WEL<= '1';WEH <= '1';
WE <= '0'; RE <= '0';
Load <= '1';
Adress_on_Databus <= '1'; Shadow <= '1'; IR_on_LOpndBus <= '0'; IR_on_HOpndBus <= '0'; ALUout_on_Databus <= '0'; RFright_on_OpndBus <= '0'; Rs_on_AddressUnitRside <= '1'; Rl_on_AddressUnitRside <= '0';
end if; --oup
138
if IR (15 downto 12)= "0101" then
WPreset<= '0'; CReset <= '0';
ZReset <= '0';ResetPC<= '0';
PCplus1<='0' ;PCplusI<='0';R0plusI <='0';R0plus0 <='1';jmp <='0';
WPadd <= '0';CSet <= '0';ZSet <= '0'; K <= '1';ReadIO <= '0';WriteIO <= '1';
B15to0 <= '0';AandB <= '0';AorB <= '0';NotB <= '0';AaddB <= '0';AsubB <= '0';AmulB <= '0';AcmpB <= '0';ShrB <= '0';ShlB <= '0';
WEL<= '1';WEH <= '1';
WE <= '0'; RE <= '0';
Load <= '1';
Adress_on_Databus <= '1'; Shadow <= '1'; IR_on_LOpndBus <= '0'; IR_on_HOpndBus <= '0';
139
ALUout_on_Databus <= '0'; RFright_on_OpndBus <= '0'; Rs_on_AddressUnitRside <= '1'; Rl_on_AddressUnitRside <= '0';
end if;
--and
if IR (15 downto 12)= "0110" then
WPreset<= '0'; CReset <= '0';
ZReset <= '0';ResetPC<= '0';
PCplus1<='1' ;PCplusI<='0';R0plusI <='0';R0plus0 <='0';jmp <='0';
WPadd <= '0';CSet <= '0';ZSet <= '0';K <= '1';ReadIO <= '0';WriteIO <= '0';
B15to0 <= '0';AandB <= '1';AorB <= '0';NotB <= '0';AaddB <= '0';AsubB <= '0';AmulB <= '0';AcmpB <= '0';ShrB <= '0';ShlB <= '0';
WEL<= '1';WEH <= '1';
WE <= '0';
140
RE <= '0'; Load <= '1';
Adress_on_Databus <= '0'; Shadow <= '1'; IR_on_LOpndBus <= '0'; IR_on_HOpndBus <= '0'; ALUout_on_Databus <= '1'; RFright_on_OpndBus <= '1'; Rs_on_AddressUnitRside <= '0'; Rl_on_AddressUnitRside <= '0';
end if;
if IR (15 downto 12)= "0111" then
--or WPreset<= '0';
CReset <= '0';ZReset <= '0';ResetPC<= '0';
PCplus1<='1' ;PCplusI<='0';R0plusI <='0';R0plus0 <='0';jmp <='0' ;
WPadd <= '0';CSet <= '0';ZSet <= '0';K <= '1';
B15to0 <= '0';AandB <= '0';AorB <= '1';NotB <= '0';AaddB <= '0';AsubB <= '0';AmulB <= '0';AcmpB<= '0';ShrB <= '0';ShlB <= '0';
141
WEL<= '1';WEH <= '1';
WE <= '0'; RE <= '1';
Load <= '1';
Adress_on_Databus <= '0'; Shadow <= '1'; IR_on_LOpndBus <= '0'; IR_on_HOpndBus <= '0'; ALUout_on_Databus <= '1'; RFright_on_OpndBus <= '1'; Rs_on_AddressUnitRside <= '0'; Rl_on_AddressUnitRside <= '0';
end if; --not
if IR (15 downto 12)= "1000" then
WPreset<= '0'; CReset <= '0';
ZReset <= '0';ResetPC<= '0';
PCplus1<='1' ;PCplusI<='0';R0plusI <='0';R0plus0 <='0';jmp <= '0' ;
WPadd <= '0';CSet <= '0';ZSet <= '0';K <= '1';ReadIO <= '0';WriteIO <= '0';
B15to0 <= '0';AandB <= '0';AorB <= '0';NotB <= '1';AaddB <= '0';AsubB <= '0';AmulB <= '0';AcmpB<= '0';
142
ShrB <= '0';ShlB <= '0';
WEL<= '1';WEH <= '1';
WE <= '0'; RE<= '1';
Load <= '1';
Adress_on_Databus <= '0'; Shadow <= '1'; IR_on_LOpndBus <= '0'; IR_on_HOpndBus <= '0'; ALUout_on_Databus <= '1'; RFright_on_OpndBus <= '1'; Rs_on_AddressUnitRside <= '0'; Rl_on_AddressUnitRside <= '0';
end if; --shl
if IR (15 downto 12)= "1001" then
WPreset<= '0'; CReset <= '0';
ZReset <= '0';ResetPC<= '0';
PCplus1<='1' ;PCplusI<='0';R0plusI <='0';R0plus0 <='0';jmp <= '0';
WPadd <= '0';CSet <= '0';ZSet <= '0'; K <= '1';ReadIO <= '0';WriteIO <= '0';
B15to0 <= '0';AandB <= '0';
143
AorB <= '0';NotB <= '0';AaddB <= '0';AsubB <= '0';AmulB <= '0';AcmpB <= '0';ShrB <= '0';ShlB <= '1';
WEL<= '1';WEH <= '1';
WE <= '0'; RE <= '1';
Load <= '1';
Adress_on_Databus <= '0'; Shadow <= '1'; IR_on_LOpndBus <= '0'; IR_on_HOpndBus <= '0'; ALUout_on_Databus <= '1'; RFright_on_OpndBus <= '1'; Rs_on_AddressUnitRside <= '0'; Rl_on_AddressUnitRside <= '0';
end if; --shr
if IR (15 downto 12)= "1010" then
WPreset<= '0'; CReset <= '0';
ZReset <= '0';ResetPC<= '0';
PCplus1<='1' ;PCplusI<='0';R0plusI <='0';R0plus0 <='0';jmp <= '0';
WPadd <= '0';CSet <= '0';ZSet <= '0';
144
K <= '1';ReadIO <= '0';WriteIO <= '0';
B15to0 <= '0';AandB <= '0';AorB <= '0';NotB <= '0';AaddB <= '0';AsubB <= '0';AmulB <= '0';AcmpB <= '0';ShrB <= '1';ShlB <= '0';
WEL<= '1';WEH <= '1';
WE <= '0'; RE <= '1';
Load <= '1';
Adress_on_Databus <= '0'; Shadow <= '1'; IR_on_LOpndBus <= '0'; IR_on_HOpndBus <= '0'; ALUout_on_Databus <= '1'; RFright_on_OpndBus <= '1'; Rs_on_AddressUnitRside <= '0'; Rl_on_AddressUnitRside <= '0';
end if; --add
if IR (15 downto 12)= "1011" then
WPreset<= '0'; CReset <= '0';
ZReset <= '0';ResetPC<= '0';
PCplus1<='1' ;PCplusI<='0';
145
R0plusI <='0';R0plus0 <='0';jmp <= '0' ;
WPadd <= '0';CSet <= '0';ZSet <= '0'; K <= '1';ReadIO <= '0';WriteIO <= '0';
B15to0 <= '0';AandB <= '0';AorB <= '0';NotB <= '0';AaddB <= '1';AsubB <= '0';AmulB <= '0';AcmpB<= '0';ShrB <= '0';ShlB <= '0';
WEL<= '1';WEH <= '1';
WE <= '0'; RE <= '1';
Load <= '1';
Adress_on_Databus <= '0'; Shadow <= '1'; IR_on_LOpndBus <= '0'; IR_on_HOpndBus <= '0'; ALUout_on_Databus <= '1'; RFright_on_OpndBus <= '1'; Rs_on_AddressUnitRside <= '0'; Rl_on_AddressUnitRside <= '0';
end if; --sub
if IR (15 downto 12)= "1100" then
WPreset<= '0';
146
CReset <= '0';ZReset <= '0';ResetPC<= '0';
PCplus1<='1' ;PCplusI<='0';R0plusI <='0';R0plus0 <='0';jmp <= '0' ;
WPadd <= '0';CSet <= '0';ZSet <= '0';K <= '1';ReadIO <= '0';WriteIO <= '0';
B15to0 <= '0';AandB <= '0';AorB <= '0';NotB <= '0';AaddB <= '0';AsubB <= '1';AmulB <= '0';AcmpB <= '0';ShrB <= '0';ShlB <= '0';
WEL<= '1';WEH <= '1';
WE <= '0'; RE <= '1';
Load <= '1';
Adress_on_Databus <= '0'; Shadow <= '1'; IR_on_LOpndBus <= '0'; IR_on_HOpndBus <= '0'; ALUout_on_Databus <= '1'; RFright_on_OpndBus <= '1'; Rs_on_AddressUnitRside <= '0'; Rl_on_AddressUnitRside <= '0';
147
end if;--mul
if IR (15 downto 12)= "1101" then
WPreset<= '0'; CReset <= '0';
ZReset <= '0';ResetPC<= '0';
PCplus1<='1' ;PCplusI <='0';R0plusI <='0';R0plus0 <='0';jmp <= '0' ;
WPadd <= '0';CSet <= '0';ZSet <= '0';K <= '1';ReadIO <= '0';WriteIO <= '0';
B15to0 <= '0';AandB <= '0';AorB <= '0';NotB <= '0';AaddB <= '0';AsubB <= '0';AmulB <= '1';AcmpB <= '0';ShrB <= '0';ShlB <= '0';
WEL<= '1';WEH <= '1';
WE <= '0'; RE <= '1';
Load <= '1';
Adress_on_Databus <= '0'; Shadow <= '1'; IR_on_LOpndBus <= '0';
148
IR_on_HOpndBus <= '0'; ALUout_on_Databus <= '1'; RFright_on_OpndBus <= '1'; Rs_on_AddressUnitRside <= '0'; Rl_on_AddressUnitRside <= '0';
end if; --cmp
if IR (15 downto 12)= "1110" then
WPreset<= '0'; CReset <= '0';
ZReset <= '0';ResetPC<= '0';
PCplus1<='1' ;PCplusI <='0';R0plusI <='0';R0plus0 <='0';jmp <= '0';
WPadd <= '0';CSet <= '0';ZSet <= '0';K <= '0';ReadIO <= '0';WriteIO <= '0';
B15to0 <= '0';AandB <= '0';AorB <= '0';NotB <= '0';AaddB <= '0';AsubB <= '0';AmulB <= '0';AcmpB <= '1';ShrB <= '0';ShlB <= '0';
WEL<= '0';WEH <= '0';
WE <= '0'; RE <= '1';
149
Load <= '1';
Adress_on_Databus <= '0'; Shadow <= '1'; IR_on_LOpndBus <= '0'; IR_on_HOpndBus <= '0'; ALUout_on_Databus <= '0'; RFright_on_OpndBus <= '1'; Rs_on_AddressUnitRside <= '0'; Rl_on_AddressUnitRside <= '0';
end if;
if IR (15 downto 12)= "1111" then--mil
if IR (9 downto 8)= "00" then
WPreset<= '0'; CReset <= '0';
ZReset <= '0';ResetPC<= '0';
PCplus1<='1' ;PCplusI<='0';R0plusI <='0';R0plus0 <='0';jmp <='0' ;
WPadd <= '0';CSet <= '0';ZSet <= '0'; K <= '1';ReadIO <= '0';WriteIO <= '0';
B15to0 <= '1';AandB <= '0';AorB <= '0';NotB <= '0';AaddB <= '0';AsubB <= '0';AmulB <= '0';AcmpB <= '0';ShrB <= '0';ShlB <= '0';
150
WEL<= '1';WEH <= '0';
WE <= '0'; RE <= '1';
Load <= '1';
Adress_on_Databus <= '0'; Shadow <= '1'; IR_on_LOpndBus <= '1'; IR_on_HOpndBus <= '0'; ALUout_on_Databus <= '1'; RFright_on_OpndBus <= '0'; Rs_on_AddressUnitRside <= '0'; Rl_on_AddressUnitRside <= '0';
end if;--mih
if IR (9 downto 8)= "01" then
WPreset<= '0'; CReset <= '0';
ZReset <= '0';ResetPC<= '0';
PCplus1<='1' ;PCplusI<='0';R0plusI <='0';R0plus0 <='0';jmp <= '0';
WPadd <= '0';CSet <= '0';ZSet <= '0'; K <= '1';ReadIO <= '0';WriteIO <= '0';
B15to0 <= '1';AandB <= '0';AorB <= '0';
151
NotB <= '0';AaddB <= '0';AsubB <= '0';AmulB <= '0';AcmpB <= '0';ShrB <= '0';ShlB <= '0';
WEL<= '0';WEH <= '1';
WE <= '0'; RE <= '1';
Load <= '1';
Adress_on_Databus <= '0'; Shadow <= '1'; IR_on_LOpndBus <= '0'; IR_on_HOpndBus <= '1'; ALUout_on_Databus <= '1'; RFright_on_OpndBus <= '0'; Rs_on_AddressUnitRside <= '0'; Rl_on_AddressUnitRside <= '0';
end if;
--spc if IR (9 downto 8)= "10" then
WPreset<= '0'; CReset <= '0';
ZReset <= '0';ResetPC<= '0';
PCplus1<='0' ;PCplusI<='1';R0plusI <='0';R0plus0 <='0';jmp <='0' ;
WPadd <= '0';CSet <= '0';ZSet <= '0';
152
K <= '1';ReadIO <= '0';WriteIO <= '0';
B15to0 <= '0';AandB <= '0';AorB <= '0';NotB <= '0';AaddB <= '0';AsubB <= '0';AmulB <= '0';AcmpB <= '0';ShrB <= '0';ShlB <= '0';
WEL<= '1';WEH <= '1';
WE <= '0'; RE <= '1';
Load <= '1';
Adress_on_Databus <= '1'; Shadow <= '1'; IR_on_LOpndBus <= '0'; IR_on_HOpndBus <= '0'; ALUout_on_Databus <= '0'; RFright_on_OpndBus <= '0'; Rs_on_AddressUnitRside <= '0'; Rl_on_AddressUnitRside <= '0';
end if; --jpa
if IR (9 downto 8)= "11" then
WPreset<= '0'; CReset <= '0';
ZReset <= '0';ResetPC<= '0';
PCplus1<='0' ;PCplusI<='0';
153
R0plusI <='1';R0plus0 <='0';jmp <= '0' ;
WPadd <= '0';CSet <= '0';ZSet <= '0'; K <= '1';ReadIO <= '0';WriteIO <= '0';
B15to0 <= '0';AandB <= '0';AorB <= '0';NotB <= '0';AaddB <= '0';AsubB <= '0';AmulB <= '0';AcmpB<= '0';ShrB <= '0';ShlB <= '0';
WEL<= '0';WEH <= '0';
WE <= '0'; RE <= '1';
Load <= '1';
Adress_on_Databus <= '0'; Shadow <= '1'; IR_on_LOpndBus <= '0'; IR_on_HOpndBus <= '0'; ALUout_on_Databus <= '0'; RFright_on_OpndBus <= '0'; Rs_on_AddressUnitRside <= '0'; Rl_on_AddressUnitRside <= '1';
end if; end if;end if;
else
154
WPreset<= '0'; CReset <= '0';
ZReset <= '0';ResetPC<= '0';
PCplus1<='0' ;PCplusI<='0';R0plusI <='0';R0plus0 <='0';jmp <='0' ;
WPadd <= '0';CSet <= '0';ZSet <= '0'; K <= '0';ReadIO <= '0';WriteIO <= '0';
B15to0 <= '0';AandB <= '0';AorB <= '0';NotB <= '0';AaddB <= '0';AsubB <= '0';AmulB <= '0';AcmpB <= '0';ShrB <= '0';ShlB <= '0';
WEL<= '0';WEH <= '0';
WE <= '0'; RE <= '0';
Load <= '0';
Adress_on_Databus <= '0'; Shadow <= '0'; IR_on_LOpndBus <= '0'; IR_on_HOpndBus <= '0'; ALUout_on_Databus <= '0'; RFright_on_OpndBus <= '0';
155
Rs_on_AddressUnitRside <= '0'; Rl_on_AddressUnitRside <= '0';
end if; end if; end process;end control_ARCH;
156
10. PROCESOR SAYEH
U delu koji sledi dat je VHDL opis procesora SAYEH. Blokovi koji su do sada opisani povezani su na sledeći način:
ADDR(15:0)
Q(15:0)
DATA(15:0)REWE
U1
memorija
CLK
RD(15:0)
DATA(15:0)
RS(15:0)
Sel(3:0)
WEHWEL
WP(2:0)
U2
registar_file
A(15:0)
ALUout(15:0)
AaddB
Cout AandB
Zout
AcmpB
AmulB
AorB
AsubB
B(15:0)
B15to0
Clk
NotB
ShlB
ShrB
U3
alu
CLK
C
CReset
Z
CSet
Cout
ZResetZSetZout
U4
flags
IR(7:0)
izl(15:0)
PC(15:0)
PCplus1
PCplusI
R0plus0
R0plusI
RSide(15:0)
ResetPCclk
jmp
U5
adr_unt
C
ALUout_on_DatabusClk
AaddBExternal_Reset
AandB
IR(15:0)
AcmpB
MemDataReady
Adress_on_DatabusZ
AmulB
AorB
AsubB
B15to0
CReset
CSet
IR_on_HOpndBus
IR_on_LOpndBus
K
Load
NotB
PCplus1
PCplusI
R0plus0
R0plusI
RE
RFright_on_OpndBus
ResetPC
Rl_on_AddressUnitRside
Rs_on_AddressUnitRside
Shadow
ShlB
ShrB
WE
WEH
WEL
WPadd
WPreset
ZReset
ZSet
jmp
ReadIO
WriteIO
U6
control
CLK Q(15:0) DATA(15:0)
Q1(7:0)
LOAD
U7
irI0(11:8)
O(3:0)I1(3:0)
Shadow
U8
mux
CLK
IZL(2:0)
K
ULAZ(2:0)
U10
novo
O(7:0)
I(7:0)
IR_on_LOpndBus
U11
buff1
CLK
Q(2:0)DATA(2:0)
WP
add
WP
reset
U12
WP
I(7:0)O
(7:0)
IR_on_HOpndBus
U13
buff2
I(15:0)O
(15:0)
RFright_on_OpndBus
U14
buff3
I(15:0)O(15:0)
Rs_on_AdressUnitRSide
U15
buff4I(15:0) O(15:0)
Rd_on_AdressUnitRSide
U16
buff5
ALUout_on_Databus
O(15:0)
I(15:0)
U17
buff6
Address_on_Databus
O(15:0)
I(15:0)
U18
buff7
Opnd(15:0)
Opnd(15:8)
Irout(7:0)
Irout(3:1)
Ir_bus(15:0)Ir_bus(11:8)
Ir_bus(3:0)
clock
Opnd(7:0)
ExtResetMemDatReady ReadIO
WriteIO
Procesor SAYEH ima sledeće portove:- Clk – ulaz taktnog signala- ExternalReset – jednobitni ulaz za spoljašnje resetovanje procesora,- MemDataready – jednobitni ulaz kojim se obaveštava procesor da je
memorija spremna za rad,- ReadMem – izlazni kontrolni signal (ako je =1 dozvoljeno je iščitavanje iz
memorija),- WriteMem – izlazni kontrolni signal (ako je =1 dozvoljen je upis u
memoriju),
157
---------------------------------------------------------------------------------------------------
--
-- Title : No Title
-- Design : sayeh
-- Author : Nikola Sekulovic
-- Company : SekulaCo
--
---------------------------------------------------------------------------------------------------
--
-- File : c:\Documents and Settings\Nikola\Desktop\sayeh\sayeh\compile\sayeh procesor.vhd
-- Generated : Tue Jul 17 10:55:52 2007
-- From : c:\Documents and Settings\Nikola\Desktop\sayeh\sayeh\src\sayeh procesor.bde
-- By : Bde2Vhdl ver. 2.6
--
---------------------------------------------------------------------------------------------------
--
-- Description :
--
---------------------------------------------------------------------------------------------------
-- Design unit header --
library IEEE;
use IEEE.std_logic_1164.all;
158
entity \sayeh procesor\ is
port(
ExtReset : in STD_LOGIC;
MemDatReady : in STD_LOGIC;
clock : in STD_LOGIC;
ReadIO : out STD_LOGIC;
WriteIO : out STD_LOGIC
);
end \sayeh procesor\;
architecture \sayeh procesor\ of \sayeh procesor\ is
---- Component declarations -----
component adr_unt
port (
IR : in STD_LOGIC_VECTOR(7 downto 0);
PC : in STD_LOGIC_VECTOR(15 downto 0);
PCplus1 : in STD_LOGIC;
PCplusI : in STD_LOGIC;
R0plus0 : in STD_LOGIC;
R0plusI : in STD_LOGIC;
RSide : in STD_LOGIC_VECTOR(15 downto 0);
ResetPC : in STD_LOGIC;
clk : in STD_LOGIC;
159
jmp : in STD_LOGIC;
izl : out STD_LOGIC_VECTOR(15 downto 0)
);
end component;
component ALU
port (
A : in STD_LOGIC_VECTOR(15 downto 0);
AaddB : in STD_LOGIC;
AandB : in STD_LOGIC;
AcmpB : in STD_LOGIC;
AmulB : in STD_LOGIC;
AorB : in STD_LOGIC;
AsubB : in STD_LOGIC;
B : in STD_LOGIC_VECTOR(15 downto 0);
B15to0 : in STD_LOGIC;
Clk : in STD_LOGIC;
NotB : in STD_LOGIC;
ShlB : in STD_LOGIC;
ShrB : in STD_LOGIC;
ALUout : out STD_LOGIC_VECTOR(15 downto 0);
Cout : out STD_LOGIC;
Zout : out STD_LOGIC
);
end component;
component buff1
160
port (
I : in STD_LOGIC_VECTOR(7 downto 0);
IR_on_LOpndBus : in STD_LOGIC;
O : out STD_LOGIC_VECTOR(7 downto 0)
);
end component;
component buff2
port (
I : in STD_LOGIC_VECTOR(7 downto 0);
IR_on_HOpndBus : in STD_LOGIC;
O : out STD_LOGIC_VECTOR(7 downto 0)
);
end component;
component buff3
port (
I : in STD_LOGIC_VECTOR(15 downto 0);
RFright_on_OpndBus : in STD_LOGIC;
O : out STD_LOGIC_VECTOR(15 downto 0)
);
end component;
component buff4
port (
I : in STD_LOGIC_VECTOR(15 downto 0);
Rs_on_AdressUnitRSide : in STD_LOGIC;
O : out STD_LOGIC_VECTOR(15 downto 0)
161
);
end component;
component buff5
port (
I : in STD_LOGIC_VECTOR(15 downto 0);
Rd_on_AdressUnitRSide : in STD_LOGIC;
O : out STD_LOGIC_VECTOR(15 downto 0)
);
end component;
component buff6
port (
ALUout_on_Databus : in STD_LOGIC;
I : in STD_LOGIC_VECTOR(15 downto 0);
O : out STD_LOGIC_VECTOR(15 downto 0)
);
end component;
component buff7
port (
Address_on_Databus : in STD_LOGIC;
I : in STD_LOGIC_VECTOR(15 downto 0);
O : out STD_LOGIC_VECTOR(15 downto 0)
);
end component;
component control
port (
162
C : in STD_LOGIC;
Clk : in STD_LOGIC;
External_Reset : in STD_LOGIC;
IR : in STD_LOGIC_VECTOR(15 downto 0);
MemDataReady : in STD_LOGIC;
Z : in STD_LOGIC;
ALUout_on_Databus : out STD_LOGIC;
AaddB : out STD_LOGIC;
AandB : out STD_LOGIC;
AcmpB : out STD_LOGIC;
Adress_on_Databus : out STD_LOGIC;
AmulB : out STD_LOGIC;
AorB : out STD_LOGIC;
AsubB : out STD_LOGIC;
B15to0 : out STD_LOGIC;
CReset : out STD_LOGIC;
CSet : out STD_LOGIC;
IR_on_HOpndBus : out STD_LOGIC;
IR_on_LOpndBus : out STD_LOGIC;
K : out STD_LOGIC;
Load : out STD_LOGIC;
NotB : out STD_LOGIC;
PCplus1 : out STD_LOGIC;
PCplusI : out STD_LOGIC;
R0plus0 : out STD_LOGIC;
163
R0plusI : out STD_LOGIC;
RE : out STD_LOGIC;
RFright_on_OpndBus : out STD_LOGIC;
ReadIO : out STD_LOGIC;
ResetPC : out STD_LOGIC;
Rl_on_AddressUnitRside : out STD_LOGIC;
Rs_on_AddressUnitRside : out STD_LOGIC;
Shadow : out STD_LOGIC;
ShlB : out STD_LOGIC;
ShrB : out STD_LOGIC;
WE : out STD_LOGIC;
WEH : out STD_LOGIC;
WEL : out STD_LOGIC;
WPadd : out STD_LOGIC;
WPreset : out STD_LOGIC;
WriteIO : out STD_LOGIC;
ZReset : out STD_LOGIC;
ZSet : out STD_LOGIC;
jmp : out STD_LOGIC
);
end component;
component flags
port (
CLK : in STD_LOGIC;
CReset : in STD_LOGIC;
164
CSet : in STD_LOGIC;
Cout : in STD_LOGIC;
ZReset : in STD_LOGIC;
ZSet : in STD_LOGIC;
Zout : in STD_LOGIC;
C : out STD_LOGIC;
Z : out STD_LOGIC
);
end component;
component ir
port (
CLK : in STD_LOGIC;
DATA : in STD_LOGIC_VECTOR(15 downto 0);
LOAD : in STD_LOGIC;
Q : out STD_LOGIC_VECTOR(15 downto 0);
Q1 : out STD_LOGIC_VECTOR(7 downto 0)
);
end component;
component memorija
port (
ADDR : in STD_LOGIC_VECTOR(15 downto 0);
DATA : in STD_LOGIC_VECTOR(15 downto 0);
RE : in STD_LOGIC;
WE : in STD_LOGIC;
Q : out STD_LOGIC_VECTOR(15 downto 0)
165
);
end component;
component mux
port (
I0 : in STD_LOGIC_VECTOR(11 downto 8);
I1 : in STD_LOGIC_VECTOR(3 downto 0);
Shadow : in STD_LOGIC;
O : out STD_LOGIC_VECTOR(3 downto 0)
);
end component;
component novo
port (
CLK : in STD_LOGIC;
K : in STD_LOGIC;
ULAZ : in STD_LOGIC_VECTOR(2 downto 0);
IZL : out STD_LOGIC_VECTOR(2 downto 0)
);
end component;
component registar_file
port (
CLK : in STD_LOGIC;
DATA : in STD_LOGIC_VECTOR(15 downto 0);
Sel : in STD_LOGIC_VECTOR(3 downto 0);
WEH : in STD_LOGIC;
WEL : in STD_LOGIC;
166
WP : in STD_LOGIC_VECTOR(2 downto 0);
RD : out STD_LOGIC_VECTOR(15 downto 0);
RS : out STD_LOGIC_VECTOR(15 downto 0)
);
end component;
component WP
port (
CLK : in STD_LOGIC;
DATA : in STD_LOGIC_VECTOR(2 downto 0);
WPadd : in STD_LOGIC;
WPreset : in STD_LOGIC;
Q : out STD_LOGIC_VECTOR(2 downto 0)
);
end component;
---- Signal declarations used on the diagram ----
signal NET2418 : STD_LOGIC;
signal NET2420 : STD_LOGIC;
signal NET2442 : STD_LOGIC;
signal NET2444 : STD_LOGIC;
signal NET2470 : STD_LOGIC;
signal NET2472 : STD_LOGIC;
signal NET2474 : STD_LOGIC;
signal NET2476 : STD_LOGIC;
167
signal NET2478 : STD_LOGIC;
signal NET2480 : STD_LOGIC;
signal NET2482 : STD_LOGIC;
signal NET2484 : STD_LOGIC;
signal NET2488 : STD_LOGIC;
signal NET2491 : STD_LOGIC;
signal NET2493 : STD_LOGIC;
signal NET2495 : STD_LOGIC;
signal NET2510 : STD_LOGIC;
signal NET2512 : STD_LOGIC;
signal NET2514 : STD_LOGIC;
signal NET2516 : STD_LOGIC;
signal NET2518 : STD_LOGIC;
signal NET2520 : STD_LOGIC;
signal NET2541 : STD_LOGIC;
signal NET2543 : STD_LOGIC;
signal NET2545 : STD_LOGIC;
signal NET2547 : STD_LOGIC;
signal NET2551 : STD_LOGIC;
signal NET2554 : STD_LOGIC;
signal NET2604 : STD_LOGIC;
signal NET2615 : STD_LOGIC;
signal NET2624 : STD_LOGIC;
signal NET2626 : STD_LOGIC;
signal NET2628 : STD_LOGIC;
168
signal NET2630 : STD_LOGIC;
signal NET2638 : STD_LOGIC;
signal NET2641 : STD_LOGIC;
signal NET2643 : STD_LOGIC;
signal NET2645 : STD_LOGIC;
signal NET2652 : STD_LOGIC;
signal NET2654 : STD_LOGIC;
signal BUS2412 : STD_LOGIC_VECTOR (15 downto 0);
signal BUS2414 : STD_LOGIC_VECTOR (15 downto 0);
signal BUS2416 : STD_LOGIC_VECTOR (15 downto 0);
signal BUS2435 : STD_LOGIC_VECTOR (15 downto 0);
signal BUS2438 : STD_LOGIC_VECTOR (15 downto 0);
signal BUS2440 : STD_LOGIC_VECTOR (3 downto 0);
signal BUS2446 : STD_LOGIC_VECTOR (2 downto 0);
signal BUS2468 : STD_LOGIC_VECTOR (15 downto 0);
signal BUS2538 : STD_LOGIC_VECTOR (15 downto 0);
signal BUS2549 : STD_LOGIC_VECTOR (15 downto 0);
signal BUS2696 : STD_LOGIC_VECTOR (2 downto 0);
signal Irout : STD_LOGIC_VECTOR (7 downto 0);
signal Ir_bus : STD_LOGIC_VECTOR (15 downto 0);
signal Opnd : STD_LOGIC_VECTOR (15 downto 0);
begin
---- Component instantiations ----
169
U1 : memorija
port map(
ADDR => BUS2412,
DATA => BUS2416,
Q => BUS2414,
RE => NET2418,
WE => NET2420
);
U10 : novo
port map(
CLK => clock,
IZL => BUS2446,
K => NET2628,
ULAZ => BUS2696
);
U11 : buff1
port map(
I => Irout,
IR_on_LOpndBus => NET2626,
O(0) => Opnd(0),
O(1) => Opnd(1),
O(2) => Opnd(2),
170
O(3) => Opnd(3),
O(4) => Opnd(4),
O(5) => Opnd(5),
O(6) => Opnd(6),
O(7) => Opnd(7)
);
U12 : WP
port map(
CLK => clock,
DATA(0) => Irout(1),
DATA(1) => Irout(2),
DATA(2) => Irout(3),
Q => BUS2696,
WPadd => NET2652,
WPreset => NET2654
);
U13 : buff2
port map(
I => Irout,
IR_on_HOpndBus => NET2624,
O(0) => Opnd(8),
O(1) => Opnd(9),
O(2) => Opnd(10),
171
O(3) => Opnd(11),
O(4) => Opnd(12),
O(5) => Opnd(13),
O(6) => Opnd(14),
O(7) => Opnd(15)
);
U14 : buff3
port map(
I => BUS2438,
O => Opnd,
RFright_on_OpndBus => NET2638
);
U15 : buff4
port map(
I => BUS2438,
O => BUS2549,
Rs_on_AdressUnitRSide => NET2643
);
U16 : buff5
port map(
I => BUS2435,
O => BUS2549,
172
Rd_on_AdressUnitRSide => NET2641
);
U17 : buff6
port map(
ALUout_on_Databus => NET2604,
I => BUS2468,
O => BUS2416
);
U18 : buff7
port map(
Address_on_Databus => NET2615,
I => BUS2538,
O => BUS2412
);
U2 : registar_file
port map(
CLK => clock,
DATA => BUS2414,
RD => BUS2435,
RS => BUS2438,
Sel => BUS2440,
WEH => NET2442,
173
WEL => NET2444,
WP => BUS2446
);
U3 : ALU
port map(
A => BUS2435,
ALUout => BUS2468,
AaddB => NET2470,
AandB => NET2474,
AcmpB => NET2478,
AmulB => NET2480,
AorB => NET2482,
AsubB => NET2484,
B => Opnd,
B15to0 => NET2488,
Clk => clock,
Cout => NET2472,
NotB => NET2491,
ShlB => NET2493,
ShrB => NET2495,
Zout => NET2476
);
U4 : flags
174
port map(
C => NET2510,
CLK => clock,
CReset => NET2512,
CSet => NET2516,
Cout => NET2472,
Z => NET2514,
ZReset => NET2518,
ZSet => NET2520,
Zout => NET2476
);
U5 : adr_unt
port map(
IR => Irout,
PC => BUS2538,
PCplus1 => NET2541,
PCplusI => NET2543,
R0plus0 => NET2545,
R0plusI => NET2547,
RSide => BUS2549,
ResetPC => NET2551,
clk => clock,
izl => BUS2538,
jmp => NET2554
175
);
U6 : control
port map(
ALUout_on_Databus => NET2604,
AaddB => NET2470,
AandB => NET2474,
AcmpB => NET2478,
Adress_on_Databus => NET2615,
AmulB => NET2480,
AorB => NET2482,
AsubB => NET2484,
B15to0 => NET2488,
C => NET2510,
CReset => NET2512,
CSet => NET2516,
Clk => clock,
External_Reset => ExtReset,
IR => Ir_bus,
IR_on_HOpndBus => NET2624,
IR_on_LOpndBus => NET2626,
K => NET2628,
Load => NET2630,
MemDataReady => MemDatReady,
NotB => NET2491,
176
PCplus1 => NET2541,
PCplusI => NET2543,
R0plus0 => NET2545,
R0plusI => NET2547,
RE => NET2418,
RFright_on_OpndBus => NET2638,
ReadIO => ReadIO,
ResetPC => NET2551,
Rl_on_AddressUnitRside => NET2641,
Rs_on_AddressUnitRside => NET2643,
Shadow => NET2645,
ShlB => NET2493,
ShrB => NET2495,
WE => NET2420,
WEH => NET2442,
WEL => NET2444,
WPadd => NET2652,
WPreset => NET2654,
WriteIO => WriteIO,
Z => NET2514,
ZReset => NET2518,
ZSet => NET2520,
jmp => NET2554
);
177
U7 : ir
port map(
CLK => clock,
DATA => BUS2416,
LOAD => NET2630,
Q => Ir_bus,
Q1 => Irout
);
U8 : mux
port map(
I0(8) => Ir_bus(8),
I0(9) => Ir_bus(9),
I0(10) => Ir_bus(10),
I0(11) => Ir_bus(11),
I1(0) => Ir_bus(0),
I1(1) => Ir_bus(1),
I1(2) => Ir_bus(2),
I1(3) => Ir_bus(3),
O => BUS2440,
Shadow => NET2645
);
end \sayeh procesor\;
178
11. BUDUĆNOST PROCESORA
Do 2010. godine današnje kompjutere će zameniti 1000 puta moćniji multimedijalni uređaji.
Slika 1. Personalni računar budućnosti
Napredak našeg društva već više od 150 godina diktiraju elektroni. Iako će oni i ubuduće nastaviti da nam služe kao prenosnici električne energije, čini se da se njihovoj primeni, prvenstveno u računarima a i u ostalim tehničkim uređajima, polako bliži kraj. Na scenu dolaze fotoni. Razlozi za ovu smenu generacija postaju svakim danom sve više evidentni. Elektron je jednostavno prevelik, prespor i prevruć. Danas u procesorima veze od 0,25-mikrometara (mikrona) polako zamenjuju one od 0,18, a sledeći korak je 0,13 mikrona. Pored činjenice da je proizvodnja još tanjih veza sve skuplja, biće gotovo nemoguće izbeći preskakanje elektrona između susednih veza. S druge strane, foton gotovo da nema masu i može da nosi više podataka u jednom snopu zavisno od frekvencije, i to bez zagrevanja. Na kraju, fotoni su najbrže čestice poznate čoveku jer, naravno, putuju brzinom svetlosti.Sa ovom činjenicom na umu, ljudi koji se bave projektovanjem superračunara skočili su kroz vreme deset godina unapred i sklopili prosečnu konfiguraciju personalnog računara budućnosti. Kod ovog računara je svaki deo koji se trenutno oslanja na elektrone zamenjen optičkim pandanom. Naravno, elektronski prekidači će i dalje ostati važan deo računara. Rezultat ovog spoja je pouzdaniji, jeftiniji i mnogo manji računar nego oni koje poznajemo danas. Zapravo dizajneri predviđaju da će ovi računari pre ličiti na frizbi nego na sadašnje računare. Naravno, ono što svakog korisnika najviše zanima, performanse računara, dostići će nivo današnjih superkompjutera. Računar takve snage, toliko jeftin da će svako moći da ga priušti i toliko mali da ćete moći da ga nosite svuda sa sobom, postaće nezamenjiva alatka u životu svakog modernog čoveka. To znači da na poslu nećete imati drugi kompjuter, već samo spustite sopstveni računar na sto i on se već povezao s mrežom! Upravljački interfejs ovog računara biće vaš glas i desktop. Površina samog stola (engl. desktop) biće veliki touch screen koji će zameniti današnje monitore, tastature i miševe. Pored toga što će prepoznavati glas, ovi računari će imati i vlastiti sintetizator
179
glasa, tako da će moći da vam pročitaju pristigle poruke ili da vas upozore na termine iz podsetnika. Da ne biste morali da brinete za bezbednost svojih podataka na samom kućištu stajaće biometrički senzor za očitavanje otisaka prstiju. Da biste mogli sa sastavite ovaj računar budućnosti potrebne su vam komponente iz budućnosti. Većina ovih komponenti postoji već sada, ali su trenutno preskupe za prosečnog korisnika. Pored toga skoro sve su još uvek u takvom stadijumu razvoja da čak i kada biste mogli da ih kupite njihovim spajanjem napunili biste celu sobu, a još uvek ne biste imali željene performanse. Tako, recimo, hard diskovi koji će se koristiti u ovakvim računarima već postoje, ali u laboratorijama. Hologramski diskovi će se u slobodnoj prodaji pojaviti „mnogo” pre potpuno optičkih kompjutera, a do 2010. godine biće dovoljno jeftini da se ugrađuju u sve računare. Za deset godina današnje procesore zameniće oni sa optoelektronskim integralnim kolima. Ova kola su kombinacija elektronskih i optičkih delova. Prekidači u procesoru su od silicijuma, ali oni više neće biti povezani metalnim vezama nego će komunicirati optičkim putem. Tako će se otkloniti osnovna mana današnjih procesora – predugo čekanje na nove podatke za obradu. Otklanjanjem metalnih veza koji se zagrevaju i sprečavaju povećanje takta, brzina procesora preći će čak 100 GHz. Za razliku od sadašnjih procesora koji su četvorougaoni, procesor u računaru budućnosti imaće izgled pravilnog šestougla. Dok je četvrtasti oblik današnjih procesora rezultat potrebe za minijaturizacijom i maksimalnim iskorišćenjem silicijumske ploče, naredne generacije biće šestougaone da bi svaki deo procesora mogao što brže da komunicira sa keš memorijom koja će ga okruživati poput prstena. Veoma proste verzije optoelektronskih integralnih kola postoje već sada, ali su još uvek daleko od stepena koji je potreban za proizvodnju procesora sa željenim specifikacijama. Po trenutnim procenama, ovakvi procesori će se pojaviti tek za deset godina. Na usavršavanju optoelektronike najviše rade kompanije „Scientific-Atlanta” i „Nortel”, a u „Lucentu” pokušavaju da naprave i optičke prekidače, tj. potpuno optički procesor. Da ova vrsta procesora predstavlja budućnost pokazao je i veliki „Intel”, kada je kupio dansku kompaniju „GIGA”, jednog od navećih svetskih proizvođača optoelektronskih kola. Optika će ubrzati još jedno usko grlo današnjih računara – magistralu. Dok su trenutno najbrži procesori već probili barijeru od 1 GHz, krajnje brzine magistrala se kreću od 133 MHz kod „Intela” do 200 MHz kod AMD-ovog Athlona. Optička magistrala će bez problema raditi na taktu procesora – 100 GHz. Za brzinu magistrale vezana je i brzina RAM memorije. Računari će imati veliki keš od ultrabrzog magnetnog RAM-a, dok će osnovna sistemska radna memorija biti optički tj. holografski RAM. Kod današnje memorije od silicijumskih elemenata osvežavanje, zbog konstrukcije, traje predugo. S druge strane, magnetni RAM čine mali naelektrisani molekuli. Osvežavanje ove memorije vrši se jednostavnim električnim impulsom i dostizaće brzinu od 100 GHz. Sama brzina magnetne memorije omogućiće da se u računare stavlja čak 1 GB (da, gigabajt!) keša. Nažalost, magnetna memorija je još uvek u eksperimentalnom stadijumu razvoja, na njoj rade samo u državnim laboratorijama američke vlade i, naravno, u IBM-u. Iako su ljudi iz „Velikog plavog” do sada postigli najbolje rezultate na ovom polju, njihove su procene da će do komercijalno pristupačne magnetne memorije najverovatnije morati da se čeka više od deset godina. Ako imate gigabajt keša, šta mislite koliko ćete imati RAM-a? Očekuje se da će standardne konfiguracije imati i više od 256 GB potpuno optičkog, odnosno holografskog
180
RAM-a. Holografski RAM u principu funkcioniše slično holografskim hard diskovima, ali je mnogo brži i skuplji. Ovakva memorija takođe već postoji u univerzitetskim laboratorijama. Procenjuje se da će se u narednih osam godina, nakon višestrukog povećanje brzine i kapaciteta, veće kompanije zainteresovati za serijsku proizvodnju. Pošto će kompjuteri budućnosti biti zasnovani na fotonima, a ne na elektronima kao današnji, trošiće mnogo manje električne energije. Ovi računari će pored konvencionalnog napajanja imati i okruglu litijumsku bateriju ugrađenu u obod kućišta, koja će pružati nekoliko nedelja rada bez priključivanja na električnu mrežu. „Hewlett-Packard” je najavio da će do 2007. godine imati ovakve baterije. Što se tiče ekrana, sem velikih displeja od preko 30 inča koji će biti ugrađeni u stolove i zidove u kućama i na radnim mestima, trebaće vam pregledni prenosivi monitor. Veliki ekrani biće ili paneli od tečnog kristala pobuđenog fotonima ili nova generacija plazma-displeja. Ovakva rešenja mogu se očekivati od kompanija kao što su „Sony”, „Toshiba” i „IBM”. Prenosni monitori neće biti veliki kao sadašnji displeji na notebook računrima, nego mnogo sitniji. Ovi mali displeji nose se poput naočara i stvaraju u oku prividno veliku sliku, kao da gledate ekran od nekoliko metara. „Sharp Electronics” je najdalje odmakao na polju kolor LCD tehnologije, a pored mikrodispleja u poslednje vreme mnogo ulažu i u primenu optoelektronike. Na kraju se postavlja pitanje – koja će kompanija napraviti ovakav računar? Ako pogledamo tržište komponenti za računare, još uvek postoje žestoke borbe za primat i standarde. Kako očekivati od konkurentskih kompanija da sarađuju? Trenutno postoje tri velika igrača na polju optičkih komponenti, „Lucent Technologies”, „Cisco Systems” i „Nortel Networks” i najveće borbe na tržištu odvijaće se između ovih kompanija. U želji da ne se izgubi korak sa „velikim momcima”, osnovana je koalicija „Optical Domain Service Interconnect” koja se zalaže za izgradnju otvorenog sistema. To bi im omogućilo da prave komponente koje bi bile kompatibilne sa sva tri velika proizvođača. Ova koalicija broji već preko 130 „malih” kompanija od kojih neke mogu da se pohvale godišnjim prihodima od preko dvadeset milijardi dolara. Bez obzira koja strana prevagne, potencijalni kupci moći će, kao i uvek, samo da profitiraju od sukoba između proizvođača. Kako godine budu odmicale, sve više komponenti potrebnih za ovaj računar izlaziće iz laboratorija i nalaziti mesto na tržištu. Možda se ovakav računar, kao jedinstvena celina, neće pojaviti još izvesno vreme. Međutim, vremenom ćete sigurno sve svoje stare komponente postepeno zamenjivati sve novijim i novijim, usavršenijim i usavršenijim... i tako sve dok jednog vrelog letnjeg dana daleke 2010. godine ne shvatite da već radite na – kompjuteru budućnosti!
181
12. Testiranje sintetizovanog procesora
Programskom sekvencom od šest naredbi testiraćemo korektnost rada sintetizovanog procesora SAYEH.
Add R1, R6; R1 ← R1 + R6
Shl R7; R0 ← Shl R7
Or R3, R7; R3 ← R3 Or R7
Not R5; R0 ← Not R5
Sub R1, R6; R1 ← R1 – R6
Sta (R3), R4; mem(R3) ← R4
Definisanje inicijalnih vrednosti memorijskih lokacija i sadržaja registara registarskog polja
a) Sadržaj programske memorije za odgovarajuću programsku sekvencu treba da bude sledećeg oblika:
Memory[0]=1011011000000000=B600: Add Memory[1]=1001001100000000=9300: Shl Memory[2]=0111111100000000=7F00: Or Memory[3]=1000000100000000=8100: Not Memory[4]=1100011000000000=C600: SubMemory[5]=0011110000000000=3C00: Sta
Napomena: Mašinski kod, četiri MS bita instrukcije, označen je crvenom bojom, naredna četiri bita označena plavom bojom specificiraju izvorišni i odredišni operand instrukcije, zadnjih osam bitova specificiraju neposrednu vrednost opkoda instrukcije, tj. polje koje se naziva imm. Kada se opkodom ne specificira korišćenje polja imm tada je njegova vrednost 00h (za više detalja videti poglavlje 2.3. Sayeh instrukcije).
b) Sadržaj registara registarskog polja pre početka izvršenja programske sekvence treba biti sledeći:
Reg_file[0]=0000000000000000=0000; Reg_file[4]=0000000000000100=0004; Reg_file[1]=0000000000000001=0001; Reg_file[5]=0000000000000101=0005;Reg_file[2]=0000000000001010=000A; Reg_file[6]=0000000000000110=0006;Reg_file[3]=0000000000000011=0003; Reg_file[7]=0000000000000111=0007;
Nakon prve instrukcije Add sadržaj registarskog polja je sledeći:Reg_file[0]=0000000000000000=0000; Reg_file[4]=0000000000000100=0004; Reg_file[1]=0000000000000111=0007; Reg_file[5]=0000000000000101=0005;Reg_file[2]=0000000000001010=000A; Reg_file[6]=0000000000000110=0006;Reg_file[3]=0000000000000011=0003; Reg_file[7]=0000000000000111=0007;
Nakon druge instrukcije Shl sadržaj registarskog polja je sledeći:
182
Reg_file[0]=0000000000001110=000E; Reg_file[4]=0000000000000100=0004; Reg_file[1]=0000000000000111=0007; Reg_file[5]=0000000000000101=0005;Reg_file[2]=0000000000001010=000A; Reg_file[6]=0000000000000110=0006;Reg_file[3]=0000000000000011=0003; Reg_file[7]=0000000000000111=0007;Nakon treće instrukcije Or sadržaj registarskog polja je sledeći:Reg_file[0]=0000000000001110=000E; Reg_file[4]=0000000000000100=0004; Reg_file[1]=0000000000000111=0007; Reg_file[5]=0000000000000101=0005;Reg_file[2]=0000000000001010=000A; Reg_file[6]=0000000000000110=0006;Reg_file[3]=0000000000000111=0007; Reg_file[7]=0000000000000111=0007;
Nakon četvrte instrukcije Not sadržaj registarskog polja je sledeći:Reg_file[0]=1111111111111010=FFFA; Reg_file[4]=0000000000000100=0004; Reg_file[1]=0000000000000111=0007; Reg_file[5]=0000000000000101=0005;Reg_file[2]=0000000000001010=000A; Reg_file[6]=0000000000000110=0006;Reg_file[3]=0000000000000111=0007; Reg_file[7]=0000000000000111=0007;Nakon pete instrukcije Sub sadržaj registarskog polja je sledeći:Reg_file[0]=1111111111111010=FFFA; Reg_file[4]=0000000000000100=0004; Reg_file[1]=0000000000000111=0001; Reg_file[5]=0000000000000101=0005;Reg_file[2]=0000000000001010=000A; Reg_file[6]=0000000000000110=0006;Reg_file[3]=0000000000000111=0007; Reg_file[7]=0000000000000111=0007;Nakon šeste instrukcije Sta sadržaj registarskog polja je ostao nepromenjen, dok je Memory[7]=0000000000000100=0004.
U delu koji sledi dat je detaljan postupak kojim se vrši pozivanje programa, inicijalizacija memorije, inicijalizacija registarskog polja i testiranje procesora.
12.1 Pozivanje programa
183
Korak 1: Pokrenuti program Active-HDL 6.3 dvostrukim klikom na ikonicu smeštenu na desktop računara.
Korak 2: a) U prozoru Getting Started izabrati levim klikom miša opciju Open existing workspace. b) Levim klikom miša selektovati projekat Sayeh. c) Levim klikom na opciju Ok pozivamo program koji opisuje procesor Sayeh.
Slika uz korak 2
184
Posle koraka 2 otvara se prozor kao na narednoj slici:
Slika: Workspace (radni prostor) ' Sayeh '
12.2. Inicijalizacija memorije
185
Korak 1: a) U prozoru DESIGN BROWSER levim klikom miša izabrati komponentu memorija.vhd.
b) Desni klik u padajućem meniju na fajl označen crvenom ikonicom memorija (memorija_arch). c) Levi klik u novodobijenom prozoru na opciju Set as Top-Level.
Slika uz korak 1
Korak 2: Levim klikom miša na ikonicu New Waveform označenu crvenom bojom otvara se polje Waveform Editor u koje se unose signali i njihove vrednosti.
Slika uz korak 2
Korak 3: Desnim klikom na polje Waveform Editor otvaramo novi prozor u kojem levim klikom odabiramo opciju Add Signals.
186
Slika uz korak 3
Korak 4: U desnom delu novodobijenog prozora nalaze se signali izabrane komponente. a) Desnim klikom miša u desnom delu prozora otvaramo novi prozor kao na slici. Levim klikom u novodobijenom prozoru na opciju Select All selektujemo prikazane signale.b) Levim klikom na opciju Add dodajemo selektovane signale polju Waveform Editor.
Slika uz korak 4Korak 5: a) Levim klikom na opciju line_47 u levom delu prozora, pojavljuje se promenljiva V= memorija_mem u desnom delu prozora.
187
b) Levim klikom na promenljivu V= memorija_mem vršimo njeno selektovanje. c) Levim klikom na opciju Add, polju Waveform Editor dodajemo prethodno selektovanu promenljivu V= memorija_mem.
Slika uz korak 5
Korak 6: Polje Waveform Editor izgleda kao na slici. Levim klikom na ikonicu Run označenu crvenom bojom startuje se simulacija.
Slika uz korak 6
Korak 7: a) Nakon levog klika mišem na opciju line_47 u prozoru DESIGN BROWSER,pojavljuje se promenljiva V=memorija_mem.
188
b) Desnim klikom na promenljivu V=memorija_mem otvara se novi prozor kao na slici. c) Levi klik na opciju Add_to_Memory_View.
Slika uz korak 7
Korak 8: Nakon klika na opciju Add_to_Memory_View, dobijamo prozor kao na slici. Mogućnost upisivanje željenog sadržaja u odgovarajuću memorijsku lokaciju obezbeđuje se dvostrukim klikom miša na memorijsku lokaciju, dok se unošenje željenog sadržaja vrši tastaturom.
Slika uz korak 8
Korak 9: Za našu progamsku sekvencu sadržaj memorijskih lokacija je sledeći:Memory[0]=1011011000000011=B600: Add
189
Memory[1]=1001001101000100=9300: Shl Memory[2]=0111111100000000=7F00: Or Memory[3]=1000000100010001=8100: Not Memory[4]=1100011000000011=C600: Sub
Memory[5]=0011110000000010=3C00: Sta a) Nakon unošenja odgovarajućih vrednosti, levim klikom na opciju Save označenu crvenom bojom javlja se prozor Save Memory View file. b) U prozoru Save Memory View file u delu File name navodi se ime pod kojim će sadržaj memorijskih lokacija, nakon levog klika na opciju Save, ostati zapamćen (npr. memorija_mem).
Slika uz korak 9
12.3. Inicijalizacija registarskog polja
190
Korak 1: a) U prozoru DESIGN BROWSER levim klikom miša izabrati komponentu register file.vhd. b) Desni klik u padajućem meniju na fajl označen crvenom ikonicom register_ file(register_ file_arch). c) Levi klik u novodobijenom prozoru na opciju Set as Top-Level.
Slika uz korak 1
Korak 2: Levim klikom miša na ikonicu New Waveform označenu crvenom bojom otvara se polje Waveform Editor u koje se unose signali i njihove vrednosti.
Slika uz korak 2
Korak 3: Desnim klikom na polje Waveform Editor otvaramo novi prozor u kojem levim klikom odabiramo opciju Add Signals.
191
Slika uz korak 3
Korak 4: U desnom delu novodobijenog prozora nalaze se signali izabrane komponente. a) Desnim klikom miša u desnom delu prozora otvaramo novi prozor kao na slici. Levim klikom u novodobijenom prozoru na opciju Select All selektujemo prikazane signale.b) Levim klikom na opciju Add dodajemo selektovane signale polju Waveform Editor.
Slika uz korak 4
192
Korak 5: a) Levim klikom na opciju line_49 u levom delu prozora, pojavljuje se promenljiva V= ram_mem u desnom delu prozora. b) Levim klikom na promenljivu V= ram_mem vršimo njeno selektovanje. c) Levim klikom na opciju Add, polju Waveform Editor dodajemo prethodno selektovanu promenljivu V= ram_mem.
Slika uz korak 5
Korak 6: Polje Waveform Editor izgleda kao na slici. Levim klikom na ikonicu Run označenu crvenom bojom startuje se simulacija.
Slika uz korak 6
Korak 7: a) Nakon levog klika mišem na opciju line_49 u prozoru DESIGN BROWSER,
193
pojavljuje se promenljiva V=ram_mem. b) Desnim klikom na promenljivu V=ram_mem otvara se novi prozor kao na slici. c) Levi klik na opciju Add_to_Memory_View.
Slika uz korak 7
Korak 8: Nakon klika na opciju Add_to_Memory_View, dobijamo prozor kao na slici. Mogućnost upisivanje željenog sadržaja u odgovarajući registar registarskog polja obezbeđuje se dvostrukim klikom miša na polje registra, dok se unošenje željenog sadržaja vrši tastaturom.
Slika uz korak 8
194
Korak 9: Neka je za našu progamsku sekvencu sadržaj registara registarskog polja sledeći:Regfile[0]=0000000000000000=0000;Regfile[0]=0000000000000001=0001; Regfile[0]=0000000000001010=000A;Regfile[0]=0000000000000011=0003;Regfile[0]=0000000000000100=0004;Regfile[0]=0000000000000101=0005;Regfile[0]=0000000000000110=0006;Regfile[0]=0000000000000111=0007;
a) Nakon unošenja odgovarajućih vrednosti, levim klikom na opciju Save označenu crvenom bojom javlja se prozor Save Memory View file. b) U prozoru Save Memory View file u delu File name navodi se ime pod kojim će sadržaj registara registarskog polja, nakon levog klika na opciju Save, ostati zapamćen (npr. ram_mem).
Slika uz korak 9
12.4.Testiranje procesora
195
Nakon inicijalizacije memorije i registarskog polja, možemo pristuputi testiranju sintetizovanog procesora. Korak 1: a) U prozoru DESIGN BROWSER levim klikom miša izabrati komponentu sayeh procesor.bde. b) Levim klikom miša u padajućem meniju izabrati komponentu sayeh procesor.vhd. c) Desnim klikom u padajućem meniju izabrati fajl označen crvenom ikonicom \ sayeh procesor \(\ sayeh procesor \). d) Levi klik u novodobijenom prozoru na opciju Set as Top-Level.
Slika uz korak 1
Korak 2: Levim klikom miša na ikonicu New Waveform označenu crvenom bojom otvara se polje Waveform Editor u koje se unose signali i njihove vrednosti.
Slika uz korak 2
Korak 3: Desnim klikom na polje Waveform Editor otvaramo novi prozor u kojem levim klikom odabiramo opciju Add Signals.
196
Slika uz korak 3
Korak 4: U desnom delu novodobijenog prozora nalaze se signali procesora SAYEH. Levim klikom na željeni signal vršimo njegovo selektovanje, dok se levim klikom na opciju Add selektovani signali dodaju polju Waveform Editor (selektovali smo signale ExtReset, MemDatReady i clock)
Slika uz korak 4
197
Korak 5: a) Nakon levog klika u levom delu prozora na jedinicu U1: memorija (memorija_arch) i levog klika u padajućem meniju na opciju line_47, pojavljuje se promenljiva V= memorija_mem u desnom delu prozora. b) Levim klikom na promenljivu V= memorija_mem vršimo njeno selektovanje. c) Levim klikom na opciju Add, polju Waveform Editor dodajemo prethodno selektovanu promenljivu V= memorija_mem.
Slika uz korak 5
Korak 6: a) Nakon levog klika u levom delu prozora na jedinicu U2: registar_file (registar_file_arch) i levog klika u padajućem meniju na opciju line_49, pojavljuje se promenljiva V= ram_mem u desnom delu prozora. b) Levim klikom na promenljivu V= ram_mem vršimo njeno selektovanje. c) Levim klikom na opciju Add, polju Waveform Editor dodajemo prethodno selektovanu promenljivu V= ram_mem.
Slika uz korak 6
198
Korak 7: Selektovani signali ExtReset, MemDatReady i clock, kao i promenljive V= memorija_mem i V= ram_mem pojavljuju se u polju Waveform Editor kao na slici. Desnim klikom na signal ExtReset dobijamo novi prozor u kojem treba levim klikom izabrati opciju Stimulators.
Slika uz korak 7
Korak 7.1: a) U novootvorenom prozoru Stimulators levim klikom miša selektujemo polje Value.
b) U polju Force value tastaturom unosimo vrednost '1'. c) Levim klikom na opciju Apply signalu ExtReset dodeljujemo prethodno unetu vrednost.
199
Slika uz korak 7.1
Korak 7.2: a) U polju Waveform Editor selektujemo signal MemDatReady levim klikom miša. b) U prozoru Stimulators levim klikom miša selektujemo polje Value.
c) U polju Force value tastaturom unosimo vrednost '1'. d) Levim klikom na opciju Apply signalu MemDatReady dodeljujemo prethodno unetu vrednost.
Slika uz korak 7.2
200
Korak 7.3: a) U polju Waveform Editor selektujemo signal clock levim klikom miša. b) U prozoru Stimulators levim klikom miša selektujemo polje Clock. c) Levim klikom na opciju Apply signalu clock dodeljujemo signal periode 100 ns (trajanje logičke jedinice je 50 ns; trajanje logičke nule je 50 ns). d) Levim klikom na opciju Close zatvaramo prozor Stimulators.
Slika uz korak 7.3
Korak 8: Levim klikom na ikonicu Run označenu crvenom bojom startuje se simulacija.
Slika uz korak 8
201
Korak 9: a) Nakon levog klika mišem u prozoru DESIGN BROWSER na jedinicu U1: memorija (memorija_arch) i levog klika u padajućem meniju na opciju line_47,pojavljuje se promenljiva V=memorija_mem. b) Desnim klikom na promenljivu V=memorija_mem otvara se novi prozor kao na slici. c) Levi klik na opciju Add_to_Memory_View.
Slika uz korak 9
Korak 10: Levim klikom na opciju Memory otvaramo novi prozor u kojem levim klikom selektujemo opciju Change Memory.
Slika uz korak 10
202
Korak 11: U prozoru Change Memory treba levim klikom miša izabrati opciju Load From File, a zatim i opciju Browse.
Slika uz korak 11
Korak 12: a) U prozoru Open memory block file levim klikom miša izabrati fajl u kojem je smeštena predhodno inicijalizovana memorija (inicijalizovanu memoriju za našu programsku sekvencu zapamtili smo pod imenom memorija.mem). b) Levim klikom na opciju Open, a zatim i levim klikom na opciju Ok u prozoru Change Memory sadržaj naše memorije postaje jednak sadržaju izabranog fajla.
Slika uz korak 12Inicijalizovana memorija za našu programsku sekvencu izgleda kao na slici:
203
Slika: Inicijalizovana memorija
Korak 13: a) Nakon levog klika mišem u prozoru DESIGN BROWSER na jedinicu U2: register_file (register_file_arch) i levog klika u padajućem meniju na opciju line_49,pojavljuje se promenljiva V=ram_mem. b) Desnim klikom na promenljivu V=ram_mem otvara se novi prozor kao na slici. c) Levi klik na opciju Add_to_Memory_View.
Slika uz korak 13
204
Korak 14: Levim klikom na opciju Memory otvaramo novi prozor u kojem levim klikom selektujemo opciju Change Memory.
Slika uz korak 14
Korak 15: U prozoru Change Memory treba levim klikom miša izabrati opciju Load From File, a zatim i opciju Browse.
Slika uz korak 15
205
Korak 16: a) U prozoru Open memory block file levim klikom miša izabrati fajl u kojem je smešteno predhodno inicijalizovano registarsko polje (inicijalizovano registarsko polje zapamtili smo pod imenom ram.mem). b Levim klikom na opciju Open, a zatim i levim klikom na opciju Ok u prozoru Change Memory sadržaj registarskog polja postaje jednak sadržaju izabranog fajla.
Slika uz korak 16
Inicijalizovano registarsko polje u našem primeru je kao na slici:
Slika: Inicijalizovano registarsko polje
206
Korak 17: Levim klikom na ikonicu Run označenu crvenom bojom pokrećemo simulaciju.
Slika uz korak 17
Korak 18: Desnim klikom na signal ExtReset dobijamo novi prozor u kojem treba levim klikom izabrati opciju Stimulators.
Slika uz korak 18
207
Korak 18.1: a) U novootvorenom prozoru Stimulators levim klikom miša selektujemo polje Value.
b) U polju Force value tastaturom unosimo vrednost '0'. c) Levim klikom na opciju Apply signalu ExtReset dodeljujemo prethodno unetu vrednost. d) Levim klikom na opciju Close zatvaramo prozor Stimulators.
Slika uz korak 18.1
Korak 19: Levim klikom na opciju Run oznašenu crvenom bojom pokrećemo izvršenje programske sekvence.
Slika uz korak 19
208
Slika 1. Sadržaj registara pre izvršenja programske sekvence
Slika 2. Sadržaj registara nakon prve instrukcije ( Add R1,R6 : R1 ← R1 + R6 )
209
Slika 3. Sadržaj registara nakon druge instrukcije (Shl R7; R0 ← Shl R7)
Slika 4. Sadržaj registara nakon treće instrukcije (Or R3,R7; R3 ← R3 Or R7 )
210
Slika 5. Sadržaj registara nakon četvrte instrukcije(Not R5; R0 ← Not R5 )
Slika 6. Sadržaj registara nakon pete instrukcije (Sub R1,R6; R1 ← R1 – R6)
211
Slika 7. Sadržaj registara i memorije nakon šeste instrukcije (Sta (R3),R4; mem(R3) ← R4)
Korak 20: Testiranje završavamo levim klikom na ikonicu End simulation označenu crvenom bojom.
Slika uz korak 20
212
13. Laboratorijska vežba analize izvršavanja instrukcija jednostavnog 16-bitnog procesora
Cilj ove vežbe je upoznavanje sa skupom instrukcija i načinom izvršavanja instrukcija 16-bitnog procesora SAYEH. Procesor SAYEH manipuliše sa 16-bitnim podacima i operiše sa 16-bitnom adresnom magistralom (za više detalja videti poglavlje 2. SAYEH ).Zadatak studenta:- na osnovu datog skupa instrukcija, opkodova (slika 1) i formata instrukcija (slika 2)ručno definisati sadržaj programske memorije za zadatu programsku sekvencu;- pozvati program postupkom koji je opisan u sekciji 13.1. Pozivanje programa- definisani sadržaj inicijalizirati u programsku memoriju postupkom koji je opisan u sekciji 13.2. Inicijalizacija memorije ;- inicijalizirati sadržaj registara registrskog polja na specificirane vrednosti postupkom koji je opisan u sekciji 13.3. Inicijalizacija registarskog polja ;- izvršiti simulaciju na način koji je opisan u sekciji 13.4. Testiranje procesora ;- izvršiti analizu rezultata simulacije upisivanjem aktivnih signala u odgovarajuću tabelu, verifikaciju rezultata i odštampati izveštaj o rezultatima simulacije.
Instrukcija Bits 15:0 Opis instrukcije
nop No operation 0000-00-00 Operacija bez efektahlt Halt 0000-00-01 Halt, stop fečszf Set zero flag 0000-00-10 Z <= 1'czf Clr zero flag 0000-00-11 Z <= '0'scf Set carry flag 0000-01-00 C<='1'ccf Clr carry flag 0000-01-01 C <= '0'cwp Clr
Window pointer0000-01-10 WP <= "000"
mvr Move Register 0001-D-S RD <= RsIda Load Addressed 0010-D-S RD <= (Rs)sta Store Addressed 0011-D-S (RD) <= Rsinp Input from port 0100-D-S In from Rs write to RDoup Output to port 0101-D-S Out to port RD from Rsand AND Registers 0110-D-S RD <= RD & Rsor OR Registers 0111-D-S RD <= RD I Rsnot NOT Register 1000-D-S RD <= ~Rsshl Shift Left 1001-D-S RD <= sla Rsshr Shift Right 1010-D-S RD <= sra Rsadd Add Registers 1011-D-S RD <= RD + RS + Csub Subtract
Registers1100-D-S RD <= RD - RS - C
mul MultiplyRegisters
1101-D-S RD <= RD * Rs :8-bitnomnoženje
cmp Compare 1110-D-S RD, RS (ako je:Z=1; ako jeRD<RS: C=1)
mil Move Immd Low 1111-D-00-I RDL <= {8'bZ, I}mih Move Immd High 1111-D-01-I RDH <= {I, 8'bZ }spc Save PC 1111-D-10-I RD <= PC + Ijpa Jump Addressed 1111-D-ll-I PC <= RD + Ijpr Jump Relative 0000-01-11-I PC <= PC + Ibrz Branch if Zero 0000-10-00-I PC <= PC + I :ako je Z= 1
213
brc Branch if Carry 0000-10-01-I PC <= PC + I :ako je C= 1awp Add Win pntr 0000-10-10-I WP <= WP + I
Slika 1. Skup instrukcija SAYEH procesora
15 12 11 1 0 09 08 07 00 00OPCODE Left Right Immediate
Slika 2. Format instrukcije Nadalje će biti dat skup od 16 sekvenci instrukcija koje trebaju da budu analizirane.Odgovarajuće rezultate treba upisati u polje tabele.
Tabela 1. Programska sekvenca za studenta 1Instrukcija Sadržaj memorijske lokacije
Opcode Left Right Immediate
Aktivni signali
Sub R3,R4
Orr R2,R5Ccf Add R1,R7Sta (R2), R6
Tabela 2. Programska sekvenca za studenta 2Instrukcija Sadržaj memorijske lokacije
Opcode Left Right Immediate
Aktivni signali
Shl R5
And R3,R4Szf Add R1,R4Jpa
Tabela 3. Programska sekvenca za studenta 3Instrukcija Sadržaj memorijske lokacije
Opcode Left Right Immediate
Aktivni signali
214
Not R5
Mul R2,R7Cmp R3,R6Cwp Spc
Tabela 4. Programska sekvenca za studenta 4Instrukcija Sadržaj memorijske lokacije
Opcode Left Right Immediate
Aktivni signali
Shr R4
Shl R7Not R4Add R3,R4Lda R3,(R5)
Tabela 5. Programska sekvenca za studenta 5Instrukcija Sadržaj memorijske lokacije
Opcode Left Right Immediate
Aktivni signali
Mul R1,R7
Shl R4Sub R1,R6Mil R3Sta (R2), R6
Tabela 6. Programska sekvenca za studenta 6Instrukcija Sadržaj memorijske lokacije
Opcode Left Right Immediate
Aktivni signali
215
Add R1,R7
Not R7Shr R5Or R2,R6Mvr R3,R6
Tabela 7. Programska sekvenca za studenta 7Instrukcija Sadržaj memorijske lokacije
Opcode Left Right Immediate
Aktivni signali
Ccf
Mih R1And R2,R5Not R7Sta (R3), R6
Tabela 8. Programska sekvenca za studenta 8Instrukcija Sadržaj memorijske lokacije
Opcode Left Right Immediate
Aktivni signali
And R2,R5
Sub R1,R7Ccf Add R1,R5Lda R3,(R5)
Tabela 9. Programska sekvenca za studenta 9
216
Instrukcija Sadržaj memorijske lokacije
Opcode Left Right Immediate
Aktivni signali
Cwp
Awp Mul R1,R5Orr R2,R7Sta (R2), R7
Tabela 10. Programska sekvenca za studenta 10Instrukcija Sadržaj memorijske lokacije
Opcode Left Right Immediate
Aktivni signali
Shl R5
Shr R7Not R6Scf Brc
Tabela 11. Programska sekvenca za studenta 11Instrukcija Sadržaj memorijske lokacije
Opcode Left Right Immediate
Aktivni signali
And R1,R4
Not R4Mul R2,R5Szf Brz
Tabela 12. Programska sekvenca za studenta 12
217
Instrukcija Sadržaj memorijske lokacije
Opcode Left Right Immediate
Aktivni signali
Mul R0,R5
Not R6Orr R2,R7Shl R6Mvr R3,R6
Tabela 13. Programska sekvenca za studenta 13Instrukcija Sadržaj memorijske lokacije
Opcode Left Right Immediate
Aktivni signali
Shr R6
Ccf Add R0,R5Sub R1,R6Sta (R0), R7
Tabela 14. Programska sekvenca za studenta 14Instrukcija Sadržaj memorijske lokacije
Opcode Left Right Immediate
Aktivni signali
Shl R7
Not R5Sub R1,R6Szf Brz
Tabela 15. Programska sekvenca za studenta 15
218
Instrukcija Sadržaj memorijske lokacije
Opcode Left Right Immediate
Aktivni signali
And R0,R7
Ccf Add R0,R5Not R4Jpa
Tabela 16. Programska sekvenca za studenta 16Instrukcija Sadržaj memorijske lokacije
Opcode Left Right Immediate
Aktivni signali
Shl R5
Orr R1,R6Mul R2,R4Szf Sta (R2), R7
219
13.1. Pozivanje programa
Korak 1: Pokrenuti program Active-HDL 6.3 dvostrukim klikom na ikonicu smeštenu na desktop računara.
Korak 2: a) U prozoru Getting Started izabrati levim klikom miša opciju Open existing workspace. b) Levim klikom miša selektovati projekat Sayeh. c) Levim klikom na opciju Ok pozivamo program koji opisuje procesor Sayeh.
220
Slika uz korak 2
Posle koraka 2 otvara se prozor kao na narednoj slici:
221
Slika: Workspace (radni prostor) ' Sayeh '
13.2. Inicijalizacija memorije
Korak 1: a) U prozoru DESIGN BROWSER levim klikom miša izabrati komponentu memorija.vhd.
b) Desni klik u padajućem meniju na fajl označen crvenom ikonicom
222
memorija (memorija_arch). c) Levi klik u novodobijenom prozoru na opciju Set as Top-Level.
Slika uz korak 1
Korak 2: Levim klikom miša na ikonicu New Waveform označenu crvenom bojom otvara se polje Waveform Editor u koje se unose signali i njihove vrednosti.
Slika uz korak 2
Korak 3: Desnim klikom na polje Waveform Editor otvaramo novi prozor u kojem levim klikom odabiramo opciju Add Signals.
223
Slika uz korak 3
Korak 4: U desnom delu novodobijenog prozora nalaze se signali izabrane komponente. a) Desnim klikom miša u desnom delu prozora otvaramo novi prozor kao na slici. Levim klikom u novodobijenom prozoru na opciju Select All selektujemo prikazane signale.b) Levim klikom na opciju Add dodajemo selektovane signale polju Waveform Editor.
Slika uz korak 4Korak 5: a) Levim klikom na opciju line_47 u levom delu prozora, pojavljuje se promenljiva V= memorija_mem u desnom delu prozora. b) Levim klikom na promenljivu V= memorija_mem vršimo njeno selektovanje.
224
c) Levim klikom na opciju Add, polju Waveform Editor dodajemo prethodno selektovanu promenljivu V= memorija_mem.
Slika uz korak 5
Korak 6: Polje Waveform Editor izgleda kao na slici. Levim klikom na ikonicu Run označenu crvenom bojom startuje se simulacija.
Slika uz korak 6
Korak 7: a) Nakon levog klika mišem na opciju line_47 u prozoru DESIGN BROWSER,pojavljuje se promenljiva V=memorija_mem. b) Desnim klikom na promenljivu V=memorija_mem otvara se novi prozor kao na slici.
225
c) Levi klik na opciju Add_to_Memory_View.
Slika uz korak 7
Korak 8: Nakon klika na opciju Add_to_Memory_View, dobijamo prozor kao na slici. Mogućnost upisivanje željenog sadržaja u odgovarajuću memorijsku lokaciju obezbeđuje se dvostrukim klikom miša na memorijsku lokaciju, dok se unošenje željenog sadržaja vrši tastaturom.
Slika uz korak 8
Korak 9: a) Nakon unošenja odgovarajućih vrednosti (za zadatu programsku sekvencu), levim klikom na opciju Save označenu crvenom bojom javlja se prozor Save Memory View file.
226
b) U prozoru Save Memory View file u delu File name navodi se ime pod kojim će sadržaj memorijskih lokacija, nakon levog klika na opciju Save, ostati zapamćen (npr. memorija_(redni broj programske sekvence)).
Slika uz korak 9
13.3. Inicijalizacija registarskog polja
227
Korak 1: a) U prozoru DESIGN BROWSER levim klikom miša izabrati komponentu register file.vhd. b) Desni klik u padajućem meniju na fajl označen crvenom ikonicom register_ file(register_ file_arch). c) Levi klik u novodobijenom prozoru na opciju Set as Top-Level.
Slika uz korak 1
Korak 2: Levim klikom miša na ikonicu New Waveform označenu crvenom bojom otvara se polje Waveform Editor u koje se unose signali i njihove vrednosti.
Slika uz korak 2
Korak 3: Desnim klikom na polje Waveform Editor otvaramo novi prozor u kojem levim klikom odabiramo opciju Add Signals.
228
Slika uz korak 3
Korak 4: U desnom delu novodobijenog prozora nalaze se signali izabrane komponente. a) Desnim klikom miša u desnom delu prozora otvaramo novi prozor kao na slici. Levim klikom u novodobijenom prozoru na opciju Select All selektujemo prikazane signale.b) Levim klikom na opciju Add dodajemo selektovane signale polju Waveform Editor.
Slika uz korak 4
229
Korak 5: a) Levim klikom na opciju line_49 u levom delu prozora, pojavljuje se promenljiva V= ram_mem u desnom delu prozora. b) Levim klikom na promenljivu V= ram_mem vršimo njeno selektovanje. c) Levim klikom na opciju Add, polju Waveform Editor dodajemo prethodno selektovanu promenljivu V= ram_mem.
Slika uz korak 5
Korak 6: Polje Waveform Editor izgleda kao na slici. Levim klikom na ikonicu Run označenu crvenom bojom startuje se simulacija.
Slika uz korak 6
Korak 7: a) Nakon levog klika mišem na opciju line_49 u prozoru DESIGN BROWSER,
230
pojavljuje se promenljiva V=ram_mem. b) Desnim klikom na promenljivu V=ram_mem otvara se novi prozor kao na slici. c) Levi klik na opciju Add_to_Memory_View.
Slika uz korak 7
Korak 8: Nakon klika na opciju Add_to_Memory_View, dobijamo prozor kao na slici. Mogućnost upisivanje željenog sadržaja u odgovarajući registar registarskog polja obezbeđuje se dvostrukim klikom miša na polje registra, dok se unošenje željenog sadržaja vrši tastaturom.
Slika uz korak 8
231
Korak 9: a) Nakon unošenja željenih vrednosti, levim klikom na opciju Save označenu crvenom bojom javlja se prozor Save Memory View file. b) U prozoru Save Memory View file u delu File name navodi se ime pod kojim će sadržaj registara registarskog polja, nakon levog klika na opciju Save, ostati zapamćen (npr. ram_(redni broj programske sekvence)).
Slika uz korak 9
13.4. Testiranje procesora
232
Nakon inicijalizacije memorije i registarskog polja, možemo pristuputi testiranju sintetizovanog procesora. Korak 1: a) U prozoru DESIGN BROWSER levim klikom miša izabrati komponentu sayeh procesor.bde. b) Levim klikom miša u padajućem meniju izabrati komponentu sayeh procesor.vhd. c) Desnim klikom u padajućem meniju izabrati fajl označen crvenom ikonicom \ sayeh procesor \(\ sayeh procesor \). d) Levi klik u novodobijenom prozoru na opciju Set as Top-Level.
Slika uz korak 1
Korak 2: Levim klikom miša na ikonicu New Waveform označenu crvenom bojom otvara se polje Waveform Editor u koje se unose signali i njihove vrednosti.
Slika uz korak 2
Korak 3: Desnim klikom na polje Waveform Editor otvaramo novi prozor u kojem levim klikom odabiramo opciju Add Signals.
233
Slika uz korak 3
Korak 4: U desnom delu novodobijenog prozora nalaze se signali procesora SAYEH. Levim klikom na željeni signal vršimo njegovo selektovanje, dok se levim klikom na opciju Add selektovani signali dodaju polju Waveform Editor (npr. selektovati signale ExtReset, MemDatReady i clock)
Slika uz korak 4
234
Korak 5: a) Nakon levog klika u levom delu prozora na jedinicu U1: memorija (memorija_arch) i levog klika u padajućem meniju na opciju line_47, pojavljuje se promenljiva V= memorija_mem u desnom delu prozora. b) Levim klikom na promenljivu V= memorija_mem izvršiti njeno selektovanje. c) Levim klikom na opciju Add, polju Waveform Editor dodati prethodno selektovanu promenljivu V= memorija_mem.
Slika uz korak 5
Korak 6: a) Nakon levog klika u levom delu prozora na jedinicu U2: registar_file (registar_file_arch) i levog klika u padajućem meniju na opciju line_49, pojavljuje se promenljiva V= ram_mem u desnom delu prozora. b) Levim klikom na promenljivu V= ram_mem izvršiti njeno selektovanje. c) Levim klikom na opciju Add, polju Waveform Editor dodati prethodno selektovanu promenljivu V= ram_mem.
Slika uz korak 6
235
Korak 7: Selektovani signali ExtReset, MemDatReady i clock, kao i promenljive V= memorija_mem i V= ram_mem pojavljuju se u polju Waveform Editor kao na slici. Desnim klikom na signal ExtReset dobijamo novi prozor u kojem treba levim klikom izabrati opciju Stimulators.
Slika uz korak 7
Korak 7.1: a) U novootvorenom prozoru Stimulators levim klikom miša selektovati polje Value.
b) U polju Force value tastaturom uneti vrednost '1'. c) Levim klikom na opciju Apply signalu ExtReset dodeljujemo prethodno unetu vrednost.
236
Slika uz korak 7.1
Korak 7.2: a) U polju Waveform Editor selektovati signal MemDatReady levim klikom miša. b) U prozoru Stimulators levim klikom miša selektovati polje Value.
d) U polju Force value tastaturom uneti vrednost '1'. d) Levim klikom na opciju Apply signalu MemDatReady dodeljujemo prethodno unetu vrednost.
Slika uz korak 7.2
237
Korak 7.3: a) U polju Waveform Editor selektovati signal clock levim klikom miša. b) U prozoru Stimulators levim klikom miša selektovati polje Clock. c) Levim klikom na opciju Apply signalu clock dodeljujemo signal periode 100 ns (trajanje logičke jedinice je 50 ns; trajanje logičke nule je 50 ns). d) Levim klikom na opciju Close zatvaramo prozor Stimulators.
Slika uz korak 7.3
Korak 8: Levim klikom na ikonicu Run označenu crvenom bojom startuje se simulacija.
Slika uz korak 8
238
Korak 9: a) Nakon levog klika mišem u prozoru DESIGN BROWSER na jedinicu U1: memorija (memorija_arch) i levog klika u padajućem meniju na opciju line_47,pojavljuje se promenljiva V=memorija_mem. b) Desnim klikom na promenljivu V=memorija_mem otvara se novi prozor kao na slici. c) Levi klik na opciju Add_to_Memory_View.
Slika uz korak 9
Korak 10: Levim klikom na opciju Memory otvaramo novi prozor u kojem levim klikom selektujemo opciju Change Memory.
Slika uz korak 10
239
Korak 11: U prozoru Change Memory treba levim klikom miša izabrati opciju Load From File, a zatim i opciju Browse.
Slika uz korak 11
Korak 12: a) U prozoru Open memory block file levim klikom miša izabrati fajl u kojem je smeštena predhodno inicijalizovana memorija (inicijalizovanu memoriju za zadatu programsku sekvencu zapamtili smo pod imenom memorija.(redni broj programske sekvence)). b) Levim klikom na opciju Open, a zatim i levim klikom na opciju Ok u prozoru Change Memory sadržaj naše memorije postaje jednak sadržaju izabranog fajla.
Slika uz korak 12
240
Korak 13: a) Nakon levog klika mišem u prozoru DESIGN BROWSER na jedinicu U2: register_file (register_file_arch) i levog klika u padajućem meniju na opciju line_49,pojavljuje se promenljiva V=ram_mem. b) Desnim klikom na promenljivu V=ram_mem otvara se novi prozor kao na slici. c) Levi klik na opciju Add_to_Memory_View.
Slika uz korak 13Korak 14: Levim klikom na opciju Memory otvaramo novi prozor u kojem levim klikom selektujemo opciju Change Memory.
Slika uz korak 14
241
Korak 15: U prozoru Change Memory treba levim klikom miša izabrati opciju Load From File, a zatim i opciju Browse.
Slika uz korak 15
Korak 16: a) U prozoru Open memory block file levim klikom miša izabrati fajl u kojem je smešteno predhodno inicijalizovano registarsko polje (inicijalizovano registarsko polje zapamtili smo pod imenom ram.(redni broj programske sekvence)). b Levim klikom na opciju Open, a zatim i levim klikom na opciju Ok u prozoru Change Memory sadržaj registarskog polja postaje jednak sadržaju izabranog fajla.
Slika uz korak 16
242
Korak 17: Levim klikom na ikonicu Run označenu crvenom bojom pokrećemo simulaciju.
Slika uz korak 17
Korak 18: Desnim klikom na signal ExtReset dobijamo novi prozor u kojem treba levim klikom izabrati opciju Stimulators.
Slika uz korak 18
243
Korak 18.1: a) U novootvorenom prozoru Stimulators levim klikom miša selektujemo polje Value.
b) U polju Force value tastaturom unosimo vrednost '0'. c) Levim klikom na opciju Apply signalu ExtReset dodeljujemo prethodno unetu vrednost. d) Levim klikom na opciju Close zatvaramo prozor Stimulators.
Slika uz korak 18.1
Korak 19: Levim klikom na opciju Run oznašenu crvenom bojom pokrećemo izvršenje programske sekvence.
Slika uz korak 19
244
Korak 20: Testiranje završavamo levim klikom na ikonicu End simulation označenu crvenom bojom.
Slika uz korak 20
245
Literatura
Mile Stojčev – “RICS, CISC i DSP procesori”, Elektronski Fakultet Niš, 1997
Mile K. Stojčev, Saša S. Ristić, Miloš D. Krstić – “Zbirka zadataka iz mikroprocesora i mikroračunara”, Elektronski Fakultet Niš, 1999
Prof.dr Milunka Damnjanović (kao urednik) i grupa predavača na Elektronskom fakultetu u Nišu – “Praktikum laboratorijskih vežbanja iz projektovanja i testiranja elektronskih kola i sitema”, Elektronski Fakultet Niš, 2000
Dr Živko Tošić, Momčilo Randjelović − “Računari”
J.Mirkowski, M.Kapustka, Z.Skovronski, A.Biniszkiewicz − “Interactive VHDL Tutorial REV. 2.1”
K.Sobolewski, M.Ossysek − “Getting Started Guide”
246
247