BUDAPESTI MŰSZAKI ÉS GAZDASÁGTUDOMÁNYI EGYETEM VILLAMOSMÉRNÖKI ÉS INFORMATIKAI KAR MÉRÉSTECHNIKA ÉS INFORMÁCIÓS RENDSZEREK TANSZÉK Digitális technika VIMIAA02 9. hét Fehér Béla BME MIT Processzor adatstruktúrák DIGITÁLIS RENDSZEREK ÁLTALÁNOS FELÉPÍTÉSE: ADATSTRUKTÚRA + VEZÉRLÉS Vezérlés: Minden feladatra egységes általános elv De természetesen egyedi állapotdiagram, jelek, stb. Adatstruktúra: Egyedi felépítés, feladatorientált kialakítás Megmaradt a HW párhuzamos, időben konkurens működése
Processzor adatstruktúrák ADATSTRUKTÚRA + VEZÉRLÉS Adatstruktúra: Ahány feladat, annyi architektúra Lehetne itt is általánosítani? Valószínűleg igen Feladjuk a párhuzamos működés előnyét az egyszerű tervezhetőség érdekében Sok elemi művelet időben sorban egymás után, lehetőleg ugyanazt a HW-t használva Processzor adatstruktúrák Milyen legyen az általános adatstruktúra? Komponensek: adattárolók, műveletvégzők, huzalozás Adattárolók: Önálló regiszterek: bármelyik adat bármikor elérhető/tölthető : korlátozott számú adat érhető el (1,2,3) Stack: csak a stack teteje érhető el (1,2) Műveletvégzők: Egyedi elemek, közvetlen egyedi bemenetekkel Többfunkciós egység, funkcióválasztással és bemeneti operátor kiválasztással (ADD/SUB/COMP, AND/OR/XOR) Általános státuszjelek a művelet eredményéről (Z/C/N/V) Huzalozás: Bemenet/ kimenet kiválasztás/aktiválás Belső adatutak, operandus kiválasztás
Processzor adatstruktúrák Milyen legyen az általános adatstruktúra? Szabványosítás: Adatméret: minden legyen adat azonos méretű pl. 8 bit Egyedi jelek lehetnek egy bitvektor elemei, beolvasunk 8 bitet, és maszkoljuk a kívánt bitpozíciót Az eddigi külső vezérlőjelek (pl. START) is adatbemenetként kezelhetőek, beolvashatóak, tesztelhetőek és a teszt eredménye szerint használhatóak a vezérlési feladat végrehajtására A kimeneti jelek hasonlóan egységesen kezelhetők, 8 bites bitvektorok közvetlenül, egyedi bitek bitpozíció beállítással kiadhatók A vezérlő egység kimenete (pl. READY) is így kezelhető Processzor vezérlés Az általános adatstruktúra jól használható, de képességei korlátosan érvényesíthetők Egy ütemben egy változó módosulhat Ez erősen szekvenciális végrehajtást jelent A vezérléshez az ASM működési modell csökkentett képessége bőven elegendő Nem jelent lényeges előnyt az általános FSM/HLSM tetszőleges állapotátmeneti képessége ASM állapotátmenetek: CONT: folytatás (ez az alapértelmezett mód) JUMP: ugrás tetszőleges állapotra (saját magára is) CJMP: elágazás, feltételes ugrás tetszőleges állapotra Feltétel nem teljesülése esetén CONT, folytatás
Processzor vezérlés ASM algoritmikus állapotvezérlővel A vezérlő ebben az esetben lehet egy egyszerű számlálón alapuló vezérlőegység: programszámláló (, Program Counter) Az állapotátmenetek vezérlése: CONT: <= + 1; // számláló INC JUMP : <= LABEL; // számláló LOAD CJMP : if (COND) then <= LABEL // LOAD else <= +1 // INC Ezt a feladatot egy inicializálható, tölthető bináris felfelé számláló tudja biztosítani RESET-re = 0, vagy a csupa 1, azaz 0xFFFF Processzor vezérlés ASM algoritmikus állapotvezérlővel A vezérlőjelek tehát nem közvetlenül a értékéből származnak, (annak állapota nem direktben kódolja azokat), hanem a tartalma megcímzi és kiolvassa a programmemóriában található utasítás szót (FETCH), és az utasításszó tartalmazza a kódolt vezérlőjeleket (annyi biten, amennyi a formátumba belefér), ezt az utasítás dekóder értelmezi (DECODE) és juttatja el az adatstruktúra felé végrehajtásra (EXECUTE). Tehát az adatstruktúra vezérlőjel generálás folyamata: új érték FETCH DECODE EXECUTE Ez történik a processzor vezérlő egységében
Processzor műveletvégzés alapú adatstruktúra kiegészítése be- /kimeneti interfésszel (memória, periféria) Általános tulajdonságok: Minden adatot először beírunk a regisztertömbbe Műveletet csak a regiszter adatokon végzünk Létezik közvetlen adat programkódból A részeredményeket visszaírjuk A végeredményt kiadjuk Ezt hívjuk LOAD/STORE felépítésnek A regisztertömb mérete Szélesség: 8/16/32/64 bit Mélység: 16/32/64 regiszter Több regiszter több reg. címbit (ut. méret) Több regiszter kevesebb extra adatmozgatás A 32 bites utasításméret jó kompromisszum Processzor műveletvégzés Az adatstruktúra műveleti egysége: : Aritmetikai Logikai Egység Műveleti képességek (utasítás készlet) Aritmetikai (ADD, SUB, INC, DEC.) Logikai (AND, OR, XOR, NOT ) Léptetés (SHL, SHR, ASH ) Forgatás (ROL, ROR, ) Feltétel vizsgálat (COMP, TST, ) Egyszerű adatmozgatás (MOV, LD, ST) Minden művelet a szabványos adatméreten 8 / 16 / 32 / 64 bit, az adott rendszer jellemzője Kisebb adatméret: operandus/eredmény maszkolása Nagyobb adatméret: Átvitelbit használatával kiterjesztett műveletvégzés
Processzor műveletvégzés felépítése 1. verzió: Minden feladatra külön áramkör, a kimeneten MUX hálózattal nem gazdaságos 2. verzió: Sok feladat egyetlen összeadóval + a bemeneten speciális kiegészítés az adatelőkészítésre Kivonás: Kettes komplemens képzéssel Inkrementálás: 1 hozzáadása (pl. Ci) Dekrementálás: 1 kivonása Léptetés balra: önmagával összeadás Konkrét áramköri megoldások eltérőek Közös vonás: Néhány bites vezérlés: FUN bitek Operandus kiválasztás: REG1, REG2 cím Bemenet/kimenet előválasztás MUX vez Összegzés Tetszőleges digitális rendszer: Általános rendszerterv: adatstruktúra + vezérlés Processzoros rendszerek: Általános processzor adatstruktúra + ASM alapú egyszerűsített processzor vezérlőegység A vezérlési állapot indirekt megadása: (programmemória cím) programtár olvasás (aktuális utasítás) dekódolt vezérlő jelek származtatása és végrehajtás Továbblépés: = +1 vagy esetleg (feltételes) ugrás Egységesített adatméret és be-/kimeneti interfészek LOAD/STORE működés, külső vagy memória adatok regiszterbe töltődnek használat előtt
MiniRISC processzor - Bevezetés 8 bites vezérlőegység egyszerű alkalmazásokhoz Jól illeszkedik a LOGSYS Spartan-3E FPGA kártya komplexitásához Egyszerű felépítés, kis erőforrásigény Harvard architektúra 256 x 16 bites programmemória 256 x 8 bites adatmemória Egyszerű RISC jellegű utasításkészlet Load/store architektúra Műveletvégzés csak regisztereken 16 x 8 bites belső regisztertömb MiniRISC mintarendszer LED ek DIP kapcsoló A bővítőcsatlakozó B bővítőcsatlakozó 128 x 8 bites adatmemória (0x00 0x7F) basic_owr (0x80) basic_in (0x81) basic_io (0x84 0x87) basic_io (0x88 0x8B) MiniRISC CPU Adatmem. interfész Debug Prg. mem. Debug modul 256 x 16 bites programmemória slave_usrt (0x8E 0x8F) USRT basic_display (0x90 0x9F) basic_timer (0x8C 0x8D) basic_in (0x82) JTAG nyomógombok fejlesztői és kommunikációs port kijelzők
MiniRISC processzor Felépítése követi az adatstruktúra-vezérlő szemléletet : az utasítások beolvasása, feldolgozása és ennek megfelelően az adatstruktúra vezérlése Adatstruktúra: műveletek végrehajtása az adatokon RD WR DIN jelek Adatstruktúra Feltétel jelek MiniRISC processzor MiniRISC processzor adatstruktúra működése DIN RD WR DIN RD WR DIN RD WR MUX MUX MUX olvasás (load) Lokális adat átalakítása ( művelet) írás (store)
MiniRISC processzor A működés bemutatása egy egyszerű példán Példa: DMEM[3] = DMEM[0] + DMEM[1], ez négy adatstruktúra műveletet igényel: 1. REG[0] = DMEM[0] (load) 2. REG[1] = DMEM[1] (load) 3. REG[1] = REG[0] + REG[1] ( művelet) 4. DMEM[3] = REG[1] (store) Utasítás: a processzor által végrehajtható művelet Program: utasítások sorozata A végrehajtandó feladatot a processzor által támogatott utasításokra kell lebontani A programot a programmemória tárolja A vezérlőegység beolvassa az utasításokat és végrehajtja azokat az adatstruktúrán Programszámláló (Program Counter, ): a beolvasandó utasítás címét állítja elő Utasításregiszter (Instruction Register, ): a beolvasott utasítást tárolja vezérlő jelek feltétel jelek MiniRISC processzor Minden egyes utasítás végrehajtásánál a vezérlőegységnek a következő lépéseket kell elvégeznie: Lehívás (fetch): az utasítás beolvasása a programmemóriából és a növelése Dekódolás (decode): a művelet és az operandusok meghatározása Végrehajtás (execute): az utasításhoz tartozó művelet végrehajtásra kerül az adatstruktúrán A vezérlő lehet például egy állapotgép A fenti lépésekhez a vezérlő állapotgép egy-egy állapota rendelhető hozzá Ekkor egy utasítás végrehajtása három órajelciklust igényel vezérlő jelek feltétel jelek
MiniRISC processzor teljes blokkvázlata A részletes felépítést lásd a Verilog forráskódban DIN RD WR Q Számláló 0x00 0x01 ugrási cím Verem Z,C,N,V Z,C,N,V IE bit IF bit vezérlő jelek MUX1 WrX RdX RdY Debug modul Break állapotgép Int_req feltétel jelek MiniRISC processzor 8 bites konstans ugrási cím OP1 Adatstruktúra MUX2 OP2 MiniRISC processzor működése DMEM[0]=5 DMEM[1]=2 DMEM[2]=0 DMEM[3]=0 DIN RD WR 0 1 REG[0]=DMEM[0] 1 REG[0]=DMEM[0] 1 REG[0]=DMEM[0] MUX LOAD LOAD REG[0]=? 5 REG[1]=? REG[2]=? Adatstruktúra Utasítás lehívása Dekódolás Végrehajtás
MiniRISC processzor működése DMEM[0]=5 DMEM[1]=2 DMEM[2]=0 DMEM[3]=0 DIN RD WR 1 2 REG[1]=DMEM[1] 2 REG[1]=DMEM[1] 2 REG[1]=DMEM[1] MUX LOAD LOAD REG[0]=5 REG[1]=? 2 REG[2]=? Adatstruktúra Utasítás lehívása Dekódolás Végrehajtás MiniRISC processzor működése DMEM[0]=5 DMEM[1]=2 DMEM[2]=0 DMEM[3]=0 DIN RD WR 2 3 R[1] = R[0] + R[1] 3 R[1] = R[0] + R[1] 3 R[1] = R[0] + R[1] MUX ADD ADD REG[0]=5 REG[1]=2 7 REG[2]=? 5 2 5 + 2 = 7 7 Adatstruktúra Utasítás lehívása Dekódolás Végrehajtás
MiniRISC processzor működése DMEM[0]=5 DMEM[1]=2 DMEM[2]=0 DMEM[3]=0 7 DIN RD WR 3 4 DMEM[3]=REG[1] 4 DMEM[3]=REG[1] 4 DMEM[3]=REG[1] MUX STORE STORE REG[0]=5 REG[1]=7 REG[2]=? Adatstruktúra Utasítás lehívása Dekódolás Végrehajtás MiniRISC processzor utasításai A programmemória bináris kód formájában tartalmazza a végrehajtandó utasításokat (gépi kód, assembly kód) Magasabb szintű leírást a processzor nem tud értelmezni Minden utasítás tartalmazza a művelet leírását és a művelet elvégzéséhez szükséges egyéb adatokat művelet (4 bit) regisztercím (4 bit) memóriacím (8 bit) Cím Művelet Gépi kód (16 bit) Assembly kód 0: REG[0] = DMEM[0] 1101000000000000 MOV r0, 0x00 1: REG[1] = DMEM[1] 1101000100000001 MOV r1, 0x01 2: REG[1] =REG[0] + REG[1] 1111000100000000 ADD r1, r0 3: DMEM[3] = REG[1] 1001000100000011 MOV 0x03, r1
MiniRISC assembler A MiniRISC processzor felhasználói programjait alacsonyszintű (gépközeli) programnyelven készíthetjük el és fordíthatjuk futtatható bináris kódra. Az assembly nyelven megírt programok lefordítása a LOGSYS MiniRISCv2-as assemblerrel lehetséges Konkrét programfejlesztési részletek az előadás végén MiniRISC kódgenerálás az assemblerrel Fordítás eredménye: Generált lista fájl: demo_add.lst
MiniRISC kódgenerálás az assemblerrel A generált memória tárgykód fájlok: kódfájl: code.hex 256 db 16 bites utasításkód kódfájl: data.hex 128 db 8 bites adat A kész kódfájlokat futtatás előtt a MiniRISC mintarendszer megfelelő memóriájába le kell tölteni. code.hex data.hex MiniRISC IDE - Programfejlesztés Futtatás: Szimulátorban Hardveren Fordítás és letöltés Végrehajtás vezérlése Forráskód szerkesztő tartalma USRT terminál Kijelző vezérlőpanel GPIO vezérlőpanel Periféria vezérlőpanel: LED ek, DIP kapcsoló Nyomógombok Assembler konzol CPU állapot:, flag ek, verem teteje, regiszterek tartalma Végrehajtott utasítások száma Elfogadott megszakításkérések száma
MiniRISC IDE - Programfejlesztés Digitális technika 9. EA vége