MISKOLCI EGYETEM GÉPÉSZMÉRNÖKI ÉS INFORMATIKAI KAR
SZAKDOLGOZAT
ARM Cortex M0 mag alapú beágyazott rendszer FPGA Spartan 6 alapú rendszeren Nagy Szilárd
Tervezésvezető: Dr. Vásárhelyi József ME Automatizálási és Infokommunikációs Intézeti Tanszék
Miskolc, 2015
NAGY SZILÁRD
1. TARTALOMJEGYZÉK 1.
Tartalomjegyzék .................................................................................................. 2
2.
Bevezetés ............................................................................................................. 4
3.
Fejlesztő eszközök............................................................................................... 5
4.
3.1.
XILINX ISE környezet ................................................................................ 5
3.2.
Keil µVision fejlesztő környezet ................................................................. 7
3.3.
Digilent Nexys3 fejlesztő kártya .................................................................. 8
ARM architektúra és a CORTEX-M processzor család.................................... 10 4.1.
ARM története ........................................................................................... 10
4.2.
ARM architektúra felépítése ...................................................................... 12
4.2.1. Thumb kódok ........................................................................................ 14 4.2.1. Thumb-2 kódkészlet .............................................................................. 14 4.2.1. Thumb futtatási környezet ..................................................................... 15 4.2.2. DSP Enhancement utasítások ................................................................ 15 4.2.3. Jazelle bytekód futtatás ......................................................................... 16 4.2.4. Advanced SIMD (NEON) ..................................................................... 16 4.2.5. Lebegőpontos koprocesszor (VFP) ....................................................... 16 4.2.6. Biztonsági kiterjesztések (TrustZone) ................................................... 16
5.
6.
4.3.
CORTEX-M processzor család ................................................................. 17
4.4.
CORTEX-M0 mag implementálása........................................................... 20
AHB-Lite busz rendszer .................................................................................... 22 5.1.
Kommunikációs protokoll ......................................................................... 23
5.2.
AHB-Lite busz jelei ................................................................................... 26
A beágyazott rendszer ....................................................................................... 28 6.1.
Memóriavezérlő egység ............................................................................. 28
6.2.
8 bites LED sor .......................................................................................... 29 2
NAGY SZILÁRD 6.1.
Nyomógombok és kapcsolók ..................................................................... 31
6.2.
Hétszegmenses kijelző ............................................................................... 33
6.3.
Pont-mátrixos LCD kijelző ........................................................................ 35
6.4.
A/D átalakító .............................................................................................. 37
6.5.
Függvénygenerátor .................................................................................... 40
6.6.
UART vezérlő egység ................................................................................ 45
6.7.
VGA vezérlő .............................................................................................. 46
6.8.
Billentyűzetvezérlő .................................................................................... 47
6.9.
Időzítő ........................................................................................................ 48
7.
A beágyazott rendszer programozása ................................................................ 50
8.
Összefoglalás ..................................................................................................... 52
9.
Summary ........................................................................................................... 53
10. Irodalomjegyzék ................................................................................................ 54
3
NAGY SZILÁRD
2. BEVEZETÉS Napjainkban két fő irányvonala van a beágyazott cél áramkörök tervezésének és gyártásának. Az egyik a mikro vezérlő, mikroprocesszor alapú rendszerek; a másik az FPGA – felhasználó által tetszőlegesen programozható kapu mátrix – és ASIC architektúrájú rendszerek. Mind a két módszernek megvannak az előnyei és hátrányai, ezért egyértelműen nem mondható ki, hogy az egyik jobb rendszert eredményezne, mint a másik, de könnyen belátható, hogy az FPGA alapú rendszerek nagyobb szabadságot adnak a tervezők kezébe. FPGA használata esetén maga a céláramkör kerül leprogramozásra a chipbe. Nagyobb
komplexitású,
nagyobb
számítási
teljesítményű
feladatok
elvégzésére
alkalmasak, mint a processzor alapú technológiák. A komplexitás még tovább fokozható, ha az FPGA logika mellett egy „hardprocesszor” is helyet kap a chipen, vagy magába az FPGA-ba egy „softprocesszor” mag is leprogramozásra kerül. A dolgozat egy ilyen „softprocesszor” mag implementálását mutatja be. A választott processzor napjainkban népszerű ARM processzor család tagja, és a Digilent cég által gyártott Nexys 3 demókártyán kerül megvalósításra.
4
NAGY SZILÁRD
3. FEJLESZTŐ ESZKÖZÖK XILINX ISE környezet
3.1.
Az FPGA eszközökön történő fejlesztésre már több lehetséges módszer is rendelkezésünkre áll. Ezek közül a teljeség igénye nélkül néhány:
Hagyományos / tradicionális magas szintű hardverleíró nyelvek (VHDL, Verilog) – a mai napig a legelterjedtebb módszer
Algoritmikus nyelvek (Handel-C, Impulse-C, Catapult-C, System-C) – a lehetséges jövő
Modell alapú integrált fejlesztő rendszerek (MatLab / Simulink; LabView) Bármelyik módszert is választjuk a fejlesztéshez kivétel nélkül igaz, hogy a megírt
programkód fordítása erőforrás és idő igényes, és a legvégső lépéshez mindenképp szükséges a gyártó által támogatott szintézis eszközök. RTL források Állapot diagarm
Kapcsolási rajz
Kényszerfeltételek
Szintézis
RTL Szimuláció
Fordítás
Funkcionális szimuláció
Implementáció
HDL leírás
Tesztpad
Leképezés
Elhelyezés és összekötés
Statikus időzítési analízis
Konfigurációs fájl generálás
Időzítési szimuláció
1. ábra FPGA-alapú rendszertervezés folyamata. Forrás: [1]
A 1. ábra szemléleti egy FPGA rendszer tervezésének és fejlesztésének folyamatát. Az ábra szaggatott vonaltól balra eső része a fejlesztés lépéseit, a jobbra eső rész pedig a 5
NAGY SZILÁRD lehetséges verifikációs lépéseket mutatja. A moduláris vagy komponens alapú rendszertervezés első lépése, hogy lentről-felfelé vagy fentről-lefelé tervezési metodikát követve valamilyen HDL nyelven, vagy egyéb módszereket alkalmazva, leprogramozásra kerül maga az áramkör felépítése. Felírásra kerülnek a különböző paraméterek, például a lábkiosztás. Szintézis során a HDL leírások általános kapuszíntű komponensekké transzformálódnak. Az implementáció három fő lépésre bontható. Az első a fordítás (TRANSLATE), a második a leképezés (MAP), a végső pedig az elhelyezés és összekötés (Place and Routing). A fordítás során több, esetleg eltérő hardver leíró nyelven megírt tervezőfájl összerendelése egyetlen netlist-fájlba. A netlist-fájl tartalmazza a komponensek és összekötetéseik szabványos szöveges leírását. A leképezés során az előzőleg generált netlist-fájl kerül egy adott technológia szerint megjelenítésre. Az elhelyezés és összekötés fázisa hozza létre a végleges „fizikai” áramkör tervet a periféria kényszer feltételeitől függően. Mind az elhelyezés, mind a komponensek huzalozása speciális algoritmusok és optimalizációs eljárások szerint történik. A fejlesztés legvégső lépéseként kapjuk az FPGA-ba tölthető bitfolyamot. XILINX esetén bit fájlt, Altera esetén .sof konfigurációs fájlt.
2. ábra XILINX ISE környezet
A XILINX cég által gyártott FPGA-khoz a gyártó egy saját fejlesztésű fejlesztőkörnyezetet biztosít, mely lehetőséget és eszközt ad az előzőekben vázolt fejlesztési lépések gördülékeny elvégzéséhez. Ez a XILINX ISE környezet (2. ábra). Nem egy egyedülálló programról van szó, hanem egy program csomagról, amely az alábbi fő elemekből tevődik össze a teljeség igénye nélkül:
6
NAGY SZILÁRD
XILINX ISE Project Navigator – maga az integrált fejlesztői környezet, amely keretrendszerként integrálja a fejlesztés egyes fázisait segítő programrészeket vagy belső modulokat
CoreGenerator – XILINX IP magok generálását és paraméterezését teszi lehetővé a terveinkhez
PlanAhead – Tervezés menedzselését, I/O portok együttes kezelésére alkalmas
Shematic Editor – Kapcsolási rajzszerkesztő
Timing Analyzer – Időzítési analizátor modul
XPower Analyzer – Teljesítmény analizátor modul
Constraint Editor – Kényszerfeltételek megadására szolgáló modul. Grafikus nézetet biztosít a lábak bekötésére, amely erősen hardver specifikus
FPGA Editor – FPGA fizikai szintű logikai és makró celláinak esetleges elhelyezésére és összekötésére
Impact – Bitfolyam letöltő modul
XPS XILINX Platform Studio – Integrált keretrendszer beágyazott rendszerek fejlesztéséhez. Elsősorban a MicroBlaze processzor alapú rendszerek fejlesztését támogatja
ChipScope – Logikai analizátor a működés közben megjelenő belső jelek vizsgálatához
System Generator for DSP: MatLab / Simulin programba épülő XILINX DSP feldolgozást támogató eszközök gyűjteménye
3.2.
Keil µVision fejlesztő környezet
Az ARM Inc. a fejlesztők rendelkezésére bocsájtott egy fejlesztő környezetett, melynek a neve Keil (3. ábra). A csomag sajnos licenc díjas, de oktatási és kipróbálási célokra van egy ingyenesen elérhető változata, mely a teljes változathoz képest kisebb funkcionalitással bír. A legfontosabb különbség, hogy a megírt, program mérete maximálisan 32Kb lehet.
7
NAGY SZILÁRD
3. ábra Kail µVision környezet
A Keil µVision egy teljes szerszámos ládát biztosít a fejlesztők számár. Többek között a csomag tartalmazza az alábbiakat:
IDE fejlesztő felület
ARM architektúrára optimalizált C fordító
ARM assembler
különböző JTAG eszközök támogatása
RTOS operációs rendszer fejlesztésének támogatása
egyéb segédprogramok, mint például a lefordított bináris kód több formátumba történő konvertálása
3.3.
Digilent Nexys3 fejlesztő kártya
A Dilgilent cég által gyártott Nexys 3 kártya (4. ábra) fejlesztő kártya, mely alapja a Xilinx Spartan-6 LX 16 FPGA. A Spartan-6 egy nagyteljesítményű FPGA, 50%-val nagyobb teljesítményt és kapacitást kínál, mint az eggyel kisebb kategóriába tartózó Spartan-3 500E FPGA, ami a Nexys 2 kártya alapja. Összefoglalva a Nexys 3 kártya főbb jellemzői:
8
NAGY SZILÁRD
4. ábra Digilent Nexys3 fejlesztó kártya Forrás: [2]
Xilinx Spartan-6 LX16 FPGA 324 lábú BGA tokozásban
16Mb SRAM, Flash és soros elérésű RAM
10/100 Ethernet csatoló
kártyára integrált USB2.0 port programozáshoz és adat mozgatáshoz
USB alapú UART csatoló
USB-HID csatló, közvetlen egér és billentyűzettámogatással
8-bites VGA csatoló
100MHz-es CMOS oszcillátor
72db szabadon programozható kivezetés
8db LED, 6db nyomógomb, 8db csúszó kapcsoló és 4db hétszegmenses kijelző
9
NAGY SZILÁRD
4. ARM ARCHITEKTÚRA ÉS A CORTEX-M PROCESSZOR CSALÁD Az ARM architektúra (korábban Advanced RISC Machine, azelőtt Acorn RISC Machine) egy 32/64 bites, az ARM Limited fejlesztette RISC CPU-architektúra, amely több beágyazott rendszerben található meg. Energiatakarékosságuk miatt az ARM architektúrájú CPU-k a vezetők a hordozható elektronikai piacon, ahol az alacsony energiafogyasztás fontos tervezési szempont. Manapság az összes beágyazott 32 bites RISC CPU 75%-a az ARM családból származik, így ez a világ egyik legelterjedtebb 32 bites architektúrája. Sokféle felhasználói elektronikai eszközben található ARM, kezdve a hordozható eszközöktől (PDA, mobiltelefonok, médialejátszók, kézi számítógépkonzolok és számológépek) egészen a számítógép-perifériákig (5. ábra).
5. ábra Egy Conexant ARM processzor, amely főként routerekben található Forrás: [3]
4.1.
ARM története
Az ARM fejlesztése egy kísérleti projektként indult 1983-ban az Acorn Computers Ltd-nél. Roger Wilson és Steve Furber vezette csoport egy a MOS Technology 6502-re emlékeztető, ám annál fejlettebb processzort kezdett fejleszteni.
6. ábra ARM1 processzor a BCC microban Forrás: [4]
1985 áprilisában készült el az ARM1-nek nevezett mintával (6. ábra), majd a következő évben megjelent az első, eladásra szánt rendszer, az ARM2. Az ARM2 32 bites adatbusszal és 16 darab 32 bites regiszterrel rendelkezett, valamint 26 bitet használt címzésre (így összesen 64 MByte memória volt címezhető). Ezen regiszterek egyike 10
NAGY SZILÁRD szolgált a (szó-igazított) utasítás-számlálóként úgy, hogy a felső 6 és alsó 2 bitje tárolta a processzor státusz flageket. Valószínűleg az ARM2 volt a legegyszerűbb, használható 32 bites mikroprocesszor a világon, mindössze kb. 30 000 tranzisztorral. Ennek az egyszerűségnek a nagy része a mikro kód és a – legtöbb mai CPU-ban megtalálható – cache hiányának köszönhető. Az egyszerűsége miatti alacsony áramfelvétele ellenére jobb teljesítményt nyújtott, mint az Intel 80286-os. Az egyik utódját, az ARM3-t, 4 Kbyte méretű gyorsító tárral készítették, amely a teljesítményt tovább növelte. Az 1980-as évek végén az Apple Computer és az Acorn együttműködésbe kezdett az ARM új változatának kidolgozásában. A munka annyira fontos volt az Acornnak, hogy a fejlesztő csapatot 1990-ben egy új cégbe, az Advanced RISC Machines Ltd.-be áthelyezték. Ezért nevezik néha az ARM-ot „Advanced RISC Machine-nak” az Acorn RISC Machine helyett. Az Advanced RISC Machines Ltd. később ARM Ltd.-vé alakult.
7. ábra ARM 610 beslő felépítése Forrás: [4]
Ennek az együttműködésnek az eredményeképpen jött létre az ARM6. Az első példányok 1991-ben kerültek piacra, az Apple pedig az ARM6-alapú ARM 610-et (7. ábra) használta az Apple Newton PDA-jában. 1994-ben, az Acorn az ARM 610-et használta RISC PC-i központi processzoraként. A mag nagyjából azonos méretű maradt a változtatások ellenére. ARM2 30 000 tranzisztorral rendelkezett, míg ARM6 csupán 35 000-re növelte a tranzisztorok számát. Az elképzelés szerint a gyártó az ARM mag mellé opcionális részeket kínált, amelyekkel egy teljes CPU összeállítható, így alacsony költséggel nagy teljesítmény érhető el. 11
NAGY SZILÁRD Az ARM Ltd. szellemi terméket árul (Intelectual Property), és e licencek alapján építhetőek mikrokontrollerek és CPU-k az ARM magra. A legsikeresebb feljesztés az ARM7TDMI volt, amelyből több százmillió példányt adtak el majdnem minden mikrokontrollerrel. A DEC megvásárolta az architektúra licencét (ezzel némi zavart okozva, mivel ők készítik a DEC Alpha-t is) és elkészítették a StrongARM-ot. 233 Mhz-en a StrongARM mindössze 1 watt energiát használt, az újabb változatok pedig még kevesebbet. Később az Intel-hez került egy jogi egyezség részeként, az Intel kihasználta a lehetőséget és kiegészítette az i960-as szériáját a StrongARM-mal. Az Intel később elkészítette a saját, nagysebességű változatát (Intel XScale), amelyet azóta eladott a Marvell Technology Group-nak. Az okostelefonokban, PDA-kban és egyéb kézi eszközökben megtalálható architektúra az ARMv4. Az ARMv5TE-re épülő XScale és ARM926 már gyakoribbak a high-end készülékekben, mint a StrongARM, az ARM925T és az AM7TDMI alapú ARMv4 processzorok.
4.2.
ARM architektúra felépítése
Az egyszerűség és gyorsaság miatt mikro kód nélkül készült, hasonlóan a korábbi Acorn mikroszámítógépekben használt, jóval egyszerűbb 8 bites 6502-hez. Az ARM architektúra a következő RISC képességekkel rendelkezik:
Load/store architektúra
Csak illesztett (aligned) memória elérés az ARMv6-ig
Ortogonális utasítás-készlet
Nagy, 16×32 bit regiszter-készlet
Egységes, 32 bites utasítások (egyszerűbb dekódolás és pipelining, csökkentett kódsűrűség)
Többnyire egy-ciklusos végrehajtás
Az egyszerűbb felépítés kompenzálására, néhány egyedi jellemzőt is hozzáadtak:
A legtöbb utasításfeltételes végrehajtás, így csökkentve az elágazás idejét és kompenzálva az elágazás predikátor hiányát
Az aritmetikai utasítások a feltételes kód regisztert csak kérésre módosítják
32 bites léptető, amellyel teljesítmény-veszteség nélkül lehet aritmetikai és címszámolásokat végezni
12
NAGY SZILÁRD
Erőteljes indexelt címzési módok
Egyszerű, de gyors, két prioritási szintű megszakítás-alrendszer cserélt regiszterkészlettel
Egy érdekes ARM újítás a 4 bites feltételes kód minden utasítás elején, így minden utasítás végrehajtása feltételhez köthető. Ez jelentősen korlátozza a memória-elérési utasításokban az eltolást, viszont rövid if utasítások esetén szükségtelenné teszi az elágazás utasításokat. A standard példa erre az Euklideszi algoritmus:
C programozási nyelven a ciklus: int gcd (int i, int j) { while (i != j) { if (i > j) i -= j; else j -= i; } return i; }
ARM assembly-ben a ciklus: loop CMP SUBGT SUBLE BNE
Ri, Rj Ri, Ri, Rj Rj, Rj, Ri loop
; ; ; ;
a feltétel beállítása ha "GT", i = i-j; ha "LE", j = j-i; ha "NE", akkor ugrás a loop-hoz
Így elkerülhetőek az elágazások a then és az else kikötések körül. Az utasításkészlet egy másik egyedi képessége a léptető és forgató utasítások beépíthetősége az adatfeldolgozó (aritmetikai, logikai, és regiszter-regiszter mozgatás) utasításokba, így például a következő C utasítás a += (j << 2), egy-ciklusú utasítás lehet az ARM-on: ADD Ra, Ra, Rj, LSL #2. Ennek eredményeképpen egy szokásos ARM program jóval sűrűbb és kevesebb memória-hozzáféréssel rendelkezik, mint elvárnánk; így a pipeline hatékonyabban kihasználható. Bár az ARM sokak által alacsonynak vélt sebességen fut, felveszi a versenyt összetettebb CPU architektúrákkal. Az ARM processzoroknak vannak, RISC architektúrán ritkán látott képességei. Például: az utasításszámláló-relatív címzés (az utasításszámláló az egyike az ARM processzorok 16 bites regisztereinek). Említésre méltó még, hogy bár az ARM már jó ideje elérhető, az utasítás-készlet alig nőtt. Például néhány korai processzor (az ARM7TDMI előttiek), nem rendelkeztek 2 byteos betöltővel, így ezeken lehetetlen olyan kódot gyártani, amely úgy működne, ahogy az elvárható egy C "volatile short" objektumnál.
13
NAGY SZILÁRD Az ARM7 és a legtöbb korábbi felépítés háromfokozatú utasítás-futószalaggal rendelkeztek: begyűjtés, dekódolás és végrehajtás. A nagyobb teljesítményűek, mint az ARM9,már ötfokozatú futószalaggal bírtak. A nagyobb teljesítmény elérésének módjai között szerepel a gyorsabb összeadó és a kiterjedtebb predikciós rendszer. Az architektúra utasításkészlete kiegészíthető „koprocesszorok” használatával, amelyek szoftveresen címezhetőek az MCR, MRC, MRRC és MCRR utasításokkal. A koprocesszor-tér 16 logikai koprocesszorra van felosztva (0-tól 15-ig számozva). A 15-ös (cp15) tipikus vezérlési funkcióknak (gyorsítótár és memóriakezelés) van fenntartva. Az ARM alapú gépekben a perifériák általában (a fizikai regisztereik) ARM memóriájába, a koprocesszor-térben vagy egy másik eszközzel (sín) a leképezés során kapcsolódnak a processzorhoz. A koprocesszor elérése kisebb késleltetésű, így néhány periféria (például az XScale megszakítás-vezérlő) mindkét módon elérhető (memórián és koprocesszoron keresztül is). 4.2.1. Thumb kódok Az újabb ARM processzorok rendelkeznek egy tömörített utasításkészlettel, a Thumb-bal, amely 16 bites utasításokat használ (de továbbra is 32 bites adatokkal dolgozik). A Thumb rövidebb opkódjaival kevesebb funkció érhető el. Például: csak az elágazások köthetők feltételhez és sok opkód nem érheti el a CPU regisztereit. A rövidebb opkódok használatával növekszik a kódsűrűség, annak ellenére, hogy néhány művelethez több utasítás szükséges. Különösen azokban a helyzetekben, amelyekben a memória, port vagy busz kevesebb, mint 32 bitre van korlátozva, a rövidebb Thumb opkódok jobb teljesítményt nyújtanak, mint a 32 bites, a limitált memória-sávszélesség jobb kihasználása miatt. A beágyazott hardvereknek többnyire kevés 32 bites adatútja létezik, a többi 16 bites. Ebben az esetben van értelme a Thumb code-ra fordításának, majd a CPU-t inkább igénybe vevő részeket kézzel átírni a 32 bites nem Thumb utasításkészlettel, és utóbbiakat a 32 bites busz szélességű memóriába elhelyezni. Az első Thumb utasítás dekóderrel készült processzor az ARM7TDMI volt. Az ARM9 és a későbbiek (ideértve az XScale-t is) rendelkeznek ilyen értelmezővel. 4.2.1. Thumb-2 kódkészlet A Thumb-2, az ARM1156 core-ban, 2003-ban debütáló technológia, a Thumb 16 bites utasításkészletét egészíti ki 32 bites utasításokkal, hogy az utasításkészlet átfogóbb
14
NAGY SZILÁRD legyen. Így a Thumb-2 a Thumb kódsűrűségével és 32 bites memóriával rendelkező ARM utasításkészlet sebességével bír. A Thumb-2 mind az ARM mind a Thumb utasításkészletet kiegészíti újparancsokkal, így például bitmező-módosításokkal, ugrótáblákkal (elágazási tábla) és feltételes futtatással. Minden ARMv7 chip támogatja a Thumb-2 utasításkészletet. (például a Cortex-M3 csak a Thumb-2-t támogatja). Másik Cortex és ARM 11 sorozatú chipek támogatják az „ARM utasításkészlet módot” és a „Thumb-2 utasításkészlet módot”. 4.2.1. Thumb futtatási környezet A ThumbEE (esetleg Thumb-2EE), a 2005-ben bejelentett, majd a Cortex-A8 processzorban debütáló, Jazelle RCT néven ismert technológia. A ThumbEE a Thumb-2 utasításkészletét egészíti ki úgy, hogy az alkalmas legyen futási időben létrehozott kód futtatására (pl. Just-in-time compilation ("Pont időben fordítás")) megfelelően kezelt futtatókörnyezetekben. A ThumbEE cél-nyelvei között megtalálható a Limbo, a Java, a C#, a Perl és a Python, továbbá segítségével a JIT fordítók teljesítmény-veszteség nélkül képesek rövidebb kódot előállítani. A ThumbEE nyújtotta új szolgáltatások között megtalálható az írás/olvasás műveletkor lefutó automatikus null pointer ellenőrzés (tömbhatár-ellenőrzésnél hasznos), az r8-r15 regiszterek (ezekben tárolódik a Jazelle/DBX Java virtuális gép állapota) elérhetősége, illetve az ún. handlerek („kezelők”: gyakran meghívott kódok) feltételhez kötése (pl.: a magas szintű programozási nyelvek szolgáltatásai-mint pl.:a memóriaallokáció-egyszerűen megvalósíthatók). 4.2.2. DSP Enhancement utasítások Az ARM-t fejlesztése során digitális jelfeldolgozás és multimédiás programok új utasításával egészítették ki. Úgy tűnik, ezt az ARMv5TE és ARMv5TEJ nevekben az „E” jelöli. Ezek az új utasítások gyakoriak a digitális jelfeldolgozó architektúrákban. Különböző variációk előjeles szorzásra, telített összeadásra és kivonásra, és a vezető nullák számolására.
15
NAGY SZILÁRD 4.2.3. Jazelle bytekód futtatás A Jazelle DBX (közvetlen bytekód futtatás) technológia segítségével néhány ARM architektúra képes Java bytekódot futtatni az ARM és Thumb futtatási módok mellett. Néhány bytekódot gyorsítva futtat, a többit szoftver-kérésekkel hajtja végre. Az első Jazelle-t támogató processzor az ARM926EJ-S volt: a névben szereplő J jelöli a Jazelle-képességet. Ezt főként mobiltelefonokban használják, így gyorsítva a Java ME játékok és programok futását. 4.2.4. Fejlett SIMD (NEON) Az Advanced SIMD (továbbfejlesztett egy utasítás - több adat), a NEON néven ismert technológia a média és jelfeldolgozás gyorsítására kínál utasításokat. Egy 10 MHzen futó NEON-képes processzor alkalmas MP3-dekódolására, egy 13 MHz-es pedig a GSM-eknél használt AMR (Adaptive Multi-Rate) kodek használatára. Az ASIMD új utasításokból, új regiszterkészletből és külön futtató hardverből áll. Támogatja a 8, 16, 32 ill. 64 bites egészeket és az egyszeres pontosságú lebegőpontos értékeket, amelyeket SIMD módon kezel, így audió/videó/grafika- és játékszámításokra alkalmas. A NEON-ban a SIMD párhuzamosan akár 16 művelet elvégzésére is képes. 4.2.5. Lebegőpontos társprocesszor (VFP) A VFP egy az ARM-hoz készült segédprocesszor, az IEEE 754 szabványnak megfelelő lebegőpontos aritmetikát támogató, alacsony költségű megoldás. A VFP széles körben felhasználhatóan támogatja a lebegőpontos számításokat, például használható PDA-kban, nyomtatókban, set-top boxokban, autókban, okos telefonokban. Alkalmas továbbá egyszerűbb vektor-műveletekre, így SIMD párhuzamosságra. Ez jól kihasználható grafikai és jelfeldolgozó programoknál, a kód rövedítésére az átviteli képesség növelése révén. Az ARM-hoz készültek további lebegőpontos és/vagy SIMD segédprocesszorok (pl.: FPA, FPE, iwMMXt). Ezek az VFP funkcionalitását biztosítják, de azzal nem opkódkompatibilisek. 4.2.6. Biztonsági kiterjesztések (TrustZone) A TrustZone (TM) néven hirdetett biztonsági kiegészítések az ARMv6KZ-től kezdődően találhatók meg az architektúrákban. Egy olcsó alternatívát jelent a dedikált biztonsági mag beépítése mellett. A TrustZone két virtuális processzort szolgáltat, hardveralapú biztonsági rendszerrel. Így egy program két állapot (ún. világ) között váltogathat, és 16
NAGY SZILÁRD a megbízható világból a kevésbé megbízhatóbb világba nem kerülhetnek információk. Ez a világ-váltás általában ortogonális a processzor további képességeivel, mely által mindkét világ függetlenül működhet egy rendszermagot használva. A memória és a perifériák is észlelik ezt a váltást, így engedhetik jelszavak és egyéb titkosított adatok elérését az eszközön. Egy tipikus felhasználási módja, hogy egy teljes értékű operációs rendszer fut a kevésbé megbízható világban, míg egy biztonságra specializált kód fut a megbízható világban.
CORTEX-M processzor család
4.3.
Az ARM Cortex-M (8. ábra) processzorcsalád egy 32 bites RISC típusú ARM mag architektúra, amelyet mikroprocesszorokban és mikrokontrollerekben való felhasználásra terveztek. Cortex-M0, M0+ és M1 változatai az ARMv6-M utasításkészletet; a Cortex-M3 és Cortex-M4 változatok pedig az ARMv7-M utasításkészlet-architektúrát implementálják. Ezt a családot az ARM Ltd. fejlesztette ki, az okostelefonokba és érintőképernyős tabletekhez fejlesztett Cortex-A családdal (ARMv7-A), valamint a valós idejű alkalmazásokat célzó Cortex-R (ARMv7-R, R mint „real time”) családdal párhuzamosan.
8. ábra ARM Cortex-M0 és Cortex M3 chipek NXP-től és Energy Micro-tól Forrás: [5]
Az ARM Holdings nem gyárt és nem is forgalmaz saját tervezésű CPU eszközöket, hanem ehelyett processzor-architektúrákat licenccel az érdekelt feleknek. Az ARM a licencfeltételek széles skáláját kínálja, amelyek változatos költség- és mennyiségi igényekhez alkalmazhatók. Minden licencszerződéshez az ARM átadja a kiválasztott ARM mag integrálható hardverleírását valamint a teljes szoftverfejlesztési eszközkészletet, és biztosítja, hogy a gyártónak jogában áll a kereskedelemben forgalmazni a legyártott, ARM processzort
tartalmazó
integrált
áramkört.
Az
így
licencezhető
processzorokat szemlélteti 9. ábra a teljesítmény és képesség függvényében.
17
CORTEX-M
NAGY SZILÁRD Klasszikus ARM processzorok
Beágyazott Cortex processzorok
Alkalmazás specifikus Cortex processzorok Cortex-A15
Teljesítmény, funkcionalitás
Cortex-A9 Cortex-A8 Cortex-A5 ARM11
Cortex-R4 Cortex-M4
ARM9
Cortex-M3 Cortex-M1
ARM7
Cortex-M0 Képességek
9. ábra Cortex-M processzorok Forrás: [6]
Az integrált készülékgyártók (IDM) az ARM processzor szellemi tulajdonát (IP) szintetizálható RTL leírás formájában kapják meg, Verilog hardverleíró nyelven. Ebben a formában megvan a lehetőségük, hogy architekturális szintű optimalizálásokat és kiterjesztéseket végezzenek a tervekben. Ez lehetővé teszi a gyártóknak egyedi tervezési célok megvalósítását, mint például magasabb órajel, nagyon alacsony fogyasztás, utasításkészlet-kiterjesztések, méretbeli optimalizálás, hibakeresési támogatás, stb. A gyártók ezt a lehetőséget előszeretettel alkalmazzák is, és az elkészült módosításokat és alkalmazott komponenseket gyakran csak a gyártó dokumentációjából lehet azonosítani. Néhány legfontosabb opció a CORTEX-M magokhoz:
SysTick időzítő: egy 24 bites időzítő, mely kibővíti mind a processzor, mind a beágyazott vektoros megszakítás kezelő (NVIC) funkcionalitását. Ha beépítésre kerül, további lehetőségeket biztosít az általa generált megszakítások prioritásának konfigurálására. Habár a SysTick időzítő nem kötelező, elég ritka, hogy nélküle készülne CORTEX-M családba tartozó mikro vezérlő illetve processzor.
Bit-sáv (Bit-band): lehetőséget ad a bit-sáv területen található egy bit hosszúságú adatok közvetlen elérésére.(pl.: C vagy C++ programozási nyelvből közvetlenül beállítható vagy törölhető egy bit anélkül, hogy különböző író vagy olvasó utasításokra lenne szükség a maszkolás során.)
18
NAGY SZILÁRD
Védett memória terület (MPU): támogatja a védett memóriaterület kiváltság és szabály alapú hozzáférését. Általában nyolc memória területet támogat, melyek mindegyike felbontható további nyolc egyenlő méretű terültre.
A 1. táblázat foglalja össze a teljeség igénye nélkül az előbb felsorolt választható komponensek és néhány alapkomponens rendelkezésre állását a különböző CORTEX-M magok esetében. 1. táblázat ARM CORTEX-M választható komponensei Forrás: [7], [8]
Cortex-M0 Cortex-M0+ Cortex-M1 Cortex-M3 Cortex-M4 Cortex-M7
SysTick időzítő
Bit-sáv
MPU
TCM
Opcionális Opcionális Opcionális Van Van Van
Opcionális Opcionális Opcionális Opcionális Opcionális TBD
Nincs Opcionális Nincs Opcionális Opcionális Opcionális
Nincs Nincs Opcionális Nincs Nincs Opcionális
CPU gyorsító tár (cache) Nincs Nincs Nincs Nincs Lehetséges Opcionális
Memória architektúra Neumann Neumann Neumann Harvard Harvard Harvard
A CORTEX M0-M1 processzorok az ARMv6-M architektúrára, a CORTEX-M3 processzorok az ARMv7-M architektúrára, míg a COTEX-M4 processzorok az ARMv7EM architektúrára épülnek. A különböző architektúrák bináris utasítás készlete felfelé kompatibilisek. Vagyis például egy CORTEX-M0 magra megírt program bináris kódja, módosítás vagy újrafordítás nélkül futatható gond nélkül egy CORTEX-M3 magra épülő processzoron, míg ez fordítva már nem igaz. Az egyes magok esetén elérhető utasítás csoportokat a 2. táblázat foglalja össze. 2. táblázat ARM CORTEX-M utasítás csoportok Forrás: [7], [8]
Cortex-M0 Cortex-M0+ Cortex-M1 Cortex-M3 Cortex-M4 Cortex-M7
Thumb
Thumb-2
Részl. Részl. Részl. Teljes Teljes Teljes
Részl. Részl. Részl. Teljes Teljes Teljes
Hardveres szorzó osztó 1 v. 32 ciklus Nincs 1 v. 32 ciklus Nincs 3 v. 33 ciklus Nincs 1 ciklus Van 1 ciklus Van 1 ciklus Van
Telített aritmetika Nincs Nincs Nincs Van Van Van
DSP
FPU
Nincs Nincs Nincs Nincs Nincs Nincs Nincs Nincs Van Opcionális Van Opcionális
A CORTEX M0-M1 processzorok nem támogatják a teljes Thumb és Thumb-2 utasítás készletet, általában az alábbi utasítások hiányoznak: CBZ, CBNZ, IT, DMB, DSB, ISB, MRS, MSR. A fizikai lehetőségeket figyelembe véve, kisebb szilícium mérete esetén a CORTEX M0-M1 magok esetén a hardveres szorzó utasítások lefutásának ideje különböző lehet. Kisebb méret esetén lassabb lefutás, míg nagyobb méret esetén gyorsabb lefutás érhető el. A CORTEX M4 és M7 magok esetén elérhető opcionálisan egy lebegőpontos
számításokat
támogató
egység 19
(FPU).
Mikor
ez
támogatott,
a
NAGY SZILÁRD típusmegjelölés kiegészül egy „F” toldalékkal. Például FPU támogatással rendelkező CORTEX-M4 mag típusmegjelölése CORTEX-M4F-re változik. Az FPU-k esetén választható, hogy a 4 illetve 8 bájtos lebegőpontos számábrázolást támogassák. A CORTEX-M0 mag kialakításánál törekedtek a lehető legkisebb fizikai méret elérésére, ami azt eredményezi, hogy a legkevesebb utasítással rendelkezik.
4.4.
CORTEX-M0 mag implementálása
Az ARM által rendelkezésre bocsájtott mag csak a processzort tartalmazza. A magfelépítését a 10. ábra szemlélteti. A „DesignStart” csomag nem tartalmazza a teljes funkcionalitásában a processzor magot. Néhány funkció részlegesen érhető el, vagy teljes egészében hiányozik. A teljeség igénye nélkül csak a legfontosabb funkciók, melyek hiányoznak, vagy korlátozottan érhetők el:
AMBA AHB-Lite csipen belüli busz csak mestertámogatással rendelkezik
csak 32 ciklus idejű szorzó egység érhető el
NVIC 32 féle megszakítás helyett csak 16-ot támogat
nincs SysTick
nincs hardveres hibakereső felület
a rendelkezésre álló Verilog-kód kommentezés nélkül „titkosítva” tartalmazza a processzor magot. CORTEX-M0 közvetlen környezete CORTEX-M0 processzor
Megszakítások
Opcionális hibakereső egység Beágyazott irányított megszakítás vezérlő (NVIC)
Opcionális megszakítás ébresztéshez (WIC)
CORTEX-M0 processzor mag
Breakpoint és watchpoint kezelő egység
Busz mátrix
Hibakereső interfész
AHB-Lite Busz rendszer
Opcionális hibakereső illesztés
Soros vagy JTAG port
10. ábra CORTEX-M0 processzor mag Forrás: [9]
A FPGA-ban történő implementáláshoz nem kell mást tenni, mint a rendelkezésre álló kódot komponensként példányosítani, és a portokat illeszetni, ahogyan az alábbi kód részlet is szemlélteti.
20
NAGY SZILÁRD ARM_Cortex_M0_Core : CORTEXM0DS port map ( HCLK HRESETn HADDR HBURST HMASTLOCK HPROT HSIZE HTRANS HWDATA HWRITE HRDATA HREADY HRESP NMI IRQ TXEV RXEV LOCKUP SYSRESETREQ SLEEPING );
=> => => => => => => => => => => => => => => => => => => =>
Clock, Resetn, HAddr (31 downto 0), HBrust (2 downto 0), HMastlock, HProt (3 downto 0), Hsize (2 downto 0), HTrans (1 downto 0), HWdata (31 downto 0), HWrite, HRData (31 downto 0), HReady, HResp, NMI, IRQ (15 downto 0), Txev, Rxev, LockUp, SysResetReq, Sleeping
Az illesztés és működés könnyebb megértéséhez a fenti kódrészletben található portok funkcióját a 3. táblázat foglalja össze. A táblázat csak a „DesignStart” csomagban elérhető csökkentett funkcionalitású CORTEX-M0 processzormag portjait tartalmazza. 3. táblázat ARM CORTEX-M0 processzormag port listája Forrás: [7]
Port HADDR[31:0] HBURST[2:0] HCLK HMASTLOCK HPORT[3:0] HRDATA[31:0] HREADY HRESETn HRESP HSIZE[2:0] HTRANS[1:0] HWDATA[31:0] HWRITE
Irány Out Out In Out Out In In In In Out Out Out Out
IRQ[15:0]
In
LOCKUP
Out
NMI
In
RXEV
In
SLEEPING
Out
SYSRESETREQ
Out
TXEV
Out
Leírás
AHB-Lite busz címző, adat és vezérlő jelei, részletes leírásuk a Hiba! hivatkozási forrás nem található.. fejezetben.
Priorizálható hardveres szubrutin hívás bemenetei. Minden egyes bitje egy-egy megszakítást azonosít. A processzor kettő vagy több helyreállíthatatlan hiba jelzésére használja. Például: kísérlet azonosítatlan utasítás futtatására; busz hiba; nem valós terület címzése; stb. Nem maszkozható megszakítás kérés bemenete Esemény fogadó port. Rajta keresztül jelezhető a futó szoftver számára, hogy a külvilágban esemény történt. Processzor aktuális állapotának jelzése. Magas jelszint esetén a processzor alapállapotban van, alacsony jelszint esetén éppen valamilyen műveletet hajt végre. Rendszer újraindítás kérés szoftverből. Eseményadóport. A processzor minden esetben magas jelszintre állítja, ha a programkódban lefut a SEV utasítás.
21
NAGY SZILÁRD
5. AHB-LITE BUSZ RENDSZER A fejlett mikro vezérlő busz architektúra (AMBA) egy nyílt szabványú chipen belüli kommunikációt támogató busz rendszer. Feladata a különböző funkció blokkok összekapcsolása, menedzselése SOC rendszereknél. Így támogatva a többprocesszoros és nagy periféria számú rendszerek tervezését. Megalkotása óta, neve ellenére, az AMBA-t nemcsak mikro vezérlőkben alkalmazzák, hanem ASIC, SOC rendszerekben illetve alkalmazás specifikus processzorokban, mint például a hordozható eszközök processzorai. Az AMBA első változatát az ARM fejlesztette ki 1996-ban és azóta az ARM Inc. bejegyzett védjegye. Az első AMBA buszok a fejlett rendszer busz (ASB) és fejlett periféria busz (APB) voltak. Az elsők megjelenése óta az AMBA több verziója is napvilágot látott, és minden esetben több protokoll specifikációját tartalmazza. A második generációs AMBA 2 csomagja tartalmazza többek között AHB protokollt. A CORTEXM0 mag által használt AHB-Lite protokoll 2003-ban látott napvilágot a harmadik generációs AMBA 3 csomagban. A csomag az előbb említett protokoll mellett az alábbiakat tartalmazza:
AXI3 vagy AXI v1.0
AHB-Lite
APB3
ATB
Napjainkban már az AMBA 5 csomagnál tartunk. A nyílt szabványnak és a kellően jó dokumentáltságnak köszönhetően az AMBA protokollok a beágyazott rendszerek terén „de facto” szabvánnyá váltak. Fontos tervezési kérdés a SOC rendszereknél amellett, hogy milyen funkcionális egységekből állnak és azok hogyan épülnek fel, hogy hogyan kommunikálnak egymással. Ezért az AMBA specifikációk megalkotása során a kezdetektől fogva az alábbi irányelvekre nagy hangsúlyt fektettek:
elsőre jót irányelvek támogatása a beágyazott rendszerek fejlesztése során beleértve akár a több magos CPU-kat, GPU-kat és DSP-ket és ezek esetleges kombinációját.
technológia független IP magok és makro cellák fejlesztésének támogatása.
fejlesztők
ösztönzése
IC
független
létrehozására. 22
újra
hasznosítható
IP
könyvtárak
NAGY SZILÁRD
szilícium infrastruktúra minimalizálása, mialatt megmarad a nagy teljesítményű kommunikációs képesség és az alacsony energia felhasználás.
Kommunikációs protokoll
5.1.
Az AMBA AHB-Lite protokoll eleget tesz a nagy kommunikációs teljesítményű buszrendszerek követelményeinek. Az eredeti AHB protokollal ellentétben csak egy mestert támogat, de továbbra is megmarad a nagy sávszélességű kommunikáció lehetősége. Az AHB-Lite esetében az alábbi funkciók biztosítják a nagy órajelű és nagy teljesítményű működést:
tört transzferek (burst transfer)
egy órajel élre történő működés
nem szükséges háromállapotú kapukat implementálni
széles adatbusz konfigurációk (32bit, 64bit, 128bit, 256bit, 512bit 1024bit)
A leggyakoribb szolgaalkalmazások - melyek közvetlenül az AHB-litre vannak kapcsolva - a belső memóriák, a külső memóriák illesztő felületei és a nagy sávszélesség igényű perifériák. Habár nincs tiltva alacsony sávszélességű eszközök csatlakoztatása sem, és a lehetőség is adott, de nagyobb rendszereknél ezt mellőzni szokták az esetleges teljesítményromlás veszélye miatt. Gyakorta erre a célra az APB-t használják. A két eltérő protokoll áthidalására AHB/APB hidat (bridege) szoktak használni. Itt szeretném megjegyezni, hogy én ezzel a lehetőséggel nem éltem, mert a rendszerem felépítésekor ez nem volt kritikus szempont. A 11. ábra egy tipikus AHB-Lite rendszer felépítését szemlélteti, egy mesterrel és n számú szolgával. A buszlogika áll egy de-multiplexerből és multiplexerből. A demultiplexer figyeli a címeket és a címek alapján aktiválja, engedélyezi a megcímzett szolgát. A multiplexer pedig továbbítja a mester felé az éppen aktív szolgától érkező adatokat és vezérlő jeleket.
23
NAGY SZILÁRD HWData[31:0] HAddr[31:0]
1. HSel
2. HSel
2. Szolga
...
Demultiplexer
Mester
1. Szolga
Multiplexer címzés
3. HSel
1. HRData Multiplexer
HRData[31:0]
N. Szolga
2. HRData N. HRData
11. ábra AHB-Lite busz felépítése Forrás: [9]
A de-multiplexert és a multiplexert általában se mester, se szolga nem tartalmazza. A gyakorlatban egyszerűsége miatt és a címtér szabadon megválaszthatóságának megtartása végett, mindig a rendszer kialakításakor kell lekódolni, vagy erre a célra alkalmas makróval generáltatni. Egyszerűsége miatt általában gyorsan megy és nem okoz különösebb erőfeszítést. Ezt a tény hivatott bizonyítani az alábbi VHDL kód részlet:
24
NAGY SZILÁRD architecture Behavioral of AHB_lite_addressing is signal selection : std_logic_vector (15 downto 0); signal mux_addr : std_logic_vector (3 downto 0); signal mux_phase : std_logic_vector (3 downto 0); begin process (HClk) –- Demultiplexer szolga címzéshez begin case HAddr(31 downto 24) is when x"00" => selection <= "0000000000000001"; when x"50" => selection <= "0000000000000010"; … when others => selection <= "0000000000000000"; end case; end process; HSel_SRAMFLASH <= selection(0); HSel_LED <= selection(1); … process (HClk) –- Egyszerűsített címgenerálás multiplexernek begin case HAddr(31 downto 24) is when x"00" => mux_addr <= "0000"; when x"50" => mux_addr <= "0001"; … when others => mux_addr <= "1111"; end case; end process; … -- Szolgáktól érkező adatok multiplexálása HReady <= HReady_SRAMFLASH when mux_phase="0000" else HReady_LED when mux_phase="0001" else … '0'; … HRData <= HRData_SRAMFLASH when mux_phase="0000" else HRData_LED when mux_phase="0001" else … "00000000000000000000000000000000"; … end process;
A kommunikációt a mester indítja a vezérlő jelek megfelelő szintbe állításával és a címzett eszköz címének elküldésével (12. ábra és 13. ábra). Ezek a jelek hordozzák az információt a kommunikáció irányáról, az adat hosszáról és a kommunikáció típusáról (egyszerű, vagy részekre bontott). A mestertől a szolga felé érkező adatok írásnak számítanak és a HWDATA vezetékeken közlekednek (12. ábra), míg a szolgától mester felé érkező adatok pedig olvasásként értelmezhetők és a HRDATA vezetékeken közlekednek (13. ábra).
25
NAGY SZILÁRD
12. ábra Adat küldés az AHB-Lite buszon Forrás: [10]
13. ábra Adat fogadás az AHB-Lite buszon Forrás: [10]
Minden tranzakció két jól elkülöníthető fázisra bontható: 1. címzési fázis:
egy órajel ciklus a vezérlő jelek és cím elküldéséhez
2. adat fázis:
egy vagy több órajel ciklus az adatok küldéséhez
A szolgák nem kérhetik a címzési fázis meghosszabbítását, ezért a rendelkezésre álló idő alatt, ami egy órajel ciklus, kell mintavételezniük a címzéskor érkező adatokat. Az adat fázist már tudják várakozatni a HREADY jel alacsony szinten tartásával, ekkor több órajel ciklusra is elnyúlhat egy adatcsere. Akkor hasznos ez a módszer, ha a rendszerünknél egy sokkal lassabb külső perifériától kérünk adatot és nincs semmilyen buffer elemünk. A szolgák a HRESP-et használják, hogy jelezzék, ha valamilyen hiba történt a kommunikáció során.
5.2.
AHB-Lite busz jelei
Az AHB lite busz által a kommunikáció menedzseléséhez használt jeleket 5 csoportba lehet sorolni: globális jelek, mester jelei, szolga jelei, de-multiplexer jelei és multiplexer jelei. Ezeket a jeleket mutatja be a 4. táblázat.
26
NAGY SZILÁRD 4. táblázat ARM CORTEX-M0 processzormag port listája Forrás: [10]
Név HCLK
Leírás A busz órajele, esetek többségében megegyezik a rendszer órajelével Busz újraindítását kérő jel negáltja. Az AHB-Lite buszon ez az egyetlen aktív HRESETn alacsony jel. HADDR[31:0] 32 bites cím Üzenet típusát határozza meg. Egyszeri üzenetről van szó, vagy részekre HBURST[2:0] bontottról. Ha részekre bontott, akkor az állhat 4, 8, illetve 16 szeletből. Magas jelszint jelzi, hogy az aktuális tranzakció egy zárt szekvencia része. Az HMASTLOCK időzítése megegyezik a címzés fázis időzítésével. A védelmi vezérlőjelek további információkat szolgáltatnak a busz hozzáférésről, elsősorban valamilyen védelmi szintet megvalósítani kívánó HPROT[3:0] modulok használják. A jelek mutatják, hogy az adott tranzakció egy műveleti kód vagy adathozzáférés; vagy jelzik, hogy a tranzakció felhasználó szintű adatelérést vagy privilegizált hozzáférést kér. Jelzi a tranzakció hosszát. mely lehet bájt, félszó illetve szó hosszú. A szabvány HSIZE[2:0] további méreteket is megenged 1024bit hosszúságig. Aktuális tranzakció típusát jelzi, ami lehet: alapállapot foglalt HTRANS[1:0] nem szekvenciális szekvenciális HWDATA[31:0] 32 bit hosszúságú adat a mestertől a szolga felé. Az írás irányú adatok. A tranzakció irányát jelöli. Magas jelszint esetén írásról van szó, alacsony HWRITE jelszint esetén pedig olvasásról. HRDATA[31:0] 32 bit hosszúságú adat a szolgától a mester felé. Az olvasás irányú adatok A tranzakció végét jelző jel. Magas jelszint esetén a tranzakció befejeződött. HREADYOUT Alacsony szinten történő tartásával a tranzakció elnyújtható. Az adatok multiplexeren történt áthaladása után szolgáltat információt a HRESP tranzakcióról a mesternek. Alacsony jelszint esetén a tranzakció hibamentesen lezajlott, magas jelszint esetén valamilyen hiba történt. Minden egyes AHB-Lite buszra kötött szolga rendelkezik egy kiválasztó jellel, mely jelzi feléje, hogy a mester éppen vele akar kommunikálni. A HSELx HSELx jelnek és az előző tranzakció végét jelző HREADY jelnek egyidőben rendelkezésre kell állniuk.
27
NAGY SZILÁRD
6. A BEÁGYAZOTT RENDSZER A megvalósított beágyazott rendszer vázlatát a 14. ábra szemlélteti. A rendszer alapját egy ARM Cortex-M0 processzor mag képzi, melyhez az AHB-Lite buszrendszeren keresztül csatlakoznak a különböző I/O eszközök és memóriák. SPARTAN 6 FPGA 100Mhz-es kristály
50Mhz-es órajelgenerátor
Rendszer órajel
Reset jel
AMR Cortex M0 processzormag
Debouncer
Nyomógomb
Mem. vezérlő
8 bites kimenet
12 bites bement
7 szeg. vezérlő
LCD vezérlő
I2C vezérlő
Függvényg.
UART vezérlő
VGA vezérlő
PS2-KB vezérlő
8Mb PSRAM 8Mb Flash
8bites LED sor
Nyomógombok és kapcsolók
Hétszegmenses kijelző
Pont-mátrixos LCD kijelző
A/D átalakító
D/A átalakító
UART
VGA
Billentyűzet
AHB-Lite Busz
Időzítő
Külvilág / Digilent Nexys 3 kártya
14. ábra A megvalósított ARM CORTEX-M0 rendszer felépítése
A 14. ábraán szemléltetett perifériák kezdőcímét és a számukra fenntartott tartomány végét a 5. táblázat foglalja össze. 5. táblázat Prifériákhoz rendelt címtartomány
Címtartomány Kedő cím Befejező cím 0x0000-0000 0x007F-FFFF 0x0080-0000 0x00FF-FFFF 0x0100-0000 0x49FF-FFFF 0x5000-0000 0x50FF-FFFF 0x5100-0000 0x51FF-FFFF 0x5200-0000 0x52FF-FFFF 0x5300-0000 0x53FF-FFFF 0x5400-0000 0x54FF-FFFF 0x5500-0000 0x55FF-FFFF 0x5600-0000 0x56FF-FFFF 0x5700-0000 0x57FF-FFFF 0x5800-0000 0x58FF-FFFF 0x5900-0000 0x59FF-FFFF 0x6000-0000 0xFFFF-FFFF
6.1.
Megnevezés SRAM memóriavezérlő Flash memóriavezérlő Szabad Kimenetek a LED sornak Bementek a nyomógomboknak 7 szegmenses kijelző vezérlő LCD kijelző vezérlő I2C vezérlő az A/D átalakítónak Függvénygenerátor UART vezérlő VGA vezérlő Billentyűzetvezérlő Időzítő Szabad
Memóriavezérlő egység
A modul feladata az AHB-Lite tranzakciók konvertálása a Nexys 3 kártyán található SRAM és Flash által feldolgozható tranzakciókká. A vezérlő egyszerre képes kezelni mind a két memória típust. Lehetőséget biztosít VHDL kódból annak a kiválasztására, hogy 28
NAGY SZILÁRD melyik memória típus legyen a kezdőcímen. Erre a „FlashATZero” láb értékének változtatása szolgál (lásd: 6. táblázat). 6. táblázat Fizikai memória kiosztás lehetőségei
FlashATZero 1.
0
2.
1
Cím Kezdő Befejező 0x0000-0000 0x007F-FFFF 0x0080-0000 0x00FF-FFFF 0x0000-0000 0x007F-FFFF 0x0080-0000 0x00FF-FFFF
Memória típus SRAM Flash Flash SRAM
Látható, hogy egyes memóriatípusokból csak 8Mb-ot tud megcímezni, összesen 16Mb-ot. Ezzel ellenben a Nexys 3 kártyán mind a két típusból 16Mb található. A beágyazott rendszerben az első lehetőség lett alkalmazva, ahol is SRAM látható a kezdő címen. A „FlashATZero” értéke fixen, az elem példányosításakor lett megadva úgy, hogy az SRAM legyen a kezdőcímen, ahogyan ezt az alábbi programrészlet is szemlélteti. Inst_SRAM_Flash_Controller : AHB2SRAMFLSH port map ( HSEL => HSel_SRAMFLASH, HCLK => Clock, … -- SRAM / FLASH at 0x0 FlashAtZero => '0', … RamWait => Mem_SRAM_Wait, FlashRp => Mem_FlashRp );
6.2.
8 bites LED sor
Szinte minden fejlesztőkártyán megtalálható eltérő bit számmal az egyik legegyszerűbben vezérelhető periféria LED-sor. Néha csak néhány darabnak jut hely, de vannak olyan esetek is mikor a kettő egész hatványának megfelelő darabszámú LED áll a fejlesztő rendelkezésére. Jelen esetben ez nyolc bitet azaz nyolc darabot jelent. A LED-ek vezérlése minden esetben úgy történik, hogy ha a kimeneten „1” jel jelenik meg a LED világit, „0” jel esetén pedig elalszik. Könnyen belátható, hogy a szükséges vezérlés se bonyolultabb. Az egészhez elegendő egy 8 bites D típusú tároló, amibe a buszról érkező adat beíródik és a kimenete közvetlenül a LED-ekhez kapcsolódik. Ezt szemlélteti a 15. ábra.
29
NAGY SZILÁRD
15. ábra „n.” LED vezérlése
Az adatok beírása két órajel ciklusban történik AHB-Lite protokollnak megfelelően. Az első órajel ciklusban mintavételezésre kerülnek a busz vezérlő jeli, és ezek eltárolódnak egy-egy D típusú tárolóban. Ha minden vezérlő jel a megfelelő jelszinten van, akkor a második órajel ciklusban maguk az adatok tárolódnak el egy 8 bites regiszterben, ami majd közvetlenül vezérli a LED-eket. A regiszter kimenete egyrészt a LED-ekhez kapcsolódik, másrészt vissza van csatolva a buszra. Ez teszi lehetővé, hogy olvasni is lehessen a perifériát, ne csak írni. Ilyenkor a kimentek aktuális státuszát kapjuk vissza. A kommunikáció végét jelző „HReady” jel folyamatosan „1” állapotban lehet, mivel csak olvasás során van jelentősége és ekkor minden időpillanatban rendelkezésre áll a hiteles adat. Észre lehet venni, hogy a vezérlő jelek közül az egyik legfontosabb, hogy a cím nem kerül tárolásra. Ennek oka, hogy a buszon egyszerre 32 bitnyi adatott lehet küldeni és a periféria csak 8 bites regiszterrel rendelkezik. A címzés egy lépésben megoldható és az engedélyező jellel egyértelműen azonosítható az írandó vagy olvasandó regiszter. Vannak előnyei és hátrányai is. Előnye, hogy egyszerűbb, kisebb helyet foglaló kód készíthető így. A hátránya pedig, hogy a következő periféria kezdőcíméig minden egyes címre történő
30
NAGY SZILÁRD címzést vezérli, ami a processzoron futó program írása során áttekinthetetlenséget és hibát okozhat. A 7. táblázat foglalja össze a periféria programból történő vezérléséhez szükséges adatokat. 7. táblázat 8 bites LED sor vezérlő regisztere
Megnevezés LED-ek állapota
6.1.
Cím 0x5000-0000
Méret 8 bit
Típus Olvasható / Írható
Reset érték 0x00
Nyomógombok és kapcsolók
A nyomgombok és a különböző kapcsolók a LED-ekhez hasonlóan a legegyszerűbb perifériák közé sorolhatók. Különböző mennyiségben szinte minden fejlesztő kártyán megtalálhatóak. Jelen esetben öt darab nyomógomb és nyolc darab tolókapcsoló került beépítésre. Elméletileg a kapcsolók és gombok felől érkező jelet elég lenne egy regiszterbe tölteni és onnan szükség esetén a buszon keresztül kiolvasni. Sajnos ez nem így működik a prell hatás miatt. Átváltáskor a mechanikai rezgések miatt többször vált jelszintet az eszköz (16. ábra), ami a nála jóval gyorsabb működésű hálózatban dinamikus hazárdokat eredményezhet, ezért védekezni kell ellene. A védekezésnek több módszere lehet. A módszerek egyik nagy csoportja hardveres alapúak. Ekkor valamilyen módszerrel megpróbáljuk kiszűrni a jelből a káros tüskéket. Az egyik ilyen legegyszerűbb módszer, ha a tüskék lecsengése elég gyors RC tag alkalmazása.
16. ábra Prell hatás
A módszerek másik nagy csoportja, mikor valamilyen szoftveres megoldás kerül alkalmazásra. Ezek alapja, hogy detektáljuk a jelváltozást és várunk, ha eltelt elég a megfelelő idő anélkül, hogy bármilyen újabb változás bekövetkezett volna a jelszintben, 31
NAGY SZILÁRD akkor stabilnak tekintjük és továbbítjuk feldolgozásra. Természetesen a várakozás minden egyes változásnál újra kezdődik. A várakozási idő általában 10ms környékén szokott lenni, mert ennyi idő alatt a legrosszabb minőségű eszköz is stabilizálódik.
17. ábra Nyomógomb illetve kapcsoló illesztése
Ilyen szoftveres megoldást szemléltet a 17. ábra. Az első kettő D típusú tároló eltérő jelszintje folyamatosan töröl egy számlálóból álló időzítőt. Ha az időzítés végére értünk, vagyis a jel stabilizálódót és nem történt átkapcsolás se, akkor a következő órajelnél az utolsó tárolóba beíródik a kapcsoló vagy nyomógomb aktuális állapota. A módszer egyszerűségét és hatékonyságát tükrözi az alábbi VHDL kód részlet is. counter_set <= Dff_01 xor Dff_02; process (Clock) begin if (Clock'event and Clock='1') then Dff_01 <= button; Dff_02 <= Dff_01; if (counter_set='1') then counter_out <= ( others => '0' ); elsif (counter_out(counter_size) = '0') then counter_out <= counter_out + 1; else deb_button <= Dff_02; end if; end if; end process;
A dinamikus hazárd mentes jelek már nem okoznak hibát a feldolgozás során. A különböző vezérlő jelek értelmezése nem szükséges, mert az olvasandó adatok egyértelmű azonosítását elvégzi a buszcímző modulja, ami már korábban bemutatásra került. Mivel kiolvasható adat folyamatosan rendelkezésre áll, és nincs szükség semmilyen várakozásra, ezért a „HReady” jel folyamatosan gerjesztést kaphat. A 8. táblázat foglalja össze a periféria programból történő vezérléséhez szükséges adatokat.
32
NAGY SZILÁRD 8. táblázat 8 bites Kapcsolók és gyomgombok állapot regisztere
Megnevezés Gombok állapota
6.2.
Cím 0x5100-0000
Méret 12 bit
Típus Olvasható
Reset érték N.a.
Hétszegmenses kijelző
A fejlesztő kártyán helyet kapott egy négy számjegyből álló hétszegmenses kijelző. A kijelző elsősorban számjegyek megjelenítésére szolgál, de korlátozottan egyszerűbb betűk is megjeleníthetők rajta. Itt szeretném megjegyezni, az utóbbi lehetőséggel és az egyedi jelek megjelenítésével a továbbiakban nem foglakozom. Hely takarékossági okokból a gyakorlatban a több számjegyet tartalmazó kijelzők közös anóddal vagy közös katóddal készülnek. Jelen esetben egy közös katódú kivitel kerül bemutatásra, illetve a vezérlő ezen felálláshoz készült. Minden számjegynek külön anódja van, de a katódok közösek (18. ábra). Egy adott szegmens megjelenítéséhez az adott digithez tartózó anódot magas jelszinttel, a katódott pedig alacsony jelszinttel kell vezérelni.
18. ábra Közös katódú hétszegmenese kijelző bekötése
A szem tehetetlenségét kihasználva, megfelelő frekvenciával kapcsolgatva a vezérlő jeleket, folyamatosan látható lesz mind a négy számjegy. Minimális esetben másodpercenként 24-szer kell ki illetve bekapcsolni egy számjegyet. A kapott érték erősen elméleti, mivel a gyakorlatban ennél sokkal nagyobb frekvencia szükséges, hogy a számjegyek élesek legyenek. Ezt a vezérlést multiplexált működtetésnek nevezik. Ilyen vezérlő látható az 19. ábran.
33
NAGY SZILÁRD FPGA
19. ábra Hétszegmenses kijelző multiplexált vezérlése
Az AHB illesztés végzi az érkező adatok regiszterbe történő írását és a hétszegmenses kijelző számára a kódolást. A regiszterben történő tárolás az 15. ábran vázolt módszerhez hasonlóan történik, azzal a különbség, hogy itt négy darab 4 bites regiszter került kialakításra. A kódolás egy egyszerű kombinációs logika szerint történik, amit az alábbi VHDL kódrészlet szemléltet. case BCD is when x"0" when x"1" when x"2" when x"3" when x"4" when x"5" when x"6" when x"7" when x"8" when x"9" when x"A" when x"B" when x"C" when x"D" when x"E" when x"F" when others end case;
=> => => => => => => => => => => => => => => => =>
Segment Segment Segment Segment Segment Segment Segment Segment Segment Segment Segment Segment Segment Segment Segment Segment Segment
<= <= <= <= <= <= <= <= <= <= <= <= <= <= <= <= <=
"0000001"; "1001111"; "0010010"; "0000110"; "1001100"; "0100100"; "0100000"; "0001111"; "0000000"; "0000100"; "0001000"; "1100000"; "1001110"; "1000010"; "0110000"; "0111000"; (others => '1');
A kódból kitűnik, hogy mind BCD kódok, mindtermészetes bináris kódok fogadására alkalmas. Ennek oka, hogy a BCD kód nem más, mint természetes bináris kód azzal a különbséggel, hogy BDC esetén, 4 biten a legnagyobb ábrázolható szám a 9, míg természetes bináris kód esetén ez 15. A kódoló a 9-nél nagyobb számokat természetes bináris kódnak tekinti és a hexadecimális alakjukat továbbítja. Továbbá az is észrevehető,
34
NAGY SZILÁRD hogy a kódban az éppen aktív szegmenseket a „0” érték reprezentálja, míg az inaktívakat az „1”. Egy kódolt információ egy multiplexer bementére kerül. A multiplexer címzését egy megfelelő frekvenciával műküödő számláló végzi, mely folyamatosan újra kezdi a számlálást. Ez a számláló egy de-multiplexert is meghajt, melynek feladata, hogy az éppen aktív anódot válassza ki. Mind a multiplexer kimenete, mind a de-multiplexer kimenete közvetlenül az FPGA kivezetéseihez csatlakoznak. Itt szeretném megjegyezni a 8 darab katód közül 7 db magas számot ábrázoló szegmensek a 8. pedig a számjegyhez opcionálisan választható „tizedes” pont. A 9. táblázat foglalja össze a periféria programból történő vezérléséhez szükséges adatokat. 9. táblázat 7 szegmenses kijelző regiszterei
Megnevezés Vezérlő bitek 1. számjegy 2. számjegy 3. számjegy 4. számjegy Tizedesp. helye
Cím 0x5200-0000 0x5200-0004 0x5200-0008 0x5200-000C 0x5200-0010 0x5200-0014
Méret 2 bit 4 bit 4 bit 4 bit 4 bit 4 bit
Típus Olvasható / Írható Olvasható / Írható Olvasható / Írható Olvasható / Írható Olvasható / Írható Olvasható / Írható
Reset érték 00b 0x0 0x0 0x0 0x0 0x0
Az előzőektől eltérően itt megjelent már egy regiszter, ami a periféria vezérlését végzi az alábbiak alapján:
00b:
7 szegmenses kijelző kikapcsolva
01b:
7 szegmenses kijelző bekapcsolva és csak BCD kódok dolgozandó fel
10b:
7 szegmenses kijelző kikapcsolva
11b:
7 szegmenses kijelző bekapcsolva természetes bináris kód dolgozandó fel
A tizedes pont helye pedig az alábbiak alapján állítható be:
0000b:
nincs tizedespont
0001b:
1. helyi érték után van a tizedes pont
0010b:
2. helyi érték után van a tizedes pont
0100b:
3. helyi érték után van a tizedes pont
1000b:
4. helyi érték után van a tizedes pont
6.3.
Pont-mátrixos LCD kijelző
A pont-mátrixos LCD kijelző (20. ábra) sokkal több lehetőséget biztosít a felhasználó számára a megjelenítési lehetőségek közül, mint a hét szegmens kijelző. Itt már van lehetőség a számok megjelenítése mellett karakterek, írásjelek esetleg egyéni 35
NAGY SZILÁRD szimbólumok megjelenítésére is. A kijelezett információ mennyisége is több. Jelen esetben összesen 32 karakter (2x16).
20. ábra Pontmátrixos LCD kijelző Forrás: [2]
Az eszköz processzorhoz történő illesztésére több lehetőség is van. Első ilyen lehetőség, hogy a kijelzőnek küldendő adatokat először egy regiszterbe írjuk, és onnan közvetlenül a kijelző bemeneteire kerülnek. Hasonlóan, a bemutatott LED-sor vezérléséhez.
Az
adatok
küldése
közötti
várakozás
pedig
szoftveresen
kerül
megvalósításra. RW 2x16-os LCD vezérlő
AHB illesztés
AHB-Lite
RS LCD adatok
21. ábra LCD kijelző belső felépítése
Ennél jobb megoldás lehet, ha az adatok közötti várakozást is az FPGA vezérli önállóan. Ennek a megoldásnak a blokkvázlatát szemlélteti 21. ábra. A megszokott módon áll az AHB buszra történő illesztésből és egy egyedi vezérlésből. Az egyedi vezérlés feladat, hogy kontrolálja az adatok egymás utáni küldése közötti előírt minimális várakozása időt, és az áramkör bekacsolása után felhasználói igényeknek megfelelően inicializálja a kijelzőt. Mind az inicializálás, mind a jövőbeni adatok küldését egy állapotgép vezérli a 22. ábra alapján.
36
NAGY SZILÁRD
Rst=0
Rst=0
Start
50ms
Bekapcsolás
Beállítás
2,2ms
Kész
Rst=0
En=1
Küldés
50us
22. ábra LCD kijelzőt vezérlő állapotgép
Bekapcsolást indítást követően a bekapcsolás állapotba kerül, ahol nem csinál mást, mint várakozik, 50ms-ot időtartamban. Erre azért van szükség, hogy legyen ideje az LCD kijelzőnek felélednie. Az idő leteltével a beállítás állapotba kerül, ahol a VHDL kódban kódolt kezdeti beállításokat küldi el. Ilyen beállítások például: legyen-e kurzor, villogjon-e kurzor vagy milyen legyen a szövegkiírás iránya. A szükséges időt itt is meg várja. A készállapotba lépve várakozik az adatküldés engedélyező jelre. Ezt mindenegyes alkalommal megkapja, mikor új adat érkezik az AHB buszon. A küldés állapotban továbbítja az új adatot és szükséges ideig várakozik. Majd visszalép a kész állapotba. A „reset” jel érkezésekor bármelyik állapotból a bekapcsolás állapotba lép. Látható, hogy a rendszer semmilyen buffert, FIFO tárolót nem tartalmaz, ezért ha az AHB rendszeren túl gyorsan érkeznek a küldendő adatok, várakoztatja azt, ami egyben azt is jelenti, hogy a processzorban a program futása is várakozik. A 10. táblázat foglalja össze a periféria programból történő vezérléséhez szükséges adatokat. 10. táblázat LCD vezérlő regiszterei
Megnevezés LCD-nek küldendő adat
6.4.
Cím 0x5300-0000
Méret 10 bit
Típus Írható
Reset érték N.a.
A/D átalakító
A fejlesztő kártyához csatolható egy 4 csatornás 12bites A/D átalakító. Az átalakító I2C buszon keresztül kommunikál a külvilággal. Maga a vezérlő felépítésének megismerése előtt célszerű magával a kommunikációs protokollal megismerkedni. Az I2C kommunikációs buszt a Philips fejlesztette ki. Egyszerű kétirányú, kétvezetékes buszrendszer, ami hatékonyan használható IC-k közötti kommunikációra. Kedvező tulajdonságainak köszönhetően napjainkban már nem csak a Philips gyártmányú IC-k használják. Szinte minden mikrovezérlő tartalmaz beépített I2C kommunikációs felületet és a legtöbb neves gyártó kínál különböző áramköröket ezzel a felülettel. 37
NAGY SZILÁRD Mint már említettem a busz két vezetéket használ, és így egy szinkron szimplex kommunikációra alkalmas. a tisztán látás végett tehát a buszon továbbításra kerül egy szinkronizáló órajel (SCL), és az adatvezetéken (SDA) egy időben csak egyirányú kommunikáció történhet. A csatlakoztatott áramkörök mester-szolga hierarchiába vannak szervezve. A kommunikációt minden esetben a mester kezdeményezi a szolga megszólításával. Az eszközök azonosítása címmel történik, mely egy része gyártóspecifikus, a másik része pedig szabadon beállítható a címző lábakon keresztül. Az előzőek alapján a busz típusától függően az alábbi kommunikációs sebességek érhetők el:
szabványos mód (standard mode; Sm):
⁄
gyors mód (fast mode; Fm):
⁄
gyors mód plusz (fast mode plus; Fm+):
⁄
nagy sebességű mód (high-speed mode; Hm):
⁄
ultra gyors mód (ultra fast mode; Um):
⁄
23. ábra Adatcsomag az I2C buszon
Egy a buszon közlekedő adatcsomagot szemléltet a 23. ábra. Alap állapotban,amikor nem történik kommunikáció a buszon,- mind az adat vezeték (SDA), mind az órajel (SCL) magas logikai szinten van. A mester a küldési szándékot e jelek alacsony logikai szintre állításával jelzi, vagyis elküld egy start bitet. Majd elküldi a cél áramkör címét, ami 7 bit. A 8. bit jelzi a címzettnek a kommunikáció irányát. 0 esetén a mester fog adatot küldeni a szolgának, 1 esetén pedig ez pont fordítva történni. A sikeres címzést a címzett egy alacsony jelszintű nyugtázó jellel nyugtázza. A kommunikáció irányának megfelelően az adó elküldi a 8 bit hosszúságú adatot, amit a vevő szintén egy alacsony jelszintű nyugtázó jellel nyugtáz. A küldés vagy fogadás mindig a legmagasabb helyi értékű bittel kezdődik, és a legalacsonyabbal végződik. Ha a kommunikáló feleknek több bájt hosszú mondandójuk van, akkor ezek követhetik folyamatosan egymást 8 bites csoportokban, ha minden 8. bitet egy nyugtázó jel követ. Mindaddig így működhet, amíg a kommunikáció iránya meg nem változik, vagy amíg a mester egy másik eszközt nem szólít meg, mert egy újabb címzési fázisra van szüksége.
38
NAGY SZILÁRD Az előzőekben elmondottak alapján a kommunikáció egy bizonyos sorrendiséget követ, aminek a vezérlését egy szinkron állapotgéppel könnyedén meg lehet oldani, ezt szemlélteti a 24. ábra. A busz szempontjából beágyazásra egy mester került, és az állapotgép is e funkció ellátásának szemszögéből lett felépítve. En=1 és új cím
En=1 és ugyanaz a cím
Kész
Start En=1
Clk=1
Parancs
En=0
Fogad ás
Rw=0
ACK
Bit_cnt=0 ACK
Stop
Bit_cnt=0
Bit_cnt=0
Küldés
Rw=1
ACK En=0 En=1 és ugyanaz a cím
24. ábra I2C kommunikáció vezérlő
A rendszer start állapotban várakozik mindaddig, amíg a kommunikációs szándékot engedélyező jel (En) magas jelszintre nem vált. A parancs állapotban beállítja a szükséges belső regisztereket és továbbítja a start bitet. A címzés állapotban elküldi a megcímzett eszköz címét és a kommunikáció irányát jelző bitet, majd várakozik a címzett válaszára. Ha megérkezett a nyugtázó jel, a kommunikáció irányának megfelelően halad tovább az állapotgép. Küldés és fogadás ágak hasonlóan működnek, ezért őket egyben tárgyalom. A rendszer az adott állapotban marad mindaddig, míg a fogadott vagy küldött bitek számát jelző számláló (bit_cnt) el nem éri a nullát, vagyis mindaddig, míg az összes bit feldolgozásra nem került. Itt szeretném megjegyezni, hogy a busz mintavételezése olvasáskor lehetőségéhez mérten a bitidő felénél történik. Az összes bit elküldése vagy fogadása után a nyugtázó jelre váró állapotba kerül. A nyugtázást követően, ha a cím és az irány nem változott, visszalép az előző állapotra és újabb küldést / fogadást indít. Ezt mindaddig folytatja, míg a paraméterek megegyeznek a címzés fázisában eltárolt paraméterekkel. Ha ezek változnak először stop állapotba, majd készenlét állapotba lép a rendszer. A két eltérő kommunikációs protokoll miatt az előzőekben bemutatott vezérlő logikát nem lehet közvetlenül a processzor maghoz csatolni. Szükséges egy külön illesztés, ami összhangot teremt köztük. A sorrendiség miatt ez is egy állapotgéppel könnyen 39
NAGY SZILÁRD megoldható (25. ábra). Többek közül két tényt szeretnék kiemelni, ami a feladat megoldása során felmerült és nagyban befolyásolta azt. Várakozás
Hsel=1
Parancs küldése
Kész=1
1. 8bit olvasása
Kész=1
2. 8bit olvasása
Kész=1
Stop
Clk=1
25. ábra AHB-Lite illesztő állapotgép
Az első hogy az AHB-Lite busz sokkal gyorsabb, mint az I2C. Több lehetőség közül kihasználva az AHB-Lite kommunikáció felfüggesztésének lehetőségét, ez a megoldás a legegyszerűbb, hogy az AHB-Lite bevárja az I2C-t. Sajnos van egy nagy hátránya, hogy a kommunikáció során a processzor is várakozik. A 25. ábran szemléltetet állapotgép működése akkor kezdődik el, ha az AHB buszon kiválasztásra kerül a periféria, ekkor az I2C-n keresztül elküldi az A/D áthalkítónak, hogy melyik csatornát szeretné beolvasni. Minden egyes csatornának és működési módnak külön címe van. Majd beolvas, 2x8bitet. A stop állapotban a regiszterekbe beírja a beolvasott értéket, és felszabadítja a buszt. Jól látható, hogy a vázolt állapotgép nem képes tetszőleges perifériával kommunikációt megvalósítani, csak a csatlakoztatott A/D átalakítóval. A 11. táblázat foglalja össze a periféria programból történő vezérléséhez szükséges adatokat. 11. táblázat A/D átalakító regiszterei
Megnevezés Működési mód Fogadottadat
6.5.
Cím 0x5400-0000 0x5400-0004
Méret 8 bit 16bit
Típus Olvasható / Írható Olvasható
Reset érték 0x00 N.a.
Függvénygenerátor
A fejlesztő kártyához a PMOD csatlakozó felületen keresztül csatlakoztatható egy D/A átalakító (26. ábra). Az digitálisból analóg konverziót egy AD5541A típusó D/A konverter IC végzi, amit az Analog Devices cég gyárt. A chip egy csatornás 16bites átalakítást tesz lehetővé. Az átalakítót felhasználva könnyen szerkeszthető egy egyszerű függvény generátor a beágyazott rendszerhez.
40
NAGY SZILÁRD
26. ábra D/A átalakító kiegészítő modul
Az átalakító soros szinkron szimplex módon kommunikál a külvilággal. A kommunikáció
teljes
egészében
a
szó
szoros
értelmében
nem
tekinthető
kommunikációnak, mert csak írni lehet az áthalkítót olvasni nem. Az írás folyamatát szemlélteti a 27. ábra.
27. ábra Adatok küldése a D/A átalakítónak
Az SCLK jel szolgáltatja a szinkron óra jelet, ami a gyártó specifikációja szerint 2,7 – 5,5V-os tápfeszültség mellett akár 50MHz is lehet. Elsőre én is ezzel próbálkoztam, de sajnos gyorsan be kellet látnom, hogy a fejlesztő kártya és elsősorban azon a PMOD csatlakozók nem alkalmasak erre, mert a négyszögjel annyira eltorzul és zajos lesz, hogy az átalakító már nem képes értelmezni (28. ábra). A torzulás és a zajosodás az adat és vezérlő bitekre is igaz. Jelentősen csökkentve a frekvenciát az órajel kismértékű zajosodás mellett már átvihető a PMOD csatlakozón a D/A átalakítónak (29. ábra). Az ábráktól
3,5 3 2,5 2 1,5 1 0,5 0
Feszültség [V]
Feszültség [V]
függetlenül kísérletek alapján a végleges órajelet 6,25MHz-re választottam.
0
0,05
0,1
0,15
0,2
0,25
3,5 3 2,5 2 1,5 1 0,5 0 0
Idő [ms]
0,2
0,4
0,6
Idő [ms]
28. ábra ~20MHz-es órajel
29. ábra ~3,3MHz-es órajel
41
0,8
1
NAGY SZILÁRD A D/A átalakítóval a kommunikáció a CS jel alacsony jelszintre húzásával kezdődik, és itt is marad, míg az adatbitek küldése be nem fejeződik. Az adatok az MSB bittől LSB bitig haladva sorban érkeznek a D/A átalakítóhoz. Az utolsó bit elküldése esetén a CS vezérlő bit magas jelszintre vált és LADC vezérlő jellel kell jelezni a kommunikáció végét. Az előzőeknek megfelelően az adatok elküldésért felelős vezérlő logika VHDL kódját szemlélteti az alábbi forráskód részlet: SD0 <= wData0(index); process(rst, datClk) begin if (rst = '1') then DONE <= '0'; SYNC <= '1'; LDAC <= '1'; index <= 0; stCur <= stInit; elsif falling_edge(datClk) then case stCur is when stInit =>
when stTx
=>
when stLDAC
=>
when stDone
=>
DONE <= '0'; SYNC <= '0'; index <= 0; stCur <= stTx; DONE <= '0'; SYNC <= '0'; index <= index + 1; if (index = 14) then stCur <= stLDAC; else stCur <= stTx; end if; DONE <= '1'; SYNC <= '1'; LDAC <= '1'; stCur <= stDone; stCur <= stInit; DONE <= '1'; SYNC <= '1'; LDAC <= '0'; index <= 0;
end case; end if; end process;
A kód tanulmányozása során észrevehető két érdekes dolog. Az első hogy látszólag a vezérlő egység az előzőektől eltérően az adat biteket nem MSB bittől az LSB bit felé haladva küldi, hanem fordítva. Az oka hogy így egyszerűbb a kódot megszerkeszteni, de ez azt is eredményezi, hogy a példányosításnál, jobban kell figyelni. A wdata0 vektort ellentétes bitsorrenddel kell majd példányosítani, mint ahogyan a vezérlőben van definiálva. A másik érdekes dolog, hogy az adatok küldésért felelős számláló csak 14-es indexig megy látszólag. Az oka hogy a számláló növelése és a következő állapotba lépés párhuzamosan történik. Vagyis mikor a számláló 14 értékről 15 re vált a logika már a következő állapotba lép. 42
NAGY SZILÁRD A mérési gyakorlatban azt szokták mondani, hogy egy jel időtartományban történő vizsgálatához 10 minta elegendő. Ebből következik, hogy az elő állításához is elegendő 10 minta periódusonként, de ez elég csúnya jelet eredményez (30. ábra). A szebb jelalak érdekében érdemes a minták számát növelni. A függvény generátornál a minták számát 20 minta / periódusra választottam.
Feszültség [V]
2,5 2 1,5 1 0,5 0 0
100
200
300
400
500
Idő[ms] 30. ábra 10 minta/periodús-ú fűrészfogjel
A függvény generátornál törekedtem a lehető legegyszerűbb felépítésre és lehessen vele a három alap jelalakot elő állítani. Név szerint szinusz jelet, fűrészfogjelet és négyszög jelet. A felépítését a 31. ábra szemlélteti. Függvény generátor Jelalak
Számláló
LUT
D/A kummunikáció
Késleltetés
31. ábra 10 minta/periodús-ú fűrészfogjel
Az AHB busz felöl meg kapja, hogy milyen jelalakot kell generálnia, és hogy milyen időközönként kell új jelszintet generálnia. Ennek megfelelően számol a számláló 1-től 20ig. Ha a rendszernek fűrészfog jelet kell előállítania akkor a számláló értéke közvetlenül D/A kommunikáció vezérlőre kerül, míg szinusz vagy négyszög jel esetén a LUT-ra. A LUT nem más, mint egy 20 elemű vektor, mely rendre tartalmazza a megfelelő jel előállításához szükséges jelszinteket. A rendszer által egy maximum körülbelül 17kHz-es jel generálható, melyeket a 32. ábra - 34. ábra szemléltet. Az ábrákon látható hogy a jelek 0 és 2,5 V között változnak, ennek oka hogy a D/A átalakító referencia feszültsége 2,5V és csak pozitív tápfeszültség áll az átalakító rendelkezésére.
43
3 2,5 2 1,5 1 0,5 0
Feszültség [V]
Feszültség [V]
NAGY SZILÁRD
0
50
100
150
200
3 2,5 2 1,5 1 0,5 0
250
0
50
100
150
200
250
Idő [ms]
Idő [ms] 32. ábra ~17kHz-es fűrészfogjel
33. ábra ~17kHz-es négyszögjel
3
Feszültség [V]
2,5 2 1,5
1 0,5 0 0
50
100
150
200
250
Idő [ms] 34. ábra ~17kHz-es szinuszjel
A 12. táblázat foglalja össze a periféria programból történő vezérléséhez szükséges adatokat. 12. táblázat Függvénygenerátor regiszterei
Megnevezés Generálandó jelalak Késleltetés
Cím 0x5500-0000 0x5500-0004
Méret 2 bit 32 bit
Típus Olvasható / Írható Olvasható / Írható
Reset érték 00b 0x0000-0000
A generálandó jelalak regsizter határozza meg, hogy milye jelalakot generáljon a függvény generátor az alábbiak alapján:
00b:
a
függvény
generátor
kikapcsolva,
a
kimenetén
1,25V-os
egyenfeszültség
01b: fűrészfog jel generálása
10b: szinusz jel generálása
11b: négyszögjel generálása
A késleltetés regiszter pedig azt határozza, meg hogy D/A átalakító kommunikációjához használt órajelhez képest hány ciklust várakozzon, míg új jelet generál.
44
NAGY SZILÁRD
UART vezérlő egység
6.6.
A felhasznált univerzális adó / vevő egység a RS-232 szerinti kommunikáció biztosítására lett telepítve a rendszerbe. A kommunikáció jellemzői 50Mhz órajel esetén:
Bitsebesség:
19200kbs
Paritás bit:
nincs
Stop bit:
1db
Az eszköz nem biztosít lehetőséget a kommunikációs jellemzők – bitsebesség, paritásbit, stop bit, stb. – programból történő dinamikus állíthatóságára. A buszrendszerről érkező párhuzamos adatokat az RS-232 szabványnak megfelelően soros adatfolyammá alakítja oda-vissza. Küldés esetén a párhuzamosan érkező adatok egy FIFO tárolóba kerülnek (35. ábra), majd innen kiolvasva történik az átalakítás és a jelek kiküldése a kommunikációs csatornára. Üzenet fogadása esetén először az adatok konvertálása történik meg (35. ábra), majd ezután kerülnek be egy FIFO tárolóba és onnan a buszra, ha van rá igény. azon esetben,Ha a vételi tároló üres volt és ezután egy adat érkezik bele, akkor egy megszakítás kérő jelet is továbbit a processzor felé. Az összes adat elküldése és fogadása után – vagyis ha mind a kettő FIFO tároló kiürült – az eszköz kész jelet küld a processzornak és várakozik mindaddig, míg újabb fogadandó vagy küldendő adat nem érkezik. P/S átalakító
Rx FIFO
Rxd
AHB-Lite Bitráta generátor IRQ S/P átalakító
Tx FIFO
Txd
35. ábra UART egység belső felépítése
A 13. táblázat foglalja össze a periféria programból történő vezérléséhez szükséges adatokat. A regisztert írva adat küldhető az UART-on olvasva pedig adat olvasható onnan. 13. táblázat UART vezérlő regiszterei
Megnevezés UART adat
Cím 0x5600-0000
Méret 8 bit
45
Típus Olvasható / Írható
Reset érték 00000-0000b
NAGY SZILÁRD
6.7.
VGA vezérlő
A VGA vezérlő különböző modulok kombinációja, hogy szöveges konzolt lehessen generálni vele a Nexys 3 kártya VGA portán keresztül. Részei: egy VGA szinkronizáló, konzol generátor, ami magában foglal egy szinkron RAM-ot az adatok tárolásához és egy ROM-ot a szöveg elemek tárolásához (36. ábra). A Nexys 3 kártya csak 8bites színmélységre ad lehetőséget, amik 3 bit a pirosnak, zöldnek és 2 bit a kéknek felel meg. Ez összesen 256 színvariáció megalkotásához elegendő. A VGA szinkronizáló szabványos 640x480-as felbontást használ. Számlálója 25MHz-es órajelet állít elő. Ez közel van a szükséges 25,2Mhz frekvenciához, ami 60Hz-es képfrissítést tesz lehetővé. Az előállított órajel lesz felhasználva a vízszintes és függőleges kimenet szinkronizáláshoz, melynek segítségével a képpont kirajzolódik a szükséges X;Y koordinátára. Vsync Hsync
AHB-Lite
VGA Szinkronizáció
VGA konsol 2048x8 bit ROM RGB 4096x7 bit RAM
VGA Kép 32768x8 bit RAM
36. ábra VGA vezérlő belső felépítése
A VGA rendszer konzol részét használja szöveges tartalom megjelenítéséhez, úgy hogy a minimálisra lehessen csökkenteni a tárolandó adatok mennyiségét. A képernyő egy 80x30 mátrixra osztja fel. Az egyes pozíciókban egy 8x16 képpont méretű karaktert lehet írni. A kerekterek alakja bitképként ROM-ban van tárolva. A kijelezendő karakter ASCII kódja pedig RAM-ban raktározódik. Az „Enter” billentyű vagy „/n” új sor karakter új sort hoz létre, és a már meglévőket eggyel feljebb mozgatja. A „Backsapce” hasonlóan viselkedek, mint a megszokott, de nem tud eggyel feljebbi sorba lépni. A szöveges mód a 0x5700-0000 címtől érhető el.
46
NAGY SZILÁRD A vezérlő lehetőséget ad egy 256x128 méretű kép létrehozására a képernyő jobb alsó sarkában. A rajzoláshoz csak a képpont színét kell elküldeni az adott koordinátához tartozó címre. A képpont 8bit-es színének felépítése: RRRGGGBB, ahol a betűk az adott színhez tartozó biteket jelölik. A rajzolt kép minden esetben a konzolon kiírt szöveg mögött lesz. A képpontok címzése a bal felső sarokponttól indul és jobb alsó sarokban ér véget. Soronként folytatólagosan a 0x57A0-0000 – 0x57A2-0000 címtartományon lehet elérni. A vezérlő sajnos az FPGA beépített Block-RAM-ját használja memóriának.
6.8.
Billentyűzetvezérlő
A vezérlő a PS/2 billentyűzetről érkező adatokat fordítja 7-bites ASCII kóddá, majd továbbítja az AHB-Lite busz felé. Az adat nem íródik ki közvetlenül a buszra, hanem először egy FIFO tárolóba kerül, ahol várakozik a kiolvasásig (37. ábra). Ha a tároló üres volt és új adat érkezett, akkor megszakítás kéréssel jelzi a processzor felé a rendelkezésre álló új adatot. Az összes adat kiolvasása után várokozó üzemmódba kerül mindaddig, míg újabb billentyű nem kerül leütésre.
AHB-Lite
Billentyűzetkód ASCII kódá alakítása
Billentyűzetkód PS2 órajel PS2 Rxd
IRQ
PS2 Adat
FIFO
37. ábra Billenytűzetvezérlő belső felépítése
A vezérlő funkcionalitása szorosan korlátozva van az ASCII karakterekre, számokra és szimbólumokra. A funkcióbillentyűket, mint Ctrl, Alt, Caps Lock, Tab, nyilak és „F” billentyűk nem tudja feldolgozni. Ekkor egy csillag karakter jelzi, hogy a bemenet ismeretlen. A 14. táblázat foglalja össze a periféria programból történő vezérléséhez szükséges adatokat. 14. táblázat UART vezérlő regiszterei
Megnevezés Billentyű
Cím 0x5800-0000
Méret 8 bit
47
Típus Olvasható
Reset érték 00000-0000b
NAGY SZILÁRD
6.9.
Időzítő
Az időzítő belső felépítését a 38. ábra szemlélteti. Az órajel teljes egészében vagy ⁄
előosztást, vagy ⁄
előosztást követően jut egy multiplexere. A regiszterekben
beállított értékeknek megfelelően a multiplexer a megfelelő órajelet továbbítja a lefelé számláló felé. Csak a busszal van kommunikációs kapcsolat, ami a regiszterek beállítására és aktuális számlálási érték kiolvasására szolgál. Működési módtól függően különböző megszakításkérések állíthatók be. Órajel
AHB-Lite Lefelé számláló
MUX
Előosztó 16
Előosztó 256 IRQ Regiszterek
38. ábra Időzítő belső felépítése
Az időzítőnek alapvetően két működési módja van. Az első a szabadonfutó-mód. Ha a számlálás a beállított kezdőértékről indulva eléri a nulla értéket egy megszakításkérés jel generálódik, és a számlálás folytatódik tovább a maximum értékről. A második üzemmód periodikus. Ekkor minden egyes alkalommal a kezdő értékről indul a számlálás és minden egyes nulla értéknél generálódik egy megszakítás kérő jel. Ez az üzemmód használható időzített megszakítások kérésére. 15. táblázat Időzítő regiszterei
Megnevezés Kezdő érték Számlálási érték Futási mód Alaphelyzetbe állítás
Cím 0x5900-0000 0x5900-0004 0x5900-0008 0x5900-000C
Méret 32 bit 32 bit 4 bit 1 bit
Típus Olvasható / Írható Olvasható Olvasható / Írható Olvasható / Írható
Reset érték 0x00000000 0x00000000 0x0 0
Az időzítő regisztereit 15. táblázat tartalmazza. Az elsővel a számlálás kezdő értékét lehet beállítani. A másodikkal pedig kiolvasni az aktuális számlálási értéket. A kívánt futási mód beállításához a szükséges értékeket 16. táblázat tartalmazza. Az értékek binárisan vannak megadva (az „X” tetszőleges értéket felvehet). Az időzítő alaphelyzetbe állításakor magas jelet kell küldeni a táblázat szerinti utolsó regiszternek. Ekkor az összes
48
NAGY SZILÁRD regiszter törlődik és a számlálás a maximum értékről indul. Ha egyidőben van aktív megszakítás kérő jel, akkor az is törlődik. 16. táblázat Időzítő futási módjai
Futási mód Folyamatos Periodikus
1 000X 001X
Előosztás ⁄ 010X 011X
49
⁄ 1X0X 1X1X
NAGY SZILÁRD
7. A BEÁGYAZOTT RENDSZER PROGRAMOZÁSA Az elkészült konfiguráció több módon is az FPGA-ba tölthető. Az első és ipari gyakorlatban tán a legelterjedtebb módszer, hogy valamilyen JTAG alapú programozó hardvert használunk, amit az ISE fejlesztő környezet is támogat. Ennek a megoldásnak egyik hátránya, hogy szükség van egy költséges hardverre. A másik megoldás azon alapszik, hogy a Digilent cég minden egyes fejlesztőkártyájukba beépít egy programozó felületet és biztosít hozzá egy számítógépes programozó szoftvert. A kártya felprogramozásához én is ezt a módszert választottam. Természetesen kényelem és költséghatékonyság mellett vannak negatív oldalai is a módszernek, például a
hibakeresés nem olyan hatékony, mint a JTAG felületű
programozókkal. Jelen esetben két dolgot kell a kártyára programozni: az egyik aFPGA viselkedését leíró „.bit” fájl, a másik aARM CORTEX-M0 magon futó program kód. először célszerű a kártya RAM-jába tölteni a processzoron futó program kódot, amit a 39. ábra szemléletet. A lefordított bináriskódot programozás előtt „.bin” formátumba kell konvertálni.
39. ábra RAM programozása
Az FPGA-ba töltendő „.bit” file feltöltésére két lehetőség is van. Az első, mikor az egyszerűség elve mellett a FPGA-ba töltjük, és ki és bekapcsolás után elveszik. A második lehetőség, hogy SPI Flash-be továbbítódik, és raktározódik, melynek előnye, hogy bekapcsolás után is megmarad az FPGA konfigurációja, de a RAM-ba töltött program továbbra is elveszik. Az előbb említett módszereket szemlélteti a 40. ábra és 41. ábra. SPI Flash-be törtőné programozásnál a sorrend akár meg is cserélhető, csak bármelyik kód (FPGA vagy ARM) betöltése után minden esetben a fejlesztő kártyát újraindítani szükséges. a fejlesztő kártya újraindítása szükséges 50
NAGY SZILÁRD
40. ábra FPGA direkt konfigurálása
41. ábra SPI Flash programozása
Az teszt programok gyanánt a rendszerhez készültek egyszerű bemutató programok néhány ezek közül:
villogó LED-ek
tolókapcsolókkal vezérelt LED-sor
hét szegmenses kijelzőn megjelenített előre számláló
„Hello világ!” kiíratása a LCD kijelzőn
17KHz-es függvény generátor
51
NAGY SZILÁRD
8. ÖSSZEFOGLALÁS A dolgozat első néhány fejezete rövid áttekintést nyújt a FPGA fejlesztés folyamatának alapjairól és annak hardveres és szoftveres eszközeiről. Megemlít egy lehetséges fejlesztő környezetet ARM processzorok programozásához. Röviden bemutatom az ARM processzor architektúrát és annak történetét, majd kitérek a Cortex-M processzorcsalád jellemzőire. Implementálom az ARM által Verilog kódban biztosított Cortex-M0 processzormagot. A processzor mag az AHB-Lite buszon keresztülkommunikál a világgal. A kommunikációs folyamatot és a különböző perifériák címzését röviden ismertetem. A processzor maghoz különböző perifériák lettek csatolva. Többet közülük saját magam terveztem. Ilyen perifériák: a LED vezérlő, a gomb vezérlő, 7 szegmenses kijelző vezérlő, LCD kijelző vezérlő, I2C vezérlő és a függvénygenerátor. Néhány perifériát pedig felhasználtam és illesztettem az ARM cég által biztosított perifériák közül. Tételesen ezek: az UART vezérlő, a VGA vezérlő és az időzítő. Végeredményül egy egyszerű, alap, működő rendszert kaptam, amit hobbi és esetleg oktatási célokra lehet felhasználni.
52
NAGY SZILÁRD
9. SUMMARY In first chapters of thesis I have given a short introduction about basic of developing process of FGPA systems and needed hardware and software tools. A possible ARM processor programing and developing environment was introduced. I shortly introduced the ARM processor architectures and its history. After that I focused properties of Cortex-M processor family. Cortex-M0 processor core was implemented. It was given by ARM Inc. company in Verilog source. The processor core use AHB-Lite bus to communicate its environment. The communication protocol and addressing of periphery was shortly introduced. Different peripheries were connected to the processor core. Among them I designed more than. For example: LED controller, button controller, 7 segment display controller, LCD display controller, I2C controller and function generator. Also some ARM INc. supported periphery was implemented such as: UART controller, VGA controller and timer. Finally I have get a simple, basic working embedded system what could be used for hobby activities or education.
53
NAGY SZILÁRD
10.
IRODALOMJEGYZÉK
[1] A. Fodor és Z. Vörösházi, Beágyazott rendszerek és programozható logikai eszközök, Veszprém: Typotex Kiadó, 2011. [2] „Digilent Inc. cég weblapja,” [Online]. Available: http://www.digilentinc.com/. „ARM Architektúra - Wikipédia,” [Online]. Available: [3] http://hu.wikipedia.org/wiki/ARM_architekt%C3%BAra. „ARM architecture - Wikipedia, the free encyclopedia,” [Online]. Available: [4] http://en.wikipedia.org/wiki/ARM_architecture. „ARM Cortex-M - Wikipédia,” [Online]. Available: [5] http://hu.wikipedia.org/wiki/ARM_Cortex-M. [6] „Cortex-M Series ARM,” [Online]. Available: http://arm.com/products/processors/cortex-m/index.php. [7] „ARM Information Center - Cortex-M series processors,” [Online]. Available: http://infocenter.arm.com/help/index.jsp. [8] „ARM Cortex-M - Wikipedia, the free encyclopedia,” [Online]. Available: http://en.wikipedia.org/wiki/ARM_Cortex-M. [9] P. I. Martos és F. Baglivo, „Implementing the Cortex-M DesignStart Processor in a low-end FPGA,” Libro de Trabajos del CASE2011, 2011.03. [10] „AMBA 3 AHB-Lite Protocol Specification,” ARM, 2008. [Online]. Available: http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ihi0033a/index.html. [11] P. J. Ashenden, Digital design an embedded system approach using VHDL, Burlington: Morgan Kaufmann Publishers, 2008. [12] J. Dr. Vásárhelyi, „VHDL,” [Online]. Available: http://mazsola.iit.unimiskolc.hu/M.study/anyag. [13] „KEIL - Tools by ARM,” [Online]. Available: http://www.keil.com/.
54