BUDAPESTI MŰSZAKI ÉS GAZDASÁGTUDOMÁNYI EGYETEM VILLAMOSMÉRNÖKI ÉS INFORMATIKAI KAR MÉRÉSTECHNIKA ÉS INFORMÁCIÓS RENDSZEREK TANSZÉK Digitális technika Laboratórium 6. BME MIT Fehér Béla Benesócky Zoltán Lab6_1: Mintakeresés ROM-ban A feladat egy 256x8-as ROM-ban megadott feltételeket kielégítő adat megkeresése. ISE indítása, projekt létrehozása. Előre megkapott forrásfájlok hozzáadása a projekthez. A Lab6_1x feladatok elvégzése (működés tesztelése letöltéssel, különféle forráskód módosítások, szimulációk, működés tesztelés).
Lab6_1: A feladat specifikációja A részletes feladat specifikáció Tervezzünk olyan hardvert, amely egy 256x8 bites ROM adatai között megkeresi a megadott feltételt kielégítő legkisebb címen elhelyezkedő adatot. Az adat keresése egy nyomógomb lenyomására indul. A feladat befejezését a ready kimenetére kapcsolt LED jelzi. A találatot, a find kimenetére kapcsolt LED-en mutassa. A megtalált adat címe és a megtalált adat jelenjen meg a kimeneteken. A feltétel: az adat megegyezik egy kapcsolókon megadható adattal. A cím és az adat keresés közben tetszőleges értékű lehet. Lab6_1: A feladat algoritmusa A keresés algoritmusa: Egyesével címezzük végig a ROM-ot a legkisebb címtől kezdve (0x00). Minden címnél ellenőrizzük a feltétel teljesülését. A feltétel teljesülése esetén tároljuk el az adatot és a címet. Találat esetén vagy ha a memóriát végigcímeztük, állítsuk le a működést és jelezzük ki az eredményt (cím, adat, ready, find).
Lab6_1: Megoldás a változat Az a megoldás változat funkcionális blokkvázlatát mutatja az alábbi ábra. Lab6_1: Megoldás a változat Alaphelyzet rst-re, a 9 bites címszámlálóba betöltődik 0x100, q[8] = mem_end =1, ezért a számláló letiltódik (NOR kapu). A ready jelzést a JK flip-flop tiltja (rst-re törlődik). Indulás bt[0] 0->1-re. Fefutó él érzékelő a start impulzussal törli a számlálót. A ready jelzést a JK ff engedélyezi. A mem_end megszűnik, a számláló engedélyeződik és elkezd számolni. A feltétel figyelő jelez, ha a feltétel teljesül (find=1).
Lab6_1: Megoldás a változat Ha nincs megfelelő adat, a számláló értéke a memória végigcímzése után eléri a 0x100-at (q[8]=mem_end=1) Találat (find) vagy mem_end esetén a számláló letiltódik, find + mem_end jelzi a keresés végét (ready). A find jelzés esetén a számláló a megtalált adat címét tartalmazza, ezért a ROM kimenetén a megtalált adat van. Lab6_1: Megoldás b változat A b megoldás változat funkcionális blokkvázlatát mutatja az alábbi ábra.
Lab6_1: Megoldás b változat A feladatot két részre osztottuk. Az blokkvázlaton adatstruktúrának nevezett rész nagyon hasonlít az előző megoldásra, fő különbséget a címet és adatot mintavételező engedélyező regiszterek jelentik. Az adatstruktúra alkalmas a feladat megoldására, ha megfelelő vezérlő jeleket kap. Ezt végzi el a vezérlő, mely az adatsruktúrából jövő jelek (start, ok, mem_end) függvényében adja a vezérlő és egyes kimeneti jel(ek)et (cl, ready, find). Lab6_1: Megoldás b változat Tervezzük meg, a vezérlés algoritmusát! 1. Az rst után törölni kell a számlálót cl=1, ready= find=0. 2. A start hatására meg kell szüntetni a törlést és várni, amíg ok vagy mem_end jön (cl=ready=find=0). Ettől kezdve a regiszterekbe folyamatosan beíródik a cím és az adat, mivel n_stop=/cl=1.
Lab6_1: Megoldás b változat 3. Az ok jelzés után tiltani kell a regiszterekbe való átírást (n_stop =0, cl=1). Így ott a megtalált adat és címe eltárolódik, továbbá find=ready=1 és törlődik a számláló is. Innen start jelzésre a 2.-ban kell folytatni. 4. A mem_end után hasonló, mint előbb (cl=1), de find=0, ready=1. Innen start jelzésre a 2.-ban kell folytatni. Lab6_1: Megoldás b változat Az előzőek alapján felrajzolható a vezérlő állapot gráfja, mely Moore modell szerint működik. A kimeneteket megfigyelve a cl, find, ready jelhármas minden állapotban különböző értékű, az állapotok kódolására is alkalmas. Így a kimenetet maga az állapot regiszter adja, nincs szükség kimeneti kombinációs hálózatra. A kód ugyan egy bittel hosszabb a szükségesnél, de ez FPGA-nál nem gond (regiszter intenzív architektúra).
Lab6_1: Megoldás b változat Az állapotgráf verilog kódjának részletei: Állalpot kódok megadása: Állapotregiszter: Lab6_1: Megoldás b változat A következő állapot kódját előállító kombinációs hálózat és a Moore jellegű kimenetek előállítása.
Lab6_1: Választás a két változatból Az a változat: Nem tartalmaz külön vezérlőt. A vezérlő jeleket az adatstruktúrában előálló jelek felhasználásával állítjuk elő, megfelelő kiegészítő logikákkal. Hátránya, hogy bonyolult feladatoknál nehezen áttekinthetővé válik a terv, későbbi kisebb módosítása is nehézkes. Előnye, hogy sokszor egyszerűbb a teljes logika. Lab6_1: Választás a két változatból A b változat Az adatstruktúra megtervezése és a vezérlés specifikálása után a vezérlő szisztematikusan tervezhető, ezért bonyolultabb esetben célszerűbb. A vezérlőt az időzítési szempontból (sebesség) kedvezőbb Moore típusú automatával valósítjuk meg. Emiatt az a verzióhoz képest késleltető regiszterek beépítésére is szükség van. (Itt a ROM címet és adatot kellett késleltetni.)
Lab6_1: Választás a két változatból A késleltetők azért kellenek, mert a bejövő feltétel jelekre adott vezérlési válasz egy órajelet késik az a változathoz ill. Mealy jellegű vezérlőhöz képest. Bár az a változat egyszerűbb, a b változatból többet tanulhatunk, ezért ezt valósítjuk meg a gyakorlaton. (Megjegyezzük, hogy sebesség szempontjából az volna a legjobb, ha a ROM és a feltétel logika közé is regisztert tennénk. Azonban ekkor további késleltető regiszterekkel kellene bonyolítani a tervet, ezért ettől eltekintettünk.) Lab6_1a feladat: Project létrehozás, kipróbálás Az első feladat a project létrehozása a megkapott file-okból és kipróbálása a tesztkártyán ellenőrzés céljából. Project létrehozása Lab6 néven. A feladathoz kapott előkészített verilog file-ok hozzáadása a projekthez (Add Source.). Konfigurációs file generálása. Konfigurációs file letöltése a Logsys alkalmazás segítségével. Kipróbálás.
Lab6_1a feladat: Project létrehozás, kipróbálás A kipróbálás előtt nézzük meg a ROM adatait tartalmazó rom_data256 file-t, válasszunk ki belőle egy adatot és jegyezzük le az adatot és a címét. Az eredeti file minden címen magát a címet tartalmazza adatként, kivéve a 0x44-et, mert ott 0x88 található. A hardver az LDC-ről (Logsys Developement Cable) kapja az órajelet (clk). Ezért a működtetéshez is szükséges a Logsys alkalmazás, tehát a letöltés után ne zárjuk be. Lab6_1a feladat: Project létrehozás, kipróbálás A Logsys-alkalmazásal állíthatjuk be a kívánt órajel frekvenciát (Control box, Hz beállítása, set nyomógomb, clk checkbox). Az órajel frekvenciát 10Hz-nél ne állítsuk nagyobbra, ha követni akarjuk a kijelzést. A fejlesztői kártya DIPSW7-0 kapcsolóin állítsuk be a keresni kívánt 8 bites adatot binárisan, majd a BTN0 megnyomására indul a működés.
Lab6_1a feladat: Project létrehozás, kipróbálás A 7 szegmenses kijelző bal oldali 2 számjegye mutatja az aktuális ROM címet, a jobb oldali pedig az adatot, LD0 LED a ready-t, LD1 LED a find-ot, LD7- LD5 a vezérlő állapotkódját. find ready state ROM cím adat BTN0 bemenő adat Lab6_1b feladat ROM verziók szimulációja Az eredeti feladat 256x8-as ROM-ot specifikál, de kétféle megvalósítás bemutatásához, célszerűbb egy 16x8-as ROM. Ezért a keresőt megvalósító PatternSearcher modulban feltételes fordítást valósítunk meg generate és if alkalmazásával: A ROM_ADDR paraméter értéke alapján választ, hogy mely kódrészletet kell implementálni.
Lab6_1b feladat ROM verziók szimulációja ROM readmemh-val feltöltött tömbbel megvalósítva: Az adatokat egy text fileban kell megadni, hexadecimális formában, minden adatot új sorban. Pontosan annyi adatot kell megadni a file-ban, amekkora a tömb mérete, egyébként hibajelzést kapunk. Minden adat változtatás után újra kell fordítani a forrást. Lab6_1b feladat ROM verziók szimulációja Kódrészlet ROM első verziójának szimulációjából: Sok az adat, nem célszerű a felsorolásos értékadás. Algoritmikusan, for ciklussal generáljuk a címet.
Lab6_1b feladat ROM verziók szimulációja A szimuláció indítása Design ablakban ROM16x8_TF kiválasztása. Process ablakban Simulate.., megfelelő nagyítás után látható az eredmény. A jel értékek megjelenítésének számrendszerét célszerű átállítani hexadecimálisra (jel, bal egér gomb, radix ). A szimuláció eredményét a rom_data16.txt file alapján tudjuk ellenőrizni. Lab6_1b feladat ROM verziók szimulációja A ROM másik verziója kikommentezve található a ROM16x8 file-ban (át kell kommentezni). Itt always(*), case(addr) szerkezetben szereplő értékadásokkal valósul meg a ROM, mint egy 8 kimenetű kombinációs hálózat igazságtáblája. Sok adat esetén célszerűtlen. Kevés adat esetén kényelmes a szerkesztése. A szimuláció eredménye:
Lab6_1c feladat: Felfutó él figyelő és szimulációja A felfutó él figyelő modul a bemeneti jelének 0-1 átmenete után egy órajel hosszú impulzust ad ki. Egy közismert megvalósítása: (Elve: régebbi minta 0 és újabb minta 1) Itt más módon készítjük el. (Ez a 01 állapot alatti 0 bemenetet nem figyeli.) Állapotgáffal specifikáljuk, engedélyező bemenete is van (de nem fogjuk használni), majd úgy kódolunk, hogy a kimenetet közvetlenül egy flip-flop adja. A 2 bites állapotkód kisebb bitje maga a kimenet. Lab6_1c feladat: Felfutó él figyelő és szimulációja A felfutó él figyelő kódja a már ismert megoldású állapotgép megvalósítás. A kimenetét out = (state == s1)- el adtuk meg, de a szintézer program rájön az out = state[0] megoldásra, ezt az RTL (Register Transfer Language) kapcsolási rajzon nézhetjük meg.
Lab6_1c feladat: Felfutó él figyelő és szimulációja RTL kapcsolási rajz megnézése: Top modul kiválasztása. Synthesize XST/View RTL schematic. Felugró ablakban Start with the explorer wizard. PatternSearcher modul kibontása. R_edgeSense_FSM modul kiválasztás. Hozzáadás a megnézendőkhöz (Add). Create Schematic, zoom, klikkeléssel a hierarchiában lemenni a kapcsolásig. Lab6_1c feladat: Felfutó él figyelő és szimulációja Az RTL kapcsolási rajz: Jól láthatóan egy flip-flop adja a kimenetet. RTL szinten egy kapuval bonyolultabb, mint a jól ismert kapcsolás. Időzítési szempontból optimálisabb.
Lab6_1c feladat: Felfutó él figyelő és szimulációja Az él figyelő szimulációs file-jának részlete: Az órajelet folyamatosan adjuk Az rst megszüntetése után 2 felfutó élet generálunk A szimuláción látható, hogy az input felfutó élet követő órajel felfutó élétől a következő órajel felfutásig tart a kimenet. Lab6_1d feladat: A mintakereső vizsgálta A PatternSearcher modulban vannak összekapcsolva az egyes részmodulok példányai. Az egyes modulokat az azonos nevű wire típusú változók kötik össze, ez hasonló, mint a blokkvázlat jelvezetékei. A modul hierarchiája 2 szintű.
Lab6_1d feladat: A mintakereső vizsgálta A PatternSearcher modul példányosított almoduljai: Lab6_1d feladat: A mintakereső vizsgálta A címregiszternél a 4 bites cím esetén a felső 4 bitbe 0-át töltő példány generálódik le (generate, if). Az adat, címregiszter és számláló modulja paraméterezhető. #(parameter név = default value) az interfész előtt biztosítja, hogy a paraméter példányosításnál értéket kaphasson és az felhasználható a modulban. Példányosítás: modul_név példány_név #(.paraméter_név(érték)) (interfész definíciók)
Lab6_1d feladat: A mintakereső vizsgálta A modul definícó: A példány (adatregiszter): Ahogy a verilog kódból látható, a regiszter szinkron törölhető és engedélyezhető. Lab6_1d feladat: A mintakereső vizsgálta A címszámláló is paraméterezhető. Erre nem csak a regiszternél, hanem a terminal count (tc) megvalósításánál is figyelni kell. Több lehetőségünk is van, mivel a számláló bináris, a tc = &q is jó. Most ezt másképp adjuk meg. tc = q == (2**BITS_NUMBER)-1-et alkalmaztuk.
Lab6_1d feladat: A mintakereső vizsgálta A legfelső szinten a PatternSearcher modul az előző gyakorlatokból ismert LIP_4digit kijelző modullal van összekötve, így a teljes terv hierarchiája 3 szintű. Lab6_1d feladat: A mintakereső vizsgálta Szimuláció Szimulálni nem a top modult célszerű, mert a kijelző működése most nem érdekes. Ezért a PatternSearcher modult szimuláljuk, tehát a PatternSearcher_TF-et kell kiválasztani, majd Simulate.. és zoom. Ez a látvány fogad minket:.
Lab6_1d feladat: A mintakereső vizsgálta Az informatívabb megjelenítés érdekében célszerű a kijelzést kicsit átalakítani A jelnevet megfogva új helyre lehet húzni (clk, rst a tetején jobb) A busz jellegű jeleket a baloldali háromszögre kattintva ki lehet bontani, hogy egyedi jelekként látszanak Új buszt lehet létrehozni (kattintás a legutolsó létező jel alá, bal egér gomb, new virtual bus) Új és másolandó busz kibontása a háromszögre kattintva, majd a megfelelő jelet áthúzni az új helyre. Lab6_1d feladat: A mintakereső vizsgálta A jelek átnevezhetők (névre 2x kattintás után) A hullámforma ablakban nem látható jelek is hozzádhatók (Instances and Processes ablakban a modult kibontani, a megfelelő kiválasztása után bal egérgomb, Add to Wave Window)
Lab6_1d feladat: A mintakereső vizsgálta A szimulácó eredménye, ha talált: Figyelje meg következő jelek viszonyát: start és state, a state és counter, a counter és addr_r, a data és data_r, az ok és find továbbá a vezérlő állapotváltásait (state)! Lab6_1d feladat: A mintakereső vizsgálta A szimulácó eredménye, ha nem talált: Figyelje meg az tc és ready viszonyát továbbá a vezérlő állapotváltásait!
Lab6_1e feladat: A feltétel figyelő módosítása A keresési feltétel az eredeti feladatban a ROM adat és a kapcsolókon beállítható adat egyezését írja elő. Módosítsa a specifikációt saját elképzelése szerint, majd eszerint a feltétel logikát és a tesztelő file-t, továbbá végezze el a szimulációt, végül próbálja ki a konfigurációs file letöltése után a tesztpanalen! A forrás file-ban két példát adtunk a feltétel módosítására (kikommentezett rész).