Jelzoszám alapú szoftver diagnosztika

Lövész László

Konzulens: Majzik István

 

 
  1. Feladatkiírás
  2. Bevezetés
      1. A szótár
      2. A tömörítés eredményeit tároló buffer
      3. A tömörítési algoritmus
  3. A hardver
  4. Az FPGA-ban megvalósított logikai hálózat
 

 

 

Mélyen beágyazott környezet- és adatfüggõ szoftverhibák esetén igen nehéz utólag - a hiba bekövetkezése és leállása után - megtalálni, mi okozhatta a hibát. Egy olyan módszerre van szükség, amely futási idõben mintegy nyomon követi a programot és a nyomkövetés eredményét meg is õrzi az esetleges utólagos elemzés céljaira. A konkurrens hibadetektálás területén alkalmazott, a program állapotaihoz jelzõszámokat rendelõ eljárások ilyen célokra jól felhasználhatók. A felhasználói programot egy elõfeldolgozó úgy módosítja, hogy az futás közben egy jelzõszámsorozatot állítson elõ. Ezt a szekvenciát hatékonyan tömörítve és tárolva a program futása utólag is visszafejthetõ. (A hatékony tömörítést a programok ciklikus mûködése lehetõvé teszi.)

A feladat egy olyan segédkártya kifejlesztése, amely az IBM PC AT ISA buszára kapcsolódva alkalmas a felhasználói programok futása során generált jelzõszámszekvencia tömörítésére és tárolására. A tervezés során figyelembe lehet és kell venni, hogy a jelzõszámtovábbítás utasításai a SEIS kódolási eljárásnak megfelelõen vannak a program megas szintû (C nyelvû) forrásszövegébe illesztve.
 
A tömörítés elõre definiált és a kártyába letölthetõ szótár segítségével történjen. A szótár egy-egy hosszabb jelzõszámszekvenciát képezzen le kódkarakterekre, lehetõséget adva már definiált szekvenciák beágyazására is. A kódkarakterek tárolásárea cirkuláris buffert kell alkalmazni. A szótár letöltése és a tárolt kódsorozat kiolvasása az ISA buszon keresztül legyen lehetséges.
 
A szótár generálása a program vezérlési gráfja alapján történjen. Az eredeti jelzõszámszekvencia visszaállítása és ez alapján a programfutás elemzését diagnosztikai program végezze, interaktívan segítve az utólagos nyomkövetést.
 

 

Az elméleti probléma amivel szemben állunk: változó hosszúságúú üzenetek kódolása. Esetünkben a változó hosszúság üzenetek a felhasználói program által generált jelzõszámsorozatok. Az üzenet-abc a jelzõszámokból (signature), míg a kódolt üzenet abc-je rögzített számú karakterbõl (character) áll. Mivel az üzenetek hosszára nincs korklátozás, a jelzõszámokból elméletileg elõállítható sorozatok száma végtelen. A progrmaok felépítésébõl adódóan azonban egy adott jelzõszám után nem következhet tetszõleges másik jelzõszám, valamint a minket érdeklõ sorozatok véges hosszúak. Így a végtelen számosságú lehetséges jelzõszámsorozatoknak csak egy véges részhalmazával kell foglalkoznunk. Ezen részhalmaz elemeit szavaknak (word) hívjuk. Feladatunk abban áll, hogy létrehozzuk az adott programhoz leginkább illeszkedõ szó-halmazt és a szavek karakterekre történõ leképezését megvalósító szótárat (dictionary). Ezen mûveletek fordítási idõben történhetnek, így nem idõkritikusak.

 

 
A szavak meghartározásánál érdemes figyelembe venni, a strukturált programnyelvek alkalmazásából adódó tipikus programszerkezeteket. Az alábbi ábrán a legjellemzõbbek láthatók: Szekvenciális végrehajtású részek ( C-ben a két {} közötti utasítások), elágazások ( switch-case, vagy if-else utasításpárok), függvényhívás, valamint ciklusvégrehajtás és ezek egymásbaágyazásai. A tömörítés szempontjából az lenne az ideális, ha minél kevesebb jelzõszámot kellene alkalmaznunk, így ajánlatos, ha az elõfeldolgozó olyan, hogy a programgráf egy ágába csak egy jelzõszámot generál. A programgráf felderítése és a szó-halmaz meghatározása után következhet a szótár elõállítása. A felhasználói program elindítása elõtt az il módon elõállított szótárat kell a tömörítõ kártyába letölteni. Ez a módszer a szótár megfelelõ megválasztása esetén optimális tömörítést tesz lehetõvé. A szótár méretére a tömörítõ kártyán elhelyezkedõ memória kapacitása tesz korlátot. A memória kapacitásának jobb kihasználását tenné lehetõvé, ha a szótárban a jelzõszámszekvenciákba más szekvenciákat reprezentáló karaktereket is beilleszthetnénk. A megvalósított verzió sajnos ezt a lehetõséget sajnos nem tartalmazza.
 

 

A szótár logikai felépítése

 

A logikalag a szótár adott jelzõszámokkal kezdõdõ fák halmaza. Minden egyes jelzõszámhoz tartozik egy fa. A különbözõ jelzõszámokhoz tartozó fák mind alakban, mind méretben eltérhetnek egymástól, de bírnak néhány közös jellemzõvel:
 
· Az üzenet-abc minden eleméhez tarozik egy egyedi fa.
 
· A fák csomópontjaihoz egyedi karaktereket rendelünk.
 
· A fák csomópontjaihoz rendelt jelzõszámok nem egyediek.
 
· A csomópont utódjainak jelzõszámmezõiben olyan jelzõszámok találhatók, amelyek az aktuális csomópont jelzõszámára rákövetkezhetnek.
 
· A csomóponthoz rendelt karkter azonosítja a fa gyökerébõl a csomópontig vezetõ egyedi úton található csomópontok jelzõszámai által alkotott jelzõszámsorozatot.
 
· A csomópont utódainak száma korlátozott, mivel mûködés közben az egy jelzõszám feldolgozására rendelkezésre álló idõ korlátozott.
 
A tömörítés során az a feladat, hogy minél hosszabb olyan sorozatot találjunk, amely helyettesíthetõ karakterrel.
 

 
A szótár logikai felépítését szemlélteti az alábbi ábra, amely az s1 jelzõszámhoz tartozó részfát ábrázolja:
 
Amennyiben kódsorozatok beágyazását is lehetõvé tesszük, a csomópontokat reprezentáló körökhöz nemcsak jelzõszámot, hanem utat reprezentáló karaktert is rendelhetünk.
 
A szótár implementációja
 
A gyors keresés érdekében a szótár implementációja a következõ. Minden fa egy láncolt listaként található a memória szótár tárolására kijelölt részén. Minden memóriabejegyzés egy listaelemnek feleltethetõ meg és a következõ mezõkbõl áll:
 
· A csomóponthoz tartozó jelzõszám.
 
· A csomópont utódainak száma.
 
· A csomópont elsõ utódjához tartozó bejegyzés címe a memóriában.
 
· A csomóponthoz tartozó egyedi azonosítómezõ - a karakter - tárolása külön nem szükséges, az azonosításra alkalmas a bejegyzés címe.
 
A bejegyzések elhelyezkedésének meghatározása az elõfeldolgozó feladata, ez is a szótár elõállításának része. A szótár elõállításakor figyelembe veendõ követelmények a következõk:
 
· A gyökércsomópontokhoz tartozó karakterek egyezzenek meg azzal a jelzõszámmal amelyikhez a részfa tartozik, azaz a kezdõ csomópontok fizikai címe gyezzen meg magával a jelzõszámmal.
 

 
· Az egy csomóponthoz tarozó utódcsomópontok bejegyzései a memória egymást követõ címein helyezkedjenek el . A fenti gráfhoz tartozó szótár memóriatérképe a következõ formát ölti.
 

 

A memória egy része a tömörített üzenetek tárolására szolgál. A tömörítés eredményét képezõ karaktersorozat tárolására cirkuláris buffert használunk. Így a memóriában mindig a buffer méretétõl függõ utolsó n adat található.

 

 

A segédkártya veszi a tesztelt felhasználói program által futási idõben generált jelzõszámokat és a futással párhuzamosan elvégzi a sorozatok tömörítését. Követelmény, hogy a felhasználói programnak ne kelljen a tömörítésre várnia. A tömörítés két fázisban történik az egyik a tömörítési fázis a másik a tárolási fázis.

A tömörítés során a beérkezõ jelzõszámok alapján a szótár fájában lépkedünk. Amennyiben a továbblépés nem lehetséges vagy azért mert az aktuális csomópontnak nincs több utódja vagy azért mert van ugyan utódja de a beérkezõ jelzõszám nem található meg közöttük, átlépünk a tárolás fázisába.
 
1. A kezdõ jelzõszám beérkzése. Az aktuális csomópont a beérkezett jelzõszámhoz tartozó fa gyökércsomópontja lesz.
 
2. A memóriából kiolvassuk az aktuális csomóponthoz tarozó bejegyzést. Ha a csomópontnak nincs utódja, vagyis a bejegyzés számlálómezõje nulla értékû az aktuális csomópont azonosítóját átadjuk a tárolási fázisnak és a tárolás után az 1. ponttól folytatjuk az eljárást.
 
3. Ellenkezõ esetben várkozunk a következõ jelzõszám beérkezésére. Ha ez megérkezik, az elõzõ lépésben beolvasott pointermezõ és számlálómezõ segítségével sorra összehasonlítjuk az aktuális csomópont utódainak jelzõszámmezõivel. Ha egyezést találunk, az aktuális csomópont a megfelelõ utód lesz és az eljárást a 2. pontnál folytatjuk.
 
4. Ha nem találunk egyezést az aktuális csomópontot átadjuk a tárolási fázisnak, az új aktuális csomópont a beérkzett jelzõszámhoz tartozó fa gyökércsomópontja lesz és a 2. pontra lépünk.
 
A tárolási fázis során alkalmunk van egy másodlagos tömörítés végrehajtására is. Ennek során az egymás után eltárolandó azonos karakterek helyett egy karaktert és egy elõfordulási számot tárolunk.
 
1. Ha a tárolandó karakter a legelsõ a tömörítés folyamatában, eltároljuk egy összehasonlító regiszterben és az elõfordulásszámláló értékét egyre állítjuk.
 
2. A további tárolási kérések esetén a tárolandó karaktert összehasonlítjuk az elõbbi regiszter tartalmával. Ha egyezést találunk, az eseményszámláló értékét növeljük eggyel.
 
3. Ha nincs egyezés a regiszter tartalmát az eseményszámláló értékével együtt a cirkuláris bufferbe írjuk, az összehasonlító regiszterbe az aktuális csomópont értékét töltjük és a számlálónak egy értéket adunk.
 
A cirkuláris buffer bejegyzései két mezõbõl állnak. Az egyik a tárolni kívánt karaktert, a másik a karakter egymásutáni elõfordulásainak számát tartalmazza. Ha a legutolsó jelzõszám is megérkezett, függõben levõ tárolásokat be kell fejezni és egy záróbejegyzést kell elhelyezni a bufferben. Ezen záróbejegyzés számlálómezõje nulla értéket tartalmaz.
 

 

A tömörítési algoritmust megvalósító hardver egy az IBM PC AT ISA buszára csatlakozó segédkártya, melynek blokkvázlatát a következõ ábra mutatja. A kártya belsõ adatbusza 32 bites. Erre kapcsolódik a kártya lokális memóriája, valamint a Xilinx 3064 tipusú FPGA áramkör. A kártyán található még két egység, az ADU a kártya címdekódolását látja el, a CU pedíg a Xilinx ármkör konfigurációs adatainak letöltését vezérli. Ezen kívül csak buszmeghajtó áramkörök találhatók az áramkörben, amik az ISA buszra való csatlakozáshoz kellenek.

A kártyán levõ lokális memória 16kszó tartományban címezhetõ és 32bites szavakból áll. Kialakítása olyan, hogy az alsó és felsõ 16bit külön-külön is hozzáférhetõ. Az alkalmazott áramkör a HITACHI HM6264L-10 tipusú CMOS statikus RAM chipje, amely 100ns írási és olvasási ciklusidejû 8192x8bit szervezésû DIP tokozású alkatrész. A memória címzése az ADDR12..0 és a !SE0, !SE1 jelekkel történik. Az ADDR12..0 közvetlenül a memóriacsipek címbemeneteire csatlakozik, a másik két jellel az alsó illetve felsõ 8kszós memóriatartomány választható ki. Ezek a memóriacsipek !CS1 engedélyezõ bemeneteire kapcsolódnak. A SEHI és SELO jelek döntik el, hogy a felsõ, az alsó vagy mindkét 16bites szó hozzáférhetõ-e. Az !OE és !WE jelek a memóriák szokásos output enable illetve write enable jelei.
 
A Configuration Unit (CU) vezérli a Xilinx áramkör konfigurálását. A programozás az áramkör Serial Slave módjában történik. A programozás a mellékelt xload.exe programmal lehetséges, aminek bemenõ fájljai az XACT által elõállított .rbt fájlok. A programozást vezérlõ jeleket egy GAL22V10 tipusú áramkör állítja elõ az ISA busz jeleibõl. A CU ABEL forrásfájlja a mellékletben megtekinthetõ (A-1. ábra). A programozó adatot a 302H IO címre kell írni, ugyan errõl a címrõl olvasható a Xilinx INIT lábának állapota, míg a 303H IO címen a D/!P jel állapota kérdezhetõ le.
 
Az Address Decode Unit (ADU) látja el a címdekódolási funkciókat. Implementációja szintén egy GAL22V10 áramkör, melynek ABEL-fájlja a mellékletben található (A-2. ábra). A 300H IO címre történõ írással illetve olvasással 16bites IO ciklusokat kezdeményezhetünk, az ADU ilyenkor egy open collectoros (7405 tipusú inverteren keresztül) aktivizálja az ISA busz !IOCS16 jelét jelezve ezzel, hogy a periféria képes 16-bites IO-ciklusok kezelésére. Atól függõen, hogy perifériaírás vagy perifériaolvasás történik, a Xilinx felé a !DATAWR illetõleg a !DATARD jelek egyikét is aktív állapotba teszi. A 301H IO címre történõ írás hatására a !CMDWR jel alacsony állapotba kerül és az ISA busz SD2..0 jelei a Xilinx CMD2..0 jeleire kapcsolódnak.
 

 
A kártya belsõ 32-bites adatbuszának az ISA busz 16-bites adatbuszára történõ illesztését 74LS245 tipusú kétirányú bufferek valósítják meg, melyek vezérlõjeleit a Xilinx állítja elõ. A DIR jel határozza meg az illesztés irányát, az !ENHI és !ENLO jelek pedig azt szabják meg, hogy az ISA busz SD15..0 jelei a belsõ busz DATA31..16 vagy DATA15..0 vezetékeire csatlakoznak-e.
A segédkártya felépítése mint látjuk olyan általános architektúra (vezérlõ egység, lokális memória, busz, buszillesztés) amely tetszõleges funkció megvalósítását lehetõvé teszi a részegységek korlátainak figyelembe vételével. A feladatnak megfelelõ digitális hálízatot megtervezve azt az FPGA-ba letöltve ugyanaz a kártya más és más funkciót tölthet be.
 

 

A fentiekben ismertetett tömörítési algoritmust megvalósító logikai hálózat a mellékletben látható (B-1. ábra). Az ábrán a logikai hálózat fõbb egységei különíthetõk el.

 

Az I/O blokk
 
Az I/O feliratú PINBUF elnevezésû egység (B-2. ábra) teremt kapcsolatot a kártya és a Xilinx-ben megvalósított hálózat között. Ez a részegység tartalmazza a jelek definícióit (bemeneti, kimeneti vagy kétirányú; kitüntetett órajel; pozíció; kombinációs vagy regiszteres jelleg) Az összetartozó jelek célszerûen buszosítva jelennek meg az egység ki- és bemenetein.
 
· CH[13:0] a tárolandó tizennégybites karakter amely háromállapotú bufferen keresztül a kártya DATA31..18 jeleire csatlakozik.
 
· OC[9:0] a tárolandó karakter elõfordulási számát tartalmazó jel, amely a kártya DATA9..0 jeleire háromállapotú bufferen
keresztül csatlakozik.
 
· AD[12:0], SE1, SE0, SEHI,SELO, OE, WE a memóriák címzõ-, kiválasztó- és vezérlõjelei, megfelelnek a kártya azonos nevû jeleinek.
 
· ENHI, ENLO, DIR a buszillesztést vezérlõ jelek, a kártya azonos nevû jeleinek belsõ megfelelõi.
 
· STORE a CH és OC jelek háromállapotú buffereit engedélyezõ jel
 
· DR, DW, CW a kártya DATARD, DATAWR ÉS CMDWR jeleinek megfelelõ belsõ jelek
 
· CLK az ISA busz a Xilinx globális órajelhálózatára csatlakoztatott órajele. A megvalósított logika minden tárolója errõl az órajelrõl mûködik.
 
· CM[2:0] a kártya CMD2..0 jeleinek belsõ megfelelõje.
 
· PF[13:0] a szótár memóriabeli bejegyzéseinek pointermezõje, a kártya DATA13..0 jeleinek feleltethetõ meg.
 
· SF[9:0] a szótár memóriabejegyzéseinek jelzõszámmezõje, a kártya DATA31..22 jeleinek feleltethetõ meg.
 
· CF[1:0] a szótár memóriabejegyzéseinek számlálómezõje, a kártya DATA15..14 jeleinek feleltethetõ meg.
 
A Xilinx által biztosított vezérlõjelek regiszteresek az idõzítések jobb kezelhetõsége miatt.
 
Cirkuláris buffer címregisztere (Buffer Address)
 
A tömörítés eredményét a kártyán lévõ memóriablokk felsõ címtartományában tároljuk. Ezen tartomány címzését úgy alakítottuk ki, hogy logikailag körkörös buffert alkosson. A buffer címtartománya 16kszó, felsõ határa rögzített ( 3fffH ) az alsó azonban beállítható. Ezen körkörös buffer címzéséért felel a B-1. ábra Bufferaddress feliratú egysége (belsõ felépítése a B-3. ábrán).
 
Az egység tartalmaz egy tizennégybites felfelé számlálót, amely két bemeneti forrásból szinkron módon tölthetõ, egy tizennégybites regisztert és az ezek vezérléséhez szükséges kiegészítõ részeket. A számláló részletes kapcsolási rajza a B-5. ábrán látható.
 
Az egység inicializálása az LD jellel történik, ezen jel hatására a bemenet D[13:0] jelét betöltjük mind a belsõ regiszterbe, mind a számlálóba. A címszámláló növelését az I bemenõjel engedélyezi. Amennyiben a cím elérte a felsõ határt, a következõ inkrementáláskor a belsõ regiszter tartalma töltõdik át és egy belsõ tároló beállítódik. Ezen tároló azt jelzi, hogy történt-e már körbefordulás. A címregiszter újrabeállítására szükség lehet újabb tömörítés kezdetekor, vagy a buffer kiolvasásakor. Az elõbbi esetben a belsõ regiszter tartalma áttöltõdik a számlálóba, az utóbbi esetben, amennyiben a belsõ tároló törölt állapotú úgy ugyanez az áttöltõdés zajlik, egyébként a számláló tartalma nem módosul. Mindkét esetben a belsõ tároló törlõdik.
 
· D[13:0] a buffer címének alsó határát tartalmazó adatbusz.
 
· LD a buffer címéne alsó határa betöltését engedélyzõ jel.
 
· I a buffer címének növelését engedélyezõ jel.
 
· CI új tömörítés kezdetét jelzõ vezérlõjel.
 
· RI a buffer tartalma kiolvasása kezdetét jelzõ vezérlõjel.
 
· Q[13:0] a bufferbeli aktuális cím
 
A beérkzõ jelzõszám átmeneti tárolását végzõ regiszter (Compare Register)
 
Abban az esetben. ha az aktuális csomópont rendelkezik utódokkal, a következõ beérkzõ jelzõszámot össze kell vetnünk az utódcsomópontok jelzõszámmezõivel. Mivel a tesztelt programot nem várakoztathatjuk, szükséges a beérkzõ jelzõszám regiszterben történõ ideiglenes eltárolása. Erre szolgál a B-1. ábrán COMPREG felirattal ellátott tízbites regiszter (Compare register).
 
· D[9:0] a regiszterbe írandó adat.
 
· LD a regiszter írását engedélyezõ jel.
 
· Q[9:0] a regiszter kimeneti jele.
 
A szótári bejegyzés címének számítása (Dictionary Address Calculator, DAC)
 
A tömörítési algoritmus során a szótári bejegyzések címe három forrásból származhat. A B-1. ábra DAC (Dictionary Address Calculator) egységének a feladata, hogy a három forrásból származó cím közül a megfelelõt a memória címzését végzõ egységhez juttassa.
 
A tömörítési folyamatban elõször megérkezõ jelzõzsám a kártya DATA31..22 jelvezetékein érkzik és ez egyben a jelzõszámhoz fájának gyökércsomópontjához tartozó bejegyzés címe is. Mivel ez csak tízbites, a memóriabeli címek viszont tizennégybitesek itt történik a felsõ helyiértékû bitek kiegészítése is.
 
Ha az aktuális csomópontnak vannak utódai, úgy a következõ jelzõszámot összehasonlítás céljából az elõbb említett compare register-ben eltároljuk. Amennyiben az utódcsomópontok jelzõszámmezõi között nem akadt a compare register tartalmával megegyezõ jelzõszám, a regiszter tartalma lesz az új sorozat kezdõjelzõszáma, s mint olyan egyben az új fa gyökerének címe is. A felsõ bitek ebben az esetben is kiegészítendõk.
 
Végül a harmadik eset, mikor a következõ szótári bejegyzés címe az utódokkal rendelkezõ aktuális csomópont pointermezõjébõl adódik. Ebben az esetben nincs szükség bitkiterjesztésre, mert ez a mezõ már önmagában tizennégybites. Itt kell megjegyezni, hogy ez a cím csak az elsõ utód címe. A további utódok szótári bejegyzésének címei a késõbb ismertetendõ Memory Address Calculator inkrementálásával állnak elõ.
 
A DAC kapcsolási rajza a B-6. ábrán látható.
 
 
· C[13:0] tizenhárombites bemenet a pointermezõ adatának továbbítására.
 
· B[9:0] tízbites bemenet a jelzõszámmezõ továbbítására.
 
· A[9:0] tízbites bemenet a compare register tartalmának továbbítására.
 
· DAS1, DAS0 választójelek, ha DAS1=0, DAS0=0, akkor a kimenetre az A értéke kerül, ha DAS1=0, DAS0=1, akkor a B-é, ha
 
· DAS1=1 és DAS0=0 akkor a C-é.
 
· OUT[13:0] az egység kimeneti bitjei.
 
Összehasonlító egységek (Compare Unit)
 
A B-1. ábrán látható NOTFOUND és NOTEQUAL elnevezésû egységek (B-7, B-8. ábrák) bitminták összehasonlítását szolgálják. Kimenetük akkor magas, ha a bemeneti bitmintáik különböznek egymástól.
 
A NOTFOUND elnevezésû egység feladata az utódokkal rendelkezõ aktuális csomópont utódainak a compare register tartalmával való összevetése, a NOTEQUAL a másodlagos tömörítésnél jut szerephez, nevezetesen összehasonlítja az elõzõekben tárolni kívánt karaktert az aktuálisan tárolni kívánttal.
 
· A[13:0], A[9:0] az egyik összehasonlítandó minta.
 
· B[13:0], B[9:0] a másik összehasonlítandó minta.
 
· NE az egyenlõtlenséget mutató kimeneti jel
 
Utódszámláló (Signature Counter)
 
Az aktuális csomóponthoz tartozó azon utódok számát tartalmazza, amelyeket még nem hasonlítottunk össze a compare regiszter tartalmával. Kétbites szinkron tölthetõ számláló, amelynek kimeneti jele azt mutatja, hogy a számláló értéke nulla, azaz nincs összehasonlítandó utódcsomópont. A számláló részletes ábrája a B-9. ábrán látható.
 
· I1,I0 az utódok száma.
 
· LD az utódok számának betöltését engedélyezõ jel.
 
· D a lefele számlálás engedélyezése.
 
· SZ a számláló nulla értékét jelzõ kimenet.
 
A memória címének elõállítása (Memory Address Calculator MAC)
 
A B-1. ábrán található a kártyán lévõ memóriák címzését ellátó egység (részletes rajz a B-10. ábrán.). Az egység feladata, hogy a tizennégybites belsõ buffer- és szótárcímekbõl elõállítsa a kártyán lévõ memóriák tizenhárombites címét illetve a tizennegyedik címbitnek megfelelõen a memóriák csipszelekt jeleit. A szótár letöltéséhez szükséges ezenkívül, hogy az egység rendelkezzen a cím kinullázásának és inkrementálásának lehetõségével. Ez utóbbira az összehasonlításoknál is szükség van.
 
· B[13:0] tizennégybites bemenõ cím, esetünkben a körkörös buffer címe.
 
· A[13:0] tizennégybites bemenõ cím, a szótári bejegyzés címe.
 
· S választójel, amennyiben értéke nulla az L jel aktivizálódásakor az A ellenkezõ esetben a B bemenet értéke kerül beírásra.
 
· L a regiszterbe való írás engedélyezõjele.
 
· R a számláló nullázójele.
 
· I a felfelészámlálást engedélyezõ jel.
 
· ADDR[12:0] a memóriák tizenhárombites címjele.
 
· SE0,SE1 a memóriák címkiterjesztését végzõ szelekt jelek.
 
Az aktuális csomópont tárolása (Character Register)
 
A tömörítés során a fa bejárásában eddig megtett út utolsó csomópontja az aktuális csomópont. Az aktuális csomópont vagy egy fa kezdõcsomópontja, ebben az esetben az aktuális csomópont értékét a Dictionary Address Calculator kimenetérõl vehetjük, vagy a fában való továbblépés eredménye, ekkor az új csomópontot a MemoryAddressCalculator tartalmazza. A részletes kapcsolási rajz a B-4. ábrán tekinthetõ meg.
 
· B[13:0], A[13:0] a regiszter két tizennégybites bemenete.
 
· OUT[13:0] a regiszter kimenete.
 
· S választójel ha nulla, akkor az A, ha egy akkor a B bemenet tölthetõ be.
 
· LD A betöltést engedélyezõ vezérlõjel.
 
Az elõzõleg tárolni kívánt karakter tárolása (Previous Character)
 
A másodlagos tömörítési eljáráshoz szükséges, az elõzõleg tárolni kívánt karakter regiszterben való tárolása. Ha a tömörítés során a tárolási fázisba kerülünk, elõször összehasonlítjuk az aktuális csomópont tárolni kívánt értékét a previous characterrel. Ha a két érték megegyezik csak az eseményszámláló értékét növeljük. Tényéleges tárolás csak a két érték különbözõsége esetén történik.
 
· D[13:0] bemeneti bitek.
 
· Q[13:0] a regiszter kimenete.
 
· LD a töltést engedélyezõ jel.
 
Az elõfordulásszámláló (Occurences Register)
 
A másodlagos tömörítés során az egymás után következõ azonos karakterek számát tartalmazza. Részletes rajza a B-11. ábrán. Szükséges a zárókarakter tárolásához, hogy nullázható legyen.
 
· R a számlálót nullázó jel.
 
· P a számlálót egy értékbe állító jel.
 
· I a számláló növelését engedélyezõ jel.
 
· OUT[9:0] a számláló kimenete,
 
Vezérlõegység (Controller)
 
Az FPGA-n belüli részegységek összehangolt mûködéséért felel valamint elõállítja a kártya részegységeinek vezérlõjeleit. XABEL környezetben fejlesztett ABEL fájllal definiált, mely a C-1. ábrán látható.

 

© 2010-2024 BME MIT | Hibajelentés | Használati útmutató