24
Fotogalerie

Pojďme programovat elektroniku: Destička, která se promění v jakýkoliv čip, který si vymyslíte

  • Dnes se seznámíme s nejpokročilejší destičkou Arduino
  • Jmenuje se MKR Vidor 4000, má armový mikrokontroler a Wi-Fi
  • A také tak trochu magický čip FPGA

V našem občasném seriálu Pojďme programovat elektroniku, jehož tempo udává především rychlost pražské celní pošty, jsme si představili už desítky nejrůznějších prototypovacích destiček programovatelných v prostředí Arduino, nicméně nikdy jsme se nedostali k žádné originální. Dnes na ni přijde řada.

Jelikož jsme měli nedávno Vánoce, Ježíšek dorazil i do naší redakce, a to v podobě kurýra DHL, který dovezl malou krabičku. Uvnitř se skrývalo originální, evropské, a tedy i šíleně drahé Arduino z nejvyšší řady MKR – nejnovější Arduino MKR Vidor 4000, které autoři představili teprve loni na jaře.

MKR Vidor 4000: Nejnovější člen rodiny Arduino

MKR Vidor 4000 se vymyká všem základním prototypovacím deskám, se kterými jsme se zatím setkali a tomu odpovídá i cena. Nejprve se vyšplhala až na 63 eur, na sklonku roku ale skrze oficiální e-shop spadla na částku lehce pod 50 eur. K ceně ale musíte připočítat ještě daň a dopravu.

2cd32783-3387-4d61-907f-4e183b4b30fb624b3d74-8e28-4b9f-8e98-c06b2ba5a8a51b5d5950-4dea-4b8a-869b-191aed435747
Šíleně drahá krabička, uvnitř které bylo originální Arduino made in Italy a poděkování za podporu open-source

Sečteno a podtrženo, dohromady se mi z PayPalu strhla částka 62 eur, což po přepočtu činí bezmála 1 600 korun! Jen pro srovnání, čínský klon základní desky Arduino Uno seženete na AliExpressu za necelou stovku a nejmocnější Raspberry Pi 3 Model B+ pak na českém RPishopu za devět stovek.

Proboha, proč?

O práci se stará mikrokontroler Microchip ATSAMD21

Dobrá otázka, takže co dostanete? Protáhlou destičku velikosti zhruba lithiového článku 18650. O práci se stará 32bitový armový mikrokontroler Microchip ATSAMD21 (Cortex-M0+) s pracovním taktem 48 MHz, který má k dispozici 250 kB flashového úložiště a 32 kB RAM, také má obvod RTC hodin a 22 vyvedených pinů pro digitální GPIO i analogový vstup. UART a sběrnice SPI a I2C jsou samozřejmostí.

f924a94c-aeba-4584-af7d-790f144ef494
Nejdražší a nejexotičtější Arduino, které můžete získat. Ale pěkně popořadě.

No dobrá, ale eBay je přece plný armových destiček za pár dolarů. Říká se jim blue pill a zpravidla je pohání mikrokontroler STM32F103C8T6 (Cortex-M3), který má o něco menší RAM a flash, ale pracovní takt 72 MHz. Cena přitom začíná zhruba na padesátikoruně, tak proč proboha utrácet 32× více?

7141b8d9-0acc-452a-8a45-0f841e73c1b6
O běh vašeho programu se stará Microchip ATSAMD21 (Cortex-M0+)

Arduino s Wi-Fi díky čipu U-blox Nina-W102

Protože na Vidoru 4000 je ještě pár dalších drobností. Tak zaprvé, vedle armového čipu na něm najdete švýcarský Wi-Fi/Bluetooth čip U-blox Nina-W102, který nabídne konektivitu 802.11b/g/n a v Arduinu pak můžete pomocí knihovny WiFiNINA psát prakticky identické programy jako s populárními čipy ESP8266. Spuštění webového serveru nebo HTTP klientu, který si bude stahovat data odkudsi z internetu, je otázkou několika málo řádků kódu.

f83d8e94-cd15-4974-b46d-11594a3a16d9
O Wi-Fi konektivitu se stará čip U-blox Nina-W102

No dobrá, ale destičky s čipem ESP8266 také stojí pár desetikorun, takže ani Wi-Fi není argument pro tak obrovskou útratu. Má destička něco opravdu unikátního? Má!

Konektor pro připojení kamery Raspberry Pi a Micro HDMI

Vedle armového a Wi-Fi čipu na ní totiž najdete ještě micro HDMI konektor a CSI/MIPI rozhraní pro připojení kamery – bude fungovat prakticky jakákoliv laciná kamerka pro Raspberry Pi za nějakou tu stovku z e-shopu.

4c47abe9-bc79-48d4-93dc-92daf9a2bdd5b3d28a33-0259-4718-a5b8-d134766b4070d4a414f9-dee0-4277-a25d-d4f1d85ebe4c
K destičce můžete připojit lacinou kameru pro Raspberry Pi. Cena na eBayi začíná na ceně okolo stokoruny.

Aha, takže destička umí to samé, co Raspberry Pi? Má videovýstup a videovstup? A to kvůli tomu děláš takové haló? Dělám, protože bedlivý čtenář si jistě všiml, že jsem doposud psal pouze o tom, že na desce je armový mikrokontroler. A armový mikrokontroler opravdu není komplexní a v tomto kontextu supervýkonný armový procesor s grafickým subsystémem – GPU!

d051fd5f-95a5-4e38-92a7-7612801fe8cb09a7930d-18dc-41ee-ab01-5d804d9b8ba5
Destičku můžete připojit třeba k monitoru pomocí Micro HDMI

Jinými slovy, jak proboha může drobný řídící čip s 32 kB RAM zpracovávat obraz kamery a s minimální latencí jej zobrazovat na monitoru připojeném skrze HDMI? To je přece trošku něco jiného než malý displej, který k podobným destičkám připojíte skrze SPI nebo I2C.

Programovatelné hradlové pole čili FPGA

Poslední velkou a také zdaleka nejdražší legrací, kterou stroj kdesi ve vzdálené fabrice připájel na drobnou destičku, je totiž čip Intel Cyclone 10CL016, který má k dispozici 2MB flash a 8MB RAM.

5eb7dd1a-cad8-4ae8-a3d4-a73e1163731e
Nejexotičtější čip našeho seriálu – FPGA, Tedy obří matice univerzálních logických členů, ze kterých můžete poskládat libovolný digitální obvod. Třeba i procesor. Je to takové Lego.

Cyclone 10 není další mikrokontroler nebo CPU. Cyclone 10 je FPGA – tedy programovatelné hradlové pole, což je speciální typ integrovaného obvodu, jehož historie sahá teprve do 80. let minulého století a v poslední době se o něm mluví stále častěji třeba v souvislosti s akcelerátory pro těžbu kryptoměn a strojové učení.

Stáhněte si e-book od Intelu FPGAs for Dummies (FPGA pro zelenáče, nutná bezplatná registrace)

No dobrá, ale co to tedy je? Hradlové pole je opravdu pole mnoha tisíců až milionů logických jednotek, kterým každý výrobce říká trošku jinak, v případě Intelu je to ale Logic Element (LE).

8b1a2e03-fef5-4aa3-ad63-db086ca08fab
Schéma možného návrhu logického elementu, který může se vstupy vlevo provádět základní logické operace, přičemž výsledek vyplivne vpravo. Zdroj: Wikipedie

Každý z těchto elementů se skládá z integrovaného obvodu pro základní logické operace s bity a drobnou pamětí pro uchování jejich stavu. A všechny tyto logické členy jsou vzájemně propojené – tak trochu jako neurony ve vašem mozku.

FPGA může pomocí digitální logiky vytvořit prakticky libovolný obvod – třeba i komplexní procesor

Jeden logický element vám moc nepomůže. Provede třeba jen logickou operaci OR se dvěma vstupy 0 a 1, jejíž výsledkem bude 1. Podstata ale spočívá v jejich množství. Jelikož jeden logický člen zvládne všechny elementární digitální logické operace, můžete jejich vzájemným propojováním poskládat jakoukoliv složitou digitální logiku – digitální obvod.

03e4b226-0544-488e-a15c-3be8df28d7d2
Možný návrh konstrukce logické brány OR z diskrétních součástek. Pokud je alespoň na jednom ze vstupů A a B logická jednička, otevře se jeden ze dvou tranzistorů a na výstupu (Out) nastaví také logickou jedničku. Logický element v nitru FPGA provádí právě tuto a další logické operace.

Může to být primitivní obvod, který jen bude periodicky nastavovat logickou jedničku a nulu na některém z pinů GPIO (FPGA čip jich může mít i stovky), anebo neskutečně složitý obvod, který z logických elementů napodobí chování celého procesoru – třeba architektury ARM.

Pokud se už lehce ztrácíte, vězte, že z logických elementů lze postavit prakticky cokoliv. Jediným omezením je to, že čím složitější obvod budete chtít postavit, tím více těchto základních elementů budete potřebovat.

16 tisíc logických elementů

Cyclone 10CL016 jich má už podle svého značení necelých 16 tisíc. Pro představu, takový obvod velmi přesného generátoru signálu PWM jich spotřebuje okolo šedesáti. Na podobné experimenty to tedy s přehledem stačí.

Ty nejdražší a nejsložitější FPGA současnosti pak nabízejí až několik milionů logických elementů a s nimi pak už opravdu dokážete ve vývojovém prostředí Intel Quartus Prime postavit celý komplexní procesor. Právě proto se FPGA používají při vývoji těch nových. Fungují jako jejich zdatné hardwarové simulátory, které jsou jen o něco pomalejší a energeticky náročnější než procesory natvrdo vyrobené kdesi ve vzdálené fabrice.

FPGA se promění v primitivní GPU s HDMI výstupem

Tak, teď už jistě chápete, kdo na destičce MKR Vidor 4000 zpracovává obraz a stará se o velmi složitý signál HDMI, jehož časování by běžný mikrokontroler této kategorie zvládl jen velmi těžko. Ano, je to FPGA, které se podle našeho zadání promění v obvod jednoduchého grafického čipu, se kterým v prostředí Arduino komunikujeme skrze dostupné knihovny.

17eac439-08ef-4a6f-aaf6-dbbf92a71d5f
V Arduinu jsem použil knihovny VidorCamera a VidorGraphics, které do FPGA nahrály obvody pro práci s kamerou a HDMI výstupem.

Když pak hotový program přeložíme a nahrajeme do mikrokontroleru, v případě Vidoru 4000 se zároveň nahraje speciální sled bitů do paměti FPGA. Říká se mu bitstream a je to vlastně kompletní hardwarový popis toho, jak se mají propojit jednotlivé logické elementy hradlového pole a nastavit výchozí hodnoty v paměťových registrech.

Jakmile pak destičku připojíte k napájení, tradiční mikrokontroler si načte z flashové paměti náš program a začne jej zpracovávat, no a FPGA si zase z vlastní paměti načte onen bitstream a vytvoří z něj elektrický obvod, který je na fyzické úrovni realizovaný jen otevíráním a zavíráním jednotlivých hradel (anglicky gate), které jsou na té nejnižší úrovni tvořené běžnými polovodičovými prvky – tranzistory.

Jakmile FPGA odpojíme od napájení, elektrický obvod složený z logických elementů jednoduše zmizí a vytvoří se zase při dalším spuštění.

Takto vypadá kód programu Arduina, který přesměruje obraz z kamery do HDMI výstupu. Se samotným FPGA komunikují knihovny, které do něj při flashování nahrají i adekvátní bitstream:

// Knihovny pro praci s grafikou a kamerou
// Na FPGA se vytvori obvod pro HDMI a kameru
#include "VidorGraphics.h"
#include "VidorCamera.h"

// Objekt kamery
VidorCamera vcam;

void setup() {
  Serial.begin(115200);
  while (!Serial) {}

  // Spojeni armoveho mikrokontroleru s FPGA
  if (!FPGA.begin()) {
    Serial.println("Nelze nastartovat FPGA!");
    while (1) {}
  }
  else {
    Serial.println("FPGA pripraveno!");
  }

  // Nastartovani streamovani obrazu z kamery do HDMI
  if (!vcam.begin()) {
    Serial.println("Nelze nastartovat kameru!");
    while (1) {}
  }
  else {
    Serial.println("Kamera pripravena");
  }

  delay(4000);
  Serial.println("Spoustim...");
}

// Pokud poslu ze seriove linky prikaz STOP,
// zastav streamovani
void loop() {
  String prikaz = Serial.readStringUntil('\n');
  if (prikaz.indexOf("STOP") > -1) {
    vcam.end();
  }
}

Architektura FPGA umožňuje ohromný paralelismus

Vedle rychlosti FPGA, která je dána tím, že náš algoritmus netvoří na té nejnižší úrovni třeba i tisíce a tisíce instrukcí strojového kódu, které musí jednu po druhé zpracovat mikrokontroler nebo procesor, ale logický obvod podobný tomu, který byste s pájkou a polovodičovými prvky zbastlili na tištěném spoji, má hradlové pole ještě jednu ohromnou výhodu – paralelismus.

Jak už jsem napsal výše, FPGA čip Cyclone 10CL016 na destičce MKR Vidor 4000 má necelých 16 tisíc použitelných logických elementů. Vy je ale nemusíte zaplnit jen jednou funkcí. Na poli těchto elementů vedle sebe může paralelně koexistovat celá hromada obvodů, která spolu může (ale také nemusí) spolupracovat.

Na mnoha současných FPGA tak část logických elementů zabírají nejrůznější heterogenní subsystémy třeba pro DSP aj. a pro uživatele je vyhrazena jen část pole. Pro FPGA to není žádný problém, čip má totiž k dispozici časovače s taktem i mnoha desítek až stovek MHz – FPGA na našem Arduinu může pracovat s pulzy o taktu až 200 MHz a stavy na svých GPIO dokáže měnit rychlostí mnoha desítek MHz. Díky tomu na nich může generovat velmi přesný digitální signál od PWM přes UART, SPI, I2C až po jednodušší HDMI jako v našem příkladu.

Když bychom tedy do FPGA na Vidoru nahráli třeba bitstream pro obvod sériové linky UART, může jich vedle sebe na dostupných pinech destičky, které sdílí FPGA s armovým mikrokontrolerem, provozovat až 7. Stejně tak je tomu se sběrnicemi I2C, a SPI. Můžeme tedy použít ty na armovém mikrokontroleru, ale stejně tak si vytvořit další pomocí FPGA.

FPGA se může proměnit v paralelní superpočítač

Ale zpět k paralelismu. To je totiž odpověď na to, proč se FPGA těší velké popularitě mezi nejrůznějšími akcelerátory pro zpracování vektorů (grafické modely aj.) a strojové učení. Dejme tomu, že bychom si vytvořili obvod, který bude provádět nějakou matematickou transformaci s reálnými čísly. Obvod bude mít nějaký vstup, který přepočítá číslo a vyplivne výsledek.

Představte si, že by takový obvod zabral třeba 100 logických elementů, ale naše teoretické a pokročilé FPGA by jich nabízelo milion. Namísto jednoho obvodu bychom jich tedy vedle sebe na FPGA sestavili třeba tisíc, takže namísto jednoho výpočtu za jeden průběh algoritmu by jich FPGA spočítalo 1 000!

Kdybychom něco takového chtěli programovat na klasickém počítači, potřebovali bychom spustit 1 000 pracovních vláken, přičemž na té nejnižší úrovni by se stejně nejednalo o skutečný paralelismus, protože žádný obecný procesor nedisponuje 1 000 zcela autonomními subprocesory. Naše teoretické FPGA ale ano!

Programovatelné hradlové pole by tedy četlo z paměťového bufferu čísla, do výstupního bufferu by ukládalo výsledky a ty by již interpretovala další část naší elektroniky – třeba klasický počítač, který by na monitoru zobrazil nádherný 3D model, který naše FPGA zpracovalo rychleji než běžné CPU.

Jak se to vlastně programuje?

Proč se to neděje na denní bázi a programátoři stále většinu programů píšou pro běžné procesory a GPU akcelerátory? Protože i když mají FPGA ohromný potenciál, sestavit složitý a především bezchybný obvod, který se skládá třeba i ze stovek tisíc primitivních logických elementů, není pro každého.

Je to jeden z mála úkonů, při kterém se zapotí trenýrky i Chucku Norrisovi.

50a679f2-2471-4194-ba91-421cc2279c2e
Bezplatné vývojové prostředí Intel Quartus Prime Lite a kus kódu generátoru PWM napsaný v jazyku Verilog, který Quartus přeloží na digitální obvod

Zatímco v dřevních dobách FPGA se jeho konfigurační bitstream vytvářel vlastně stejně jako jakékoliv jiné elektrické obvody – nákresem elektrického digitálního obvodu a jeho převedením do bitstreamu, což bylo asi tak záživné, jako byste svůj program pro Arduino psali namísto v C++ pomocí jednotlivých instrukcí procesoru, čili byste po měsíci práce vytvořili leda tak program, který napíše na obrazovku „Hello, World,“ dnes se používají přece jen abstraktnější programovací jazyky rodiny HDL (Hardware Description Language) – především VHDL a Verilog.

2ed60af5-0602-4034-9884-f7ecc37c43ac
Generování drobného optimalizovaného obvodu může na průměrném počítači trvat i dlouhé minuty. Šipka ukazuje na analýzu, podle které obvod PWM generátoru spotřebuje 68 logických elementů z necelých 16 tisíc, které mám na tomto FPGA k dispozici

Ten druhý jmenovaný se v některých aspektech přibližuje C, které znáte z Arduina, přes veškerou snahu je to ale stále poměrně odlišný svět, který vyžaduje určité mentální přepnutí, do reálného programování vlastních obvodů FPGA se tedy vrhneme až v některém z dalších pokračování našeho seriálu.

af9a7810-6431-4908-bb52-fefa58f699f41312e846-2939-4338-80d5-e1194cc82028
Výsledkem překladu není strojový kód, jak ho známe z klasických programů, ale digitální obvod, který se vytvoří po spuštění FPGA. Díky tomu si mohu prohlédnout i jeho logické schéma, jako bych zapojoval součástky třeba na nepájivém poli.

Nicméně, když vyrobíte svůj první obvod třeba ve Verilogu (každý výrobce FPGA nabízí alespoň v základní verzi bezplatné vývojové prostředí), přeložíte jej podobně jak to děláte v Arduinu. Výsledkem ale nebude strojový kód pro konkrétní procesor, protože jak už jsme si vysvětlili, FPGA není procesor, ale obrovská šachovnice logických elementů, které vykonávají základní logické operace.

3be3c455-ba22-4596-9e17-35702d615eae6d9746b7-d734-4e61-bcfc-f5c8492cd58bd9563835-bdcb-499b-9eb0-d350775c61aa
a944b796-3772-4bcc-bdbf-fc3da66d7bec
A tady už vidím pole logických elementů FPGA, respektive jejich shluků, přičemž tmavší barvou jsou označené ty použité pro můj obvod. Mám tedy přehled o jejich fragmentaci. Pomocí lupy mohu celé pole přiblížit až na úroveň logického členu. Představte si, že byste měli na plátky rozřezaný procesor a elektronový mikroskop. Programování a debugování FPGA je něco podobného.

Ve skutečnosti neprogramujete, ale stavíte obvod

Namísto toho vývojové prostředí na základě vašeho kódu začne propojovat jednotlivé logické elementy do vyšších celků a hromada dalších optimalizátorů se postará o to, aby byly cestičky co nejkratší, a tedy i energeticky nejúspornější – prostě aby se do hry zapojilo co nejmenší množství prvků.

Když skončíte, celý obvod budete moci vyzkoušet v softwarovém simulátoru FPGA a dokonce si prohlédnout celý návrh na schématu FPGA, kde uvidíte, které logické elementy integrované do vyšších buněk se zapojí do hry a které zůstanou volné pro další práci.

Na konci pak hotový bitstream flashnete do pomocné paměti, ze kterého se po startu načte. V případě destičky MKR Vidor 4000 za nás vše udělá prostředí Arduino, součástí knihovny pro práci s jeho FPGA jsou totiž už hotové bitstreamy pro konkrétní scénáře.

Vidor 4000 chce být destičkou, která se promění v cokoliv, aniž byste tomu museli rozumět

Nutno podotknout, že vzhledem k tomu, že je MKR Vidor 4000 ve světě Arduina zcela nový koncept, samotná tvorba bitstreamů je aktuálně poměrně složitá, velmi chabě dokumentovaná (pročítání GitHubu nutností) a není ani náznakem určená pro začínající uživatele.

d56bcff2-54b5-41c0-9954-c4cabb6dad5d
A ještě jedna ukázka. Tentokrát se FPGA proměnilo v jednoduchý grafický subsystém opět s HDMI výstupem. Sice zatím zvládá jen rozlišení 640×480 pixelů, ale nabízí obvyklé rutiny knihovny GFX pro tvorbu základních geometrických prvků a textů.

K čemu je tedy taková destička dobrá pro zelenáče, kteří FPGA v životě neprogramovali? Autoři Arduina doufají, že experti vytvoří dostatek licenčně-svobodných bitstreamů pro nejrůznější situace, zapouzdří je do tradičních knihoven pro Arduino a komunita bastlířů je bude používat, aniž by musela tušit, jak vlastně fungují. Říkejme tomu třeba FPGA-as-a-service.

Představte si například, že někdo napíše bitstream pro převod hlasu na text. FPGA se poté promění v čip, který bude v reálném čase a s minimálním zpožděním poslouchat vstup z mikrofonu a výstupem bude text. No, a vy to celé ovládnete pomocí API nějaké tradiční jednoduché knihovny a vůbec nebudete muset rozumět tomu, co se proboha v nitru, na křemíkové úrovni, vlastně děje.

V tomto směru mají hrátky týmu Arduina s FPGA zajímavý potenciál, chtějí jej totiž širokým masám zpřístupnit jako zařízení, které se může proměnit prakticky v jakýkoliv čip, jehož funkci si stáhnete z internetu. FPGA by opravdu mohlo být zajímavým koprocesorem bastlířského světa.

Ukázka drobného kódu pro Arduino, který zobrazil zprávičku na HDMI monitoru opět bez potřeby znalosti FPGA. O vše se starají knihovny:

#include "VidorGraphics.h"
#include "Vidor_GFX.h"

Vidor_GFX  vdgfx;

void setup() {
  FPGA.begin();
  delay(4000);

  vdgfx.fillRect(0,0,640,480,vdgfx.Black());
  vdgfx.fillRect(40,40,560,300 ,vdgfx.White());
  vdgfx.text.setColor(vdgfx.Red());
  vdgfx.text.setCursor(170, 120);
  vdgfx.text.setSize(1);
  vdgfx.println("Tento monitor ma rad");
  vdgfx.text.setCursor(120, 250);
  vdgfx.text.setSize(4);
  vdgfx.println("ZIVE.CZ");
}

void loop()
{}

IP bloky

Ostatně, toto není žádný unikátní nápad Arduina, takto to totiž v obchodní rovině s FPGA funguje už roky. Reálným návrhům, které do FPGA můžete nahrát, se říká IP bloky/jádra (intelektuální dílo). Ty, které vznikly třeba na akademické půdě nebo v open-source komunitě, bývají zpravidla zdarma, zatímco za ty komerční a mnohdy patentově chráněné můžete zaplatit ohromný balík peněz. Není se čemu divit, kupujete totiž návrh celého čipu.

Jedním z katalogů open-source IP bloků je třeba OpenCores.org

Díky tomu vývoj složitých FPGA obvodů často vypadá tak, že jen vývojáři skládají a optimalizují jednotlivé IP bloky dohromady, stejně jako vy v Arduinu používáte jednoduché knihovny pro práci s nejrůznějšími senzory a nemusíte si je psát sami.

Náš seriál se ale jmenuje Pojďme programovat elektroniku, a tak si vyzkoušíme i vytvoření vlastního bitstreamu a proměníme FPGA v originální čip, aniž bychom měli doma továrnu Intelu na jejich konstrukci.

O tom ale někdy příště, pro dnešek to už opravdu stačilo.

Určitě si přečtěte

Články odjinud