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
COND polje Lijevi bit Desni bit Sljedeća adresa 1 Nema skoka - MPC+1 1 Nema skoka - MPC+1 Skok na ADRESA ako je N=1 Skok na ADRESA ako je Z=1 Skok na ADRESA 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!!!
SKUP INSTRUKCIJA OGLEDNOG PROCESORA 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 II 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)
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 D R mar:=pc; rd 2 1 00 Rd ir:=mbr 3 pc:=pc+1 6 mar:=ir; mbr:=ac; wr alu:=tir; if n then goto 15 4 15 ac:=inv(mbr) tir:=lshift(tir); if n then goto 25 25 alu:=ac; if z then goto 22 22 ac:=band(ir,amask); goto 0 8 sp:=sp+(-1); rd 7 tir:=lshift(ir+ir); if n then goto 69 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;
mar := pc; ac:= mbr; rd; goto 1; 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 !
HORIZONTALNO ILI VERTIKALNO MIKROPROGRAMIRANJE?