VI. SZOFTVERES PROGRAMOZÁSÚ VLSI ÁRAMKÖRÖK 1
Az adatok feldolgozását végezhetjük olyan általános rendeltetésű digitális eszközökkel, amelyeket megfelelő szoftverrel (programmal) vezérelünk. A mai digitális technikában Ilyen eszközök a mikroprocesszorok, a mikrovezérlők és a szignál processzorok. Összetettségüket tekintve ezek az eszközök a nagyon nagy integráltságú (VLSI) kategóriába tartoznak. A programmal történő vezérlés lehetővé teszi a kívánt algoritmus végrehajtását lépésről lépésre. 2
VI.1. SZOFTVERES ADATFELDOLGOZÓ EGYSÉG ÁLTALÁNOS FELÉPÍTÉSE A szoftveres adatfeldolgozó egység adatokat fogad, tárol, dolgoz fel és továbbít a kimenet felé, programmal meghatározott algoritmus szerint. Az ilyen adatfeldolgozó egység (nevezik digitális számítógépnek is) általános rajzát az ábrán láthatjuk. 3
4
KÖZPONTI FELDOLGOZÓ EGYSÉG (CPU) 5
A műveleteket az ALU (arithmetic-logic unit aritmetikai-logikai egység) hajtja végre. A lehetséges műveleteket/utasításokat rendszerint úgy alakítják ki, hogy minél kevesebb írást kelljen végezni a memóriába, illetve minél kevesebb olvasást kelljen végezni a memóriából. Ezt a célt szolgálják az ALU különböző regiszterei, a velük végzett műveletek sokkal gyorsabbak. 6
Az ALU regiszterek közül kiemelendő az ún. akkumulátor (Akku), rendszerint itt tároljuk az egyik vagy az egyetlen operandust és a művelet végeredményét is. Az ALU működését az CU (control unit vezérlő egység) irányítja. Ennek fő része az utasítás dekódoló és végrehajtó egység, de néhány regiszter is tartozik hozzá. 7
A PC (program counter programszámláló) regiszter a következő végrehajtandó utasítás memória-címét tartalmazza. Sorban végzett utasításoknál minden utasítás elvégzésekor növelni kel eggyel a programszámláló tartalmat. Szükség esetén a szoftver ugrásokat végezhet, ilyenkor a programszámlálóba a következő utasítás címét kell betölteni. 8
Az IR (instruction register utasítás regiszter) fogadja a memóriából érkező műveleti kódokat és operandusokat (amelyekkel műveletet kell végezni). Az itt megjelenő utasítás-kódot érzékeli az utasítás dekódoló és végrehajtó egység, majd az ALU-val elvégezteti a műveletet. Az MA regiszter a memória címeket tárolja, az MD regiszter az írandó vagy a kiolvasott adatokat tartalmazza. 9
VI.2. OPERATÍV MEMÓRIA A szoftveres adatfeldolgozó egység a félvezető memóriában tárolt program alapján működik és a memóriában tárolt adatokat dolgozza fel. Ilyen értelemben szükség van adatmemóriára és programmemóriára. Ezek együttesen alkotják az operatív memóriát. 10
A Neumann János általa javasolt megoldásnál (Neumann architektúra) ugyanabban a memóriaegységben tároljuk a programokat és az adatokat is. Az elektronikus számítógépek fejlesztésének hajnalán ez tűnt a célszerű megoldásnak, mert egyszerűsíti a hardvert. 11
Idővel elterjedt a Harvard architektúra is, amely elkülöníti a programmemóriát az adatmemóriától. Ez ugyan több hardvert kíván, de gyorsítani tudja a működést. Lehetséges egy időben beolvasni az utasítást a programmemóriából és a vele kapcsolatos adato(ka)t az adatmemóriából. 12
A memória és a CPU az ábra szerint kapcsolódik egymáshoz. A címvonalak és az adatvonalak mellett szükség van bizonyos vezérlőjelekre is, amelyek meghatározzák az adatforgalom irányát és engedélyezik a kommunikációt. A címvonalak száma a memória kapacitásától függ: n címvonallal 2 n adatot lehet megcímezni, pl. 16 címvonalra 64 kb nagyságú memóriát lehet kötni. Az adatvonalak száma a szóhosszal egyenlő. 13
14
VI.2. A SZOFTVERES ADATFELDOLGOZÓ EGYSÉG MŰKÖDÉSE A különböző egységek időbeli összehangolását az órajel végzi, ezért erről szólunk először. Ezt követően áttekintjük, hogy milyen lépések szükségesek egy-egy utasítás végrehajtásához, majd csoportosítjuk az utasításokat, áttekintjük az adatok címzésének hagyományosan használatos módozatait. 15
AZ ÓRAJEL SZEREPE A CPU egy szinkron működésű állapotgép: a végrehajtott összes művelet pontos időrendben történik. A szinkronizálást az órajel végzi. Az órajel egy periodikus négyszögjel, rendszerint néhány MHz-től néhány 100MHz-ig terjedhet a frekvenciája. Egyes processzorok egy órajel ciklus alatt egy utasítást végeznek el. Mások a külső órajelet leosztják bizonyos arányban és a műveletek egyes részleteit végzik csak a külső órajel egy periódusában. 16
AZ UTASÍTÁSOK VÉGREHAJTÁSA Ha például egy adatot be szeretnénk olvasni az akkumulátor regiszterbe, az a következő lépésekből áll: Ø A programszámláló (PC) tartalma az MA címregiszterbe kerül. Ennek hatására az adatvonalakon megjelenik az utasítás kódja és az MD regiszteren keresztül az utasítás regiszterbe (IR) kerül. Ø A programszámláló értéke eggyel nő, hogy a következő memória rekeszre mutasson, ahol a beolvasandó adat van tárolva. 17
Ø Az utasítás dekódoló és végrehajtó egység értelmezi a művelet kódját. Ø A beolvasandó adat címe a programszámlálóból (PC) az MA regiszterbe jut, onnan pedig a memória címvonalaira. Az adatvonalakon megjelenő adat az MD regiszteren keresztül beíródik az akkumulátorba. Ø A programszámláló (PC) értéke megint eggyel nő, hogy a következő utasításra mutasson és elkezdődjön annak végrehajtása. 18
Típustól függően egyes processzorok mindössze néhányszor tíz utasítást (műveletet) tudnak végrehajtani, ezt a megközelítést RISC (reduced instruction set csökkentett utasítás készlet) architektúrának nevezzük. Más CPU-k ismerhetnek néhány száz utasítást is. Az utasítás kód hosszabb vagy rövidebb az utasítások száma szerint. 19
A következő utasítás csoportokat szokásos megkülönböztetni: Ø bináris aritmetikai műveletek (összeadás, kivonás...), Ø logikai műveletek (ÉS, VAGY...), Ø regiszter műveletek (jobbra-balra léptetés, inkrementálás, dekrementálás...) 20
Ø biteken végzett műveletek (a regiszter egyes bitjeinek nullára vagy egyesre állítása...) Ø adatátviteli műveletek (a memória és a regiszterek vagy a kimeneti/bemeneti egységek és a regiszterek között). Ø ugró utasítások (feltételes vagy feltétel nélküli). 21
CÍMZÉSI LEHETŐSÉGEK Az utasítások végrehajtása közben a CPU egy vagy több operanduson végez műveletet. Az operandusok lehetnek valamelyik regiszterben vagy a memóriában. Az operandusokat megfelelő címek megadásával érjük el. A címzés egyszerű, ha valamelyik belső regiszter vesz részt a műveletben, ilyenkor már rendszerint az utasítás kódja tartalmazza a címet. Más esetekben a címet a memóriából kell beolvasni. 22
A gyakorlatban a következő címzési módszerek terjedtek el: Direkt regiszter címzés: a műveleti kód rámutat egy regiszterre, amelyben az operandus van. 23
Direkt rekesz címzés: az operandus a memóriában van, a memóriarekesz címe része az utasításnak (címrész lehet az utasítást követő rekeszben is). 24
Indirekt memória címzés: az utasítás címrészében egy memóriarekesz címe van. Az operandus címe az illető memóriarekeszből olvasható ki. Indirekt regiszter címzés: az utasítás címrészében egy regiszterre hivatkozunk, ebben a regiszterben van a memóriarekesz címe. 25
26
Relatív bázisregiszteres címzés: az utasítás címrésze egy regiszterre mutat, de tartalmaz egy eltolási értéket is. Az operandust tartalmazó memóriarekesz címét a regiszter tartalmának és az eltolási értéknek az összeadásával kapja a CPU. 27
Közvetlen (immediate) címzés: az operandus az utasítás része vagy a memóriában közvetlenül az utasítás utáni rekeszben van. 28
A GÉPI NYELV Az adatfeldolgozó egység (mikroprocesszor, mikrovezérlő) memóriájába tölthető utasítássor bináris kódokból áll. Az ilyen programot gépi nyelven történő programozásnak nevezzük. Az egyes utasítás kódok bitsorait a processzor közvetlenül értelmezni tudja és végrehajtja. Például a 0010 bitsor értelmezhető összeadásként, a 0011 bitsor pedig kivonásként. Gépi programozás esetén az operandusok és az operandusok címei is bináris formában vannak jelen. 29
AZ ASSEMBLY NYELV Tekintettel a gépi nyelven történő programozással kapcsolatos nehézségekre, a gépi kódokat rövid szavakkal (mnemonik) helyettesítjük. Például, az összeadási utasítást a bináris kód helyett ADD szóval írjuk le, a regiszter tartalmának eggyel történő növelését INC szóval stb. Az operandusoknak is nevet adunk, pl. az akkumulátor regisztert A-val jelöljük, a C operandus címét ADRC-vel stb. 30
Az assembly nyelven írt programok rendszerint három oszlopból állnak, esetleg kommentár is beilleszthető a harmadik oszlop után, ahogyan az ábrán láthatjuk. Az első oszlopba címkéket írunk, amelyeket fordítás közben az assembler memóriacímekkel fog helyettesíteni. A második oszlopban vannak az utasítások mnemonikjai, a harmadik oszlopban az operandusok nevei. 31
32
Az assembly program nem tölthető közvetlenül a processzor memóriájába, hanem le kell fordítani gépi nyelvre. Ezt egy fordítóprogram, az assembler végzi. A fordítás valójában egyszerű helyettesítésekből áll. Az assembly nyelv és az assembler is géptől függő, az egyik processzorra írt programot nem-, vagy csak átalakítások árán tudjuk telepíteni másik gépre. Időben kritikus programokat, pl. perifériák kezelését szokták ma is assembly nyelven írni. 33
MAGASABB SZINTŰ PROGRAMNYELVEK Ismerve a gépi nyelvvel és az assembly nyelvvel kapcsolatos nehézségeket, célszerű a programozást olyan, magasabb szintű, nyelven végezni, amely egyrészt nem gépfüggő, másrészt közelebb van az emberi nyelvhez, ill. az emberi gondolkodáshoz. Ilyen nyelvek a C, C+, UNIC, JAVA... A magasabb szintű nyelven írt programot is gépi nyelvre kell fordítani, ahhoz, hogy futtatni lehessen. Az ilyen fordítóprogramot compiler-nek nevezzük. A fordítás vagy egy lépésben történik, vagy a magasabb szintű nyelvről először assembly nyelvre, majd a második lépésben gépi nyelvre. 34
VI.3. MIKROPROCESSZOR CSALÁDOK Az első mikroprocesszorok órajel frekvenciája 100 khz nagyságrendű volt, mindössze néhány kbyte memóriát tudtak címezni, 16 vagy 18 kivezetéssel készültek. 1974-ben jelent meg az Intel 8080-as mikroprocesszora, amely már 64 kbyte-ot tudott címezni, 2 MHz-es órajellel működött, meglehetősen bő utasításkészlettel rendelkezett. 35
MOTOROLA 6800 A Motorola cég kevéssel az Intel 8080-as után (1974) vezette be 6800-as típusjelzésű, nyolcbites mikroprocesszort. Az itt alkalmazott architektúra fontos pedagógiai szempontból is, de a később megjelenő 68HC05, 68HC08 és 68HC11 jelzésű mikrovezérlők megértéséhez is. A 40 kivezetéses tokozásban 16 bites címvonalas és nyolc adatvonalas CPU helyezkedik el. 36
A modern mikroprocesszorokban és mikrovezérlőkben szokásos regiszterek mind jelen vannak már ebben a processzorban: programszámláló (PC program counter), veremmutató (SP - stack pointer), két akkumulátor regiszter (ACCA és ACCB), index regiszter, állapotregiszter (CCR-condition code register). 37
Háromféle megszakítás lehetséges: nem letiltható, letiltható és szoftveres. A szoftveres megszakítás azonnali ugrásokat tesz lehetővé olyan alprogram címre, amelyet a főprogramnak nem szükséges ismernie. A mikrovezérlő az ugrás címét a memóriában őrzött megszakítás vektorból olvassa ki. A címek 16 bitesek, így két memóriarekeszt foglalnak el a következő táblázat szerint: 38
AZ INTEL 8086 MIKROPROCESSZOR CSALÁD Az 1978-ban bevezetett 8086-os család a hírnevét jórészt annak köszönheti, hogy az IBM a személyi számítógépeihez ezt a mikroprocesszort választotta. A számítógépipar fejlődésével párhuzamosan folyt a mikroprocesszor továbbfejlesztése is: megjelentek a 32 bites (80386, Pentium) és a 64 bites (Itanium) változatok. Az egyszerűbb alkalmazásokra készült a 8088-as, kívülről szemlélve nyolcbites változat. 39
A 16 bites regiszterek egy részénél az egyes byte-ok külön is kezelhetők. A memóriatartományt 1 Mbyte-ra tervezték (20 címvonal). A 20 bites címet egy 16 bites cím és egy pointer regiszter tartalmának összeadásával kapjuk. Ez az eljárás szegmentált memóriához vezet, és némileg bonyolítja a memória elérését, de az utasítások megfelelő kialakításával definiálták, hogy melyik regiszterek segítségével hozható létre a teljes cím. 40
41