První kroky s FPGA

Máme kit, programátor, nainstalované IDE, připojili jsme to k PC přes USB, a co dál?

Nejprve troška teorie.

FPGA je po zapnutí úplně tuhý kus křemíku, který k tomu, aby něco zajímavého dělal, potřebuje nejprve nakrmit konfiguračními daty. Ty bývají nejčastěji uložené mimo FPGA, v sériové paměti FLASH, ale můžete je při ladění nacpat do FPGA i přes programovací rozhraní JTAG.

Kit EP2C5T144 například nabízí dvě rozhraní, do kterých lze zapojit USB Blaster: JTAG a AS. Pomocí JTAG dostanete konfiguraci do FPGA při ladění. Přeložit, nahrát, testovat… Po vypnutí a zapnutí se ale načte nová konfigurace zase z FLASH. Pokud chcete uložit konfiguraci přímo do této paměti, použijete AS (Active Serial). Existují i způsoby, jak nahrát obsah do FLASH přes JTAG, tzv. „indirect programming“: pro Xilinx, pro Alteru (Serial Flash Loader).

Pro experimenty využijeme JTAG.

Vlastní návrh proběhne ve vývojovém prostředí – IDE. Ovládání IDE není triviální, ale pokud máte nějaké zkušenosti s vývojovým prostředím typu Visual Studio, Eclipse apod., brzy se sjijete i s těmito.

Obě se od sebe liší, každé má jinak pojmenovaná menu, ale základ je stejný: ke každému projektu existuje Project. Project v jednom adresáři schraňuje všechny soubory, potřebné k naprogramování FPGA. Jde především o popis funkce v některém z jazyků (VHDL, Verilog a další). K těmto zdrojovým souborům si IDE vytvoří velké množství různých konfiguračních souborů (většinou je nemusíte editovat přímo, ale jsou na to v IDE nástroje). Jedním z takových nástrojů je nástroj, kterým můžete určit, který vývod FPGA má mít jakou funkci. V IDE Quartus se tato funkce jmenuje Pin Planner.

Překlad probíhá v několika krocích. Zase – názvosloví se liší, ale postup zhruba odpovídá.

  • První krok je analýza a syntéza. V něm se ze zdrojových kódů vytvoří návrh pro konkrétní FPGA. Překladač zkontroluje syntaxi, vyhodnotí logické výrazy, vazby mezi nimi, spočítá, kolik elementů bude potřeba, vytvoří seznam signálů, které bude potřeba připojit na piny FPGA…
  • Ve druhém kroku se IDE snaží vhodně rozmístit komponenty do vnitřku FPGA. Zde se zohlední například i ten Pin Planner. Po tomto kroku je jasno, zda se váš návrh do FPGA vejde, nebo zda je potřeba něco někde změnit.
  • Třetí krok je vlastní překlad. Z výstupu druhého kroku se připraví konfigurační soubory, které se budou nahrávat do FPGA.
  • Následují nejrůznější testy, hledání kritických míst, a závěrečný report, z něhož se např. dozvíte, nakolik jste využili možností svého FPGA.

Zde překlad končí. Další krok je vlastní programování do FPGA.

Kroky jsou přehledně vidět v IDE, takže víte, co už je splněno a co vás ještě čeká.

Nemusíte psát nutně všechno ve zdrojovém kódu – IDE obsahují i nástroje pro vizuální návrh, kde si obvod sestavíte, jako byste ho kreslili v Eagle nebo jiném EDA nástroji.

Hello world, model FPGA

Pokud máte všechno potřebné, tj. kit, programátor i IDE, můžete si zkusit „blikat LEDkou“, což je taková hardwarová obdoba Hello world.

Budu popisovat blikání LEDkou pro kit EP2C5, programátor USB Blaster a IDE Quartus.

1. Vytvoření projektu

Začínáme vytvořením projektu. Jako vždy: File – New Project Wizard.

qq1

Projekt pojmenujeme „blink“. Klikáme na NEXT.

qq2

 

Ve třetím kroku je potřeba vybrat použité FPGA. Zadejte rodinu „Cyclone 2“, čip je „EP2C5T144C8“.

Next, next, finish…

2. Zapojení

Blikání můžeme udělat mnoha způsoby. Já vybral ten, kdy si na hodinový vstup (50 MHz) připojíme čítač, kterým podělíme frekvenci natolik, aby bylo blikání pozorovatelné pouhým okem. To znamená ideálně 24 bitů a víc. Kit má navíc 3 LED, takže nechám blikat všechny tři a zapojím je na bity 24, 25 a 26. Dělič nemusím vytvářet z elementárních obvodů – Quartus obsahuje knihovnu neskromně nazvanou Megalibrary, která obsahuje sadu nejrůznějších obvodů, od jednoduché logiky až po komplexní obvody typu řediče SDRAM, rozhraní PCIe nebo síťové vrstvy PHY. Je mezi nimi i univerzální čítač.

Jak jsem slíbil výš, nebudeme obvod popisovat zdrojovými kódy, ale nakreslíme si ho. Vyberu tedy File – New – Block Diagram/Schematic File. Otevře se známý „tečkovaný papír“, kam můžu umístit komponenty a propojovat je.

qq3

Nejprve tedy umístím komponentu. Vyberu si z „Megafunctions“, složky „Arithmetic“ obvod, který se jmenuje „lpm_counter“. Kliknu na OK, a otevře se průvodce nastavením.

qq4

Jako jazyk zvolím VHDL (teď je to jedno) a pojmenování nechám takové, jaké mi průvodce nabízí.

qq5

V dalším kroku zvolím bitovou šířku. Já zvolil 28 bitů a čítání nahoru (mohu vytvořit i čítač dolů, popřípadě obousměrný). Další volby nechám tak, jak jsou nastavené, na konci kliknu na Finish.

qq6

 

Objeví se okno, které mě upozorňuje, že jsem stvořil komponentu, a ptá se, jestli ji chci vložit do projektu. Chci, takže Yes.

Teď kreslím zapojení. Na vstup připojím vstupní pin, pojmenuju ho clk50. Na výstup připojím sběrnici (Bus), která se bude jmenovat „q[27..0]“ – tedy 28 linek. Využiju z nich ale jen tři. Připravím si tři výstupní piny LED1-3 a připojím je ke sběrnici jako q[24], q[25] a q[26].

qq7

Soubor uložím jako „blink.bdf“, zkusím si zadat překlad (Processing – Start – Analysis & Synthesis, Ctrl-K), a pokud je vše OK, je načase připojit piny z nákresu k fyzickým. Otevřu si Pin Planner (Assignments – Pin Planner) a zadám správné piny.

Podle schématu je hodinový vstup 50 MHz připojený na pin 17 a LED jsou připojené k pinům 3, 7 a 9. Stejně tedy přiřadím i piny v planneru.

qq8

Po zavření planenru vidím, že se přiřazení promítlo do schématu:

qq9

Teď tedy mohu spustit celý překlad (Processing – Start Compilation, Ctrl-L). Měl by proběhnout bez chyb.

Pokud je vše v pořádku, je načase programovat. Připojte USB Blaster a počkejte, až se nainstaluje. Možná bude potřeba vyřešit ovladače… Blaster připojte do konektoru JTAG na kitu a kit zapojte na zdroj 5V. Měla by svítit POWER LED. Otevřte programátor (Tools – Programmer), vyberte jako nástroj „USB Blaster“, mód „JTAG“ (pokud byste programovali natrvalo, viz výše, zde zadáte AS). A pak už stačí jen kliknout na Start.

qq10

Během několika sekund se LED na kitu rozblikají. Hurá!

Po chvíli zjistíte, že blikají nějak divně, že to počítání moc neodpovídá, jako by snad počítaly směrem dolů, a při pohledu na zapojení kitu vám to dojde: LED nejsou připojené na zem, ale na Vcc. Tedy inverzně. Jako intelektuální cvičení si můžete zkusit, jak do celého zapojení přidat tři invertory…

banner