Technická zpráva PicoBlaze lekce 4: Aplikace pro výuku asembleru procesoru PicoBlaze Jiří Svozil, Jaroslav Stejskal, Leoš Kafka, Jiří Kadlec svozil@utia.cas.cz, kafkal@utia.cas.cz Obsah 1. Úvod... 2 2. Hardware... 2 2.1 Komponenta bram_loader... 2 2.2 Komponenta user wrapper... 4 2.3 Komponenta I/O unit... 6 3. Software... 8 4. Příklady implementací... 9 5. Obsah a popis přiloženého balíku... 10 6. Reference... 10 Poděkování... 10 Revize Revize Datum Autor Popis změn v dokumentu 0 25.10.2007 Jiří Svozil Vytvoření dokumentu 1 2.
1. Úvod Tento dokument popisuje HW/SW aplikaci, jejíž cílem je usnadnit seznamování uživatelů s procesorem PicoBlaze [1] a s assemblerem pro tento procesor. Aplikace umožňuje download programu pro PicoBlaze do přípravku bez nutnosti opakovaného překladu hardware, čímž zkracuje dobu potřebnou pro otestování funkce programu v přípravku. HW část aplikace dále obsahuje řadiče některých periferií (PS/2 klávesnice a znakový LCD displej), což odstiňuje uživatele od nízkoúrovňového ovládání těchto periferií a tím dále usnadňuje vývoj aplikací. Tato lekce dále slouží jako ukázka složitější aplikace založené na procesoru PicoBlaze. Funkce jednotlivých komponent je vysvětlena v následujících kapitolách; příslušné zdrojové soubory jsou v přiloženém balíčku. Aplikace se skládá ze dvou částí: z HW a SW části. HW část tvoří design pro FPGA, který obsahuje vlastní procesor PicoBlaze pro uživatelské aplikace a podpůrné obvody. SW část je program pro download programu pro PicoBlaze do přípravku. 2. Hardware Blokové schéma HW částí je na obrázku 1. HW část je tvořena třemi hlavními komponentami. První komponenta (bram_loader) zajišťuje komunikaci přípravku se SW aplikací po sériové lince. Druhá komponenta (user wrapper) představuje vlastní procesor PicoBlaze pro uživatelské aplikace. Třetí komponenta (I/O ctrl) je řadič periferií. Zajišťuje výstup na textový LCD display a obsluhu PS/2 klávesnice. Všechny tři komponenty jsou založeny na procesoru PicoBlaze. Obrázek 1 - Blokové schéma HW části 2.1 Komponenta bram_loader Komponenta bram_loader slouží k nahrávání dat do programové paměti RAM (blok bram_imem na obrázku 1) uživatelského procesoru PicoBlaze. Komponenta dále ovládá signál RESET tohoto procesoru. Bram_loader je řízen konzolovou SW aplikací pb_loader.exe. Funkce SW aplikace je detailně popsána v kapitole 3. Blokové schéma komponenty bram_loader znázorňuje obrázek 2. Z něj je patrná možnost připojení dvou různých programových pamětí ROM (echo_c a pbl_code) k procesoru PicoBlaze. Tyto paměti jsou připraveny ve VHDL zdrojovém kódu a uživatel tak může před implementací obvodu vybrat, která z daných dvou pamětí bude k procesoru připojena. Standardně je k procesoru připojena paměť ROM_2 pbl_code, která slouží ke komunikaci s aplikací pb_loader.exe, jak bylo zmíněno výše. Program echo_c byl vytvořen pro otestování sériové linky. Tento programový kód má za úkol přijímat všechny data ze sériové linky a odesílat je zpět. Uživatel si pak může pomocí tohoto programu a hyperterminálu na PC ověřit funkčnost sériové linky a částečně i funkčnost 2/10
implementovaného hardwaru. Pokud je správně nastavena sériová linka a pokud byl design správně implementován, bude každý znak odeslaný z hyperterminálu vracen hardwarem zpět. Obrázek 2 - Blokové schéma komponenty bram_loader Program pbl_code Program pbl_code dekóduje příkazy vysílané aplikací pb_loader.exe. Aplikace podporuje tyto příkazy: clear, download a verify a reset. Příkaz clear provede smazání programové paměti uživatelského procesoru PicoBlaze. Příkaz download provádí konfiguraci programové paměti zadaným souborem HEX. Příkaz verify provádí kontrolu obsahu programové paměti. Příkazem reset se provede reset uživatelského procesoru PicoBlaze. Zjednodušený vývojový diagram programu pbl_code je na obrázku 3. Program je po spuštění nasměrován do smyčky, kde přijímá znaky ze sériové linky a čeká na první znaky příkazů (znaky C, D, U a R ), které komponenta bram_loader akceptuje. Jedná o příkaz CLEAR pro vymazání paměti, příkaz DL ab pro download dat, příkaz UL ab pro upload dat (součást příkazu verify), a příkaz RESET pro resetování procesoru PicoBlaze. Vymazání paměti Vymazání programové paměti je provedeno po dekódováni posloupnosti CLEAR. Provádí se zápisem nulových hodnot na všechny pozice programové paměti. Po smazání obsahu paměti je nastaven příznak code_empty na hodnoty 1 tento příznak informuje o tom, že programová paměť je prázdná a uživatelský procesor by neměl být spuštěn. Download Přijetím úvodní sekvence znaků DL ab je procesoru signalizován požadavek na download dat do programové paměti procesoru PicoBlaze. Znaky ab představují dvě binární čísla; délka programu je rovna (b * 256 + a). Po přijetí této sekvence program ve smyčce vyčítá hodnoty ze sériové linky a ty zapisuje do programové paměti. Data programové paměti jsou 18 bitová, a proto je třeba přijetí 3 bajtů ze sériové linky pro zápis jedné položky v programové paměti. Uživatelský procesor PicoBlaze je před začátkem nahrávání dat převeden do stavu reset, aby nezačal vykonávat nový program v průběhu nahrávání dat do programové paměti. Reset je uvolněn až po nahrání všech dat. Po ukončení celého procesu se program vrací do hlavní smyčky. Verifikace paměti Verifikace se provádí softwarově v aplikaci pb_loader.exe a to srovnáním dat přečtených z programové paměti s daty ze zadaného souboru HEX na počítači. Čtení dat se spustí odesláním sekvence UL ab. Význam znaků ab je shodný jako u příkazu download. Po zadání této posloupnosti program opět přechází do podprogramu, kde ve smyčce vyčítá hodnoty z programové paměti a ty odesílá po sériové lince do počítače. Reset 3/10
Po přijetí znaků RESET je proveden reset procesoru. Reset se provede pouze v případě, že programová paměť procesoru není prázdná (příznak code_empty) Start main Read from uart return to main Character D Character U download upload Next is L ab\n Next is L ab\n assert pb_reset loop (ab): load data from uart write data to BRAM end loop release pb_reset code_empty<= 0 loop (ab): load data from BRAM write data to UART end loop Character C clear Next is LEAR assert pb_reset loop (1024): data <= 0 write data to UART end loop release pb_reset code_empty<= 1 Character R reset Next is ESET code_empty = 1 release pb_reset assert pb_reset release pb_reset Obrázek 3 - Struktura programu pbl_code 2.2 Komponenta user wrapper Komponenta user wrapper představuje uživatelský procesor PicoBlaze. I/O porty tohoto procesoru jsou pevně nadefinovány. Programová paměť je tvořena dvoubránovou pamětí RAM (bram_imem). Tato paměť je po implementaci prázdná. Data jsou do programové paměti nahrána až po spuštění aplikace, a to pomocí SW aplikace pb_loader.exe a komponenty bram_loader (kapitola 2.1) 4/10
Obrázek 4 - Zapojení komponenty user wrapper Definované I/O periferie uživatelského procesoru PicoBlaze jsou paměť FIFO délky 8B a paměť RAM o velikosti 64B. Do FIFO jsou komponentou I/O unit ukládány scan-kódy z PS/2 klávesnice. V případě, že je FIFO prázdná, vyvolá první přijatý znak přerušení uživatelského procesoru PicoBlaze. FIFO může být pouze čtena. Do paměti RAM jsou uživatelským procesorem PicoBlaze zapisována data, která mají být zobrazena na LCD displeji. Mimo těchto hodnot obsahuje tato paměť i údaje o pozici a stavu kurzoru. Paměť RAM je přístupná pro čtení i zápis. Mapování periferií do I/O adresového prostoru uživatelského procesoru PicoBlaze je uvedeno v tabulce 1. Výsledek I/O operace v nepoužitých adresách paměťového prostoru není definován, stejně tak i v případě použití nesprávného typu operace (např. zápis do oblasti určené pouze pro čtení). Tabulka 1 mapování periferií do I/O adr. prostoru PicoBlaze Adresa I/O Typ Použití Popis 00 0F mem r/w LCD data 16 byte paměti: 1 B pro každý znak LCD displeje 10 1F mem r/w Nepoužito - 20 20 mem r/w LCD CURSOR_STATE 21 21 mem r/w LCD CURSOR_POSITION 22 3F mem r/w Nepoužito - 40 7F - - - - bit 0 blikání kurzoru bit 1 kurzor ON/OFF bit 3..0 pozice kurzoru 80 80 FIFO r PS/2 KB FIFO data scan-kódy kláves 81 81 FIFO r/w PS/2 KB FIFO status čtení: bit 0 FIFO prázdná bit 1 FIFO plná zápis: zápis libovolné hodnoty vyprázdní FIFO 82 FF - - - - 5/10
2.3 Komponenta I/O unit I/O unit je řadič periferních zařízení. Tato komponenta je také založena na procesoru PicoBlaze. Program PicoBlaze převádí vstupní sériová data vysílaná PS/2 klávesnicí na paralelní (8b) a vkládá je do FIFO. Řadič zachovává vstupní data beze změny, tzn. neprovádí překlad scan-kódů na ASCII znaky ani žádné jiné konverze. Data jsou pak z FIFO čtena a dále zpracovávána uživatelským procesorem PicoBlaze (viz kapitola 2.2). V případě, že je FIFO plná, jsou další přijatá data zahazována. Komponenta dále vyčítá z paměti RAM znaky, které mají být zobrazeny na LCD displeji. Data jsou do této paměti zapisována uživatelským procesorem PicoBlaze. Program čte hodnoty z paměti a porovnává je s hodnotami aktuálně zobrazovanými na displeji. Porovnávání se děje po jednotlivých znacích. Pokud se znak liší, je na jeho pozici v paměti LCD displeje zapsána nová hodnota. Obrázek 5 - Blokové zapojení komponenty I/O unit Běh programu I/O unit lze rozdělit na dvě části. Na část určenou pro sběr dat z PS/2 klávesnice a na část vykonávající obsluhu LCD displeje. Program pro sběr dat z PS2 je řízen přerušením procesoru PicoBlaze. Přerušení je generováno při nástupné hraně hodinového signálu PS/2 klávesnice. Správa LCD displeje je prováděna v nekonečné smyčce v hlavním programu. Běh programu pro sběr dat z PS/2 klávesnice je na obrázku 6. Účelem tohoto kódu je vyčítat sériová data z klávesnice a s převodem na 8 bitová paralelní je zapisovat do připojené FIFO. Program proto rozeznává čtyři základní stavy, podle toho v jaké fázi sběru dat z PS2 se nachází. V první fázi testuje start bit (log 0), pokud je test pozitivní přesouvá se dále na čtení samotných dat. Data se čtou po jednotlivých bitech. Pokud toto proběhne v pořádku je zkontrolována parita a stop bit a poté jsou načtená data zapsána do FIFO. 6/10
Obrázek 6 - Běh programu pro sběr dat z PS/2 Programová část vykonávající obsluhu LCD displeje je zobrazena na obrázku 7. Běh programu je prováděn v nekonečné smyčce, ve které se postupuje po jednotlivých pozicích displeje. Na začátku programu je umístěn ukazatel na nultou zobrazovanou pozici displeje. Poté je prováděna kontrola aktuálnosti zobrazovaných dat a to porovnáním hodnoty ze sdílené paměti s aktuální hodnotou uloženou v scratchpad memory. Jsou-li data vyhodnocena jako shodná, tedy bez potřeby změny, dochází pouze k zvýšení ukazatele pozice a test se opakuje pro následující znak. Pokud se data aktuálně zobrazovaná displejem nerovnají datům požadovaným, je zavolán podprogram, který umístí kurzor displeje na danou pozici a zapíše do ní nová data. Komunikace s displejem je 4-bitová, kompatibilní s protokolem řadičem Hitachi HD44780. 7/10
START char_position = 0 character required = current move display cursor to char_position char_position = char_position + 1 write data to display char_position < 15 Obrázek 7 Základní princip obsluhy LCD displeje 3. Software Softwarová část příkladu je tvořena konzolovou aplikací pb_loader.exe. Ta slouží pro download dat do programové paměti uživatelského procesoru PicoBlaze a dále umožňuje programovou paměť mazat, verifikovat její obsah a resetovat uživatelský procesor PicoBlaze. Přehled parametrů programu je v tabulce 2. Stejný popis se vypíše, pokud spustíte program pb_loader.exe bez žádných parametrů, nebo se špatnými parametry. Para metr Příkaz ID Popis Tabulka 2 parametry programu pb_loader.exe -p port_name - jméno sériového portu (COM1, COM2, ), ke kterému je připojen přípravek (port JP5) -c CLEAR Příkaz pro smazání celé programové paměti PicoBlaze -d DOWNLOAD Příkaz pro download dat do programové paměti PicoBlaze. -v VERIFY Příkaz pro verifikaci dat v programové paměti. Data jsou přečtena z paměti a porovnána s obsahem souboru. -r RESET Příkaz pro reset PicoBlaze -f filename - Jméno souboru s programem pro Picoblaze. Soubor s daty je textový soubor *.hex, generovaný assemblerem KCPSM3.exe. Parametr -f je povinný, pokud je uveden příkaz d nebo v Program umožňuje zadávat i několik příkazů zároveň. V tom případě jsou příkazy prováděny v pořadí CLEAR, DOWNLOAD a VERIFY. Signál RESET procesoru PicoBlaze je aktivní po zapnutí 8/10
přípravku (kdy je programová paměť prázdná), v průběhu provádění příkazu CLEAR, DOWNLOAD a RESET a po provedení příkazu CLEAR (kdy je programová paměť opět prázdná). 4. Příklady implementací Následující kapitola je věnována popisu jednotlivých kroků k praktickému otestování výše popisované HW/SW aplikace. Přípravek s FPGA K používanému přípravku je třeba kromě konfiguračního kabelu (JTAG nebo USB) připojit také sériový kabel a PS/2 klávesnici. Po připojení přípravku nakonfigurujte FPGA odpovídajícím bitstreamem. Bitstreamy pro jednotlivé přípravky jsou na přiložením CD v adresářích pojmenovaných podle jednotlivých přípravků. Postupu konfigurace FPGA je uveden v Lekci 2. SW aplikace pb_loader.exe Pro jednoduchý test aplikace spusťte program pb_loader.exe v příkazové řádce s parametry -p a r, (Tabulka 2). Pro sériový port COM1 bude příkaz vypadat následovně: pb_loader p COM1 r. Program provede reset PicoBlaze, vypíše reset PB OK a ukončí se. Pokud předchozí test proběhl v pořádku, můžeme provést download programu pro PicoBlaze do přípravku. Spusťte program pb_loader.exe s parametry -p, -d, -f. Pro sériový port COM1 a předpřipravený program ze složky data může příkaz vypadat takto: pb_loader -p COM1 -d -f..\data\user02.hex nebo takto: pb_loader -p COM1 -cdv -f..\data\user02.hex. Tato sekvence provede nejprve smazání, potom konfiguraci a na závěr verifikaci programové paměti uživatelského procesoru Picoblaze. Výše uvedený program USER02.HEX vypisuje na LCD display scan kódy stisknutých kláves z připojené klávesnice v HEX formátu. Tímto jsme ověřili funkčnost jednotlivých částí systému i systému jako takového. Seznam předpřipravených programů pro uživatelský procesor PicoBlaze je v tabulce 3. Tabulka 3 Uživatelské aplikace pro procesor PicoBlaze user01.hex program vypíše na LCD displeji znaky a až p. user02.hex user03.hex program vypisuje scan-kódy stisknutých kláves v HEX formátu. program se stejnou funkcí jako program user02.hex. Liší se v implementaci, kde se místo kontroly příznaku FIFO používá přerušení. Pro procvičení psaní ASM programů pro PicoBlaze doporučujeme vytvořit vlastní program, kterým pak pomocí aplikace pb_loader.exe nahrajete do programové paměti procesoru Picoblaze. Příklad takového programu muže být kombinace obou zde ukázaných principů. Například program, který bude po stisku určité klávesy na klávesnici zobrazovat na LCD display oznámení, že byla stisknuta správná klávesa, v opačném případě že byla stisknuta chybná klávesa. Pro překlad dalších programů pro procesor PicoBlaze použijte assembler KCPSM3.exe, viz Lekce 1. 9/10
5. Obsah a popis přiloženého balíku Data jsou dělena dle jednotlivých lekcí. Všechny dostupné soubory pro tuto jsou tedy v adresáři PicoBlaze_lekce4. Hotové projekty byly vytvořeny v ISE 8.2.02i. PicoBlaze_lekce4/ FITkit_VUT/ - fitkit.zip - top_fitkit.bit S3ESK/ - s3esk.zip - top_s3esk.bit ML402/ - ml402.zip - top_ml402.bit ML403/ - ml403.zip - top_ml403.bit bin/ - pb_loader.exe - load.bat, reset.bat data/ src/ pb_assembler/ vhdl/ doc/ - Picoblaze_lekce4.pdf Složka pro desku FITkit VUT Brno ZIP archív hotového projektu Bitstream pro FPGA Složka pro desku S3ESK ZIP archív hotového projektu Bitstream pro FPGA Složka pro vývojovou desku ML402 ZIP archív hotového projektu Bitstream pro FPGA Složka pro vývojovou desku ML403 ZIP archív hotového projektu Bitstream pro FPGA Program pro ovládání HW části Příklady použití programu pb_loader.exe Přeložené programy pro uživatelský procesor PicoBlaze Zdrojové soubory pro PicoBlaze Zdrojové soubory HW části aplikace Tento dokument 6. Reference [1] Xilinx, PicoBlaze http://www.xilinx.com/picoblaze Poděkování Tato práce byla podpořena projektem ministerstva školství a tělovýchovy číslo 2C06008, http://www.vlam.cz. 10/10