240 likes | 364 Views
SEKVENCIRANJE MIKROINSTRUKCIJA. Kako se određuje sljedeća mikroinstrukcija?. 2 na čina sekvenciranja. MPC <=MPC+1 inkrementiranjem MPC-a i uslovni skokovi u mikroprogramu polja COND i ADRESA COND odlu čuje o sljedećoj adresi – izbor je (MPC +1) ili ADRESA
E N D
SEKVENCIRANJE MIKROINSTRUKCIJA Kako se određuje sljedeća mikroinstrukcija?
2 načina sekvenciranja • MPC<=MPC+1 inkrementiranjem MPC-a i • uslovni skokovi u mikroprogramu • polja COND i ADRESA • COND odlučuje o sljedećoj adresi –izbor je (MPC+1) ili ADRESA • svaka mikroinstrukcija može imati dvije nasljednice!
-SEKVENCIJALNA LOGIKA • Određuje sljedeću adresu mikroinstrukcije za vrijeme četvrtog podciklusa • Tada su ALU izlazi N i Z stabilni • Na osnovu COND upravlja MMUX-om
Lijevi bit Desni bit Sljedeća adresa 0 0 1 1 0 1 0 1 Nema skoka - MPC+1 Skok na ADRESA ako je N=1 Skok na ADRESA ako je Z=1 Skok na ADRESA COND polje Mmux = /LRN + L/RZ + LR Mmux = RN + LZ + LR
MAKROARHITEKTURA OGLEDNOG PROCESORA (programski model) • Memorijski prostor 4096 16-bitnih riječi • 3 registra dostupna programeru (PC, AC i SP), a ostale vidi mikroprogramer!!!
3 načina adresiranja: DIREKTNO (12-bitno polje za apsolutnu adresu) za pristup globalnim varijablama INDIREKTNO(izračunata adresa u AC) za pristup nizovima, tabelama itd. i LOKALNO (8-bitni offset u odnosu na SP) za pristup lokalnim varijablama. Sva tri načina su jednostavna i efikasna!!!
Binarni kod Mnemonik Instrukcija Značenje 0000 xxxx xxxx xxxx LODD Napuni direktno ac:=m(x) 0001 xxxx xxxx xxxx STOD Smjesti direktno m(x):=ac 0010 xxxx xxxx xxxx ADDD Dodaj direktno ac:=ac+m(x) 0011 xxxx xxxx xxxx SUBD Oduzmi direktno ac:=ac-m(x) 0100 xxxx xxxx xxxx JPOS Skoči ako je (ac)0 if (ac) 0 then pc:=x 0101 xxxx xxxx xxxx JZER Skoči ako je (ac)=0 if (ac)=0 then pc:=x 0110 xxxx xxxx xxxx JUMP Bezuslovan skok pc:=x 0111 xxxx xxxx xxxx LOCO Napuni konstantu ac:=x (0 x 4096) 1000 xxxx xxxx xxxx LODL Napuni lokalno ac:=m(sp+x) 1001 xxxx xxxx xxxx STOL Smjesti lokalno m(sp+x):=ac 1010 xxxx xxxx xxxx ADDL Saberi lokalno ac:=ac+m(sp+x) 1011 xxxx xxxx xxxx SUBL Oduzmi lokalno ac:=ac-m(sp+x) 1100 xxxx xxxx xxxx JNEG Skoči ako je (ac)0 if (ac)0 then pc:=x SKUP INSTRUKCIJA OGLEDNOG PROCESORA
1101 xxxx xxxx xxxx JNZE Skoči ako je (ac)0 If (ac) 0 then pc:=x 1110 xxxx xxxx xxxx CALL Poziv procedure sp:=sp-1; m(sp):=pc; pc:=x 1111 0000 0000 0000 PSHI Smjesti na stek indirektno sp:=sp-1; m(sp):=m(ac) 1111 0010 0000 0000 POPI Pokupi sa steka indirektno m(ac):=m(sp); sp:=sp+1 1111 0100 0000 0000 PUSH Smjesti na stek sp:=sp-1; m(sp):=ac 1111 0110 0000 0000 POP Pokupi sa steka ac:=m(sp); sp=sp+1 1111 1000 0000 0000 RETN Povratak iz procedure pc:=m(sp); sp:=sp+1 1111 1010 0000 0000 SWAP Zamijeni sadržaj AC i SP tmp:=ac; ac:=sp; sp:=tmp 1111 1100 yyyy yyyy INSP Inkrementiraj SP sp:=sp+y (0y255) 1111 1110 yyyy yyyy DESP Dekrementiraj SP sp:=sp-y (0y255) SKUP INSTRUKCIJA OGLEDNOG PROCESORA II
U/I prostor? • Ogledni procesor nema U/I instrukcija • U/I uređaji su u memorijskom prostoru - memorijski preslikani (mapirani).
MIKROPROGRAM • Mikroprogram je program koji se izvršava na mikroarhitekturi i interpretira instrukcije procesora • Pisanje mikroprograma/mikroinstrukcija u binarnoj formi - nije pogodno ! • Potreban je simbolički jezik za pisanje
Simbolički jezik • Za sabiranje sadržaja AC i A registara i smještaj rezultata u AC može se pisati ENC = 1, C = 1, B = 1, A = 10 (adr. A-reg.) Bolje je to izraziti “mikroasemblerskom” instrukcijom koji se jednoznačno pretvara u mašinsku mikroinstrukciju ac:=a+ac
Ostale ALU operacije... • a:=band (ir,smask) operacija (A B) • ac:=a operacija A • a:=inv(a) operacija /A • logičko pomijeranje lshift - pomjeranje lijevo jedno mjesto npr. tir:= lshift (tir + tir) rshift - pomjeranje desno jedno mjesto.
Skokovi u mikroprogramu • "goto“ – bezuslovni skok • uslovni - testiranjem N/Z - if n then goto 27 • Dodjeljivanja i skokovi se mogu pisati u istoj liniji • Samo za testiranje vrijednosti - "alu" alu:= tir; if n then goto 27 čitanja/pisanja memorije samo sa "rd" ili"wr"
Mikroasembler Mikroinstrukcija AMUX COND A LU SH MBR MAR RD WR ENC C B A A D R mar:=pc; rd 0 0 2 0 0 1 1 0 0 0 0 0 00 Rd 0 0 2 0 0 0 1 0 0 0 0 0 00 ir:=mbr 1 0 2 0 0 0 0 0 1 3 0 0 00 pc:=pc+1 0 0 0 0 0 0 0 0 0 1 0 6 00 mar:=ir; mbr:=ac; wr 0 0 2 0 1 1 0 1 0 0 3 1 00 alu:=tir; if n then goto 15 0 1 2 0 0 0 0 0 0 0 0 4 15 ac:=inv(mbr) 1 0 3 0 0 0 0 0 1 1 0 0 00 tir:=lshift(tir); if n then goto 25 0 1 2 2 0 0 0 0 2 4 0 4 25 alu:=ac; if z then goto 22 0 2 2 0 0 0 0 0 0 0 0 1 22 ac:=band(ir,amask); goto 0 0 3 1 0 0 0 0 0 1 1 8 3 00 sp:=sp+(-1); rd 0 0 0 0 0 0 1 0 1 2 2 7 00 tir:=lshift(ir+ir); if n then goto 69 0 1 0 2 0 0 0 0 1 4 3 3 69
MIKROPROGRAM OGLEDNOG PROCESORA • Osim PC, AC i SP, registri imaju uloge: • -IR - instrukcijski registar, • -TIR - privremeni IR - služi za dekodiranje ... • -0, +1 i -1 - registri sa ožičenim konstantama, • -AMASK - adresna maska #0FFF za direktno ad. • - SMASK - stek-maska #00FF za lokalno adres. • Ostalih 6 registara nemaju posebnu namjenu i na raspolaganju su mikroprogrameru!
Sadržaj mikroprograma • 0 mar:=pc; rd; glavna petlja - čitanje instrukcije • 1 pc:=pc+1; rd;inkr. PC-a i drugi ciklus čitanja • 2 ir:=mbr; if n then goto 28;početak dekodiranja instrukcije 1XXX ili 0XXX • 3 tir:=lshift(ir+ir); if n then goto 19; prvo ALU pa shifter, 00XX ili 01XX? • 4 tir:=lshift (tir); if n then goto 11; 000X ili 001X ?
5 alu:=tir; if n then goto 9; 0000 ili 0001 ? • 6 mar:=ir; rd; 0000 - LODD instrukcija • 7 rd; • 8 ac:=mbr; goto 0; • 9 mar:=ir; mbr:=ac; wr;0001 -STOD instrukcija • 10 wr; goto 0; • 11 alu:=tir; if n then goto15; 0010 ili 0011 ? • 12 mar:=ir;rd; 0010 - ADDD instrukcija • 13 rd; • 14 ac:=mbr+ac; goto 0;
15 mar:=ir; rd; 0011 - SUBD ! • 16 ac:=ac+1; rd; (X-Z=X+1+ /Y) • 17 a:=inv(mbr); • 18 ac:=ac+a; goto 0; • 19 tir:=lshift(tir); if n then goto 25; 010X ili 011X ? • 20 alu:=tir; if n then goto 23; 0100 ili 0101 ? • 21 alu:=ac; if n then goto 0; 0100 - JPOS ! • 22 pc:=band(ir, amask); goto 0; skok ako AC 0 • 23 alu:=ac; if z then goto 22;0101 - JZER ! • 24 goto 0;
25 alu:=tir; if n then goto 27; 0110 ili 0111 ? • 26 pc:=band(ir,amask); goto 0;0110 - JUMP ! • 27 ac:=band(ir,amask); goto 0;0111 - LOCO ! • 28 tir:=lshift(ir+ir); if n then goto 40; 10XX ili 11XX ? • 29 tir:=lshift(tir); if n then goto 35; 100X ili 101X ? • 30 alu:=tir; if n then goto 33; 1000 ili 1001 ? • 31 a:=ir+sp; 1000 - LODL ! • 32 mar:=a; rd; goto 7; (nema maskiranja OPCOD-a !) ; na 7 se dovrši instrukcija
33 a:=ir+sp; 1001 - STOL instrukcija! • 34 mar:=a; mbr:=ac; wr; goto 10; dovrši na 10 • 35 alu:=tir; if n then goto 38; 1010 ili 1011 ? • 36 a:=ir+sp; 1010 - ADDL instrukcija! • 37 mar:=a; rd; goto 13; • 38 a:=ir+sp; 1011 - SUBL instrukcija! • 39 mar:= a; rd; goto 16; • 40 tir:=lshift(tir); if n then goto 46; 110X ili 111X ? • 41 alu:=tir; if n then goto 44; 1100 ili 1101 ? • 42 alu:=ac; if n then goto 22; 1100 - JNEG ! • 43 goto 0;
44 alu:=ac; if z then goto 0; 1101 - JNZE ! • 45 pc:=band(ir,amask); goto 0; skok • 46 tir:=lshift(tir); if n then goto 50; 1110 ili 1111 ? • 47 sp:=sp+(-1); 1110 - CALL instrukcija! • 48 mar:=sp; mbr:=pc; wr; • 49 pc:=band(ir,amask); wr; goto 0; • 50 tir:=lshift(tir); if n then goto 65; 1111 - ispitati sljedeća 3 bita • 51 tir:=lshift(tir); if n then goto 59; • 52 alu:=tir; if n then goto 56; • 53 mar:=ac; rd; 1111 000 - PSHI instrukcija! • 54 sp:=sp+(-1); rd; mbr <- (ac); • 55 mar:=sp; wr; goto 10; mbr ->> m(sp-1); • 56 mar:=sp; sp:=sp+(+1); rd; 1111 001 - POPI ! • 57 rd; ;mbr <- (sp) • 58 mar:=ac; wr; goto 10; mbr -> m(ac)
59 alu:=tir; if n then goto 62; 1111 010 ili 1111 011 ? • 60 sp:=sp+(-1); 1111 010 - PUSH instrukcija • 61 mar:=sp; mbr:=ac; wr; goto 10; • 62 mar:=sp; sp:=sp+(+1); rd; 1111 011 - POP instrukcija • 63 rd; • 64 ac:=mbr; goto 0; • 65 tir:=lshift(tir); if n then goto 73; 1111 10X ili 1111 11X ? • 66 alu:=tir; if n then goto 70; 1111 100 ili 1111 101 ? • 67 mar:=sp; sp:=sp+(+1); rd; 1111 100 - RETN instrukcija • 68 rd; • 69 pc:=mbr; goto 0; • 70 a:=ac; 1111 101 - SWAP instrukcija • 71 ac:=sp; • 72 sp:=a; goto 0; • 73 alu:=tir; if n then goto 76; 1111 110 ili 1111 111 ? • 74 a:=band(ir,smask); 1111 110 - INSP instrukcija • 75 sp:=sp+a; goto 0; • 76 a:=band(ir,smask); 1111 111 - DESP instrukcija • 77 a:=inv(a); • 78 a:=a+(+1); goto 75;
Diskusija... • PC se inkrementira u liniji 1 iako se to moglo uraditi i u liniji 0, ostavljajući liniju 1 za neke druge poslove (npr. traže li U/I uređaji obradu, DMA, refresh i sl.). • Ako se linija 1 ne promijeni, procesor se može ubrzati promjenom linije 8 u: mar := pc; ac:= mbr; rd; goto 1; • Time se počinje donošenje sljedeće instrukcije prije završetka tekuće - jednostavna forma protočne strukture (engl. pipeline). • puno vremena gubi u dekodiranju instrukcija !