Valyon Attila
Önálló laboratóriumi feladat
Konzulens: Majzik István
1995.
Tartalomjegyzék
1. Specifikáció
1.1. Bevezetés
1.2. Programozási felület
2. Hardware struktúra
2.1. Funkcionális felépítés
2.2. Jelzôszám-adminisztráció
2.3. Jelzôszám-ellenôrzés
2.4. Timer alrendszer
2.5. A vezérlôegység
3. Implementáció
3.1. Alkatrészjegyzék
3.2. Cím-dekódoló egység
3.3. Pointer ALU
3.4. A vezérlôegység
3.5. A konfigurációs hardware
IBM is a registered trademark of International Business Machines Corporation
Intel and i486 are registered trademarks of Intel Corporation
Xilinx, XACT are registered trademarks of Xilinx Inc.
Motorola is a registered trademark of Motorola Inc.
GAL is a registered trademark of Lattice Semiconductor
ABEL is a registered trademark of Data I/O Corporation
1. Specifikáció
1.1. Bevezetés
Az utóbbi évek informatikai gyakorlatában - különösen speciális felhasználási területeken (pl. ipari folyamatok, egészségügyi alkalmazások) - egyre nagyobb jelentôsége van a nagymegbízhatóságú rendszereknek. A hibafelismerés alapja - többek között - olyan speciális alrendszer lehet, mely a mûködés közbeni folyamatos monitoring funkcióját képes ellátni adott számítógépes környezetben. Az ilyen jellegû ellenôrzô áramkörök az ún. watchdog processzorok.
A watchdog processzor különleges céláramkör, mely az informatikai rendszerrel kapcsolatos futás közbeni információgyûjtés és real-time adatfeldolgozás alapján ellenôrzi annak helyes mûködését. Statisztikai megfigyelésekbôl következik, hogy a programvezérelt rendszerekben elôforduló hibák jelentôs része a folyamathoz rendelhetô vezérlési gráf sérülésébôl származik. A watchdog processzor a futás közbeni tényleges vezérlési gráfot hasonlítja össze egy elôre rögzített, hibátlan referencia-gráffal. Az aktuális vezérlési gráf felismerése jelzôszámok alapján történik; a magasszintû programozási nyelven megírt forráskódból egy elôfeldolgozó (preprocesszor) elôállítja a folya-mathoz tartozó ve- zérlési gráfot, s an- nak csomópontjai- hoz egyedi jelzô- számokat rendel. A jelzôszámokat az ellenôrzött pro- cesszor futás köz- ben továbbítja a watchdog procesz- szorhoz az elôfeldolgozó által az eredeti programszövegbe beszúrt transzfer utasítások segítségével. A szélesebb körû funkcionális ellenôrzés érdekében a folyamatoknak bizonyos idôzítési korlátnak is eleget kell tenniük: ha két jelzôszám-továbbítás között eletelt idô túlzottan hosszúra nyúlik, feltételezhetô a program hibás mûködése (pl. végtelen ciklus). Hibás állapot detektálása ill. time-out hiba fellépte esetén a watchdog processzor megszakítja a program futását, ami egy esetleges elôzô hibátlan állapotba való visszatéréssel folytatható. A fentieknek megfelelôen a tervezendô áramkör IBM PC AT számítógéphez illeszkedô watchdog processzor (WP) kártya, mely multitasking környezetben képes ellátni a futásidejû monitoringot; a jelzôszámok vételét és vizsgálatát.
1.2. Programozási felület
A watchdog processzor memóriába ágyazott periféria-társprocesszorként mûködik, a felügyelt processzorral (Intel 80486) - a nagyobb hatékonyság és a maximális kommunikációs sebesség érdekében - 32 bites adatforgalmat bonyolít le a VESA lokális buszon. A WP egyidejûleg 256 task felügyeletét képes ellátni. (A jelenlegi kiépítettség mellett csak 128 task ellenôrzésére van mód.) A watchog processzor által lefoglalt memória-címtartomány 16Mbyte, amely a rendszerbeli taskok ill. az operációs rendszer között van felosztva. A felügyelt taskok mindegyikéhez a WP-címtartomány egy-egy 4Kbyte méretû szegmense tartozik; az egyes szegmensekhez való illegális hozzáférés megakadályozása az i486 memória-kezelô egységének (MMU - Memory Management Unit) feladata. A watchdog processzor utasításainak végrahajtása egy-egy memória-írási ill. -olvasási ciklus alatt történik. A WP-utasításkód és a hozzá tartozó adatok kódolása a VLB cím- és adatbusza között oszlik meg, lehetôvé téve a hierarchikus utasításkészlet kialakítását. Az utasításkészlet magas prioritású tagjait - melyek a watchdog processzor alapvetô paramétereit befolyásolják - csak az operációs rendszer tudja használni, a taskok csak jelzôszám-továbbítást hajthatnak végre. A watchdog processzor az egymásba ágyazott függvényhívások adminisztrálását 256 szint mélységig kezeli, ennél nagyobb mélységû egymásba ágyazás ill. rekurzió hatására a WP megszakítást okoz. A megszakítási rutin feladata a jelzôszám-stack kiürítése és tartalmának az operatív memóriában való ideiglenes tárolása. A taskokhoz rendelt globális timer-limit és idôalap megfelelô koprocesszor utasítással beállítható ill. módosítható.
1.2.1. ábra. A watchdog processzor utasításkészlete
A folyamathoz tartozó - esetlegesen igen terjedelmes - referencia-gráf explicit tárolása helyett a jelzôszámok célszerû megválasztásával megvalósítható az állapotátmenetekre vonatkozó információk implicit kódolása. Egy aktuális állapot csak abban az esetben tekinthetô érvényesnek, ha az elôzô állapothoz tartozó jelzôszámot alkotó 3 cimke legalább egyikének 1-gyel növelt értéke szerepel az aktuális állapothoz rendelt cimkék (Sublabel3, Sublabel2, Sublabel1) között. Kivételt jelentenek a - kerülendô, de mégis elôforduló - olyan ugrás jellegû utasítások, melyek esetében fordítási idôben nem dönthetô el, hogy a program hol folytatódik, s így a vezérlési gráf állapotátmenete sem detektálható. Ilyen utasítások jelölésére szolgál a JMP utasítástípus-azonosító.
A watchdog processzor utasításkészletében szereplô jelölések a következôk:
SIG : Signature
Jelzôszám-továbbító utasítás, a jelzôszám típusát az adatvonalakon kódolt típus-azonosító bitek (D31,D30) határozzák meg. Valamennyi task által kiadható, alacsony prioritású parancs.
T : Timer Enable (D24)
A taskhoz tartozó idôzítô egyedi ki- ill. bekapcsolására szolgáló bit. A konkrét WP-címhez tartozó task esetén az utasítások közötti idôzítések számlálása mindaddig áll, amíg a Timer Enable bit inaktív.
T = 0 timer letiltva
T = 1 timer engedélyezve
Amennyiben a program futása során olyan külsô függvény hívása történik, melynek a WP preprocesszorral való feldolgozása - s így jelzôszámok hozzárendelése - nem történt meg, a taskhoz tartozó timert - a téves time-out jelzés elkerülése érdekében - fel kell függeszteni.
NRM : Normal (D31=0, D30=0)
Közönséges jelzôszámtovábbító utasítás (Sublabel3, Sublabel2, Sublabel1), a watchdog processzor az ezt logikailag megelôzô jelzôszámmal hasonlítja össze, s hiba esetén megszakítást generál.
SOP : Start Of Procedure (D31=0, D30=1)
Start-Of-Procedure típusú jelzôszám - azaz függvény belépési pont - esetén a WP a függvényhívást megelôzô állapothoz tartozó jelzôszámot saját stack jellegû memóriájában tárolja, amely majd referenciaként szolgál a függvényhívásból való visszatéréskor.
EOP : End Of Procedure (D31=1, D30=0)
End-Of-Procedure - vagyis függvényhívásból való visszatérés - felléptekor az elôzôekben a stackben tárolt - a függvényhívást megelôzô állapothoz tartozó - jelzôszámot kiolvassa, amit a követekezô - a függvényhívást követô - állapot vizsgálatához használ.
JMP : Jump (D31=1, D30=1)
JMP típusú jelzôszám vételekor a watchdog processzor az ezt követô állapotot (jelzôszámot) mindenképpen érvényesnek fogadja el.
TCH : Task Change
A TCH utasítás jelzi a watchdog processzornak, hogy taskváltás történt, az ezt követô jelzôszámok már az új taskra vonatkoznak. Az új task azonosítóját a címbusz megfelelô bitjei (A10-A2) tartalmazzák, az adatbusz bitjei közömbösek. A WP csak TCH utasítás mellett engedélyezi a rendszerbeli taskok közötti váltást - azaz az eddigiektôl eltérô WP-címre való hivatkozást -, ellenkezô esetben Task Error hibajelzéssel megszakítást vált ki. Az utasítás természetébôl fakadóan magas prioritású, csak az operációs rendszer adhatja ki.
STP : Set Timer Parameters
A watchdog processzor globális, valamennyi taskra azonos értékû timer jellemzôinek beállítása az STP utasítással történhet. Magas prioritású utasítás.
G : Global Timer Enable (D25)
A rendszerben levô - a watchdog processzor által felügyelt - összes task idôzítés-ellenôrzését tiltja ill. engedélyezi.
G = 0 az idôzítés valamennyi taskra letiltva
G = 1 idôzítés engedélyezve
T-limit : Timer limit (D15-D8)
A Timer limit érték határozza meg, hogy a WP az idôalap hányszorosát tekintse idôzítési korlátnak.
T-base: Time base (D23-D16)
A WP által használt idôzítés idôalapja a Time base érték. Az alap idôegység (
) az itt beállított értékkel szorzódik, és time-out hiba a Timer limit valamint a Timer base értékek szorzatából adódó idôkorlát túllépése esetén lép fel.
Az érvényes értékek az [1...255] intervallumba esnek, 0 esetén az 1 értéknek megfelelô kb.15us-os idôalap állítódik be. Ennek megfelelôen:
TimeOutmin = 15.52us
TimeOutmax = 1s
WPT : Write Pointer
A rendszerben elôforduló különbözô taskok - az egymásba ágyazott függvényhívások adminisztrálására miatt - egymástól elkülönített - egyenként 256 byte méretû - veremmemóriát igényelnek, amit a lokális WP-stack statikus felosztása biztosít. Az egyes memóriaterületek aktuális címeit a folyamatosan karbantartott stack-pointer tábla tartalmazza, melynek címzése az éppen futó taskhoz rendelt azonosítóval (TaskID) történik. A WPT utasítás eredményeképpen az adatbuszon levô 8 bit (D7-D0) felülírja az aktuális taskhoz tartozó pointert. Az utasítás elsôsorban inicializálási folyamathoz ill. túlcsordult stack tartalmának mentéséhez ill. visszaállításához alkalmazható. A pointerek átírása megfelelô gondosságot igényel, hibás érték a taskhoz tartozó nyilvántartás teljes összeomlását okozhatja! Magas prioritású utasítás.
SCE : Set Checking Enable
A jelzôszám-ellenôrzés be- ill- kikapcsolására vonatkozó, magas prioritású utasítás.
C : Checking Enable (D28)
A bit inaktív állapota esetén a jelzôszám-ellenôrzés szünetel, tetszôleges jelzôszám beírható a stackbe. Használata elsôsorban a WP-stack elôzôleg elmentett tartalmának visszaállítására ill. a taskonkénti legelsô jelzôszám bevitelére ajánlott.
C = 0 jelzôszám-ellenôrzés tiltva
C = 1 jelzôszám-ellenôrzés engedélyezve
RSS : Read Status
Az RSS utasítás a watchdog processzor pillanatnyi állapotáról ill. az aktuális task-paraméterekrôl nyújt információkat.
A státusz-olvasást közvetlenül megelôzô WP-megszakításhoz tartozó állapotbitek (az állapotbit értéke 1, ha a legutolsó IT a bithez rendelt hiba fellépte miatt következett be):
TE : Task Error (D31)
A legutolsó jelzôszám címbitjein kódolt task azonosító nem egyezik a watchdog processzorban referenciaként tárolt aktuális Task ID-vel.
TO : Time Out (D30)
Két - a watchdog processzornak küldött - jelzôszám-utasítás között a Timer limit és Timer base értékek által meghatározott korlátnál hosszabb idô telt el.
S : Signature Error (D29)
Az egymás után érkezett jelzôszámok hibátlan mûködés esetén nem követhetik egymást.
SF : Stack Is Full (D28)
A taskhoz tartozó stack megtelt, tartalmának az operatív memóriába történô ideiglenes mentésérôl gondoskodni kell.
SE : Stack Is Empty (D27)
A lokális stack kiürült, a korábbiakban elmentett tartalmát vissza kell állítani.
Az RSS utasítás törli a megszakítás státusz-biteket.
A WP aktuális beállításaira vonatkozó állapotbitek:
C : Checking Enable (D26)
G : Global Timer Enable (D25)
T : Timer Enable (D24)
Timer value : a task idôzítôjének pillanatnyi állapota (D23-D16)
(0 elérésekor következik be TO típusú megszakítás.)
Task ID : az aktuális referencia task azonosító (D15-D8)
Pointer : a taskhoz tartozó aktuális stack-pointer (D7-D0)
RSK : Read Stack
A kiolvasott információ a WP lokális stackjének az aktuális taskhoz tartozó pointer által megcímzett mezôjének a tartalmát jelenti:
ST : Signature type
A stack tartalmának kiolvasása elsôsorban a stack túlcsordulása esetén, a stack kiürítésekor szükséges.
2. Hardware struktúra
2.1. Funkcionális felépítés
A specifikációnak megfelelôen a watchdog processzor fôbb funkcionális hardware elemei a következôk:
jelzôszám-ellenôrzô és adminisztráló egységek
timer alrendszer
vezérlôegység
VESA lokális busz interface
2.1.1. ábra. A watchdog processzor blokkvázlata
Az egymásba ágyazott függvényhívások kezelése érdekében az egyes taskoktól érkezô jelzôszámok átmeneti tárolása a statikusan felosztott jelzôszám veremben történik (Signature stack). A stack címzését az aktuális taskhoz tartozó stack-pointer végzi, amit a pointertömb (Pointer array) megfelelô mezôje tartalmaz. A függvényhíváskor ill. a függvénybôl való visszatéréskor szükséges pointer-módosítást (SOP esetén inkrementálás, EOP esetén csökkentés) és a pointertömbbe való visszaírást a Pointer ALU hajtja végre. Az aktuális taskhoz tartozó jelzôszám-stack túlcsordulása vagy kiürülése esetén a stack-pointer módosítása helyett a hiba jellegétôl függôen SF (Stack-Is-Full) ill. SE (Stack-Is-Empty) hibajelzést generál. A pointertömb írása ill. olvasása a megfelelô WP-utasítással (WPT ill. RSS) a belsô adatbuszon keresztül hajtható végre. A jelzôszám-ellenôrzés a logikailag elôzô (Previous signature) és az aktuális (Actual signature) jelzôszámok összehasonlítása alapján történik (Signature checker).
A timer alrendszer alapja egy idôzítô áramkör (Timer), mely a - megfelelô utasítással (STP) - beállított idôkorlát túllépése esetén time-out hibát okoz. Taskváltás során az aktuális timer-érték a Timer base egységben tárolódik, s a task újbóli aktívvá válása után az idôzítô áramkör errôl az értékrôl folytatja a mûködést. A jelzôszám-küldéssel egyidejûleg az aktuális taskra vonatkozóan az idôzítés a T bit inaktív állapotának beállításával felfüggeszthetô. A Timer mûködése a - csak az operációs rendszer által kiadható - STP utasítással (G bit) leállítható.
A watchdog processzor által generált megszakítás 5 forrásból származhat:
Task Error
Jelzôszám vétele során a VLB-címbuszon kódolt task azonosító nem egyezik a referencia-regiszterben (Actual task ID) tárolt azonosítóval.
Time Out
Az idôzítô áramkör (Timer) túlcsordult.
Signature Error
A jelzôszám-ellenôrzô egység (Signature Checker) érvénytelen jelzôszámot detektált.
Stack Is Full
Az aktuális stack pointer a verem tetejére mutat és SOP típusú jelzôszám érkezett.
Stack Is Empty
Az aktuális stack pointer a verem aljára mutat és EOP típusú jelzôszám érkezett.
A vezérlô egység (Control unit) - az egyes funkcionális egységek mûködésének összehangolása mellett - bármilyen típusú hiba fellépte esetén az AT buszon megszakítást generál. A megfelelô interrupt rutin a WP megszakítási állapotvektorának kiolvasása (RSS) alapján ismeri fel a megszakítást kiváltó okot és reagál az IT-kérésre.
2.2. Jelzôszám-adminisztráció
A jelzôszám stack az elôzôek alapján 128 task egyenként max. 256 szintig egymásba ágyazható függvényhívásaihoz tartozó referencia-jelzôszámokat tartalmazza, ami 32 bit széles 32Kbyte statikus RAM-ot igényel. A memória adatvonalai a WP belsô adatbuszára csatlakoznak, lehetôvé téve a stack írását (SIG) és olvasását (RSK). A címvonalak két részre oszlanak: a felsô 7 címbit (A14-A8) megegyezik az aktuális task azonosítóval - s így 128 db. 256 x 32 bites blokkra osztja a jelzôszám stacket -, az alsó 8 címvezeték (A7-A0) a WP 8 bites pointer buszára csatlakozik. A pointer busz vonalait vagy a pointertömbnek az aktuális taskhoz tartozó eleme - azaz a stack pointer -, vagy a pointer-aritmetikát kezelô Pointer ALU hajtja meg, lehetôvé téve az egy taskhoz tartozó stacken belüli címzést. Az operációs rendszernek lehetôsége van a pointertömbnek az aktuális taskhoz tartozó mezôjének módosítására (WPT) ill. tartalmának kiolvasására (RSS) kétirányú buszmeghajtón (Bridge) keresztül.
2.2.1. ábra. A jelzôszám-adminisztráció
A Pointer ALU feladata, hogy jelzôszám vétele esetén (SIG) a jelzôszám típusának megfelelôen (TypeH és TypeL) módosítsa a stack pointer értékét: SOP típusú jelzôszám esetén eggyel növeli, EOP esetén eggyel csökkenti, NRM és JMP típusú jelzôszámok vételekor nem változtatja. A memória-hozzáférési idô megkerülése érdekében a Pointer ALU egy redundáns regisztert tartalmaz, melynek pillanatnyi értéke megegyezik a pointertömbben tárolt stack pointer értékével. Jelzôszám érkezésekor az itt tárolt értéket módosítja, s egyidejûleg írja be a pointertömbbe a módosított értéket és címzi a jelzôszám stacket.
A lokális stack túl- ill. alulcímzése esetén a Pointer ALU SF ill. SE hibajelzést küld a hiba logika (Error logic) felé. Stack-Is-Full hiba felléptekor a megszakítási rutin feladata az aktuális task lokális stackjének megfelelô mélységig történô kiürítése (RSK) és az operatív memóriában való átmeneti tárolása, valamint a stack pointer új értékének beállítása (WPT) - célszerûen a stack közepére. Az egyszerûbb kezelô software-környezet kialakíthatósága érdekében a stack legfelsô - SP=FFh értékhez tartozó - mezôje túlcsordulási tartalék; a watchdog processzor FEh pillanatnyi stack-cím mellett és ezzel egyidejûleg SOP típusú jelzôszám vételekor a pointert 1-gyel inkrementálja, a jelzôszámot FFh címen tárolja és SF típusú megszakítást okoz. Stack-Is-Empty típusú hiba esetén a korábban elmentett stack-tartalom visszaállítása és a stack pointer korrekciója szükséges. Ha elôzôleg nem történt stack-mentés és SE típusú megszakítás lép fel, akkor a task vezérlési gráfjának illegális állapotátmenetrôl van szó.
A megszakításkérés egy másik forrása a vett jelzôszámhoz tartozó és a referenciaként tárolt task azonosító értékének különbözôsége lehet. A VESA lokális buszra ill. a refencia regiszterre (Task ID REG) kapcsolódó komparátor eltérés esetén TE (Task Error) hibajelzést állít elô: a pointer értéke nem változik és a jelzôszám sem kerül a stackbe. A referencia task-azonosító státusz-olvasás során (RSS) lekérdezhetô.
2.3. Jelzôszám-ellenôrzés
A jelzôszám-ellenôrzés mindig egy adott task által aktuálisan elküldött és az ezt logikailag megelôzô jelzôszám összehasonlításán alapszik. Egymást követô normál jelzôszámok (NRM) csak abban az esetben érvényesek, ha a korábbi jelzôszámban szereplô 8 bites cimkék 1-gyel növelt értékei közül valamelyik - vagy több - megegyezik a késôbbi jelzôszám cimkéinek egyikével. SOP jelzôszámot - az egyéb feltételek betartása mellett - a WP mindenképpen érvényesnek fogad el. EOP jelzôszám az NRM típushoz hasonlóan csak az ôt megelôzô jelzôszámmal való összehasonlítás alapján tekintendô legálisnak. A JMP típus-azonosítóval megjelölt ugrás jellegû utasítások esetén a következô jelzôszámot a watchdog processzor szintén érvényesnek fogadja el.
Az ellenôrzés alapja egy 3x3-as, 8 bites komparátor mátrix; ennek sorai az aktuális jelzôszám egy-egy cimkéjének összehasonlítását végzik az elôzô jelzôszám cimkéinek - a mátrix oszlopaihoz rendelt - 1-gyel inkrementált értékeivel. Az ellenôrzôrendszer tartalmaz egy 24 bites jelzôszám-árnyékregisztert (Signature register), mely - a késleltetési jellemzôk hatásának minimalizálása érdekében - a legutoljára érkezett jelzôszám összehasonlításra elôkészített alakját tárolja.
A jelzôszám-érvényesség 3 esetben - illetve ezek kombinációiban - fordulhat elô:
jelzôszám-egyenlôség: a komparátorok valamelyike azonosságot észlelt a cimkék között
SOP típusú jelzôszám: függvényhívás belépési pontja következik, azaz nincs elôzetes referencia-jelzôszám
az aktuális jelzôszám JMP azonosítót követ
Ennek megfelelôen jelzôszám-hiba (aktív '1') csak akkor keletkezik, ha sem a komparátorok kimeneteinek VAGY kapcsolatát jelentô EQ jel, sem a belsô adatbusz típus-azonosító bitjeibôl (TypeH, TypeL) elôállított SOP jel (kódja: 01b), sem az elôzô jelzôszám esetleges JMP típusát (kódja: 11b) tároló flip-flop (JMPprev register) kimenete nem aktív szintû.
A jelzôszám-regiszter elsôdleges célja a jelzôszám-stack hozzáférési idejének és az egyéb járulékos késleltetések hatásának kiküszöbölése, a leggyakoribb típusú jelzôszám (NRM) kezelésével kapcsolatos átfutási idô optimalizálása.
Mivel a jelzôszám-regiszter minden esetben a legutoljára érkezett jelzôszámot tárolja, taskváltáskor, függvényhívásból való visszatérés esetén ill. pointer-módosításkor a jelzôszám-stack megfelelô rekeszének tartalmát - a jelzôszámcimkék inkrementálása után - át kell másolni a jelzôszám regiszterbe, amit a watchdog processzor automatikusan elvégez.
2.3.1. ábra. A jelzôszám-ellenôrzés
2.4. Timer alrendszer
Egy folyamat helyes mûködése ellenôrzésének egy módja lehet az "I'm alive!" jellegû üzenetekkel kommunikáló tesztelés. A watchdog processzor ezt a módszert ötvözi a jelzôszámokon alapuló ellenôrzéssel: adott task két jelzôszám-továbbítása között eltelt idô nem haladhat meg egy elôre rögzített idôkorlátot, ellenkezô esetben time-out típusú megszakítás generálódik.
Az idôzítô alrendszer alapja egy programozható 8 bites számláló (Counter). Jelzôszám vételekor - az inicializálás során beállított (STP) - idôkorlát értéke beíródik a lefelé számláló Counterbe, melynek órajelét a VESA lokális busz órajelébôl állítja elô egy elôosztó idôalap generátor (Frequency divider). A WP nagyobb rugalmassága érdekében az osztásarány a 8 bites - csak írható - elôosztó regiszterben (Division register - Time base) beállítható az alapértéktôl az alapérték 255-szereséig terjedô intervallumban. (Nulla esetén az alapérték állítódik be.) Az idô-alpérték (T0) a VESA lokális busz órajelének (LCLK) leosztásából jön létre. PREDIV=256 - azaz 8 bites elôosztó - mellett
.
Ha a számláló eléri a 0 értéket - vagyis a task túllépte az idôkorlátot -, aszinkron time-out hibaüzenet jön létre, ami TO típusú megszakítást vált ki.
2.4.1. ábra. Timer alrendszer
A számláló a WP-kártya inaktív állapotában folyamatosan frissíti a Timer base egységben az aktuálisan futó taskhoz tartozó rekeszt. Taskváltás során az új task idôzítési ciklusa a task legutolsó aktív állapotától folytatódik.
A számláló mûködéséhez szükséges, hogy a globális (G) és az aktuális taskra vonatkozó (T) idôzítés-engedélyezés aktív legyen. A watchdog processzorral folytatott kommunikáció ideje alatt az idôzítés automatikusan felfüggesztôdik, lehetôvé téve a pontos idôzítési korlát beállítását.
2.5. A vezérlôegység
A watchdog processzor funkcionális egységei mûködésének összehangolása, ezek vezérlô jeleinek elôállítása a vezérlôegység feladata. A vezérlôegységnek 19 állapota van (2.5.1. ábra); a WP-kártya inaktív állapotában (S_Idle) csak az idôzítô egység mûködik, a késleltetések hatásának csökkentése érdekében a VLB adatbusza - kétirányú buszmeghajtókon keresztül - a WP belsô adatbuszára kapcsolódik. A koprocesszor a vele való kommunikáció-kezdeményezés hatására az S_Idle állapotból az utasítás típusától függôen valamelyik parancs-végrehajtási állapotba kerül.
2.5.1. ábra. A watchdog processzor állapotgráfja
Annak érdekében, hogy az ellenôrzött taskok mûködési sebességét a lehetô legkisebb mértékben csökkentse a watchdog processzorral való kommunikáció, a vezérlô és a járulékos hardware a jelzôszám-továbbítás kezeléséhez optimalizált. A leggyakrabban elôforduló NRM típusú jelzôszámok - és a SOP ill. JMP típusúak - vétele a - 33MHz órajel-frekvenciával mûködô - VESA lokális buszon 3 periódus, azaz kb.90ns idô alatt zajlik le. De a fizikai paraméterekbôl adódóan hosszabb feldolgozási idôt igénylô utasítások is csak a szükséges ideig foglalják le a VL-buszt (folytonos vonallal rajzolt állapotok); a szaggatott vonallal jelzett állapotokban a watchdog processzor a felügyelt processzorral párhuzamosan mûködik.
A WP-utasítások vétele során a felügyelt processzor a buszciklus elsô ütemében érvényes címet és adatot helyez a VESA lokális buszra, amit az ADS# jel lefutó éle jelez. A watchdog processzor - a hardware késleltetéseket figyelembevéve - azonnal aktív szintre húzza az LDEV# jelet, ezzel jelezve, hogy a memória-hozzáférés a lokális buszon fog lezajlani. Az utasítás típusától függô adatátviteli folyamat végrehajtása után a WP a LRDY# jel 01 átmenetével fejezi be a buszciklust.
2.5.2. ábra. NRM,SOP és JMP jelzôszámok vétele
Jelzôszámok vétele esetén a watchdog processzor a buszciklus elsô ütemében (T1) történô utasítás-dekódolás eredményeképpen (SIG=1) a második órajel-periódusban (T2 - SIG) elvégzi a jelzôszám típusától függô pointermódosítást. (CE_PR - Count Enable for Pointer Register). Mivel a Pointer ALU által kiszámított új cím és a WP-vezérlôtôl érkezô memória-vezérlôjelek egyszerre válnak stabillá, olyan statikus memória-egységet kell alkalmazni, melynek a vezérlôjeihez képest cím elôkészítési idôre nincs szüksége. (A felsô 7 címbit - melyeket a task referencia-regiszter kimenetei hajtanak meg - már az elôzô taskváltás óta stabil.)
A jelzôszám típusától függôen az utasítás-végrehajtás további fázisai eltérôek:
NRM, SOP és JMP típusú jelzôszámok - azaz nem EOP - esetén a T3 ütemben (NEOP) egyrészt a Pointer ALU a pointer buszon keresztül beírja az új mutatót a pointertömbbe (WE_P#=0, CS_P#=0) másrészt a belsô adatbusz tartalma, vagyis az új jelzôszám beíródik a stacknek az új pointer által megcímzett rekeszébe (WE_S#=0) és - a T3 ütem végén - a jelzôszám regiszterbe is (CE_SRT=1).
A T2 és T3 órajel-periódus alatt a timer buszra - melyet eddig az idôzítô áramkör hajtott meg, - a Timer limit regiszterben beállított érték kerül (OE_TLR#=0, OE_Counter#=1), ami egyidejûleg beíródik a taskokhoz tartozó timer állapotokat tároló statikus RAM-ba és a számlálóba. A CE_SRT jel aktív állapota során a jelzôszámmal együtt érkezett T bit frissíti a Timer Enable flip-flopot.
A T3 ütemben az LRDY# jel aktív szintû, ezzel jelezve a buszciklus végét.
A watchdog processzor a T2 órajel-periódus (SIG) végén vizsgálja, hogy fellépett-e valamilyen típusú hiba. Task ID hiba ill. jelzôszám hiba esetén - amennyiben a jelzôszám-ellenôrzés engedélyezve van - a T3 ütemre nem kerül sor, a jelzôszám stackbe való beírás és a pointer-módosítás nem történik meg, így hibás jelzôszám nem kerülhet a stackbe, ami lehetôvé teszi egy elôzô állapotba való esetleges visszatérést. SF típusú hiba felléptekor - vagyis, ha a stack-pointer értéke legalább FEh és SOP jelzôszámról van szó - a jelzôszám beírása és a pointer-inkrementálás megtörténik FFh címre. A Pointer ALU semmiképpen nem címzi túl a lokális stack területet; FFh aktuális stack-cím és SOP jelzôszám mellett a jelzôszám felülírja az FFh címen tárolt jelzôszámot.
EOP típusú jelzôszám esetén a stackbe való beírásra nincs szükség, csak az elôzô jelzôszámmal való összehasonlítást és a stack-pointer dekrementálását kell elvégezni. Ennek megfelelôen a buszciklus T1 és T2 szakasza a nem EOP jellegû jelzôszámok kezelésével megegyezôen zajlik. Mivel a stack-pointer értékének megváltozásával egy új jelzôszám jelenti az összehasonlítási alapot a következô jelzôszámhoz, az inkonzisztencia elkerülése érdekében a stack-pointer által megcímzett mezô tartalmát - megfelelô módosítás után - át kell másolni a jelzôszám-regiszterbe. Ez történik a T3 (EOP1) és T4 (EOP2) ütemben: a belsô adatbuszt már nem a VLB, hanem a stack hajtja meg (OE_S#=0). A memória-hozzáférési idô és a jelzôszám-cimkék inkrementálásához szükséges idô után, a T4 ütem végén történik meg a jelzôszám-regiszter értékének frissítése (CE_SR=1).
Az utasítás-végrehajtás csak 3 ütemig foglalja le a VL-buszt, a T4 (EOP2) ütem már a koprocesszoron belül, a felügyelt processzortól függetlenül megy végbe.
A hiba- ill. megszakítás-kezelés a nem EOP típusú jelzôszámokéhoz hasonló, SE hiba elôfordulásakor az egyszerûbb hardware felépítés érdekében - megszakításkérés mellett - a teljes parancs-feldolgozási ciklus lejátszódik, de mivel a Pointer ALU soha nem címzi alul a lokális stacket, ez a helyes mûködést nem befolyásolja.
2.5.3. ábra. EOP típusú jelzôszám vétele
Taskváltás során a címbuszon kódolt új task azonosítónak a task referencia- regiszterbe történô beírása mellett a konzisztencia megôrzése érdekében szükség van a Pointer ALU-ban levô pointer regiszter és a jelzôszám regiszter új értékének beállítására is. Az utasítás-feldolgozás második ütemében megfelelô vezérlô impulzus hatására a task referencia-regiszter bekapuzza a VLB-címbuszon levô task azonosítót (CP_TIDR=0®1). A pointertömbnek az új task azonosító által megcímzett mezôjének tartalma kerül a pointer buszra (CS_P#=0, WE_P#=1), melyet idôben "elenged" a Pointer ALU (OE_PR=0). A memória-hozzáférési idô után a stack címbemenetein érvényes cím - azaz új pointer - van. Megfelelô sebességû statikus RAM-okkal elérhetô, hogy a sorba kapcsolt memóriák és a jelzôszám-regiszter elôtti inkrementáló logika együttes késleltetése ne haladja meg a három periódust (kb. 90ns), s igy a T4 ütem (TCH3) végén a jelzôszám-regiszter új értéke beírható (CE_SR).
A fenti folyamattal párhuzamosan a timer alrendszernek az új taskra való átállítását is el kell végezni. Mivel az idôzítô számláló órajele WP-kommunikáció alatt nincs engedélyezve, állapota legfeljebb a T1 ütem elején változhat utoljára. Kellôen gyors SRAM-ot alkalmazva a Counter értéke - T1 ütem alatt - biztosan beíródik a - folyamatosan írásra kiválasztott - Timer base egységnek a régi task azonosító által megcímzett rekeszébe. T3 ütemben az új taskhoz tartozó, elôzôleg tárolt timer érték a Timer base egységbôl (CS_T#=0, WE_T=1) aszinkron módon beíródik a számlálóba (PLoad#=0).
A taskváltás mindössze 2 órajel-periódusig foglalja le a processzort, ami az i486 lehetôségeit figyelembe véve a lehetô legkevesebb.
2.5.4. ábra. A taskváltás folyamata
Az STP utasítás végrehajtása szintén két ütemet vesz igénybe: T1 ütemben történik az utasítás-dekódolás, a T2 ciklus (STP) végén - az órajel következô felfutó élének hatására - íródnak be a VLB-n és a belsô adatbuszon keresztül a paraméterek a megfelelô regiszterekbe (C_TLGD=1).
A pointertömb egyes elemeinek a watchdog processzoron kívülrôl történô megváltoztatása a WPT paranccsal lehetséges. Az utasítás-dekódolást követô ütemben (T2 - WPT1) az órajel következô felfutó élénél a belsô adatbuszt a pointer busszal összekötô kétirányú buszmeghajtón keresztül (Bridge) a beírandó érték a pointer regiszterbe kerül (OE_PR=0). Mivel az írási folyamat nem közvetlenül a pointertömbbe történik, az utasítás végrehajtása csak a minimális processzoridôt igényli. Ezt követôen a Pointer ALU veszi át a poiter busz meghajtását, egyidejûleg írja be az új pointer-értéket a pointertömbbe (CS_P#=0, WE_P#=0) és címzi a stacket (OE_S#=0), melybôl az új referencia-jelzôszám átmásolódik a jelzôszám-regiszterbe (CE_SRT=1).
2.5.5. ábra. WPT utasítás végrehajtása
A jelzôszám-ellenôrzés ki- ill. bekapcsolása az SCE utasítással történhet. Végrehajtása 2 órajel-periódus alatt megy végbe; a T2 ütem (SCE) végén az órajel felfutó éle írja be a C bitet a megfeflelô flip-flopba.
A WP-státusz kiolvasása az RSS utasítással minimálisan 3 ütem alatt zajlik le. Az IT státuszbitek, az aktuális task azonosító, a taskhoz tartozó stack-pointer és az idôzítô pillanatnyi értéke a T3 órajelcikus végére már stabil adatként jelenik meg a VLB-adatbuszon. (A T2 periódus során a memória-cache-sel való ütközést elkerülendô a WDP a belsô adatbuszán levô adatot még nem kapuzza a VLB-re.) A watchdog processzor a LRDY# jel aktív szintre húzásával jelzi, hogy érvényes adat van a buszon. A i486 processzor - mely minden órajel-periódus végén mintavételezi a LRDY# jel állapotát - a RDYRTN# handshake jel aktív állapotba vezérlésével zárja le a buszciklust. A WP mindaddig tartja az érvényes információt a VESA lokális buszon, amíg a RDYRTN# jel inaktív, azaz a felügyelt processzor nincs készen az adat beolvasásával. A buszciklus befejeztét követô ciklusban (T4 - RSS3) az IT státuszbitek - melyek a megszakításkéréstôl idáig aktív szintûek - törlôdnek, majd a watchdog processzor alapállapotába (S_Idle) tér vissza.
A WP-megszakítási rutin az RSS utasítást használhatja az magszakítás forrásának azonosítására. Az IT-kezelés elsô lépéseként célszerû egy RSS utasítást kiadni, mely egyúttal megszünteti a watchdog processzorhoz tartozó IRQ vonal aktív állapotát is.
Az aktuális taskhoz tartozó pointer által a stackben megcímzett mezô tartalmát az RSK utasítás hatására szolgáltatja a watchdog processzor. Az utasítás min. 3 órajel-periódus alatt megy végbe; a T1 ütemben történô utasítás-dekódolás után a T3 (RSK2) periódusban a memória-hozzáférési idôt követôen a kiolvasott adat a VESA lokális buszon van, amit a LRDY# aktív szintje jelez. Az RSS utasításhoz hasonlóan a watchdog processzor az órajel minden felfutó élénél mintát vesz a RDYRTN# jel állapotából, és csak ennek aktív szintje esetén tér vissza inaktív állapotába.
2.5.6. ábra. RSK utasítás végrehajtása
A watchdog processzor a külvilág, az esetlegesen együttmûködô más rendszerek ill. felügyelôrendszer felé is biztosítja az ellenôrzött taskokkal kapcsolatos állapot-információkat. A felügyelt processzor hibájából adódó WP-megszakítás (TE,TO,S) esetén a külsô csatlakozón a belsô IT-vel egyidôben szintén jelzés generálódik. A hiba típusa a külsô rendszer által is hozzáférhetô állapotbitek alapján azonosítható.
3. Implementáció
3.1. Alkatrészjegyzék
A watchdog processzor egy IBM PC AT számítógéphez illeszthetô bôvítôkártyaként realizálódik. A kapcsolás központi vezérlô egységét, a késleltetések ill. alkatrészigény szempontjából kritikus részeket egy Xilinx XC3064PC84-70 típusú FPGA eszköz tartalmazza. A további járulékos hardware elemeket F-TTL ill. kisebb integráltságú PLD-k valósítják meg.
Alkatrészjegyzék:
Alkatrész típusa Gyártó neve Funkció Darabszám XC3064PC84-70 Xilinx FPGA 1 GAL22V10B-7LP Lattice PLD 3 TC55328P-25 Toshiba 32K x 8 SRAM 4 TMM2018AP-25 Toshiba 2K x 8 SRAM 2 74191 up/down binary counter 2 MC74F244 Motorola octal buffer/line 5 driver MC74F245 Motorola octal bidirectional 5 transceiver MC74F374 Motorola octal D-type flip-flop 2 MC74F521 Motorola 8-bit identity 1 comparator
3.2. Cím-dekódoló egység
A WP-kártyacím dekódolást és ennek a VESA lokális busz felé történô jelzését egy GAL22V10 architektúrájú programozható eszköz végzi.
MODULE AddrComp TITLE ' project : WATCHDOG PROCESSOR part : Address Compare Logic author : Valyon Attila last modified : 04. 10. 1995. ' " _________ " ADR31 -> | | <- CA31 " ADR30 -> | | <- CA30 " ADR29 -> | Address | <- CA29 " ADR28 -> | Compare | <- CA28 " ADR27 -> | Logic | <- CA27 " ADR26 -> | | <- CA26 " ADR25 -> | | <- CA25 " ADR24 -> | | <- CA24 " | | " ADS# -> | 22v10 | -> WPADS# " M/IO# -> |_________| -> LDEV# DECLARATIONS AddrComp DEVICE 'p22v10'; x = .X.; " don't care condition z = .Z.; " three state value LDEV PIN 14 ISTYPE 'com, buffer'; " device selected on VLB M_IO PIN 1; " M/IO# signal from VLB ADS PIN 2; " ADS# VLB control signal WPADS PIN 23 ISTYPE 'com, invert'; " bus cycle with WP AddrEQ NODE 19 ISTYPE 'com'; " VLB address is equal to " WP card address low " active) with internal " feedback ADR31,ADR30,ADR29,ADR28,ADR27,ADR26,ADR25,ADR24 PIN 3,4,5,6,7,8,9,10; Addr = [ADR31..ADR24]; " VLB address signals CA31,CA30,CA29,CA28,CA27,CA26,CA25,CA24 PIN 11,13,22,21,20,18,17,16; CardAddr = [CA31..CA24]; " WP card address defined " by switches END AddrComp;
3.3. Pointer ALU
A speciális struktúrát igénylô Pointer ALU-t szintén 22V10 típusú PLD valósítja meg. A pointer regiszter (P7...P0) kétirányú lábakon keresztül csatlakozik a pointer buszra. Mivel a 22V10 makrocellájának architektúrája nem teszi lehetôvé a regiszterek órajel-engedélyezését, az inaktív állapotban szükséges állapot-megôrzés a regiszterek bemeneteire való visszacsatolással valósul meg. A pointer regiszter kimenetrôl való leválasztása az OE_PR (Output Enable) jel inaktív állapota mellett lehetséges. Az OE_PR=0 állapot egyúttal azt is jelenti, hogy az órajel következô felfutó élénél a pointer buszon levô információ automatikusan beíródik a pointer regiszterbe. A CE_PR (Count Enable) jel engedélyezi a Pointer ALU számára, hogy a pointer buszról visszacsatolt értéknek a pointer regiszterbe történô betöltésénél figyelembe vehetôk-e a az belsô adatbusz jelzôszám típus-azonosító bitjei (TypeH, TypeL).
MODULE ALU TITLE ' project : WATCHDOG PROCESSOR part : Pointer ALU author : Valyon Attila last modified : 04. 24. 1995. ' " _________ " CLK -> | | <-> P7 " | | <-> P6 " OE_PR -> | | <-> P5 " CE_PR -> | ALU | <-> P4 " | | <-> P3 " TypeH -> | | <-> P2 " TypeL -> | | <-> P1 " | | <-> P0 " | | " | 22v10 | -> SF " |_________| -> SE DECLARATIONS ALU DEVICE 'p22v10'; c = .C.; " low-high-low transition x = .X.; " don't care condition z = .Z.; " three state value CLK PIN 1; " 33MHz VESA local bus clock P7,P6,P5,P4,P3,P2,P1,P0 PIN 18,19,17,20,16,21,15,22 ISTYPE 'reg_D,buffer'; PointerRegister = [P7..P0]; OE_PR PIN 2; " Output Enable for Pointer Register CE_PR PIN 3; " Count Enable for Pointer Register TypeH, TypeL PIN 4,5; " signature type bits SF PIN 14 ISTYPE 'com'; " Stack-Is-Full and SE PIN 23 ISTYPE 'com'; " Stack-Is-Empty error signals SOP = !TypeH & TypeL; " Start-Of-Procedure type signature EOP = TypeH & !TypeL; " End-Of-Procedure type signature StackFull = (PointerRegister.pin>=^hFE); StackEmpty = (PointerRegister.pin==^h00); END ALU;
3.4. A vezérlôegység
A watchdog processzor mûködésének alapja a vezérlôegység. Implementációja Xilinx FPGA chipbe történt, felépítését a Xilinx architektúrához optimalizált XABEL fejlesztôi környezetben magas hierarchia szintû ABEL program írja le. A vezérlô állapotkódolása az FPGA környezethez igazodik, illegális állapot-átmenentek megszüntetésére járulékos logikával van kiegészítve.
MODULE SMachine TITLE ' project : WATCHDOG PROCESSOR part : State Machine author : Valyon Attila last modified : 04. 24. 1995. ' @DCSet; DECLARATIONS "--------------------------- Constant declarations ------------------ c = .C.; " low-high-low transition x = .X.; " don't care condition z = .Z.; " three state value fromPB = 0; " constants to determine the direction of toPB = 1; " data flow between the internal data bus " and the pointer bus fromVLB = 0; " constants to determine the direction of toVLB = 1; " data flow between the VESA local bus " and the internal data bus "------------------------- VESA local bus interface ---------------- CLK PIN; " 33MHz VESA local bus clock !LRDY PIN; " Local Device Ready control signal !RDYRTN PIN; " Ready Return signal driven by " VLB controller "----------------------------- WP command types ------------------ SIG PIN; " Signature sending TCH PIN; " Task Change STP PIN; " Set Timer Parameters WPT PIN; " Write Pointer SCE PIN; " Set Checking Enable RSS PIN; " Read Status RSK PIN; " Read Stack EOP PIN; " End-Of-Procedure type signature "------------------------- Internal control signals ------------------- " Pointer control section: !CS_P PIN; " Chip Select for SRAM contains " stack pointers !WE_P PIN; " Write Enable for SRAM contains " stack pointers DIR_Bridge PIN; " determines the direction of data " flow through the octal bidirectional " transceiver (Bridge) !OE_Bridge PIN; " enable or disable the ports of the " bridge OE_PR PIN; " Output Enable signal for Pointer " Register CE_PR PIN; " Count Enable signal for Pointer " Register " Stack control section: !OE_S PIN; " Output Enable for the stack " SRAM !WE_S PIN; " Write Enable for the stack SRAM " Status control section: !OE_Status PIN; " Output Enable for status vector CLR_Status PIN; " Reset (async.) for status vector CE_Status PIN; " Clock Enable for status vector CE_CheckEn PIN; " Clock Enable for Checking Enable " Bit " VLB-WP connection section: !CP_TIDR PIN; " Clock signal for Task ID register !OE_Gate PIN; " Output Enable for VLB-WP Gate DIR_Gate PIN; " direction of the VLB-WP Gate " Timer control section: C_TLGD PIN; " Clock Signal for Timer Limit Register, " Clock Enable for G register and " Division Register !OE_TLR PIN; " Output Enable for Timer Limit Register !CS_T PIN; " Chip Select for SRAM contains timer " values !WE_T PIN; " Write Enable for SRAM contains timer " values !PLoad PIN; " Parallel Load the Timer !OE_Counter PIN; " Output Enable Counter to " timer bus "-------------------------- Error checking signals ------------------- Error PIN; " Error signal: TE or S (without SF, SE " and TO) CE_SRT PIN; " Clock Enable for Signature Register " and T register "------------------------------ State register ------------------------- QState STATE_REGISTER ISTYPE 'reg_D'; S_Idle STATE; " WP is inactive S_SIG STATE; " signature receive S_EOP1, S_EOP2 STATE; " EOP type signature " arrived S_NEOP STATE; " NRM, SOP or JMP signature S_TCH1, S_TCH2, S_TCH3 STATE; " Task Change "command states S_STP STATE; " Set Timer Parameters command S_WPT1, S_WPT2, S_WPT3 STATE; " Write Pointer "command states S_SCE STATE; " Set Checking Enable state S_RSS1, S_RSS2,S_RSS3 STATE; " Read Status " states S_RSK1, S_RSK2 STATE; " Read Stack states S_Error STATE; " Error noticed state XILINX PROPERTY 'Initialstate S_Idle'; END SMachine;
3.5. A konfigurációs hardware
A watchdog processzor vezérlô egységét ill. egyéb hardware komponenseket tartalmazó Xilinx chipet a mûködés megkezdése elôtt a belsô struktúra kialakítása érdekében konfigurálni kell. A tápfeszültség bekapcsolása után a Xilinx eszköz - a belsô automatikus reset folyamatokat követôen - valamennyi I/O kivezetését nagyimpedanciás állapotba vezérli és a konfigurációs módot meghatározó lábainak állapotától függôen kezdi meg a belsô RAM feltöltését. Master módban a konfigurációt saját maga felügyeli, míg slave módban passzív szerepet játszik. A watchdog processzorbeli chip konfigurációja soros slave módban történik, azaz a konfigurációs adatok bitsorosan, külsô vezérlô - jelen esetben az i486 processzor - által ütemezve íródnak be. A bitsorozat letöltése az ISA buszon keresztül zajlik le.
A konfigurációs báziscím négy - az AT gépek szokásos szabad periféria-címtartományában levô - lehetséges értékpár közül választható ki:
Jumper pozíció Bitfolyam báziscím Inicializáló báziscím 00 300h 301h 01 30Ah 30Bh 10 314h 315h 11 31Eh 31Fh
A WP kártyának az ISA buszhoz való illesztését programozható logikai eszköz végzi. A konfigurációs hardware ABEL nyelvû logikai leírása:
MODULE ConfAddr TITLE ' project : WATCHDOG PROCESSOR part : Configuration Address Decode Unit author : Valyon Attila last modified : 11. 01. 1995. ' " _______________ " SA9 -> | | <- SD0 " SA8 -> | | <- SD6 " SA7 -> | | " SA6 -> | | <-> DP " SA5 -> | Configuration | -> DOUT " SA4 -> | Address | -> CCLK " SA3 -> | Decode Unit | " SA2 -> | | <- AddrSelH " SA1 -> | | <- AddrSelL " SA0 -> | | " | | " AEN -> | | " IOR# -> | 22v10 | " IOW# -> |_______________| DECLARATIONS ConfAddr DEVICE 'p22v10'; z = .Z.; " three state value x = .X.; " don't care condition SA9,SA8,SA7,SA6,SA5,SA4,SA3,SA2,SA1,SA0 PIN 1,2,3,4,5,6,7,8,9,10; SA = [SA9..SA0]; " ISA bus address bits AEN,!IOW,!IOR PIN 11,13,20; " ISA control signals SD0 PIN 19; " ISA data bits SD6 PIN 23 ISTYPE 'com,buffer'; " SD6 is bidirectional DP PIN 15 ISTYPE 'com,buffer'; " Xilinx Done/Prog~ DOUT PIN 21 ISTYPE 'com,buffer'; " configuration in " serial slave mode CCLK PIN 14 ISTYPE 'com,buffer'; " configuration clock AddrSelH, AddrSelL PIN 18,17; " configuration base address " selection signals on ISA bus SelConf NODE 22; SelInit NODE 16; Addr1 = ^h300; " base address possibilities for Addr2 = ^h30A; " the configuration of the Addr3 = ^h314; " Xilinx chip Addr4 = ^h31E; END ConfAddr;