Typické postupy při práci s obvody PLD a FPGA
Doc. Ing. Jaromír Kolouch, CSc.
Obsah Jak se můžeme seznámit se základními způsoby práce se systémem .................................................. 3 Jak se doporučuje zapisovat kód HDL, aby byl dobře syntetizovatelný ............................................ 3
Postupy při simulaci ........................................................................................................................3 Nastavení doby simulace ......................................................................................................................... 3 Jak se simulací zjistí chování čítačů a stavových automatů v nepracovních stavech ........................ 3 Přidání vnitřních signálů do okna Wave simulátoru ........................................................................... 3
Postupy při syntéze a implementaci ................................................................................................4 Jak se definují atributy signálů na vývodech pouzdra ......................................................................... 4 Jak se definuje počáteční stav registrových signálů po připojení napájecího napětí ........................ 5 Jak se zjistí časové parametry vytvořené konstrukce .......................................................................... 6 Jak se definují vstupy a výstupy s diferenčními signály....................................................................... 6 Použití bloku DCM .................................................................................................................................. 7 Implementace pamětí RAM, ROM ........................................................................................................ 7
Postupy při programování...............................................................................................................7 Programování obvodů CPLD ................................................................................................................. 7 Programování (konfigurace) obvodů FPGA ......................................................................................... 8
Literatura .........................................................................................................................................8 V tomto textu jsou uvedeny některé postupy, které se v laboratořích Ústavu radioelektroniky při práci s návrhovým systémem ISE firmy Xilinx a s programovatelnými obvody této firmy nejčastěji používají. Tyto postupy se týkají práce s uvedeným návrhovým systémem, s obvody CPLD a FPGA firmy Xilinx a se simulátorem ModelSim, pokud není uvedeno jinak.
2
Jak se můžeme seznámit se základními způsoby práce se systémem Na www stránkách firmy Xilinx bývají ke každé verzi systému ISE dokumenty popisující vzorovou konstrukci v tomto systému a příslušné postupy při jejím zpracování. Pro systém ISE verze 7 jsou to dokumenty [ 5 ], [ 6 ].
Jak se doporučuje zapisovat kód HDL, aby byl dobře syntetizovatelný Doporučení pro zápis kódu u systému ISE jsou uvedena v literatuře [ 4 ]. V ní jsou také další obecná doporučení pro použití jazyků HDL i pro další práci s tímto systémem. Šablony pro popis nejpoužívanějších subsystémů a jazykových konstruktů je možno najít přímo v systému: Edit => Language Templates...
Postupy při simulaci Nastavení doby simulace Při simulaci spuštěné z okna Processes for Source (v okně Sources in Project je zvýrazněna položka benče) je v ISE automaticky nastavena doba simulace 1 us. Pokud používáme benč, který obsahuje příkazy pro ukončení simulace, je potřebné v ISE nastavit dobu delší, případně neohraničenou. To se provede klepnutím pravým tlačítkem myši na položku simulace v okně Processes for Source, zde se vybere položka Properties... a v řádku Simulation Run time se zadá požadovaná doba, případně -all pro neohraničenou dobu simulace.
Jak se simulací zjistí chování čítačů a stavových automatů v nepracovních stavech První možnost: Do konstrukce se přidá vstup pro asynchronní naplnění stavového registru a odpovídající datové vstupy. Tím je možno vyvolat přechod do libovolně zvoleného počátečního stavu, a další chování se zjistí běžným postupem simulace behaviorálního modelu. Druhá možnost: Počáteční stav se definuje prostředky, které umožňuje použitý návrhový systém. Například u systému ISE je možno počáteční stav definovat v deklaraci registrových signálů v popisu jazykem VHDL (viz část Postupy při syntéze a implementaci). Tato definice počátečního stavu se při simulaci behaviorálního modelu akceptuje.
Přidání vnitřních signálů do okna Wave simulátoru Předpokládá se, že byl vytvořen benč některým ze standardních postupů, například pomocí HDL Bencheru (grafické rozhraní spuštěné z Project => New Source... => Test Bench Waveform), kde se automaticky zobrazují signály představující brány (porty) simulované entity. Potřebujeme zobrazit další (vnitřní) signály v konstrukci. V okně Structure simulátoru zvýrazníme položku uut (unit under test), čímž se v okně Signals objeví signály v simulované konstrukci. Myší přetáhneme potřebné signály do okna Wave. Tam se ale neobjeví jejich průběhy, protože simulátor během simulace zaznamenává jen hodnoty těch signálů, které jsou v okně Wave
3
zadány. Musíme tedy provést novou simulaci. V okně Wave klepneme na tlačítko Restart a pak spustíme simulaci (obsahuje-li benč příkazy pro ukončení simulace, použijeme tlačítko Run –all). Máme-li v úmyslu změnit zdrojový text nebo přidat další vektory a pak provést znovu simulaci s nezměněným oknem Wave, můžeme formát tohoto okna před zavřením simulátoru uložit (File => Save Format...). Nabídne se tím vytvoření souboru Wave.do, formát však uložíme pod označením *.udo, kde * je název souboru, v němž je benč – nejsnadněji se to udělá tak, že v okně pro uložení vybereme v menu okénka „Uložit jako typ“ všechny soubory (*.*) a v nabídce vyhledáme název *.udo – * je nyní hledané označení, čímž se dosud prázdný soubor typu udo přepíše novým s údaji o formátu). Pozor na to, že někdy okno pro zápis souboru *.udo nabídne jiný adresář než adresář projektu! Při další simulaci se již v okně Wave objeví okno v uspořádání odpovídajícím uloženému uspořádání, kde je k signálům původně zobrazeným přidána skupina složená z přidaných signálů a kopie původně zobrazených signálů (ty je pak vhodné z okna vymazat).
Postupy při syntéze a implementaci Jak se definují atributy signálů na vývodech pouzdra Jde o atributy jako přiřazení signálů vývodům, I/O standard, zatížitelnost výstupů (Drive Strength), zakončení (Termination), rychlost přeběhu (Slew), vstupní zpoždění (Delay), případně další (nebo jen některé z uvedených) podle typu cílového obvodu. Přehled atributů je uveden v literatuře [ 1 ]. Obecně jsou nejlepší zkušenosti s automatickým generováním souboru ucf (např. blokem PACE a podobně), jiné možnosti jsou občas problematické z hlediska syntaktické správnosti (chyby či nejasnosti se někdy vyskytují i ve výše uvedené literatuře). Výhodné je také, že se při automatickém generování obvykle nabízejí k výběru možnosti odpovídající zvolenému typu cílového obvodu. Definice v souboru ucf – ISE v. 7: Nejpohodlnější možnost je použití programového bloku PACE (Pinout and Area Constraint Editor) – Processes for Source => User Constraints => Assign Package Pins. Signály se z okna Design Object List – I/O Pins myší přetáhnou na příslušné pozice v okně Package Pins for ... (typ cílového obvodu), záložka Package View. V okně Design Object List se po přetažení objeví příslušné číslo vývodu. Dále je pak možno klepnutím na příslušné okénku u signálu vybrat z nabídky další výše uvedené atributy. Přitom se automaticky vytváří (edituje) příslušný soubor ucf. Automatické generování zajišťuje jeho syntaktickou správnost. Přímá editace souboru ucf – textovým editorem je možno v tomto souboru zadat různé požadavky – omezení (constraints) podle syntaxe uvedené v literatuře [ 1 ]. Například pro přiřazení signálů vývodům se používá příkaz LOC – ISE v. 7 viz šablonu, Edit => Language Templates... => UCF => CPLD|FPGA => Placement => LOC (Pin Assignment). Soubor ucf je možno vytvořit vnějším textovým editorem nebo otevřít v editoru ISE: Processes for Source => User Constraints => Edit Constraints (Text).
4
Použití atributů v popisu VHDL – syntaxe je uvedena v [ 1 ]. Příklad pro přiřazení signálů vývodům: ATTRIBUTE loc: string; ATTRIBUTE loc OF Rst: SIGNAL IS "P15"; -- prirazeni signalu na vyvod 15 ATTRIBUTE loc OF CntPin: SIGNAL IS "P21 P22 P23"; -- prirazeni vektoru
Atributy se uvádějí v deklarativním úseku popisu architektury. Signály mohou být v principu přiřazeny vývodům pouzdra libovolně (pokud samozřejmě respektujeme skutečnost, že některé vývody mají zvláštní určení, například napájecí, zemnicí, konfigurační apod. vývody). Pokud však chceme, aby toto přiřazení nezpůsobilo zhoršení kvality výsledku implementace (snížení rychlosti, zvýšení spotřeby strukturních prvků a podobně), je vhodné při výběru vhodného přiřazení dodržovat určitá pravidla – viz například [ 8 ]. V literatuře se doporučuje předepisovat toto přiřazení jen tehdy, je-li to skutečně potřebné. Pokud se přiřazení nepředepíše, může návrhový systém přiřazení automaticky optimalizovat. Jeli to možné, je vhodné aspoň při první implementaci ponechat systému tuto možnost a dále přiřazení měnit jen v případě nezbytnosti.
Jak se definuje počáteční stav registrových signálů po připojení napájecího napětí Počáteční stav je možno definovat u registrových signálů, tj. signálů, kterým jsou jejich hodnoty přiřazeny způsobem, který představuje registr řízený hranou nebo latch. Registrovými signály nejsou například vnější signály deklarované s módem OUT v deklaraci entity, kterým jsou hodnoty registrových signálů přiřazeny v popisu architektury prostým přiřazovacím příkazem (obvyklé například u čítačů). Počáteční hodnotu těchto signálů můžeme zajistit definicí počátečního stavu signálů na výstupu příslušného registru, které jsou deklarovány jako vnitřní signály. Definice v souboru ucf – ISE v. 7: Používá se k tomu příkaz INIT – viz šablonu v ISE (Edit => Language Templates... => UCF => CPLD => MISC => INIT, nebo Edit => Language Templates... => UCF => FPGA => Initialization atd.) Definice v popisu VHDL: ISE v. 6 a vyšší akceptuje definici počátečního stavu v příkazu SIGNAL – například: SIGNAL Cnt: std_logic_vector(2 DOWNTO 0) := "011";
Je také možno použít atribut - například: ATTRIBUTE init: string; ATTRIBUTE init OF Cnt: SIGNAL IS "000";
Atributy se uvádějí v deklarativním úseku popisu architektury. Počáteční stav po připojení napájecího napětí je možno definovat u všech paměťových prvků, tedy například i u distribuovaných nebo blokových pamětí RAM obsažených v obvodech FPGA. Způsob inicializace těchto pamětí je uveden například v [ 3 ]. V systému ISE v. 7 můžeme počáteční hodnoty zadat také spuštěním bloku Xilinx Constraints Editor (spuštění např.: User Constraints => Create Timing Constraints), v němž zvolíme záložku Misc a klepneme na některou z položek, které jsou nadepsány INIT Values for.
5
Jak se zjistí časové parametry vytvořené konstrukce Mezi nejdůležitější časové parametry patří nejvyšší kmitočet hodinových signálů, zpoždění mezi změnou vstupních signálů a ustálením výstupních signálů a podobné údaje. Popíšeme, jak se zjistí uvedený kmitočet statickou časovou analýzou. U dalších parametrů se postupuje analogicky. Údaje o kmitočtu se vyskytují na různých místech výpisů generovaných při zpracování popisu. Obecně platí pravidlo: Čím větší je stupeň zpracování konstrukce, tím více se tyto údaje blíží skutečným parametrům naprogramovaného cílového obvodu. U obvodů FPGA dává nejpřesnější informace statická časová analýza provedená po etapě Place and Route: Implement Design => Place & Route => Generate Post-Place & Route Static Timing => Text-Based Post-Place&Route Static Timing Report. Aby se v tomto výpisu objevila informace o kmitočtu, musíme dát systému před syntézou na vědomí, že nás tato informace zajímá. To můžeme učinit v ISE v. 7 zadáním nějakého (snadno splnitelného) požadavku na tento kmitočet: v okně Sources in Project vybereme vrcholovou jednotku, v okně Processes for Source pokračujeme volbami User Constraints => Create Timing Constraints. Tím se spustí blok Xilinx Constraints Editor. Zvolíme záložku Global, na níž je již uvedeno označení hodinového signálu použitého v konstrukci (samozřejmě pokud je použit). V okénku Period zadáme např. 100 a pak klikneme např. do okénka Pad to Setup, čímž se automaticky v okénku Period doplní jednotky (ns) a střída 50%. V okně Constraints můžeme sledovat, co se přitom generuje v souboru *.ucf. Po uložení se při statické časové analýze vytvoří údaj o nejvyšším přípustném kmitočtu, který bude zobrazen v uvedeném výpisu.
Jak se definují vstupy a výstupy s diferenčními signály Chceme-li použít u vstupních a výstupních signálů diferenční standard, musíme zajistit převod mezi vnitřním nesymetrickým signálem a vnějším signálem diferenčním. K tomu se používají speciální bufery, které je do konstrukce možno vložit jako komponenty. Odpovídající primitivy jsou obsaženy ve sloze VComponents, která je v ISE dostupná v knihovně UNISIM (na knihovnu i na slohu je nutno uvést v popisu konstrukce odkaz). Označení a šablonu pro vložení najdeme například v [ 2 ]. Hledáme-li například vstupní bufer pro řadu Spartan-3, najdeme zde všechny primitivy a makra pod záložkou Architecture Specific Information => Spartan-3. V seznamu vyhledáme položku IBUFDS (pro hodinové signály IBUFGDS) a poklepem na ni otevřeme příslušnou stránku manuálu. Zde se můžeme přesvědčit, zda je příslušný standard dostupný pro zamýšlený cílový obvod, a v kladném případě najdeme odpovídající šablonu pro vložení (VHDL Instantiation Template). Z této šablony je zřejmé, že musíme mít dva vstupní vývody, jejichž signály (předpokládejme, že jde o hodinový signál) můžeme označit například ClkA a ClkB (budou to obě větve diferenčního signálu). Ty připojíme ke vstupním signálům deklarovaným ve vložené komponentě buferu. Výstup buferu pak bude představovat hodinový signál pro buzení vstupů registrů v konstrukci, který můžeme označit například Clk (nutno deklarovat v popisu architektury). Bufer musíme vložit do konstrukce strukturálním stylem, tj. v deklarativní části popisu architektury bude deklarace komponenty IBUFGDS (ze šablony v LIB.pdf). Označení vstupních a výstupních signálů v deklaraci komponenty neměníme, odpovídá jejich označení ve sloze VComponents. V příkazové části bude její vložení (opět podle šablony), kde signály user_O, user_I a user_IB budou představovat skutečné signály v naší konstrukci. Pro výstupní signály je postup obdobný, primitiva má označení OBUFDS. 6
Použití bloku DCM Blok DCM se v systému ISE vkládá nejsnadněji pomocí průvodce: Project => New Source... => IP (CoreGen & Architecture Wizard). Otevře se okno, kde je potřebné pojmenovat vytvářenou komponentu – lze použít např. název DCM1 (nedoporučuje se samotné DCM, je to rezervovaný symbol). Další postup závisí na účelu, pro který má být DCM použit. Průvodce nabízí volby, které uživateli napovídají, je však v mnoha případech potřebné o nich vědět více – pro obvody rodiny Spartan-3 je velmi dobrou pomůckou aplikační zpráva [ 7 ], pro obvody řady Virtex-II, Virtex-II Pro a další jsou podobné informace uvedeny v příslušných uživatelských příručkách (User Guides, dostupné na www.xilinx.com). Doporučuje se přečíst si ze zprávy aspoň to, co se vztahuje k zamýšlenému použití bloku DCM, nevhodná volba může vést k nespolehlivé funkci. Pro vložení komponenty DCM1 do popisu konstrukce můžeme použít šablonu – v okně Processes for Source „DCM1“ => View HDL Instantiation Template. Blok DCM se obvykle používá ve vrcholové jednotce. Pokud je tato tvořena schématem, musíme pro jeho vložení mít k dispozici schématický symbol (Create Schematic Symbol). Přehled zvolených parametrů můžeme vidět, vygenerujeme-li popis bloku v jazyku VHDL: Processes for Source: „DCM1“ => View HDL Source. Tento text však nemusíme do konstrukce přidávat, DCM je zde reprezentován položkou xaw v okně Sources in Project. Při standardním použití bloku DCM pro zpracování hodinového signálu zavedeného do FPGA z vnějšího vývodu není pak tento signál přímo dostupný pro použití v dalších prvcích konstrukce. Místo něj je možno použít výstup CLKIN_IBUFG_OUT, který jej reprodukuje. Tato skutečnost není v literatuře běžně uváděna (aspoň v době psaní tohoto textu) a bývá často příčinou obtíží.
Implementace pamětí RAM, ROM Tyto paměti se v obvodech FPGA implementují jako distribuované nebo blokové. Paměť ROM lze implementovat stejně jako paměť RAM, pouze se musí definovat její počáteční obsah (viz výše) a dále se do ní nezapisuje. Je několik způsobů, jak paměti můžeme vložit do konstrukce. Patří mezi ně inference z behaviorálního popisu a vložení pomocí CORE Generatoru. Šablony pro behaviorální popis v jednoduchých případech lze najít přímo v ISE: Edit => Language Templates => VHDL => Synthesis Templates => RAM. Podrobný popis mnoha variant vložených pamětí je uveden např. v [ 3 ], mnoho dalších příkladů lze najít v [ 9 ]. Použití CORE Generatoru dovolí využít ještě dalších možností, které jinak nejsou dostupné.
Postupy při programování Programování obvodů CPLD Pro naprogramování obvodů CPLD je potřebné vytvořit programovací soubor *.JED (tzv. soubor JEDEC) obsahující popis požadovaného stavu propojek v naprogramovaném cílovém obvodu. Tento soubor se získá provedením procesu Implement Design => Generate Programming File. Při programování v systému paralelním kabelem nebo kabelem USB (předpokládá se, že je kabel připojen k PC a zapojen do programovacího konektoru a že je
7
zapojeno napájecí napětí programovaného obvodu) se dále pokračuje procesem Configure Device (Impact), kde se zvolí Boundary-Scan Mode a dále se pokračuje podle nápovědy. Obvody CPLD firmy Xilinx jsou nevolatilní, naprogramovaný obvod má podle údajů v katalogu udržet svou funkci mnoho let.
Programování (konfigurace) obvodů FPGA Obvody FPGA firmy Xilinx jsou volatilní. Naprogramovat můžeme buď samotný obvod FPGA (místo termínu programování se zde obvykle používá termín konfigurace) s tím, že se tato konfigurace musí vykonat znovu po každém připojení napájecího napětí, nebo můžeme naprogramovat nevolatilní konfigurační paměť, je-li na desce osazena, a z té se po připojení napájecího napětí konfigurační soubor vždy automaticky přetáhne do připojeného FPGA. Obvyklejší je druhá z těchto možností, kterou budeme dále uvažovat. Poklepáním na položku Generate PROM, ACE, or JTAG File se spustí programovací blok iMPACT v módu generování programovacích souborů. Potřebujeme vytvořit soubor *.mcs pro naprogramování konfigurační paměti, tedy z nabídky, která se objeví, vybereme PROM File a dále druh paměti a formát MCS. Zvolíme název a umístění programovacího souboru, který má být vygenerován, v následujícím okně typové označení paměti a klepneme na tlačítko Add. Vygenerování programovacího souboru *.mcs pak dokončíme podle nápovědy systému. Nyní můžeme spustit nové okno bloku iMPACT poklepáním na položku procesu Configure Device (Impact) nebo pokračovat v dosavadním okně tím, že je přepneme do konfiguračního módu. Navolíme zde vygenerovaný soubor *.mcs a pak pokračujeme podle nápovědy.
Literatura [ 1 ] Constraints Guide (cgd.pdf). Dokumentace k návrhovému systému ISE, dostupné na www.xilinx.com [ 2 ] Libraries Guide (lib.pdf). Dokumentace k návrhovému systému ISE, dostupné na www.xilinx.com [ 3 ] XST User Guide (xst.pdf). Dokumentace k návrhovému systému ISE, dostupné na www.xilinx.com [ 4 ] Synthesis and Verification Design Guide (sim.pdf). Dokumentace k návrhovému systému ISE, dostupné na www.xilinx.com [ 5 ] ISE Quick Start Tutorial (qst.pdf). Dokumentace k návrhovému systému ISE, dostupné na www.xilinx.com [ 6 ] ISE 7 In-Depth Tutorial (http://direct.xilinx.com/direct/ise7_tutorials/ise7tut.pdf) [ 7 ] Using Digital Clock Managers (DCMs) in Spartan-3 FPGAs. Aplikační zpráva XAPP462, Xilinx, dostupné na www.xilinx.com [ 8 ] Creating Pin-Out Prior to Implementation with PACE. Aplikační zpráva XAPP423, Xilinx, dostupné na www.xilinx.com [ 9 ] Using Block RAM in Spartan -3 FPGAs. Aplikační zpráva XAPP463, Xilinx, dostupné na www.xilinx.com Poznámka: Uvedené dokumenty k návrhovému systému ISE v. 7 jsou dostupné na: http://toolbox.xilinx.com/docsan/xilinx7/books/manuals.pdf 8