Při vývoji aplikací s řídicím mikropočítačem jsme často naráželi na opakující se část schématu samotného procesoru, paměti, programovatelné logiky a podpůrných obvodů, vyžadující velmi těsnou montáž z důvodů rychlosti a šíře sběrnice, zpoždění signálů a komplikovaného napájení.
Okolní obvody, často výkonové a analogové, naproti tomu vyžadují dobré propojení zemí, široké spoje a izolační vzdálenosti, takže požadavky na plošný spoj se různí. Dále k tomu přistupují požadavky na testovací módy, kdy by bylo řídicí „inteligenci” nejlépe odpojit.
A konečně, spolu s opakujícím se schématem se opakují i požadavky na chování – software na všech úrovních, od systému po komunikaci s uživatelem a na konektivitu.
Výsledkem těchto požadavků byla koncepce kombinovaného modulu s rychlým mikropočítačovým jádrem, schopným hostit operační systém Linux, a s ním propojeným programovatelným logickým obvodem, do nějž je při bootu zaveden firmware požadované logické struktury. Obvod FPGA je pro toto použití ideální, není potřeba žádný programovací adaptér a má dostatek vývodů jak pro propojení s procesorem, tak pro připojení signálů do/z vnějšku.
Obr. 1 Vestavný modul „Combi“
Tak se zrodila kombinovaná „supersoučástka” – modul velikosti vizitky na vícevrstvém plošném spoji.
Modul má řadu konektorů, rozmístěných po svém obvodu, ale i uvnitř desky.
Na užších stranách jsou umístěny dvouřadové konektory, které předurčují jedno možné použití modulu jako „součástky” – jsou použity dvouřadé dutinkové konektory po 40 kontaktech v rastru 2,54 mm, mířicí dolů, a tedy je možno modul nasunout na populární dvouřadové „hřebínky” na základní (aplikační) desce anebo na prototypové desce.
Když modul sejmete, máte přístup ke špičkám na aplikační desce a můžete testovat analogovou nebo výkonovou část.
Modul má ve skutečnosti tyto konektory tři: vlevo je to jeden konektor, který obsahuje přívod napájení a signály „populárních rozhraní”, ne však paralelní sběrnici, která propojuje procesor, paměti a FPGA na modulu. Levý konektor obsahuje jeden kompletní port COM s řídicími signály (DTE), další čtyři asynchronní sériové porty, čtyři vstupy A/D s vyvedenou referencí.
Vpravo je to dvojice stejných konektorů, obsahující (kromě signálových zemí) jen signály do/z obvodu FPGA. Je jich dostatek, proto jsou rozděleny do dvou konektorů, každý z nich je zapojen jako populární rozhraní IDE. Význam a směr těchto signálů je však určen firmwarem FPGA, stejně jako vnitřní logická struktura tohoto obvodu.
S výjimkou vstupu napájení (+5 V) jsou všechny digitální signály těchto konektorů na úrovních LVTTL a jsou mírně ochráněny sériovými odpory. Tato ochrana je ale opravdu symbolická, spíše je to jen rozpojovací a měřicí bod a impedanční přizpůsobení signálů.
V obvodu FPGA (field programmable logic array) mohou být vytvořeny rozsáhlé logické struktury, které proti programovému řízení nabízejí řádově kratší dobu odezvy, a tak umožňují kvalitativně jiný přístup k řešení konstrukčních bloků. Obvod Spartan3A, použitý v modulu, obsahuje asi 400 tisíc hradel a přes 60 kB paměti, zčásti dvouportové.
Výrobce (Xilinx) poskytuje pro podporu vývoje aplikací velmi propracované programové vybavení, jehož popis překračuje rámec této informace. Vstup zdrojové předlohy pro firmware FPGA může být v několika specializovaných jazycích (Verilog, VHDL aj.), nebo grafický či ve formě časových průběhů nebo tabulek, vše je možno kombinovat a používat knihovní prvky či „megabloky”, některé jsou zdarma, jiné za poplatek. Vše je podporováno testovacími a simulačními prostředky, nakonec však stejně skončíte u osciloskopu a logického analyzátoru.
Varianty a možnosti programovatelné logiky, navíc na modulu propojené rychlou, 32bitovou datovou a adresovou sběrnicí s procesorem, nelze vyjmenovat. Za zdůraznění stojí možnost namapování obvodu FPGA do adresového prostoru procesoru jako sdílené (dvouportové) paměti, v jejíž buňkách lze vytvářet stavové a povelové registry, fronty, mailboxy atd. Ve FPGA je možno vytvořit jeden nebo více virtuálních procesorů se specifickým instrukčním souborem, používající z druhé strany sdílenou paměť, logické sítě, automaty atd. Rozhraní k centrálnímu procesoru může být doplněno přerušovacím mechanismem například s frontou událostí, zpracovávanou jedním procesem centrálního procesoru.
Centrální procesor je tvořen obvodem Atmel AT91SAM9260, obsahující jádro ARM926 a blok integrovaných periferií a rozhraní. Podrobnosti lze najít na webu výrobce, avšak jeho prakticky nejvýznamnější vlastností, že přímo od výrobce je k dispozici instalace otevřeného operačního systému Linux.
Zapojení procesorových obvodů je navíc prakticky shodné s „katalogovým zapojením” a schématem vývojového kitu, takže co odladíte na kitu, téměř jistě funguje i na modulu (na vývojovém kitu však není FPGA). Na modulu jsou přítomny všechny prostředky a rozhraní pro testování a ladění programů pomocí prostředků výrobce, které jsou volně ke stažení.
Firmware procesoru je komplexní balík software, který je umístěn ve stálých pamětech NAND-Flash a Data-Flash na modulu. Aktualizaci jednotlivých částí firmware lze provádět pouze jako celek pro daný obvod a to pouze v servisním módu pomocí specializovaných přípravků (kabelů). Změna firmware „za provozu“ není z bezpečnostních důvodů podporována.
Firmware lze rozdělit do několika částí. Po resetu či zapnutí napájení jsou prováděny/ aktivovány v následujícím pořadí:
Je umístěn v Data-Flash (malá paměť typu EEPROM se sériovým rozhraním SPI) a spuštěn jako první uživatelský kód poté, kdy po resetu či zapnutí procesor při hledání boot-zařízení najde charakteristickou signaturu, ukazující na platný kód. Program zajišťuje inicializaci procesoru a některých jeho periferií a následně spouští U-Boot.
Tzv. hlavní zavaděč kódu. Inicializuje zbylé periferie procesoru a některé externí periferie (např. čip s unikátním identifikátorem). Zavádí Jádro operačního systému a Hlavní souborový systém do paměti SDRAM, předává inicializační řetězec Jádru operačního systému, a pak předá Jádru řízení (spustí bootování Jádra).
Základem operačního systému je čisté jádro Linux verze 2.6.27 (viz kernel.org) s aplikovanou úpravou pro procesor AT91SAM9260. Konfigurace jádra je minimalistická, aby byla zachována vysoká míra bezpečnosti operačního systému a zajištěn rychlý start celého systému.
Jádro je uloženo v NAND-Flash, u-bootem je dekomprimováno a zavedeno do SDRAM a spuštěno.
Obsahuje inicializační skripty, které zavádějí tzv. „jaderné moduly“, ovladače, a inicializují komunikační kanály k periferiím, spouští kód implementující uživatelské programy jako např. vyšší vrstvy komunikačního protokolu.
Souborový systém dále obsahuje veškeré aplikace potřebné pro fungování systému, např. aplikace zajišťující předávání informací a povelů mezi periferiemi na modulu nebo na základní desce, aplikaci zajišťující komunikaci s uživatelem po rozhraní COM, aplikaci ovládající periferie rozhraní člověk ←→ stroj atd.
Je tvořen souborovým systémem umístěným v další části stálé paměti NANDFlash. Slouží např. pro archivaci diagnostických dat pro případ výpadku napájení. Další souborové systémy mohou být vytvořeny na přídavných paměťových jednotkách, jako např. SD/MMC karta (držák připojený přes SPI), USB disk nebo pevný disk.
Aplikační software musí být napsán v některém z vyšších programovacích jazyků podporovaných překladači pro ARM9 pod Linuxem. Na trhu i bezplatně je k dispozici řada takových systémů běžících na většině PC a obsahují navíc ladicí a trasovací prostředky.
Přeložený odladěný kód je pak třeba uložit do hlavního souborového systému v NAND Flash, rekonfigurovat a restartovat modul. Po spuštění operačního systému je zajištěno spuštění uživatelského programu.
Linux je, velmi stručně řečeno, otevřený víceúlohový operační systém s úpravou pro činnost v reálném čase. To znamená, že jsou k dispozici, kromě standardních systémových funkcí, i funkce podporující časování a synchronizaci procesů, a navíc je zajištěno, že kterákoli událost, která vyvolá přerušení, bude ošetřena obslužným programem za dobu nepřevyšující stanovenou hodnotu (latence). Tak je zajištěno, že systém „nezatuhne“ uvnitř nějaké své funkce, zatímco vnější události se domáhají ošetření. Latence přerušení v současné verzi RT Linuxu na tomto procesoru nepřevyšuje 100 mikrosekund (bez RT úpravy se typická hodnota latence pohybuje v milisekundách).
Linux provozuje uživatelské programy a ukládá data v uživatelské oblasti paměti (user space), kde je možno sdílení času, dynamická správa paměti a dalších prostředků, zatímco jeho jádro žije v jaderné oblasti (kernel space), která je bezpečná. Tím je zajištěna poměrně vysoká stabilita chování uživatelských programů a případně snadné hledání chyb.
Modul poskytuje dostatek vstupů a výstupů pro jakoukoli aplikaci. Jednou funkcí každého signálu na systémovém konektoru je programovatelný I/O pin, jako vstup s možností generování přerušení při změně úrovně.
Piny mají jednu nebo víc alternativních funkcí a to tak, jak je uvedeno v popisu konektorů.
Pomocí rozhraní I2C nebo SPI je možno připojit většinu moderních převodníků, I/O expanderů atd. Tak například je možno použít levný integrovaný obvod 74HC595 jako osmibitový výstupní obvod s možností sériového řazení, připojený přes rozhraní SPI. Jedním z použití je ovládání indikačních LED např. na předním panelu. Proces, který je ovládá, vytváří sdílený segment paměti, kde je pro každou LED vyhrazen jeden byte. Stavy LED jsou ze sdílené paměti vyčítány s periodou např. 200 ms a používají se cyklicky bity 0..3. Pro každou LED je možné vytvářet například tyto kombinace:
Mix tohoto a podobných obvodů je připraven v několika vyvinutých aplikačních základních deskách, které obsahují napájecí, analogové, spínací a další užitečné obvody a hlavně konektory pro připojení Combi modulu a prototypovou oblast, pro co nejsnazší dotvoření zamýšlené aplikace.
Popsaný modul je zajímavý kompaktním uspořádáním a kombinací procesoru ARM s pamětmi, integrovaným obvodem FPGA, řadou periferií a rozhraní pro snadnou aplikaci, konektivitou LAN, USB a provozující RT OS Linux pro aplikační programy. Pro modul a z něj odvozené zapojení bylo již vytvořeno několik aplikací např. pro řízení monitorovacích zařízení.
Modul a nabízené doplňky by měly uživatelům maximálně usnadnit vývoj jejich zapojení, kombinujících programové řízení v reálném čase, programovatelnou logiku a vlastní dodatečné obvody do jednoho celku, který je možno snadno projektovat, ladit i vyrábět a používat v praxi.