Jste zde

Sestavte a programujte FPGA snadno a rychle pomocí Pythonu a Jupyter Notebooku

Na FPGA se často obrací vývojáři proto, aby využili velký výkon pro náročné aplikace jako je počítačové vidění, komunikace průmyslových systémů a internet věcí. Běžné programování FPGA však je složité a časově náročné, což vedlo ke vzniku vývojového prostředí Python Productivity for Zynq (PYNQ) na bázi notebooků Jupyter, který problematiku programovatelnosti FPGA řeší.

Tento článek bude popisovat problematiku programování FPGA a ukázku, jak začít na vývojové desce Digilent programovat FPGA. Deska poskytuje open source software, který pomůže zrychlit vývoj systémů založených na FPGA.

Proč FPGA?

Inženýři, kteří potřebují používat komplexní, náročné výpočetní algoritmy se často spoléhají na FPGA, Ve skutečnosti se FPGA ukázaly jako dominantní platforma pro zrychlení algoritmů umělé inteligence (viz „Použití FPGA pro vytváření vysoce výkonných aplikací s integrovaným viděním a učením strojů“ - Use FPGAs to Build High-Performance Embedded Vision Applications with Machine Learning).

Pokročilejší FPGA zařízení jsou vlastně komplexní systémy integrované přímo na čipu (Systeme on chip - SoC), které jsou navrženy speciálně pro vestavěné aplikace a integrují programovatelnou logiku (PL) s mikrokontrolérem. Například Zynq-7000 SoC  od Xilinx kombinuje dvou-jádrový procesorový systém  Arm Cortex-A9 s až 444 000 logickými buňkami ve své integrované programovatelné logické (PL) struktuře (obrázek 1). Spolu se zabudovanými procesory a rozsáhlými periferiemi nabízí Zynq SoC až 2020 bloků digitálního zpracování signálů (DSP). 

Obrázek 1: Xilinx Zynq-7000 SoC kombinuje dvoujádrový procesor Arm Cortex-A9, programovatelnou logiku a rozsáhlou sadu periferií (Zdroj obrázku: Xilinx)

V typickém systému postaveném na FPGA vývojáři naprogramují potřebnou správu sekvencí a bitových toků. Integrovaný procesor Zynq SoC provádí běžné úlohy mikrokontroléru, včetně správy PL struktury a dalších periferií na čipu. Tím se proces načítání FPGA více podobá procesu běžného spouštění mikrokontroléru než tradiční inicializace bitového toku FPGA.

Tento spouštěcí proces probíhá sledem kroků řízených jedním z procesorů Zynq (Obrázek 2). Po zapnutí nebo resetu se spouštěcí proces spustí a procesor Zynq provede krátký kousek kódu ze své bootovací jednotky BootROM, aby načetl skutečný spouštěcí kód. Spolu s kódem pro konfiguraci komponent systému procesoru obsahuje zaváděcí kód PL bitový tok i uživatelskou aplikaci. Když se zavádí bootovací kód, procesor používá pro konfiguraci PL integrovaný bitový tok. Po dokončení konfigurace začne zařízení spouštět aplikaci obsaženou v zaváděcím kódu.

Obrázek 2: V zaváděcí sekvenci podobné konvenčním mikrokontrolérům, Xilinx Zynq-7000 SoC spouští kód z Boot ROM, který načítá a spouští bootloader (Zdroj obrázku: Xilinx)

I se zjednodušeným zpracováním programové logiky (PL) se vývojáři museli v minulosti zabývat komplexním vývojovým procesem FPGA potřebným pro generování požadovaných bitových toků. Ti, kteří potřebují využít výkon FPGA, zůstal běžný vývojový proces FGPA významnou překážkou implementace. Xilinx tuto bariéru účinně odstranil svým prostředím PYNQ.

Prostředí PYNQ

V PYNQ jsou bitové toky programové logiky (PL) zapouzdřeny do předem vytvořených knihoven zvaných „overlays“, které mají podobnou roli jako knihovny ve vývoji software. Během procesu „bootování“ se bitové toky spojují s požadovanými „overlays“, a tím vytváří celou strukturu (fabric) programové logiky. Tento proces dobře znají vývojáři, kteří využívají přístup k „overlays“ prostřednictvím rozhraní API, které je napsáno v jazyce Python. Během vývoje lze kombinovat softwarové knihovny a „overlays“ podle potřeby a pracovat s příslušnými API pro implementaci dané aplikace. Během chodu programu systém provádí funkce dle napsaného kódu a PL struktura implementuje funkce poskytnuté v „overlays“. Výsledkem je zrychlený výkon pomocí FPGA a tím můžeme pokrýt náročnější aplikace.

Jak název napovídá, PYNQ využívá výhody vývoje spojené s programovacím jazykem Python. Python se ukázal jako jeden z nejlepších jazyků, nejen díky své relativní jednoduchosti, ale také díky velkému a rostoucímu ekosystému. Vývojáři jednoduše najdou softwarové knihovny potřebné pro podpůrné služby nebo specializované algoritmy v open source modulech jazyka Python. Současně mohou vývojáři implementovat některé speciální funkce v jazyce C, protože PYNQ používá jazyk C jako interpretaci jazyka Python. Tato implementace umožňuje snadný přístup k tisícům existujících knihoven C a zjednodušuje používání knihoven v jazyka C napsaná samotným vývojářem.  I když zkušení vývojáři mohou rozšířit PYNQ o specializované hardwarové „overlays“ a knihovny jazyka C, síla PYNQ spočívá v jeho schopnosti poskytovat vývojářské prostředí pro vytváření programu v jazyce Python.

PYNQ je sám o sobě open source projekt, který navazuje na další open source projekt - notebook Jupyter. Notebooky Jupyter poskytují obzvláště efektivní prostředí pro interaktivní zkoumání algoritmů a prototypování komplexních aplikací v Pythonu nebo v jakémkoli jiném programovacím jazyce. Notebook Jupyter kombinuje řádky spustitelného kódu s popisným textem a grafikou. Tato schopnost umožňuje jednotlivým vývojářům efektivněji dokumentovat jejich kroky, aniž by se přesunuli do jiného vývojového prostředí. Například, vývojář může používat notebook, který kombinuje několik řádků kódu potřebných pro zobrazení dat v grafu a přímo pod něj vložit výsledný graf, generovaný právě tímto kódem. (obrázek 3).

Obrázek 3: Notebook Jupyter ze vzorového uložiště Xilinx (Xilinx sample repository) kombinuje popisný text, spustitelný kód a výstup spojený s aplikací. (Zdroj obrázku: Xilinx)

Kombinace kódu, výstupu a popisného textu na jednom místě je možný, protože notebook Jupyter je živý dokument uchovávaný v interaktivním vývojovém prostředí poskytovaném serverem notebooků Jupyter (Obrázek 4). V relaci Jupyter server vykreslí soubor poznámkového bloku v běžném webovém prohlížeči pomocí protokolu HTTP a kombinace protokolů HTTP a Websockets pro statický a dynamický obsah ve výsledném dokumentu. Server na pozadí komunikuje s jádrem pro spouštění kódu pomocí open source protokolu ZeroMQ (ØMQ).

Obrázek 4: V relaci Jupyter server vykreslí obsah souboru do webového prohlížeče. (Zdroj obrázku: Project Jupyter)

V režimu úprav může uživatel upravovat text a kód. Server pak aktualizuje příslušný soubor notebooku, což je textový soubor obsahující sérii párů JSON key/ value. Tyto páry se nazývají buňky v prostředí Jupyter. Například zobrazení webového prohlížeče notebooku Jupyter v předešlém příkladu obsahuje několik buněk pro text kódu a grafické zobrazení (Výpis 1).

  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Error plot with Matplotlib\n",
    "This example shows plots in notebook (rather than in separate window)."
   ]
  },  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAA[truncated]",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x2f85ef50>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "    \n",
    "X = np.arange(len(values))\n",
    "plt.bar(X + 0.0, values, facecolor='blue', \n",
    "        edgecolor='white', width=0.5, label=\"Written_to_DAC\")\n",
    "plt.bar(X + 0.25, samples, facecolor='red', \n",
    "        edgecolor='white', width=0.5, label=\"Read_from_ADC\")\n",
    "\n",
    "plt.title('DAC-ADC Linearity')\n",
    "plt.xlabel('Sample_number')\n",
    "plt.ylabel('Volts')\n",
    "plt.legend(loc='upper left', frameon=False)\n",
    "\n",
    "plt.show()"
   ]
  },
 
Výpis 1: Notebook Jupyter je textový soubor obsahující řadu párů key / value JSON, které obsahují kódové sekce a výstup, který odpovídá vykreslené stránce zobrazené na obrázku 3. Všimněte si, že řetězec odpovídá png obrázku, který byl zkrácen pro účely prezentace. (Zdroj kódu: Xilinx)

 

Kromě vlastností dokumentace spočívá síla prostředí Jupyter v jeho schopnosti interaktivně spouštět kódové buňky. Vývojáři jednoduše vyberou požadovanou buňku ve svém prohlížeči (modrý rámeček na obrázku 3) a kliknou na tlačítko Spustit v nabídce Jupyter v horní části okna prohlížeče. Notebookový server Jupyter odešle odpovídající kódovou buňku jádru pro spuštění kódu, což je interaktivní jádro Pythonu (IPython) v prostředí PYNQ. Po provedení kódu server asynchronně aktualizuje vykreslenou webovou stránku a soubor poznámkového bloku.

PYNQ rozšiřuje tento stejný postup také pro vývoj na bázi FPGA začleněním frameworku Jupyter včetně jádra IPython a notebooku Web serveru pro Zynq SoC Arm procesory. Modul pynq Python poskytuje programátorům Python API funkce pro přístup ke službám PYNQ v programech Python.

Vývojové prostředí FPGA

Vývojový kit PYNQ-Z1 development kit je navržený speciálně pro podporu PYNQ, umožňuje vývojářům rychle začít vytvářet a zkoumat aplikace pro FPGA. Stačí si jednoduše načíst volně stažitelný obraz Linuxu PYNQ. Deska PYNQ-Z1 obsahuje Xilinx XC7Z020 Zynq SoC s 512 Mbytes RAM, 16 MB paměti a slot microSD pro přídavnou externí paměť flash. Spolu s přepínači, tlačítky, LED diodami a vstupními / výstupními porty, deska také poskytuje konektory pro rozšíření na hardware třetích stran přes rozhraní Digilent Pmod (periferní modul), Arduino shields a Digilent chipKIT shields. Deska také přináší analogově-digitální převodník Zynq SoC (ADC), nazývaný XADC, což je šest analogových vstupních portů a čtyř analogových vstupních portů. Digilent také dodává samostatnou sadu PYNQ-Z1 productivity kit, která obsahuje napájecí zdroj, kabel micro USB, kartu microSD s předinstalovaným obrazem PYNQ a ethernetový kabel pro aktualizaci nebo přidání modulů Python.

Pro vývojáře jsou možnosti SoC a boardu snadno dostupné přes notebook Jupyter. Například přístup k rozhraní Pmod desky pro čtení hodnot ADC a zápisu digitálně-analogového převodníku (DAC) ve zpětné smyčce vyžaduje pouze několik řádků kódu (obrázek 5). Po importu požadovaných modulů Python je SoC PL inicializován se „základním“ overaly (buňka 2 na obrázku 5). Stejně jako běžný balíček na podporu desek poskytuje tato základní vrstva přístup k periferiím.

Obrázek 5: Notebook Jupyter obsažený ve vzorovém úložišti Xilinx demonstruje jednoduchý vzor spojený s přístupem k hardwarovým službám pro vstupy / výstupy. (Zdroj obrázku: Xilinx)

Vývojáři potřebují pouze číst a zapisovat hodnoty importovaných modulů (buňka 3 na obrázku). Ve znázorněném ukázkovém příkladu notebook server vydá každou buňku postupně a aktualizuje notebook s generovanými výsledky. V tomto případě je jedinou výstupní hodnotou 0,3418, ale všechny chyby při provádění se zobrazí jako normální Python traceback v souladu s jejich příslušnými kódovými buňkami.

Budování komplexních aplikací

Díky široké škále dostupných modulů Python je PYNQ silná platforma pro rychlou implementaci složitých a náročných aplikací. Například vývojáři mohou rychle implementovat webovou kameru pro detekci tváří pomocí vstupu PYNQ-Z1 HDMI a populární knihovny počítačového vidění OpenCV. Po načtení základního overlay a webového rozhraní vývojáři inicializují video objekt OpenCV (obr. 6). Čtení obrazu videa je pak stejně jednoduché jako volání videoIn.read (), v tomto příkladu vrací frame_vga.

Obrázek 6: Notebook Jupyter obsažený ve vzorovém uložišti Xilinx ukazuje, jak mohou vývojáři rychle vytvořit systém rozpoznávání obličeje webkamer pomocí vývojové desky PYNQ-Z1 s výkonnými funkcemi zpracování obrazu dostupnými v knihovně OpenCV (cv2). (Zdroj obrázku: Xilinx)

V následujícím kroku vývojáři vytvářejí objekty klasifikátoru OpenCV (cv2) pomocí přednastavených kritérií a přidávají ohraničující rámečky (bounding boxes) pro identifikaci v obrazu (zelená barva rámečku pro oči a modrá pro tváře). V jiném páru buněk se aplikace dokončí a zobrazí výstup pomocí HDMI na desce (Obrázek 7).

Obrázek 7: Konečné buňky v notebooku pro detekci obličeje Xilinx demonstrují použití klasifikátorů OpenCV, jejichž výsledky se používají k přidávání ohraničovacích rámečků k originálním obrazům a zobrazují se pomocí výstupního portu HDMI vývojové desky PYNQ-Z1. (Zdroj obrázku: Xilinx)

Schopnost interaktivně budovat, testovat a sdílet diskusi o komplexním softwaru učinila z notebooků Jupyter oblíbenou platformu mezi vědci a inženýry, kteří pracují na optimalizaci algoritmů pro aplikace umělé inteligence. Jak se práce vyvíjí, notebook nejenže zobrazuje kód a jeho výstup, ale také analýzu vývojářů a tyto výsledky lze sdílet mezi členy týmu a kolegy.

Zahrnutí velkých hexadecimálních kódovaných řetězců pro obrazová data (viz zkrácený oddíl ve Výpisu 1) nejenže zvětšuje velikost dokumentu, ale může komplikovat rozdílné metody používané v typických systémech pro verzování kódu. Prokládání kódu a jiných funkční textů může dále zkomplikovat migraci kódu vytvořeného v raných analytických fázích do výrobních procesů. Pro vyhledávání kódu a rychlé prototypování však notebooky Jupyter nabízejí výkonné vývojové prostředí.

Závěr

FPGA poskytují zvýšení výkonu k uspokojení rostoucích požadavků vestavěných systémů určených pro IoT, počítačové vidění, průmyslovou automatizaci, automobilový průmysl a mnoho dalších. Ačkoli standartní vývojové metodiky FPGA zůstaly překážkami pro mnoho vývojářů, vznik Python prostředí PYNQ založené na noteboocích Jupyter tyto překážky eliminuje. Pomocí vývojové desky určené speciálně pro podporu PYNQ mohou vývojáři s malými zkušenostmi s FPGA rychle implementovat funkce, které umožní plně využít výkon FPGA pro aplikace náročné na výpočetní výkon.

 

Článek vyšel v originále "Build and Program FPGA-Based Designs Quickly with Python and Jupyter Notebooks"  na webu DigiKey.com, autorem je Stephen Evanczuk

Hodnocení článku: