Produkty Novinky Články Návody Kontakty

Mach a Lattice Diamond

Nebude to povídání o slavném Machovi a Šebestové, ale o modulu s malým FPGA od firmy Lattice Semiconductor a návrhovém systému Lattice Diamond. Modul je vedle FPGA obvodu MachXO2-1200 vybaven statickou RAM o kapacitě 128 KB, SPI Flash pamětí o kapacitě 4 Mb a 50 MHz oscilátorem. V článku si vysvětlíme, co všechno musíme udělat, abychom vytvořili jednoduchý projekt v prostředí Lattice Diamond a jeho výsledek pak nahráli do FPGA. Abychom začali jednoduchou aplikací, budeme, jak je obvyklé, blikat LEDkou.
Příklad napíšeme v jazyce VHLD, ale nečekejte, že začneme až od Adama a budeme vysvětlovat základy VHDL nebo Verilogu. K tomuto tématu najdete plno zdrojů na Internetu, stačí Googlu zadat ”základy VHDL” a vyběhne na vás plno odkazů. O obvodech FPGA a jazyku VHDL jsou v češtině k dispozici i knihy. Nakladatelství BEN vydalo několik knih, které se programovatelnou logikou zabývají. První z nich je FPGA prakticky, jejímž autorem je Jakub Šťastný, druhou knihu Řešené příklady ve VHDL napsal Jiří Král. Třetí knihu napsala dvojice autorů Jiří Pinker a Martin Poupa a její název je Číslicové systémy a jazyk VHDL.
Zdrojů v angličtině je podstatně víc. Celý svět se vám otevře, pokud v Googlu zadáte ”VHDL tutorial”. Volně ke stažení je kniha Free Range VHDL, která přehledně podává základy jazyka, potřebné pro návrh funkčních obvodů. Autoři v této knize několikrát zmiňují skutečnost, že jazyk VHDL je určen pro popis hardware, i když se jeví jako programovací jazyk. Do této pasti často padají vývojáři softwaru pro embedded systémy, kteří začínají s návrhem hardwaru a snaží se používat VHDL, tak jak jsou zvyklí při psaní programů. A ono jim to nefunguje. Totéž platí i pro Verilog.
Precizně podané základy pro psaní syntetizovatelného VHDL kódu se spoustou řešených příkladů najdete v knize FPGA Prototyping by VHDL Examples. Kompletní přehled jazyka VHDL podává Ashendenova tlustokniha The Designer's Guide to VHDL. A pro pokročilé studium návrhu hardware v jazyku VHDL dobře poslouží RTL Hardware Design Using VHDL.
Ale dost vykládání o knihách, ty přece nikoho nezajímají, nikdo je nečte, jsou tlusté a nudné. Nás zajímá akce. Chceme teď, a to hned, aspoň blikat LEDkou a zítra už napsat vlastní 32bitový procesor, minimálně se třístupňovou pajplajnou.

Nejdříve nainstalujeme software

Abychom mohli napsat vlastní aplikaci pro FPGA, abychom ji mohli přeložit, simulovat, syntetizovat a nakonec naprogramovat do FPGA obvodu, na to potřebujeme vhodný návrhový systém. Jedná se o dost nákladnou záležitost, ale výrobci FPGA obvodů poskytují základní verze svých systémů ke stažení zdarma. Firma Lattice Semiconductor není výjimkou. Vývojový software Lattice Diamond je ve verzi s licencí zdarma (Lattice Diamond Free License) plnohodnotný návrhový systém, který je omezen na některé typy obvodů. Obvody typu MachXO2 jsou ale Free License verzí podporovány a to nám stačí. Základní informace o návrhovém systému Lattice Diamond si můžete přečíst v popisu produktu.
Na programování FPGA obvodu použijeme JTAG rozhraní. Prototypovací deska BaseBoard je vybavena USB obvodem FT2232D a programovací modul v Lattice Diamond umí tento oblíbený obvod využít jako JTAG adaptér. Z webu společnosti FTDI si stáhneme D2XX drivery pro Windows a nainstalujeme je. Instalační balík obsahuje D2XX drivery i VCP drivery, takže budeme mít k dispozici i virtuální COM port. Obvod FT2232D má dva komunikační kanály, jeden použijeme jako JTAG adaptér a druhý se dá využít jako sériový port.
A teď ten Lattice Diamond
  1. Nejdříve se u Lattice zaregistrujeme
  2. Na stránkách Lattice Diamond pod záložkou Downloads si stáhneme Diamond 2.2 for Windows a nainstalujeme jej
  3. Pod záložkou Licensing si zažádáme o Lattice Diamond Software Free License
  4. Emailem dostaneme licenční soubor license.dat, ten podle návodu zaregistrujeme v Lattice Diamond a je nainstalováno.

Zapojení modulu MachXO2

Nyní si připravíme modul MachXO2 a prototypovací desku BaseBoard. Schemata desek si můžeme stáhnout z jejich produktových stránek. Se schematem si srovnáme umístění pinheadů a jumperů na modulu.
Nejdřív připojíme napájení modulu na rozvod 3,3V a GND. Na obrázku je napájení připojeno na piny 29 (3,3V) a 30 (GND) na pinheadu J5 modulu MachXO2. K napájení modulu můžete samozřejmě použít kterýkoli ze čtyř pinheadů.
Připojíme signály JTAG rozhraní obvodu MachXO2 na port A obvodu FT2232D.
Na modulu MachXO2 jsou JTAG signály vyvedeny na pinhead J6. Pro větší přehlednost jsme pro každý signál použili jinou barvu. Signál TDO je červený, TDI modrý, TCK zelený a TMS je žlutý
Signály portu A obvodu FT2232D jsou vyvedeny na BaseBoardu na pinheadu J35.
Připojení jednotlivých signálů JTAG rozhraní obvodu MachXO2 na porty obvodu FT2232D je dáno funkčností programovacího modulu Lattice Diamond. Zapojení je popsáno včetně schematu v aplikační poznámce AN8082.
Osazením jumperu J1 na modulu MachXO2 zapneme 50 MHz oscilátor. Jeho výstup OSC_CLK je připojený na pin PT12A (Bank 0, číslo pinu 128) obvodu MachXO2.
Ještě musíme někam připojit LEDku, abychom s ní mohli blikat. Proto to přece celé děláme. Použijeme jednu z osmi LEDek, které jsou v levé dolní sekci BaseBoardu a připojíme ji na některý z pinů FPGA. V našem příkladě jsme použili pravou krajní LEDku. Její katodu, která je vyvedena na 9. pin konektoru J41, jsme připojili žlutým kablíkem na port PT9C obvodu MachXO2. Ten je na FPGA modulu vyveden na 3. pinu konektoru J6. Proč jsme použili zrovna tento port? No prostě proto. A taky, že je blízko LEDce. Anodu LEDky, nebo spíš její předřadný odpor, jsme z 9. pinu konektoru J40 připojili červeným kablíkem na napájení 3,3V.
Teď už jen propojíme USB konektor J1 na BaseBoardu USB kabelem k PC (připojujeme obvod FT2232D), k BaseBoardu připojíme 12V zdroj napětí a spínačem SW1 obvody BaseBoardu připojíme k napájení. V napájecí sekci BaseBoardu se rozsvítí LEDky +5V a +3.3V a Windows nám ohlásí připojení nového zařízení.

Nový projekt v Lattice Diamond

Máme nainstalovaný návrhový systém Lattice Diamond, získali jsme a nainstalovali jsme Lattice Diamond Software Free License, máme nainstalované drivery pro obvod FT2232D, na BaseBoardu nám svítí LEDky napájení a USB připojení k PC vypadá funkční. Vytvoříme projekt, napálíme to do Macha, ať už to bliká.
Spustíme Lattice Diamond a v menu File->New->Project spustíme vytvoření nového projektu.
Vyplníme název projektu, adresář, kde bude projekt umístěn a název implementace.
Nemáme zatím žádné zdrojové soubory, které bychom chtěli k projektu přidávat, proto v následujícím okně pokračujeme beze změny.
Nastavíme typ FPGA, pro které návrh vytváříme. Modul MachXO2 je osazen typem LCMXO2-1200HC-4TG144C. To znamená MachXO2, 1200HC, úroveň 4, pouzdro TQFP144 a komerční provedení. Vpravo jsou zobrazeny zdroje, kterými obvod disponuje.
Zvolíme, který z nástrojů bude použit pro systézu VHDL kódu. Tady jsme vybrali Synplify, k dispozici je také Lattice LSE.
No a jsme ve finiši založení projektu. Zobrazí se nám shrnutí našeho zadání a Diamond vygeneruje nový projekt.
Po vygenerování nového projektu se zobrazí report se souhrnem vlastností projektu.
Detail reportu:
Teď je čas na vytvoření zdrojového souboru ve VHDL. V levém poli klikneme na záložku File List. Pravý tlačítkem myši klikneme ve stromu na položku Input Files a zvolíme Add->New File.
V následujícím dialogu v sekci Categories vybereme Source Files a zvolíme VHDL Files. Zadáme jméno zdrojového souboru single_led, přípona se volí v kombu Ext.
Do editačního okna zdrojového souboru single_led.vhd vložíme následující VHDL kód a obsah souboru uložíme na disk. Při uložení provede Diamond syntaktickou analýzu zdrojového kódu a dole ve výstupním okně informuje o případných chybách nebo varováních.
LIBRARY ieee; 
USE ieee.std_logic_1164.all; 
USE ieee.std_logic_unsigned.all;

ENTITY blinker IS   PORT(
	clk : IN STD_LOGIC;
	led : OUT STD_LOGIC);
END blinker;

ARCHITECTURE blinker_arch OF blinker IS
  SIGNAL counter : STD_LOGIC_VECTOR(25 DOWNTO 0);
BEGIN
  PROCESS (clk) IS
  BEGIN
    IF (clk'EVENT AND clk='1') THEN
      counter <= counter + 1;
    END IF;
  END PROCESS;
  led <= counter(25);
END blinker_arch; 
A teď provedeme systézu VHDL kódu. V levé sekci se přepneme na záložku Process a pod Synthesize Design dvojklikneme na Translate Design. Začnou se točit kolečka, větráček PC začne funět a ve spodním okně Diamond vypisuje informace o prováděné akci.
Nakonec musíme připojit rozhraní našeho návrhu do reálného světa. To znamená, že naše nadefinované porty clk a led svážeme s piny FPGA. V menu vybereme Tools->Spreadsheet View a pod záložkou Pin Assignment máme tabulku se všemi piny FPGA obvodu. Dvojklikem na buňku v řádku s číslem pinu 141 (port PT9C) a ve sloupci Signal Name se nám otevře dialog, ve kterém přířadíme náš signál led na port PT9C. Jak prosté, že?
Po přiřazení signálu k pinu FPGA je v tabulce ve sloupci Signal Name uveden název signálu, v tomto případě je to signál led.
Totéž provedeme se signálem clk. Je to zdroj hodinového signálu pro náš návrh, takže ho potřebujeme připojit na nějaký kmitátor. Na začátku jsme jumperem zapnuli 50 MHz oscilátor, který je na modulu osazen. Jeho výstup OSC_CLK je připojený na port PT12A (číslo pinu 128). A k němu náš clk signál připojíme.
Po přiřazení obou našich signálů vypadá tabulka Pin Assignment následovně.
Máme vše nadefinováno, teď to potřebujeme dostat do FPGA. Necháme si vygenerovat dva typy výstupních souborů. JEDEC File bude potřeba na programování vnitřní Flash paměti a Bitstream File použijeme při programování SRAM paměti FPGA obvodu MachXO2. V levém poli, v záložce Process, pod položkou Export Files, zatrhneme jak JEDEC File, tak Bitstream File. Dvojklikneme na Export Files a zase se začnou točit kolečka. Až se dotočí, budeme mít připraveny soubory s naším první příkladem pro naprogramování do FPGA.
Jdeme do finále. Naprogramujeme FPGA a bude to blikat. BaseBoard spolu s modulem MachXO2 máme stále zapnutý a přes USB obvod FT2232D připojený k PC. V menu zvolíme Tools->Programmer a otevře se nám dialog s volbou programovacího rozhraní. Diamond by měl detekovat, že má k dispozici driver pro FT2232D. Dialog odklikneme OK.
Otevře se panel programovacího modulu Diamondu, který obsahuje cílové zařízení na programování a návrh, který do něj chceme naprogramovat. Kliknutím pravým tlačítkem myši zobrazíme kontextové menu a volbou položky Device Properties si můžeme prohlédnout vlastnosti, které jsou pro programování nastaveny.
Zobrazí se dialog Device Properties, ze kterého je zřejmé, že budeme programovat interní Flash paměť obvodu MachXO2 a pro jeho naprogramování bude použit JEDEC soubor (s příponou jed). Stiskneme Cancel a vrátíme se do programovacího panelu.
Kliknutím na ikonu Program nebo v menu Design->Program spustíme programování obvodu MachXO2. Informace o průběhu akce vypisuje Diamond dolů do výstupního okna. A když je doprogramováno, LEDka se rozbliká.
Programování do interní Flash paměti obvodu MachXO2 zajistí, že náš návrh bude fungovat i po vypnutí a opětovném zapnutí napájení . To je potřeba, pokud máme odladěnou finální verzi návrhu a obsah Flash paměti neměníme tak často. Pokud je návrh ve fázi ladění nebo si s modulem hrajeme, může se Flash paměť častým programováním ošoupat a obvod pak nemusí fungovat bezchybně. Proto je pro hraní a ladění vhodné nahrávat obsah FPGA přímo do interní SRAM paměti obvodu MachXO2. Po odpojení napájení bude sice obsah ztracen, ale to nám při hraní vadit nebude.
V programovací panelu si kontextovým menu zobrazíme znovu Device Properties a nastavíme programování do SRAM paměti Bitstream souborem (s připonou bit). Nyní se bude obsah nahrávat do interní SRAM paměti obvodu MachXO2.
No a jestli ta LEDka vůbec zablikala? Však to vidíte na obrázku.

Soubory ke stažení