Beágyazott rendszerek bővítése logikai elemekkel és flexibilis hardverperifériákkal
A mikrovezérlők csipre integrált logikai elemei és flexibilisen használható perifériái segítségével jelentősen javíthatók az alkalmazás tulajdonságai: hozzájárulnak a kód terjedelmének és az energiafogyasztásnak a csökkentéséhez, ugyanakkor javítják az alkalmazás teljesítőképességét a diszkrét, „huzalozott” logikai áramkörök és hardver úton megvalósított célperifériák hozzáadásával.
A csipre integrált hardverperifériák jól ismertek arról a képességükről, hogy enyhítik az alkalmazás energiafelvételét, javítják a teljesítőképességét, kibővítik az eszköz képességeit és csökkentik a működtető programkód terjedelmét. Ezeknek a perifériáknak számos fajtája áll rendelkezésre az egyszerű műveleti erősítőktől a megnövelt képességű analóg-digitális átalakítókon (ADC-ken) és az impulzusszélesség-modulátorokon (PWM-eken) át az univerzális időzítőkig (UTMR-ekig). Ezeknek a perifériáknak az egyik leghatékonyabb készletével huzalozott logikai áramköröket vagy más perifériákat egymással összekapcsoló illesztőáramköröket hozhatunk létre. Ez a cikk segít felfedezni a konfigurálható logikai cellák (Configurable Logic Cell – CLC), a konfigurálható, felhasználó által definiálható logikai áramkörök (Configurable Custom Logic – CCL), az eseményvezérelt rendszerek (Event System – EVSYS) és a jelirányító portok (Signal Routing – SR) formájában megvalósuló perifériák lehetőségeit, és azt, hogyan lehet azokat arra felhasználni, hogy hozzáadott értékkel bővítsék a tervező által megvalósítani kívánt rendszert.
CLC / CCL
A konfigurálható logikai cellák (CLC) és a konfigurálható egyedi logikai funkciók valójában programozható „áttekintő” kódolótáblázatok (Look-Up Tables – LUT), amelyek mindegyike lényegében megfelel egy helyben programozható logikai hálózat (Field Programmable Gate Array – FPGA) egy-egy cellájának. Minden ilyen periféria által megvalósítandó logikai funkciót futásidőben kell/lehet definiálni. A CLC/CCL a CPU-tól függetlenül működhet, amely lehetővé teszi, hogy a mikrovezérlőn kívül megvalósított huzalozott funkciót helyettesítsen. A CLC és a CCL között minimálisak a megvalósítás különbségei – a CLC a PIC® mikrovezérlő-eszközcsaládban használatos megnevezés, a CCL pedig az AVR-család hasonló funkcióit jelöli. A kétféle megvalósítás alapvető működése azonos.
Kapcsolók és nyomógombok pergésmentesítése
A CLC/CCL legközönségesebb használati esete a mechanikus kapcsolóelemek hardverszintű pergésmentesítése az időzítő/oszcillátor-típusú áramkörökkel kiegészítve. A Microchip alkalmazástechnikai útmutatója1 (Application Note 2805 – AN2805) háromféle módszert mutat be a CLC-k felhasználásával megvalósított pergésmentesítésre. A háromból kettő jó egyensúlyt képvisel a hardver-erőforrásigény és a teljesítőképesség között. Mindhárom változat forráskódja elérhető a Github-on2.
A pergésmentesítő megvalósításához az egyik CLC-t D-flipflopként kell felkonfigurálni annak érdekében, hogy tárolja a kapcsoló vagy nyomógomb által képviselt logikai értéket. Egy második CLC-vel logikai ÉS-kapcsolatot kell megvalósítani az előző állapot tárolt értéke és a közvetlen bemenőjel között, majd tárolni kell ennek eredményét. Mindkét flipflop órajelét egy alacsony frekvenciájú órajelforrásból állítjuk elő egy, a mikrovezérlőbe épített időzítő vagy oszcillátor segítségével. Az áramkör megvalósítását az 1. ábra mutatja.
1. ábra Két CLC-vel megvalósított pergésmentesítő logikai hálózata
Ugyanez még egyszerűbben megvalósítható az AVR mikrovezérlő-család CCL-elemeivel. A CCL-ek tartalmaznak egy választható bemenőjel-szűrési lehetőséget, amely hatékonyan képes megvalósítani ugyanazt a két órajelciklusos szűrési műveletet, amit a CLS-es megvalósításnál megismertünk. Ráadásul a CCL-ek órajelforrásaként felhasználhatjuk azt a beépített, 1 kHz-es oszcillátorfunkciót, amely elég lassú ahhoz, hogy képes legyen ellátni a pergésmentesítés feladatát.
Kvadratúradekódolás
A CLC-k egy másik használati esete a kvadratúradekódolás megvalósítása. Az inkrementális kvadratúrakódolók két négyszögjelet állítanak elő, amelyek egyike 90 fokkal (egynegyed periódusidővel – A szerk megj.) siet a másikhoz képest. Egy forgómozgás körülfordulásainak száma meghatározható a hullámok számából, míg a jel fázisa a forgásirányra jellemző. A 2. ábrán egy példa látható a kvadratúrakódolt jelekre. Ennek dekódolásához a CLC-k ezt a jelalakot két kimenetre továbbítják, a kvadratúrajelet az óra járásával egyező és ellenkező irányú elfordulásnak megfelelő impulzussorozattá bontva. Az így keletkezett impulzusokat a mikrovezérlőben található két időzítő számlálja meg. Amikor tehát a mikrovezérlőnek az összesített pozícióváltozást kell megtudnia, egyszerű matematikai műveleteket kell csak végrehajtania az időzítők által rögzített impulzusszámokkal ahhoz, hogy meghatározzák a legutolsó leolvasás óta keletkezett pozícióváltozást.
2. ábra Egy lehetséges kvadratúra-jelalak
Eseményrendszer
Az eseményrendszer (Event System – EVSYS) arra szolgál, hogy egy periféria kimeneti jelei közül kiválasszon egyet, és azt más, a mikrovezérlőbe épített perifériák bemenetére továbbítsa. A kapcsolat lebonyolítása a CPU-tól függetlenül történhet, amely energiát takarít meg, ugyanis a mikrovezérlőnek akár az alvó vagy tétlen üzemmódjában is működőképes. Az EVSYS-alrendszer csak az AVR-mikrokontroller-családban található meg.
Az SR-port
A PIC mikrokontrollerekben megtalálható egy periféria, amit Signal Routing (SR)-portnak nevezünk. Az SR-port szerkezete ugyanolyan, mint egy kimenetként konfigurált I/O-port, de ez a mikrovezérlőn belül van megvalósítva. Egy szoftvermegoldást alkalmazhatunk arra, hogy ennek bitjeit kézi vezérléssel beírjuk vagy töröljük, éppúgy, mint azt az I/O kimeneti regiszterénél megszoktuk, de az SR-port támogatja a perifériális kimenőjelek kezelését és a shiftregiszter-funkcionalitást is. Az SR-port jól együttműködik a PIC-mikrovezérlőknél megtalálható perifériális kimeneti csatlakozópont kiválasztási (Peripheral Pin Select – PPS) képességével is. A PPS használata nagy flexibilitást kínál a tervezőnek az I/O-funkciók kijelölésében azáltal, hogy lehetővé teszi a digitális I/O-jelek kivezetését a mikrovezérlő kívánt pontjaira. Hasonlóképpen a PPS megengedi a perifériáknak azt is, hogy az SR-port (csak belül elérhető) csatlakozópontjait egymástól függetlenül, egyedileg bemenetként kezeljék. Ezáltal összetett állapotgépek (szekvenciális logikai hálózatok) is létrehozhatók, és vezérelhetők egy belső periféria által.
Beépített jelválasztó képesség
Az SR-portok és a CLC-k egy lehetséges használati esete egy belső jelválasztó multiplexer megvalósítása is. Ez felhasználható például egy belső – részegységekre lebontott – önteszteléshez, vagy több bemeneti jel közül egy tetszőlegeset kiválasztó funkció megvalósítására is. Egy „kettőből egy” multiplexer egyetlen CLC-vel is megvalósítható. Létrehozhatunk „négyből egy” jelet kiválasztó multiplexert is, de ehhez már három CLC-re és az SR-port két bitjére van szükség. A multiplexer vezérlése egy, az SR-portból származó bittel történik, ez képviseli a belső kiválasztójel-csatlakozópontot. A logikai megvalósítást a 3. ábrán láthatjuk.
3. ábra CLC logikai elemekkel megvalósított 2:1 multiplexer (a ki nem használt bemeneteket nem ábrázoltuk)
Ennek a megvalósításnak a PPS-hez képest az egyik előnye a gyorsaság és a rugalmasság. A PPS zárolható, hogy megakadályozza a véletlen változtatásokat futás közben. Ezenkívül egy konfigurációs bit is beállítható, hogy a PPS-t csak egyszer lehessen feloldani. Ezzel szemben a CLC-alapú multiplexer beállítása lehetővé teszi a program számára, hogy a bemeneteket anélkül változtassa meg, hogy minden alkalommal végig kelljen mennie egy feloldási szekvencián.
Ezt a használati esetet valósítottuk meg egy Morse-kódoló3 demóalkalmazásban, amelyhez a Microchip PIC18F56Q71-eszközcsaládját4 használtuk fel. A demó egy egyszerű Morsekód-adót és -vevőt (4. ábra) valósít meg. Ebben a multiplexer azt a célt szolgálja, hogy válasszon az adó kimenete és egy külső bemeneti jel közül.
4. ábra A Morsekód-demó tömbvázlata
A programban – a forrásszöveg jobb olvashatósága kedvéért – bitenkénti „beállítás/törlés/állapotváltás” makrókat definiáltunk az SR-port „virtuális csatlakozópontjainak” állapotkezelésére.
//Select input to decoder
#define SELECT_TX_DECODE() do { RW0_SetLow(); } while(0)
#define SELECT_USER_DECODE() do { RW0_SetHigh(); } while(0)
#define SWITCH_DECODE_SOURCE() do { RW0_Toggle(); } while(0)
Az alábbi kódrészlet azért felelős, hogy a bemeneti jelforrások kezelését „megtisztítsa” (azaz egy jól definiált alapállapotot hozzon létre – A szerk. megj.). Amikor az adó és a vevő egyaránt tétlen állapotban van, és a felhasználó egy # jelzést küld a terminálnak, ez kapcsolja át a bemeneti jelforrásokat.
if (morseTx_isSwitchRequested() && morseRx_isIdle() && morseTx_isIdle())
{
//Request to switch input sources
SWITCH_DECODE_SOURCE();
morseTx_clearSwitchRequest();
if (IS_USER_INPUT_ACTIVE())
{
//User Input
printf(„User input is now active.\r\n”);
}
else
{
//TX Input
printf(„Transmitter input is now active.\r\n”);
}
}
Megjegyzés: a teljes program forrásszövege elérhető a Github-on.
Hardvergyorsítású paritáskalkuláció
Bizonyos esetekben az adattovábbítás ellenőrzéséhez paritásbit előállítására is szükség lehet. A paritásbit előállítása szoftver úton triviálisan egyszerű, ám lassabban hajtódik végre, mint ahogy arra egy célhardver képes. Az alábbiakban egy egyszerű szoftvermegoldás forráskódja látható.
Megjegyzés: a jelen egyszerű mintaprogramok tesztelésére szükséges minta globális változóként van tárolva.
bool isOdd_SW(void)
{
bool isOdd = false;
uint8_t temp;
//Byte Scan
for (uint8_t byIndex = 0; byIndex < DATA_SCAN_LENGTH; byIndex++)
{
//Bit Scan
temp = data[byIndex];
for (uint8_t biIndex = 0; biIndex != 8; biIndex++)
{
if (temp & 0b1)
{
//Count
isOdd = !isOdd;
}
//Shift bits
temp >>= 1;
}
}
return (isOdd);
}
A számítás gyorsítására (azaz a fenti szoftveres funkció célhardverrel történő megvalósítására) egy CLC-alapú megoldással kiegészített SPI-perifériát lehet használni hardveres paritásszámító egységként. Az SPI-hardver egy soros hozzáférésre is alkalmas shiftregisztert tartalmaz az adatok adására és vételére. Az SPI-hardver (a shiftregiszter) kimenete egy CLC-re vezethető, amely paritásszámító egységként (5. ábra) működik, és lényegesen nagyobb adatsebességű jelet képes feldolgozni, mint a szoftveres változat. A hardveres megoldás – tovább csökkentve a megvalósítás erőforrásigényét – egy létező SPI-perifériát is újrahasznosít. Ez azért lehetséges, mert alapértelmezett alkalmazásban a CS (csipkiválasztó) jelvezetéket aktiválni kell ahhoz, hogy az eszköz más SPI-eszközökkel kommunikálhasson. Ha ez nem történik meg, akkor a tényleges kommunikációt az eszköz nem hajtja végre.
5. ábra A paritásszámító egység hardveres megvalósítása
A hardveresen gyorsított változat kivitelezéséhez először be kell olvasnunk a pillanatnyilag betárolt értéket a CLC-be. Ezt követően el kell küldeni a paritásbit előállítására váró adatot deaktivált CS-jellel. Ezután meg kell vizsgálni a CLC-be betárolt új értéket. Ha ennek a logikai értéke azonos az előzőleg beolvasott bitével, az azt jelenti, hogy páros számú logikai 1-es érték érkezett (ami nem változtatja meg az addig érkezett bitek paritását – A szerk. megj.). Ha az értékek eltérőek, az adott bit páratlan paritású volt. A páratlan paritású eseteket megszámláló programrészlet az alábbiakban látható.
bool isOdd_HW(void)
{
bool initialState = CLC3_OutputStatusGet();
SPI1_BufferWrite(&data[0], DATA_SCAN_LENGTH);
return (!(CLC3_OutputStatusGet() == initialState));
}
Hogy az elérhető sebességelőnyt demonstráljuk, egy, a Microchip PIC16F181465 mikrovezérlő-családján futtatható rövid demóprogramot készítettünk. A mikrokontroller belső időzítőinek egyikét, a Timer 1-et használtuk az FOSC/4 frekvenciájú órajelciklusok megszámlálására, hogy ezzel mérjük a hardver- és a szoftveralapú paritásszámítás időigényét. Az eredményeket az elemzés végrehajtásához megfelelő formátumban egy soros terminálon nyomtattuk ki. Ennek egy másolata látható az 1. táblázatban, amely a szoftver- és a hardvermegoldás teljesítőképességét hasonlítja össze a fordítóprogram optimalizációs szintje (Level 0...Level 5) függvényében. Megjegyezzük, hogy a hardvermegoldással elérhető teljesítőképesség-javulás mértéke függ a mikrovezérlő (és ezáltal az SPI-periféria) órajelének frekvenciájától is. A tesztprogram forráskódja is megtalálható a Github6-on.
1. táblázat A szoftver- és hardveralapú megvalósítás teljesítőképességének összehasonlítása, 10 bájtos vizsgálójel-sorozatokkal
Zárógondolatok
A hardverperifériák fontos szerepet töltenek be a beágyazott rendszerekben. A használatukkal a mikrokontrollerek nagyobb teljesítőképességűekké, hatékonyabbá és használhatóbbá válnak. A logikai célhardverek és a rugalmasan használható perifériák rendkívül hatékony eszközei az olyan egyszerű feladatok megoldásának, mint a nyomógombok kapcsolási bizonytalanságának szűrése vagy a kvadratúradekódolás. A hardverperifériák kreatív használata emeli a tervezett rendszer színvonalát és kitolja a mikrovezérlőkkel kezelhető megoldások határait.
Szerző: Robert Perkel – Microchip Technology, Inc.
Jegyzetek
1 https://www.microchip.com/en-us/application-notes/an2805
2 https://github.com/microchip-pic-avr-examples/pic18f16q40-clc-switch-debouncing
3 https://github.com/microchip-pic-avr-examples/pic18f56q71-morse-code-mplab-mcc
4 https://www.microchip.com/en-us/products/microcontrollers-and-microprocessors/8-bit-mcus/pic-mcus/pic18-q71
5 https://www.microchip.com/en-us/products/microcontrollers-and-microprocessors/8-bit-mcus/pic-mcus/pic16f18146
6 https://github.com/microchip-pic-avr-examples/pic16f18146-hw-parity-mplab-mcc