Slovenská technická univerzita
Fakulta informatiky a informačných technológií
Ilkovičova 3, 842 16 Bratislava 4
Milan Korenica
Návrh digitálnych systémov
Návrh štruktúry aplikačno-špecifického procesora
Ročník: 5.
Školský rok: 2005/2006
Obsah
Obsah 3
1. Špecifikácia správania 4
1.1 Prvé zjemnenie 4
1.2 Druhé zjemnenie 7
1.3 Stavový automat 11
1.4 Testovacie okolie 12
2. Opis štruktúry 14
2.1 Graf toku údajov 14
2.2 Návrh štruktúry operačnej časti 15
2.3 Graf toku riadenia 17
2.4 Konečný stavový stroj riadiacej jednotky 17
3. Poznámky k implementácii 20
1. Špecifikácia správania 1.1 Prvé zjemnenie
V prvom zjemnení sme globálny proces zjemnili na niekoľko procesov zodpovedajúcich jednotlivým insštrukciám. K stavovým premenným pribudol register AW (Address Word), ktorý uchováva druhú časť inštrukcie v prípade inštrukcií LD, ST a BRZ.
System PROC43-J1 // prvé zjemnenie špecifikácie
DT udaj [cele cislo <-215,+215-1>, operacia + je v dvojkovom doplnkovom kode];
subor_udajov pole P[0-7] udaj;
adresa [nezaporne cislo <0, 220-1>; operacia + je mod 220]
konstanta cele cislo <-29,+29-1> c dopln. kode;
cislo_reg nezaporne cislo <0, 7>;
signal bollovska hodnota {0,1}
instr_symbol symbol{ADD,ADI,NAND,SLT,LD,ST,BRZ,JRE};
instrukcia1 zaznam
opkod: instr_symbol є {ADD,NAND,SLT,JRE};
reg1: cislo_reg;
reg2: cislo_reg;
reg3: cislo_reg;
instrukcia2 zaznam
opkod: instr_symbol є {ADI};
reg1: cislo_reg;
konst: konstanta;
instrukcia3 zaznam
opkod: instr_symbol є {LD,ST,BRZ};
reg1: cislo_reg;
adresa: adresa; //4+16 byte
r_stav є {OD, AF, IF}
PORTY
vstup D data, instrukcia1, instrukcia2, instrukcia3;
Res signal;
Wait, Clk signal;
vystup D data;
A adresa;
Rd/Wr, Req signal;
OPER STAV
PC adresa;
R pole[0-7] udaj; //registre
IR instrukcia;
AW udaj; // druha cast instrukcii LD, ST a BRZ
Contr r_stav;
proces PrGlobal = Reset.
[ReadInstr.(
(IR.opkod=ADD): ANDoper,
(IR.opkod=NAND): NANDoper,
(IR.opkod=SLT): SLToper,
(IR.opkod=ADI): ADIoper,
(IR.opkod=LD): ReadAddr.LDoper,
(IR.opkod=ST): ReadAddr.SToper,
(IR.opkod=BRZ): ReadAddr.BRZoper,
(IR.opkod=JRE): JREoper )]ω;
agent ReadInstr
SI Contr = IF;
TE es, up(CLK=1), ef;
KM (u; es; u). (Wait=0; ; u)*. (Wait=1 ; ;u).(Wait=1; ; A=PC, Rd/Wr=1, Req=1)+ .(Wait=0, D=d ; ; Req=1).(Wait=0; ; Req=0)*.(Wait=1;ef; Req=0);
g IR := d; // IR obsahuje inštrukciu
PC := PC+1;
Contr := OD;
agent ADDoper
SI Contr = OD;
TE es, up(CLK=1), ef;
KM (u; es; u)(u; ef; u);
g R[IR.reg3] := R[IR.reg1] + R[IR.reg2];
Contr := IF;
agent NANDoper
SI Contr = OD;
TE es, up(CLK=1), ef;
KM (u; es; u).(u ; ef ; u);
g R[IR.reg3] := R[IR.reg1] nand R[IR.reg2];
Contr := IF;
agent SLToper
SI Contr = OD;
TE es, up(CLK=1), ef;
KM (u; es; u).(u ; ef ; u);
g R[IR.reg3] := ak < tak 1 inak 0;
Contr := IF;
agent ADIoper
SI Contr = OD;
TE es, up(CLK=1), ef;
KM (u; es; u).(u ; ef ; u);
g R[IR.reg1] := R[IR.reg1] + IR.konst;
Contr := IF;
agent ReadAddr
SI Contr = OD;
TE es, up(CLK=1), ef;
KM u; es; u). (Wait=0; ; u)*. (Wait=1 ; ;u).(Wait=1; ; A=PC, Rd/Wr=1, Req=1)+ .(Wait=0, D=d ; ; Req=1).(Wait=0; ; Req=0)*.(Wait=1;ef; Req=0);
g AW := d; //druha cast instrukcie
PC := PC + 1; // inkrementujeme PC, lebo toto je druhe slovo instrukcie
Contr := AF;
agent LDoper
SI Contr = AF;
TE es, up(CLK=1), ef;
KM (Wait=1; es; u).(Wait=1 ; ; A= IR[3-0].AW, Req=1, Rd/Wr=1) +
.(Wait=0, D=d ; ; Req=1). (u; ef ; Req=0)
g R[IR.reg1] := d;
Contr := IF;
agent SToper
SI Contr = AF;
TE es, up(CLK=1), ef;
KM (Wait=1; es; u).(Wait=1; ;A=IR[3-0].AW, D=R[IR.reg1], Rd/Wr=0, Req=1)+
.(Wait=0 ; ; A= IR[3-0].AW, D=R[IR.reg1], Rd/Wr=0, Req=1).
.(Wait=0 ; ; A= IR[3-0].AW, D=R[IR.reg1] , Req=0, Rd/Wr=1)
. (u; ef ; Req=0)
g Contr := IF;
agent BRZoper
SI Contr = AF;
TE es, up(CLK=1), ef;
KM (u; es; u).(u ; ef ; u);
g PC := ak = 0 tak IR[3-0].AW inak PC;
Contr := IF;
agent Reset
TE es, ef;
KM (u;es;u)(u;ef;u);
g PC := 0;
START
PrGlobal (ez or (up(Clk=1) and Res))
1.2 Druhé zjemnenie
V druhom zjemnení sme agenty pre jednotlivé insštrukcie rozložili na agenty obsahujúce jednu mikrooperáciu. Do operačného stavu pribuli registre MAR (záchytný register pre adresu) a MBR (záchytný register pre dáta). Takýto zápis popisuje systém na úrovni medziregistrových prenosov.
System PROC43-J2 // druhé zjemnenie špecifikácie
DT udaj [cele cislo <-215,+215-1>, operacia + je v dvojkovom doplnkovom kode];
subor_udajov pole P[0-7] udaj;
adresa [nezaporne cislo <0, 220-1>; operacia + je mod 220]
konstanta cele cislo <-29,+29-1> c dopln. kode;
cislo_reg nezaporne cislo <0, 7>;
signal bollovska hodnota {0,1}
instr_symbol symbol{ADD,ADI,NAND,SLT,LD,ST,BRZ,JRE};
instrukcia1 zaznam
opkod: instr_symbol є {ADD,NAND,SLT,JRE};
reg1: cislo_reg;
reg2: cislo_reg;
reg3: cislo_reg;
instrukcia2 zaznam
opkod: instr_symbol є {ADI};
reg1: cislo_reg;
konst: konstanta;
instrukcia3 zaznam
opkod: instr_symbol є {LD,ST,BRZ};
reg1: cislo_reg;
adresa: adresa; //4+16 byte
r_stav є {OD, AF, IF}
PORTY
vstup D data, instrukcia1, instrukcia2, instrukcia3;
Res signal;
Wait, Clk signal;
vystup D data;
A adresa;
Rd/Wr, Req signal;
OPER STAV
PC adresa;
R pole[0-7] udaj; //registre
IR instrukcia;
AW adresa; // adresa z instrukcii LD, ST a BRZ
MAR adresa;
MBR udaj;
Contr r_stav;
proces PrGlobal = Reset.[PrInstrRead.(
(IR.opkod=ADD):PrAdd;
(IR.opkod=NAND):PrNAND;
(IR.opkod=SLT):PrSLT;
(IR.opkod=ADI):PrADI;
(IR.opkod=LD):PrLD;
(IR.opkod=ST):PrST;
(IR.opkod=BRZ):PrBRZ);
(IR.opkod=JRE):PrJRE)] ω;
proces PrInstRead = (LdMAR || IncrPC)[EA](Wait=1)[SetMRd](Wait=0) [LdIR](Wait=1);
proces PrReadAddr = (LdMAR || IncrPC)[EA](Wait=1)[SetMRd](Wait=0) [SetAW](Wait=1);
proces PrADD = ADDop;
proces PrNAND = NANDop;
proces PrSLT = (R[IR.reg1]=R[IR.reg2]): Set0reg3;
proces PrADI = ADIop;
proces PrLD = PrReadAddr.MovAdd-MAR.[SetMRd](Wait=0).StReg1(Wait=1);
proces PrST = PrReadAddr.(MovAdd-MAR || LdMBR).[SetMWr](Wait=0).Set0Req(Wait=1);
proces PrBRZ = PrReadAddr. (R[IR.reg1]=0):MovAdd-PC, (R[IR.reg1] != 0):EA;
proces PrJRE = JREop;
agent LdMAR
TE es,ef;
KM (u;es;u)(u;ef;u);
g MAR := PC
agent IncrPC
TE es, ef;
KM (u;es;u)(u;ef;u);
g PC := PC + 1
agent SetMRd
TE es, ef;
KM (Wait=1;es;A=MAR,Req=1,Rd/Wr=1).(u;ef;u)
g MBR := d
agent LdIR
TE es, ef;
KM (Wait=0;es;u).(u;ef;Req=0);
g IR := MBR;
agent SetAW
TE es, ef;
KM (Wait=0;es;u).(u;ef;Req=0);
g AW := MBR;
agent ADDop
TE es, ef;
KM (u;es;u)(u;ef;u);
g R[IR.reg3] := R[IR.reg1] + R[IR.reg2];
agent NANDop
TE es, ef;
KM (u;es;u)(u;ef;u);
g R[IR.reg3] := R[IR.reg1] nand R[IR.reg2];
agent Set1reg3
TE es, ef;
KM (u;es;u)(u;ef;u);
g R[IR.reg3] := 1;
agent Set0reg3
TE es, ef;
KM (u;es;u)(u;ef;u);
g R[IR.reg3] := 0;
agent ADIop
TE es, ef;
KM (u;es;u)(u;ef;u);
g R[IR.reg1] := R[IR.reg1] + IR.konst;
agent MovAdd-MAR //adresa sa sklada z 4+16 bitov
TE es,ef;
KM (u;es;u)(u;ef;u);
g MAR := IR[3-0].AW;
agent StReg1
TE es,ef;
KM (u;es;u)(u;ef;Req=0);
g R[IR.reg1] := MBR;
agent LdMBR
TE es, ef;
KM (u;es;u)(u;ef;u);
g MBR := R[IR.reg1];
agent SetMWr
TE es, ef;
KM (Wait=1;es;A=MAR,D=MBR,Rd/Wr=0,Req=1).(u;ef;A=MAR,D=MBR);
agent Set0Req
TE es, ef;
KM (wait=0;es; A=MAR,D=MBR,Rd/Wr=1,Req=0)(u;ef;Req=0);
agent MovAdd-PC
TE es,ef;
KM (u;es;u)(u;ef;u);
u PC := IR[3-0].AW;
agent JREop
TE es, ef;
KM (u;es;u)(u;ef;u);
g PC := ;
agent Reset
TE es, ef;
KM (u;es;u)(u;ef;u);
g PC := 0;
START
PrGlobal (ez or (up(Clk=1) and Re));
1.3 Stavový automat
Stavový automat je skonštruovaný z druhého zjemnenia špecifikácie. Prehľadne zobrazuje stavy systému, vstupné predikáty a vykonávané operácie. Z tohto stavového automatu vychádza aj simulácia správania v jazyku VHDL.
Stav
|
Vstupný vektor
|
Nasl.
stav
|
Mikrooperácie
|
Podprocesy
V PrGlobal
|
RES
|
U
|
IF0
|
Reset
|
|
IF0
|
U
|
IF1
|
LdMAR || IncrPC
|
PrInstrRead
|
IF1
|
Wait=0
|
IF1
|
EA
|
IF1
|
Wait=1
|
IF2
|
|
IF2
|
Wait=1
|
IF2
|
SetMRd
|
IF2
|
Wait=0
|
IF3
|
|
IF3
|
Wait=0
|
IF3
|
LdIR
|
IF3
|
Wait=1
|
OD
|
|
OD
|
IR.opkod=ADD
|
ADD0
|
|
|
OD
|
IR.opkod=NAND
|
NAND0
|
|
OD
|
IR.opkod=SLT
|
SLT0
|
|
OD
|
IR.opkod=ADI
|
ADI0
|
|
OD
|
IR.opkod=LD
|
PRA0
|
|
OD
|
IR.opkod=ST
|
PRA0
|
|
OD
|
IR.opkod=BRZ
|
PRA0
|
|
|
OD
|
IR.opkod=JRE
|
JRE0
|
|
ADD0
|
u
|
IF0
|
ADDop
|
PrADD
|
NAND0
|
u
|
IF0
|
NANDop
|
PrNAND
|
SLT0
|
R[IR.reg1] |
SLT1
|
|
PrSLT
|
SLT0
|
R[IR.reg1]>=R[IR.reg2]
|
SLT2
|
|
SLT1
|
u
|
IF0
|
Set1reg3
|
SLT2
|
u
|
IF0
|
Set0reg3
|
ADI0
|
u
|
IF0
|
ADIop
|
PrADI
|
PRA0
|
u
|
PRA1
|
LdMAR || IncrPC
|
PrReadAddr
|
PRA1
|
Wait=0
|
PRA1
|
EA
|
PRA1
|
Wait=1
|
PRA2
|
|
PRA2
|
Wait=1
|
PRA2
|
SetMRd
|
PRA2
|
Wait=0
|
PRA3
|
|
PRA3
|
Wait=0
|
PRA3
|
SetAW
|
PRA3
|
Wait=1,IR.opkod=LD
|
LD0
|
|
PRA3
|
Wait=1,IR.opkod=ST
|
ST0
|
|
PRA3
|
Wait=1,IR.opkod=BRZ
|
BRZ0
|
|
LD0
|
u
|
LD1
|
MovAdd-MAR
|
PrLD
|
LD1
|
Wait=1
|
LD1
|
SetMRd
|
LD1
|
Wait=0
|
LD2
|
|
LD2
|
Wait=0
|
LD2
|
StReg1
|
LD2
|
Wait=1
|
IF0
|
|
ST0
|
u
|
ST1
|
MovAdd-MAR
|
PrST
|
ST1
|
Wait=1
|
ST1
|
SetMWr
|
ST1
|
Wait=0
|
ST2
|
|
ST2
|
Wait=0
|
ST2
|
Set0Req
|
ST2
|
Wait=1
|
IF0
|
|
BRZ0
|
R[IR.reg1]=0
|
BRZ1
|
|
PrBRZ
|
BRZ0
|
R[IR.reg1]!=0
|
IF0
|
|
BRZ1
|
u
|
IF0
|
MovAdd-PC
|
JRE0
|
u
|
IF0
|
JREop
|
PrJRE
|
|
1.4 Testovacie okolie
Aby bolo možné simulovať správanie procesora, bolo potrebné vytvoriť opis správania okolia. Stavový stroj tohto okolia je nasledovný.
Tab. 2: Stavový automat okolia procesora
Stav
|
Vstupný vektor
|
Nasl. stav
|
Operácie
|
RES
|
u
|
NOP
|
Wait:=1
|
NOP
|
Req=0
|
NOP
|
|
NOP
|
Req=1,RdWr=1
|
DREQ
|
D:=M[A]
|
NOP
|
Req=1,RdWr=0
|
DREQ
|
M[A]:=D
|
DREQ
|
Req=1
|
DREQ
|
|
DREQ
|
down(CLK=0)
|
DONE
|
Wait:=0
|
DONE
|
Req=1
|
DONE
|
|
DONE
|
Req=0
|
NOP
|
Wait:=1
|
Do pamäte je vložený krátky program, ktorý otestuje všetky inštrukcie:
0: LD 0 [32]
2: ADI 0 1101b
3: SLT 0 1 2
4: LD 3 [34]
6: LD 4 [35]
8: ADD 3 4 5
9: NAND 3 4 6
10: ST 5 [34]
12: LD 7 [33]
14: BRZ 7 [17] – preskoci jedno slovo
17: LD 6 [33]
19: JRE 6 7 - skok na zaciatok
data:
32: "1010101010101010"
33: "0000000000000000"
34: "0000000000101100"
35: "0000000000000110"
36: "0000000000001011"
2. Opis štruktúry
2.1 Graf toku údajov
Na obrázku 1 je graf toku údajov môjho procesora.
Obr. 1: Graf toku údajov
2.2 Návrh štruktúry operačnej časti
Na obrázku 2 je návrh štruktúry operačnej časti. Riadiace vstupy prvkov nie sú v schéme uvedené kvôli prehľadnosti. Popis prvkov je uvedený nižšie.
Premenné sú reprezentované registrami. Všetky registre majú spoločné označenie niektorých riadiacich vstupov s rovnakou funkciou, preto sú značenia týchto vstupov uvedené len raz a pri ostatných prvkoch je spomenutý len ich výskyt.
MAR je štandardný 20 bitový register. Má jeden dátový vstup a jeden výstup. Má riadený výstup signálom OE a vstup signálom LD.
PC je 20 bitový register. Tak, ako MAR má riadený vstup a výstup, má však aj synchrónny reset R a má riadiaci vstup I pre inkrementovanie o 1. V prípade pretečenia sa pokračuje od 0 a prenos sa neuvažuje.
IR je štandardný 16 bitový register s riadeným vstupom aj výstupom. Výstup je však rozdelený na jednotlivé skupiny bitov podľa významu v inštrukcii. R1, R2 a R3 sú čísla registrov, K je konštanta a A je adresa. V reálnej implementácii nie je potrebné vyrábať takýto register, tieto skupiny bitov sa dajú oddeliť zo samotných výstupov, v schéme je to spravené pre názornosť.
AW je štandardný 16 bitový register s riadeným vstupom a výstupom.
MBR je taktiež štandardný 16 bitový register s riadeným vstupom a výstupom. Keďže má ale dva vstupy a dva výstupy, ktoré sa oba pripájajú na jeden port registra, má na každý vstup a výstup dva uvoľňovacie hradlá a má teda štyri riadiace signály: DOE na zápis hodnoty z registra na dátový výstup procesora, DLD na zápis do registra z dátového vstupu procesora, BOE na výstup hodnoty z registra na vnútornú dátovú zbernicu operačnej časti a BLD na zápis hodnoty z tejto zbernice do registra.
Aritmeticko-logická jednotka ALU operačnej časti má dva 16 bitové vstupy 1 a 2 pre vstup operandov a jeden 16 bitový výstup výsledku R. Riadiaci vstup F má dva bity a vyberá funkciu ALU: sčítanie, logický súčin, porovnanie vstup 1 < vstup 2 a porovnanie vstup 1 >= „0“. Hodnota výsledku v prípade prvých dvoch operácií je súčet resp. logický súčin vstupov 1 a 2. Pri porovnaní vstupov je výstup nasledovný: ak vstup 1 je menší ako vstup 2, na výstupe je hodnota „1“, inak je tam hodnota „0“. Pri porovnaní s nulou sa výstup nenastaví (odpojí sa od zbernice) ale nastaví sa jednobitový signál C: ak vstup 1 je menší ako nula, C je log1, inak log0.
Banka registrov R je presne taká, ako v špecifikácii.
V návrhu sú dva multiplexory M1 a M2 2 na 1, každý z nich je riadený jednobitovým riadiacim vstupom. Tieto prepínajú vstupy do banky registrov a do ALU.

Doplňujúce informácie k štruktúre operačnej časti: Priamy výstup registra R1 na dátovú zbernicu je hradlovaný signálom R-OE, výstup z ALU je riadený signálom ALU-OE. Taktiež výstup adresy na adresnú zbernicu kombinovaný z IR a AW je riadený signálom AOE1, výstup adresy kombinovaný z registrov R1 a R2 je riadený signálom AOE2. Uvoľňovacie signály OE registrov IR a AW tým pádom nie je potrebné nastavovať.
2.3 Graf toku riadenia
Obr. 3 zobrazuje graf toku riadenia v navrhovanom procesore.
Riadiaca jednotka má nasledovné vstupy a výstupy:
Vstupy: Reset, Wait, IR.opkod, C, Clk
Výstupy: Req, RdWr, MAR-OE, MAR-LD, PC-OE, PC-LD, PC-R, PC-I, IR-LD, AW-LD, MBR-DOE, MBR-BOE, MBR-DLD, MBR-BLD, F, R-OE, ALU-OE, RegWr, M1, M2, AOE1, AOE2
Signály sú označené systémom súčiastka-signál. C je výstup ALU, nastavovaný komparátorom porovnávajúcim na nulu. PC-R je synchrónny reset PC, PC-I je inkrementovanie o 1. F je vstup ALU vyberajúci funkciu. RegWr je signál zápisu do registra.
Samotný FSM špecifikujúci správanie riadiacej jednotky je v tab. 1. Pri každom stave sú uvedené len tie výstupy, ktoré je v tom stave potrebné nastaviť na konkrétnu hodnotu, pri ostatných je hodnota nešpecifikovaná.
FSM riadiacej časti je takmer zhodný s FSM celého procesora z kap. 1.3. Sú tu však dve zmeny: operácia SLT sa vďaka špeciálnemu návrhu ALU vošla do jedného stavu. Naproti tomu operáciu BRZ opäť kvôli návrhu ALU bolo potrebné rozšíriť o jeden stav.

Tab. 1: Konečný stavový stroj riadiacej jednotky
Stav
|
Vstup
|
Nasl. stav
|
Výstupy
|
RES
|
Res=1
|
IF0
|
PC-R=1
|
IF0
|
|
IF1
|
MAR-LD=1, PC-OE=1, PC-I=1
|
IF1
|
Wait=0
|
IF1
|
|
IF1
|
Wait=1
|
IF2
|
|
IF2
|
Wait=1
|
IF2
|
MAR-OE=1, MBR-DLD=1, Req=1, RdWr=1
|
IF2
|
Wait=0
|
IF3
|
|
IF3
|
Wait=0
|
IF3
|
IR-LD=1, MBR-BOE=1, Req=0
|
IF3
|
Wait=1
|
OD
|
|
OD
|
IR.opkod=ADD
|
ADD
|
|
OD
|
IR.opkod=NAND
|
NAND
|
|
OD
|
IR.opkod=SLT
|
SLT
|
|
OD
|
IR.opkod=ADI
|
ADI
|
|
OD
|
IR.opkod=LD
|
PRA0
|
|
OD
|
IR.opkod=ST
|
PRA0
|
|
OD
|
IR.opkod=BRZ
|
PRA0
|
|
OD
|
IR.opkod=JRE
|
JRE
|
|
ADD
|
|
IF0
|
F=0, ALU-OE=1, RegWr=1, M1=1, M2=0
|
NAND
|
|
IF0
|
F=1, ALU-OE=1, RegWr=1, M1=1, M2=0
|
ADI
|
|
IF0
|
F=0, ALU-OE=1, RegWr=1, M1=0, M2=1
|
SLT
|
|
IF0
|
F=2, ALU-OE=1, RegWr=1, M1=1, M2=0
|
JRE
|
|
IF0
|
PC-LD=1, AOE2=1
|
PRA0
|
|
PRA1
|
MAR-LD=1, PC-OE=1, PC-I=1
|
PRA1
|
Wait=0
|
PRA1
|
|
PRA1
|
Wait=1
|
PRA2
|
|
PRA2
|
Wait=1
|
PRA2
|
MAR-OE=1, MBR-DLD=1, Req=1, RdWr=1
|
PRA2
|
Wait=0
|
PRA3
|
|
PRA3
|
Wait=0
|
PRA3
|
AW-LD=1, MBR-BOE=1, Req=0
|
PRA3
|
Wait=1
|
IF0
|
|
LD0
|
|
LD1
|
MAR-LD=1, AOE1=1
|
LD1
|
Wait=1
|
LD1
|
MAR-OE=1, MBR-DLD=1, Req=1, RdWr=1
|
LD1
|
Wait=0
|
LD2
|
|
LD2
|
Wait=0
|
LD2
|
MBR-BOE=1, RegWr=1, M1=0
|
LD2
|
Wait=1
|
IF0
|
|
ST0
|
|
ST1
|
MAR-LD=1, AOE1=1, MBR-BLD=1, R-OE=1
|
ST1
|
Wait=1
|
ST1
|
MAR-OE=1, MBR-DOE=1, Req=1, RdWr=0
|
ST1
|
Wait=0
|
ST2
|
MAR-OE=1, MBR-DOE=1, Req=1, RdWr=0
|
ST2
|
Wait=0
|
ST2
|
MAR-OE=1, MBR-DOE=1, Req=0, RdWr=1
|
ST2
|
Wait=1
|
IF0
|
|
BRZ0
|
|
BRZ1
|
F=4
|
BRZ1
|
C=1
|
BRZ2
|
|
BRZ1
|
C=0
|
IF0
|
|
BRZ2
|
|
IF0
|
PC-LD=1, AOE=1
| 3. Poznámky k implementácii
Implementácia je rozdelená do štyroch súborov s VHDL kódom:
-
proc_behavior.vhd – obsahuje opis procesora správaním
-
proc_oc_rc.vhd – obsahuje opis procesora pomocou operačnej časti (štruktúrou) a riadiacej časti (správaním)
-
konv.vhd – konverzné funkcie na prevod medzi std_logic a integer typmi
-
okolie.vhd – opis okolia správaním
Súbory je potrebné kompilovať do knižnice work, pretože je v kóde priamo vyžadované jej použitie. Súbor proc_behavior.vhd aj proc_oc_rc.vhd obsahuje tesbench, ktorý testuje daný návrh.
V implementácii nie je premenná IR reprezentovaná štruktúrou, ale binárnym vektorom. Na jednej strane to zjednodušuje implementáciu, na druhej strane to však zhoršuje čitateľnosť. Je tiež potrebné poznať formát inštrukcií, preto ho na tomto mieste uvediem:
instrukcia1:
bity
|
15 - 13
|
12 - 10
|
9 - 7
|
6 - 4
|
|
pole
|
opkod
|
reg1
|
reg2
|
reg3
|
|
instrukcia2:
bity
|
15 - 13
|
12 - 10
|
9 - 0
|
pole
|
opkod
|
reg1
|
konst
|
instrukcia3:
bity
|
15 - 13
|
12 - 10
|
|
3 - 0
|
pole
|
opkod
|
reg1
|
|
adresa (prvé 4 bity)
|
Dostları ilə paylaş: |