3 p íklady konstrukcí v jazyku vhdl
Transkript
3 p íklady konstrukcí v jazyku vhdl
Brno Training and Innovation Centre Jazyk VHDL a jeho užití pro syntézu íslicových systém Brno 2005 Doc. Ing. Jaromír Kolouch, CSc. 1 JAZYK VHDL A JEHO UŽITÍ P I SYNTÉZE ÍSLICOVÝCH SYSTÉM .......... 3 1.1 Úvod ......................................................................................................................................................... 3 1.2 Základní struktura modelu v jazyku VHDL ........................................................................................ 5 1.2.1 Deklarace entity............................................................................................................................... 7 1.2.2 T lo architektury ............................................................................................................................. 7 1.3 Datové objekty ...................................................................................................................................... 11 1.3.1 Typy dat ........................................................................................................................................ 13 1.3.2 Atributy ......................................................................................................................................... 16 1.4 P íkazy jazyka VHDL .......................................................................................................................... 17 1.4.1 Výrazy a operátory ........................................................................................................................ 17 1.4.2 Operace s objekty typu std_logic a std_logic_vector.................................................. 19 1.4.3 Soub žné p íkazy .......................................................................................................................... 22 1.4.4 Sekven ní p íkazy ......................................................................................................................... 25 1.4.5 Modelování pam ových prvk pomocí p íkaz IF-THEN-ELSE............................................. 26 1.5 Vytvá ení hierarchických model v jazyku VHDL ........................................................................... 27 1.6 Prost edky jazyka VHDL pro úsporný zápis kódu ........................................................................... 32 1.7 Funkce.................................................................................................................................................... 35 2 POSTUP VYTVO ENÍ POPISU KONSTRUKCE V JAZYKU VHDL ................ 37 3 P ÍKLADY KONSTRUKCÍ V JAZYKU VHDL .................................................. 40 3.1 Kombina ní obvody.............................................................................................................................. 41 3.1.1 P evodník hexadecimálního kódu na kód sedmisegmentového displeje....................................... 41 3.1.2 P evodník kódu BCD na binární kód ............................................................................................ 42 3.1.3 S íta ka v kódu BCD .................................................................................................................... 43 3.1.4 P evodník binárního kódu na kód BCD ........................................................................................ 45 3.2 Subsystémy se zvláštními typy bran.................................................................................................... 49 3.2.1 Subsystémy s t ístavovými výstupy a s otev eným kolektorem .................................................... 49 3.2.2 Subsystémy s obousm rnými branami .......................................................................................... 50 3.3 Pam ové obvody se zp tnou vazbou.................................................................................................. 51 3.4 íta e ..................................................................................................................................................... 51 3.4.1 Binární íta e ................................................................................................................................ 52 3.4.2 íta e pracující v kódu BCD......................................................................................................... 52 3.5 Stavové automaty.................................................................................................................................. 53 3.5.1 Behaviorální popis s deklarací uživatelského typu pro stav .......................................................... 55 3.5.2 Popis s explicitním kódováním stav ............................................................................................ 57 3.5.3 Synchronní nulování u stavových automat .................................................................................. 58 3.6 P íklady iterativních konstrukcí ......................................................................................................... 59 3.6.1 P evodník binárního kódu na Gray v a naopak ............................................................................ 59 3.6.2 Gray v íta .................................................................................................................................. 61 1 4 DODATEK 1: UŽIVATELSKÝ POPIS ZÁKLADNÍCH OBVOD SPLD ........... 64 4.1 Obvody GAL 16V8 a GAL 20V8......................................................................................................... 64 4.2 Obvod GAL 22V10 a jeho varianty..................................................................................................... 65 5 LITERATURA.................................................................................................... 69 2 1 JAZYK VHDL A JEHO UŽITÍ P I SYNTÉZE ÍSLICOVÝCH SYSTÉM 1.1 ÚVOD Název VHDL p edstavuje akronym – VHSIC Hardware Description Language. Samo ozna ení VHSIC je další akronym p edstavující název projektu, v rámci n hož byl jazyk VHDL zpracován, a znamená Very High Speed Integrated Circuits. I když vysoká i nízká rychlost popisovaných obvod není podstatná pro použití jazyka VHDL, uvedené ozna ení se vžilo a obecn se používá. Jazyk VHDL byl p vodn vyvinut p edevším pro modelování a simulaci rozsáhlých systém . Na mnoha jeho konstruktech je to znát, n které z nich nemají pro syntézu v bec význam. Zde se však budeme zabývat p edevším použitím jazyka VHDL k vytvá ení model ur ených pro syntézu íslicových systém . Simulaci budeme využívat p edevším pro ov ení správnosti funkce a asových parametr syntetizované konstrukce. eské termíny budou v prvním výskytu zapsány tu n . asto tyto termíny nejsou ustálené, a proto budeme uvád t i jejich anglické ekvivalenty, které již v tšinou mají ustálenou podobu. Anglické termíny a asto užívané fráze jsou v textu uvád ny kurzívou (zpravidla v závorce). V delších zdrojových textech, které demonstrují probírané jazykové konstrukty, jsou p íslušné úseky textu pro lepší p ehlednost uvedeny tu n . Pro popis modelu navrhovaného systému v jazyku VHDL budeme používat termín zdrojový text nebo stru n ji kód, což odpovídá asto užívanému anglickému termínu code. Základní vlastnosti jazyka VHDL (krom první z nich jsou to i vlastnosti jazyka ABEL): ∗ Je to otev ený standard (open standard). K jeho použití pro sestavení návrhových systém není t eba licence jeho vlastníka, jako je tomu u jiných jazyk HDL (nap íklad u jazyka ABEL). To je jeden z d vod , pro je tento jazyk v návrhových systémech asto používán. ∗ Umož uje pracovat na návrhu, aniž je p edtím zvolen cílový obvod. Ten m že být zvolen až v okamžiku, kdy jsou známy definitivní požadavky na prost edí, v n mž má navrhovaná konstrukce pracovat, a je možno cílový obvod m nit podle pot eby p i zachování popisu v jazyku HDL, p i emž m že být zvolen obvod PLD nebo FPGA. (Device-independent design.) ∗ Je možno provést simulaci navrženého obvodu na základ téhož zdrojového textu, který pak bude použit pro syntézu a implementaci v cílovém obvodu. Zdrojový text je možno zpracovávat v r zných simulátorech a v syntetizérech r zných výrobc . Odsimulovaný text m že být použit v dalších projektech s r znými cílovými obvody, což je podporováno hierarchickou strukturou jazyka. Této vlastnosti jazyka se íká p enositelnost (portability) kódu. ∗ V p ípad úsp šného zavedení výrobku na trh lze popis konstrukce v jazyku VHDL použít jako podklad pro její implementaci do obvod ASIC vhodných pro velké série. N které námitky proti VHDL: ∗ Jazyk VHDL je dosti „upovídaný“, jazykové konstrukty nejsou navrženy tak, aby zdrojový text byl stru ný a p i popisu modelu ur ité konstrukce se setkáme s opakováním blok stejného zn ní. Ty je však možno snadno vytvá et využitím kopírování a podobných možností sou asných editor . ∗ V jazyku VHDL je možno vytvo it neefektivní konstrukce, efektivnost nebo její nedostatek nemusí být na první pohled ze zdrojového textu patrné. To je však vlastnost i jiných jazyk vyšší úrovn a výsledná efektivnost konstrukce závisí nejen na kvalit programových 3 návrhových prost edk , ale také na zkušenosti konstruktéra (návrhá e). Jak vyzrávají návrhové systémy, p ebírají na sebe stále v tší díl pot ebné dovednosti a „chytrosti“, d íve nezbytných u konstruktéra. Tyto vlastnosti samoz ejm bude konstruktér nadále pot ebovat, budou však nasm rovány pon kud jinak než d íve. Základní verze jazyka VHDL byla p ijata jako standard IEEE íslo 1076 v roce 1987. Konstrukty odpovídající tomuto standardu se ozna ují jako konstrukty jazyka VHDL-87. Podobn jako další standardy IEEE, i tento standard se v pravidelném p tiletém intervalu akutalizuje. Upravená verze standardu byla p ijata v roce 1993, odkazuje se na ni jako na standard VHDL-93. Nový standard jazyka z konce 90. let zahrnuje již i možnosti popisu analogových prvk a je znám pod ozna ením VHDL-AMS (Analog and Mixed Signals). V tomto textu je popsána p edevším verze VHDL-87. N které dopl ky verze VHDL-93, které jsou d ležité pro syntézu, jsou uvedeny s pat i ným upozorn ním. Vedle jazyka VHDL se setkáme také s jazykem Verilog, který má podobné použití. Uvádí se, že jazyk VHDL je rozší ený zejména v Evrop , zatímco Verilog se používá hlavn v asijských zemích. V USA se používají oba tyto jazyky. V dále uvedených zp sobech popisu r zných jazykových konstrukt se n kdy vyskytují slova a fráze jako „obvykle“, „m l by být“ a podobn . Tím je myšlena skute nost, že sou asn vyskytující návrhové systémy jsou na r zné úrovni vyzrálosti a inteligence. Systém, který by bylo možno ozna it jako vysp lý, bude takové konstrukty schopen zpracovat a optimalizovat bez problém . Ne všechny sou asné systémy to však zvládnou. Obecn je možno íci, že ím blíže odpovídá popis skute né fyzické realizaci popisované struktury v cílovém obvodu, tím pravd podobn jší je optimální výsledek syntézy. Nap íklad n které zp soby behaviorálního popisu s algoritmickým charakterem mohou p sobit p i syntéze problémy, i když jsou syntakticky správné, protože zapojení, které má být výsledkem syntézy, žádný algoritmický charakter ve skute nosti nemá. Za neme-li pracovat s novým systémem, je vhodné ov it si na jednoduchých p íkladech, zda syntéza probíhá podle o ekávání. N kdy se m že stát, že zdánliv jasný text je syntetizován do struktury, která obsahuje nadbyte nou logiku, p ípadn její ást m že být nevhodná (nap íklad s hazardy) nebo úpln nefunk ní. Lze však ekat, že pr b hem doby budou syntetizéry stále dokonalejší a problém bude ím dál mén . K p enositelnosti kódu je nutno p ipojit poznámku. Jazyk VHDL je velmi rozsáhlý. Byl p vodn ur en p edevším pro simulaci velkých íslicových systém . Jeho použití pro syntézu se za alo rozpracovávat pozd ji a využívá se p i n m jen ást jeho prost edk . V po áte ních fázích tohoto sm ru využití jazyka VHDL byly vytvá eny jednoduché syntetizéry se zna n omezeným rozsahem prost edk jazyka, které jimi byly podporovány. Postupn , jak syntetizéry vyspívaly, tento rozsah se rozši oval. Proto je možno o ekávat, že základní konstrukty jazyka budou r znými syntetizéry zpracovány stejn , ale neobvyklé zp soby popisu a n které vyšší jazykové struktury mohou dávat r zné výsledky p i zpracování r znými syntetizéry. Je také nutno po ítat s tím, že r zné syntetizéry podporují odlišný rozsah prost edk jazyka. Postupem doby, jak budou syntetizéry vyzrávat, se patrn bude rozši ovat oblast jazykových konstrukt využitelných v syntéze, které budou dávat výsledky syntézy skute n nezávislé na použitých návrhových systémech. Zp soby sestavení modelu: Postup zdola nahoru (bottom-up): nejprve se vytvo í díl í bloky modelu a ty se pak skládají do v tších celk . Tento postup byl charakteristický pro sestavování íslicových konstrukcí z pevn zapojených íslicových obvod , které p edstavovaly bloky nejnižší úrovn . 4 Postup shora dol (top-down): definuje se funkce navrhovaného systému jako celku. V n m se vy lení bloky, jejichž funkce se specifikuje spolu s vzájemnou návazností jednotlivých blok . U velkých konstrukcí mohou jednotlivé bloky detailn zpracovávat r zní konstrukté i.Tento proces pokra uje tak dlouho, až se na nejnižší úrovni získají dostate n jednoduché bloky, jejichž funkci je možno popsat prost edky, jako je behaviorální popis v jazycích HDL. Tímto zp sobem se zpravidla pracuje p i syntéze s použitím moderních systém CAD, kde starost o podrobné zapojení p ebírají návrhové systémy. P ístupy zdola nahoru a shora dol m že být ú elné v r zných fázích zpracování ur ité konstrukce kombinovat. Obvykle však p evažuje tendence uvedená výše. Model plochého typu (flat) neobsahuje len ní odpovídající výše uvedeným typ m. P edstavuje konstrukci jako jeden monolitický blok. První dva zp soby sestavení konstrukce se ozna ují jako hierarchické. Jazyk VHDL hierarchi nost konstrukcí podporuje. Rozumn zvolená hierarchie usnad uje orientaci v popisu modelu navrhované konstrukce. 1.2 ZÁKLADNÍ STRUKTURA MODELU V JAZYKU VHDL Konstrukce (model) v jazyku VHDL má dv základní ásti: deklaraci entity (entity declaration) a t lo (popis) architektury (architecture body). Deklarace entity popisuje vstupy a výstupy konstrukce, popis architektury definuje její funkci. Mezery, tabulátory a znaky nového ádku slouží podobn jako v ABELu jako odd lova e, nemají další význam a m žeme je používat podle libosti k roz len ní textu tak, aby byl p ehledný. Jako p íklad uvedeme popis modelu ty bitového komparátoru: LIBRARY ieee; -- odkaz na knihovnu -- TXT1.1 USE ieee.std_logic_1164.ALL; -- odkaz na slohu v knihovn ieee ENTITY EqComp4 IS PORT(a,b: IN std_logic_vector(3 DOWNTO 0); -- vstupy Equals: OUT std_logic); -- výstup END EqComp4; ------- 1 2 3 4 5 6 ARCHITECTURE Dataflow OF EqComp4 IS BEGIN Equals <= '1' WHEN (a = b) ELSE '0'; END Dataflow; ----- 7 8 9 10 V p íkladu jsou ádky opat eny vpravo ísly pro usnadn ní odvolávek na ádky. Vyhrazená (klí ová) slova (reserved words) jsou psána velkými písmeny. Jsou to slova, jejichž význam je stanoven v definici jazyka VHDL. Význam n kterých dalších vícepísmenových slov je definován dalšími standardy, které rozvíjejí základní definici jazyka VHDL, užitými knihovnami ( o t ch pojednáme podrobn ji ve stati v nované hierarchii) apod. – zde nap . std_logic nebo std_logic_vector. Pro n budou užívána malá písmena. Identifikátory (uživatelské symboly) slouží k ozna ení signál , prom nných a podobných objekt . Volí je návrhá . Identifikátor musí za ínat písmenem anglické abecedy a na dalších pozicích m že obsahovat písmena, íslice 0 až 9 nebo znak podtržítko. Podtržítko nesmí být posledním znakem identifikátoru, dv po sob následující podtržítka nejsou p ípustná. Budeme je zapisovat s velkým po áte ním písmenem. Pokud tyto symboly budou složeny z více ástí, budou takto vyzna ena jejich po áte ní písmena. Jednopísmenové symboly budeme však psát malým písmem. Velká a malá písmena se v jazyku VHDL v klí ových slovech a v identifikátorech nerozlišují, v n kterých jiných jazykových konstruktech však mohou být rozlišována. Zde budou klí ová slova psána velkými písmeny jen pro p ehlednost. 5 Komentá e (comments) v textu VHDL za ínají dv ma poml kami (--) a kon í vždy na konci ádku; má-li komentá pokra ovat na dalším ádku, musí toto pokra ování op t za ínat dv ma poml kami. Skupinu poml ek, která, jak poznáme dále, se používá pro vyjád ení nedefinovaných hodnot (don’t care), dokážou syntetizéry od symbolu komentá e rozeznat. Deklaraci entity nazvané EqComp p edstavují ádky 3 až 6. Na ádcích 4 a 5 jsou deklarovány vstupy komparátoru – ty bitové brány a a b, a jednobitový výstup Equals. Deklarace entity p edstavuje textovou formu ozna ení bloku, který komparátor p edstavuje, analogickou schématické zna ce pro integrovaný obvod používané ve schématech. Tato deklarace se pak m že použít pro vložení popisovaného bloku do vyšších hierarchických blok jako komponenty, jak bude vysv tleno dále. Pokud je popisovaný blok nejvyšší hierarchickou jednotkou – vrcholovou jednotkou (top unit) nebo pokud hierarchie v konstrukci není zavedena, budou brány p edstavovat signály na vývodech cílového obvodu, do n hož konstrukce bude vložena. Apostrofy se používají p i uvád ní jednotlivých znak (characters), uvozovky se pak užívají pro et zce (strings), které umož ují zápis hodnoty vektor , nap . "0101". Užitím klí ového slova DOWNTO je definováno po adí bit podle jejich binární váhy, takže zde je bit a(3) nejvýznamn jší bit (MSB), bit a(0) nejmén významný bit (LSB) vektoru a. P i zápisu hodnoty vektoru se jednotlivé íslice zapisují v obvyklém po adí, tj. zleva (MSB) doprava (LSB). N kdy se m žeme setkat i s opa nou definicí pomocí klí ového slova TO, nap . bit_vector(0 TO 3). Pak má nejvýznamn jší bit index 0. ádky 7 až 10 – t lo architektury, stru n ji architektura, popisují funkci entity EqComp4. Podobn jako deklarace entity, i t lo architektury má sv j název, zde Dataflow. Oba názvy mohou, ale nemusí být totožné. K jedné deklaraci entity m že být p i azeno i více architektur s r znými jmény. Nap íklad s íta ka m že být sériová (s postupným p enosem) nebo paralelní, a ob tyto varianty mohou mít spole nou deklaraci entity. Odpovídající architektury je pak možno odlišit r znými jejich názvy. Možnost p i azení v tšího po tu architektur jedné entit je podporována obvykle jen p i simulaci, u syntézy bývá uvažována jen jedna architektura – nap íklad ta, která je zapsaná jako první. P ed klí ovým slovem BEGIN m že být za azena deklarativní ást (declarative part) architektury, v níž mohou být nap íklad deklarovány signály, za ním následuje p íkazová ást (statement part). Deklarace entity, architektura a další kódová uskupení definovaná v jazyku VHDL jako jsou komponenty, funkce, procedury atd., která mohou být jako celek zkompilována, uschována v knihovnách a používána v dalších konstrukcích, p edstavují konstruk ní jednotky (design units) kódu – stru n jim budeme íkat jednotky. Konstruk ní jednotky vytvá ené uživatelem v jazyku VHDL jsou v po íta i obvykle obsaženy ve form soubor (files), jeden soubor však m že obsahovat i více jednotek. Detaily p edstavující organizaci t chto soubor jsou specifické pro každý návrhový systém. Obecn lze íci, že nezáleží na tom, ve kterém souboru je která konstruk ní jednotka obsažena. Návrhové systémy obvykle zajiš ují p i azení soubor ur itému projektu pomocí uživatelského rozhraní, v n mž uživatel soubory pat ící k tomuto projektu vyzna í a pak jsou již všechny jednotky z t chto soubor pro projekt dostupné. Mezi návrhovými systémy však v tom mohou být ur ité rozdíly. Deklarace entity spolu s odpovídajícím t lem architektury tvo í konstruk ní entitu (design entity), stru n e eno – entitu. Ta, jak bylo uvedeno, m že p edstavovat bu vrcholovou jednotku nebo komponentu, která se vkládá do vyšších jednotek hierarchické struktury. 6 1.2.1 Deklarace entity Brány (ports) jsou v deklaraci entity deklarovány v závorce za klí ovým slovem PORT. Pat í k datovým objekt m a definují odpovídající signály (o signálech bude e dále). Deklarace brány se skládá ze jména brány, tj. identifikátoru p íslušného signálu, a dále z ur ení sm ru jejího p enosu (mód – mode) a typu dat, která signál p edstavují. Módy mohou být: ∗ IN – vstup; ∗ OUT – výstup (výstupní signál nem že být použit uvnit konstruk ní entity); ∗ BUFFER – výstup se zp tnou vazbou, z n j signál m že být použit uvnit entity; ∗ INOUT – obousm rný vývod. Význam mód m žeme dob e ilustrovat nap íklad na zapojení výstupních makrobun k obvodu GAL 16V8. Módy IN a OUT odpovídají vstup m a výstup m v jednoduchém módu (simple). Mód OUT m že p edstavovat i t ístavový výstup. Mód INOUT odpovídá výstupu se zp tnou vazbou vedenou z vývodu obvodu (s t ístavovým výstupním budi em). Brány s módem OUT i INOUT však mohou v jazyku VHDL obecn být i registrové – tato konfigurace výstup u uvedeného obvodu není. Brány s módem OUT nelze použít nap íklad pro výstupy íta e, protože jejich signály musí být dostupné uvnit obvodu. Mód BUFFER odpovídá výstupu se zp tnou vazbou v jednoduchém módu nebo konfiguraci výstup v registrovém módu. Brána s módem BUFFER je vybavena zp tnovazebním kanálem, tím však nem že být do obvodu veden signál z vn jšího zdroje. U n kterých systém se mohou vyskytnout problémy p i kompilaci text obsahující brány s módem BUFFER. Tyto brány m žeme nahradit pomocí bran s módem OUT, jestliže jim odpovídající signál deklarujeme jako vnit ní signál (klí ové slovo SIGNAL) pod jiným identifikátorem, ímž jej u iníme dostupným uvnit obvodu, a p íslušné brán tento vnit ní signál p i adíme p i azovacím p íkazem. Jinou možností je p i adit jim mód INOUT. Tato druhá možnost však p edstavuje zbyte nou komplikaci p i simulaci (nutnost vytvo ení vstupního kanálu), takže se doporu uje dávat p ednost první možnosti. Typy dat v jazyku VHDL mohou být velmi r znorodé. Nej ast ji se užívají typy, které jsou p eddefinovány v základních standardech, jako je standard IEEE 1076/87 a jeho dopln ná verze 1076/93, kde je definována tzv. sloha (package) std_logic_1164. Lze ji najít v knihovn IEEE. Zde je deklarován typ dat zvaný std_logic, který m že nabývat devíti hodnot, jak bude uvedeno dále, s odpovídajícím složeným typem std_logic_vector. Tyto typy jsou široce používány v textech VHDL psaných pro syntézu i pro simulaci. Chceme-li v kódu VHDL tyto typy použít, musí zde být na jejich deklaraci odkázáno klauzulemi LIBRARY a USE. Setkáme se však i s typy definovanými p ímo konstruktérem, jak uvidíme nap íklad v ásti v nované stavovým automat m. Podrobn ji se k typ m i ke slohám vrátíme pozd ji. 1.2.2 T lo architektury Architektura m že být popsána r znými styly jazyka VHDL. Pojem stylu není v tomto jazyku p ímo definován, ale n které jazykové konstrukty ve VHDL mohou být za azeny do skupin, které tyto styly p edstavují. Nej ast ji se mluví o stylu behaviorálním, o stylu popisujícím tok dat a o stylu strukturálním. Pojem behaviorální styl je užíván dv ma zp soby. V literatu e týkající se syntézy se obvykle tento styl charakterizuje užitím jazykového konstruktu zvaného proces (process). Výše uvedený ty bitový komparátor m žeme popsat textem zapsaným behaviorálním stylem s využitím procesu takto: 7 LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY EqComp4 IS PORT(a,b: IN std_logic_vector(3 DOWNTO 0); -- vstupy Equals: OUT std_logic); -- výstup END EqComp4; -- TXT1.2 ARCHITECTURE Behavioral1 OF EqComp4 IS BEGIN Comp: PROCESS (a,b) BEGIN IF a = b THEN Equals <= '1'; ELSE Equals <= '0'; END IF; END PROCESS Comp; END Behavioral1; ádek obsahující slovo PROCESS za íná náv štím (Comp:), které je nepovinné. Po slovu PROCESS následuje seznam citlivosti (sensitivity list) – lze íci také seznam p sobících signál , jejichž zm na m že vyvolat zm nu n kterého ze signál , které jsou procesem definovány (v souvislosti se simulací se íká, že tato zm na spustí provedení procesu). Popis procesu pak je ohrazen slovy BEGIN a END PROCESS s p íslušným náv štím. Význa ným rysem procesu je jeho algoritmický charakter, ímž se text procesu podobá po íta ovým programovacím jazyk m. Tato podoba odpovídá skute nosti, je-li v procesu zpracovávána tzv. prom nná. Je zde však významná odlišnost, jde-li o zpracovávání signálu (zatím jsme pracovali jen se signály, podrobnosti o prom nných a o signálech budou uvedeny pozd ji). Tato odlišnost spo ívá v tom, že jsou-li v procesu uvedeny p íkazy postupn p i azující jednomu ur itému signálu r zné hodnoty, jsou p i každém tomto p i azení p edcházející p íkazy p epsány posledním z nich. Po kompilaci je tento signál vytvo en tak, jak to odpovídá poslednímu p i azovacímu p íkazu v procesu, všechny p edcházející p íkazy se ignorují. To platí i tehdy, vyskytuje-li se signál, jemuž se p i azuje nová hodnota, mezi signály, z nichž se nová hodnota po ítá (viz p íklad v textu TXT1.4), p i emž až do ukon ení procesu má tento signál svou p vodní hodnotu. Proces m žeme chápat jako myšlenkovou p ípravu na vytvo ení signál v procesu popsaných. To se skute n d je p i innosti simulátor – v angli tin se p i azení hodnot signál m v procesu íká scheduled assignment, emuž by mohl v eštin odpovídat název plánované i odložené p i azení, na rozdíl od p i azení ozna ovaného jako immediate assignment (okamžité i bezprost ední p i azení), které nastává u p i azovacích p íkaz uvedených mimo proces, a také u zpracování prom nných v procesu. Tento rozdíl si m žeme si p edstavit tak, že ve skute nosti dojde k p i azení nových hodnot všem signál m v procesu najednou v okamžiku skon ení procesu podle posledního p íkazu v myšleném asovém rozvinutí procesu platného pro každý z t chto signál (odložené p i azení), zatímco p i bezprost edním p i azení nabývá signál i prom nná nové hodnoty ihned po provedení p íkazu. Odložené p i azení v procesu se u signál zna í operátorem "<=", zatímco pro p i azení bezprost ední u prom nných se používá symbol ":=". Podobnost s programem pro po íta je u signál p edevším v tom, že výsledek procesu závisí na po adí zápisu jednotlivých p íkaz v n m. To z textu TXT1.2 není p íliš patrné, lépe to uvidíme v textu TXT1.3, který popisuje tentýž komparátor: ARCHITECTURE Behavioral2 OF EqComp4 IS BEGIN Comp: PROCESS (a,b) BEGIN Equals <= '0'; IF a = b THEN Equals <= '1'; END IF; END PROCESS Comp; END Behavioral2; 8 -- TXT1.3 Zde se první p íkaz p i azující nulovou hodnotu signálu equals p epíše druhým p íkazem p i spln ní podmínky a = b, v opa ném p ípad se p íkaz Equals <= '1' neprovede a z stane v platnosti první. Uv domme si však, že výsledný signál Equals p edstavuje ve skute nosti kombina ní funkci signál a a b, která m že být zapsána i jinak, nap . pomocí logického výrazu, a rozvinutí procesu v ase (postupné p episování p i azovacích p íkaz ) je jen pom cka pro naši p edstavu, která n kdy umož uje stru n jší nebo p ehledn jší zápis než jiné zp soby vyjád ení. Jako p íklad syntakticky správného, v cn však chybného textu uvedeme popis modelu ty vstupového sou inového lenu pomocí smy ky (TXT1.4, syntaxe smy ek bude popsána pozd ji): LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY And4 IS PORT(a: IN std_logic_vector(3 DOWNTO 0); x: INOUT std_logic); END And4; -- TXT1.4 ARCHITECTURE AndErr OF And4 IS BEGIN PROCESS (a) BEGIN x <= '1'; FOR i IN 3 DOWNTO 0 LOOP x <= a(i) AND x; END LOOP; END PROCESS; END AndErr; Nezkušený konstruktér by mohl o ekávat, že tak vznikne sou inový len s po tem vstup daným deklarací a hodnotou zadanou v p íkazu smy ky (zde se ty mi vstupy). Kompilací však zjistíme, že výsledkem je bez ohledu na ší ku vektoru a zápis x = "a<0>" * x (ve WebPACKu je tento zápis v reportu fitteru), což odpovídá poslednímu z p íkaz , které p edstavují rozvinutí smy ky. Náprava m že být v tom, že se v procesu deklaruje prom nná, se kterou se vykoná p íslušná iterativní operace (smy ka), a na záv r se její hodnota p i adí signálu x: ARCHITECTURE AndOK OF And4 IS BEGIN PROCESS (a) VARIABLE Xvar: std_logic; BEGIN Xvar := '1'; FOR i IN 3 DOWNTO 0 LOOP Xvar := a(i) AND Xvar; END LOOP; x <= Xvar; END PROCESS; END AndOK; -- TXT1.5 Tato architektura pat í ke stejné entit And4, ve které však mód INOUT brány x m že být nahrazen módem OUT, protože zde není signál x použit jako vstupní signál, jak je tomu ve smy ce architektury AndErr. Kompilací zjistíme, že vyjád ení pro signál x je nyní správné. Architektura m že obsahovat více proces , a v tomto p ípad musíme p ijmout p edstavu, že všechny procesy probíhají soub žn . asto, zejména v pracích týkajících se simulace íslicových systém – nap íklad v literatu e [2], se m žeme také setkat s užitím pojmu behaviorální styl s pon kud jiným, obecn jším obsahem: behaviorálním stylem se zde rozumí popis na vysoké úrovni abstrakce, kde nemusí 9 být uvažovány konkrétní hodnoty ší ky datových a adresových sb rnic, kde nejsou specifikovány hodinové signály a podobn . Nap íklad p i abstraktním modelování po íta e se operace ADD chápe zc obecn , bez uvažování ur itého zp sobu kódování dat. Tento styl se používá k simulaci, pro syntézu je nutno úrove abstrakce snížit. O popisu demonstrovaném výše uvedenými p íklady se pak mluví jako o popisu úrovn RTL (register transfer level). Toto ozna ení vychází z obecné p edstavy o struktu e íslicového systému, který je možno rozd lit na kombina ní ást a registr. Modelování systému na úrovni RTL se pak provádí po blocích s hranicemi vymezenými rozsahem „od registru k registru”, p ípadn jednou z hranic (nebo i ob ma u kombina ních funkcí) m že být vstup nebo výstup cílového obvodu. Po takových blocích se pak také obvykle provádí i optimalizace, která zahrnuje algoritmy analogické minimalizaci známé z obecného kursu íslicové techniky (Karnaughovy mapy), volbu nejvhodn jšího typu registru (D, T, JK) a podobn . To práv odpovídá uvedeným p íklad m. Styl popisující tok dat (dataflow) je ilustrován výše uvedeným textem TXT1.1. asto se tento styl pokládá za zvláštní p ípad behaviorálního stylu. Vedle prostých p i azovacích p íkaz se zde používají p íkazy typu podmín ných p i azovacích p íkaz CASE-WHEN nebo výb rových p i azovacích p íkaz WITH-SELECT-WHEN, tedy tzv. soub žné p íkazy (podrobnosti budou uvedeny pozd ji), z nichž každý m žeme pokládat za zjednodušený tvar procesu s vynechanými slovy PROCESS a END PROCESS, na rozdíl od sekven ních p íkaz používaných v procesech zapsaných úplnou formou. U soub žných p íkaz nezávisí výsledek na po adí jejich zápisu v textu. V dalším textu se obvykle budeme p idržovat základního d lení na styl behaviorální, do n hož budeme zahrnovat i styl popisující tok dat, a na styl strukturální. Tam, kde to bude pot ebné nebo ú elné, použijeme slovní zp esn ní. Strukturální popis je t etím význa ným stylem. Spo ívá ve vkládání tzv. komponent (component) do kódového útvaru zvaného netlist. Podrobnosti o komponentách budou uvedeny v kapitole Vytvá ení hierarchických model v jazyku VHDL. Strukturální styl se používá nej ast ji v hierarchickém uspo ádání konstrukce jako popis propojení díl ích blok nižší úrovn . Náš známý komparátor m že být popsán tímto stylem podle textu TXT1.6: LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY EqComp4 IS PORT(a,b: IN std_logic_vector(3 DOWNTO 0); -- vstupy Equals: OUT std_logic); -- výstup END EqComp4; -- TXT1.6 USE work.Gatespkg.ALL; ARCHITECTURE Struct OF EqComp4 IS SIGNAL x: std_logic_vector(0 to 3); BEGIN u0: Xnor2 PORT MAP (a(0),b(0),x(0)); u1: Xnor2 PORT MAP (a(1),b(1),x(1)); u2: Xnor2 PORT MAP (a(2),b(2),x(2)); u3: Xnor2 PORT MAP (a(3),b(3),x(3)); u4: And4 PORT MAP (x(0),x(1),x(2),x(3),Equals); END Struct; Komponenty použité v textu TXT1.6 nejsou definovány ve standardu VHDL. P edpokládá se, že komponenty Xnor2 a And4 jsou definovány ve sloze Gatespkg vytvo ené uživatelem a ta že je zkompilována do knihovny work. Klauzule USE work.Gatespkg.ALL zp ístup uje tyto komponenty v uvedené architektu e. Klí ové slovo ALL v t chto klauzulích znamená, že 10 jsou zp ístupn ny všechny jednotky (zde komponenty) z p íslušných sloh. (Pokud by v n kolika použitých slohách byly jednotky se stejným jménem, je možno místo slova ALL uvést jednotku, kterou chceme v p íslušné sloze zp ístupnit, a tak vybrat ur itou z nich.) Funkce takto popsaného komparátoru spo ívá v porovnání jednotlivých bit bran a a b jednotkou Xnor2 a ve vytvo ení logického sou inu díl ích výsledk jednotkou And4. Strukturální styl popisu na rozdíl od jiných styl obvykle nedává mnoho možností pro optimalizaci p i syntéze, a poskytuje tak konstruktérovi v tší kontrolu nad výsledkem syntézy. To však nemusí vždy p edstavovat výhodu tohoto stylu, protože se tím nevyužívá inteligence zabudovaná do návrhového systému. Strukturální styl popisu je také obvykle mén p ehledný ve srovnání s behaviorálním stylem. Proto se obvykle tam, kde je to možné, používá rad ji jiných styl . N kdy se však m že stát, že použití behaviorálního stylu vede po syntéze k jiné struktu e, než bylo p vodn zamýšleno, a již proto, že inteligence systému není dostate ná, nebo když chceme vytvo it n jakou netypickou strukturu. Pak m že být strukturální popis vhodným prost edkem k dosažení cíle. asto jsou ur ité komponenty definovány pro syntézu výrobci obvod PLD a FPGA a jsou optimalizovány tak, aby odpovídaly struktu e cílových obvod . To umož uje využít specifických vlastností t chto obvod , p itom se však snižuje nebo odstra uje nezávislost popisu na cílovém obvodu. Mohou rovn ž vzniknout problémy p i simulaci, protože simulátor nemusí mít k dispozici stejné modely jako syntetizér. Syntaxe a další podrobnosti budou uvedeny pozd ji p i popisu hierarchických konstrukcí. Nyní je na míst se ptát, jestli konstrukce s ur itou danou funkcí bude syntetizérem implementována do cílového obvodu vždy stejným zp sobem, bude-li popsána r znými styly, nebo v rámci ur itého stylu r znými zp soby zápisu kódu, kterých bývá obvykle více. Obecn to nemusí platit, ale ím dokonalejšího nástroje použijeme, tím v tší pravd podobnost bude, že výsledkem bude optimální implementace nezávislá na stylu a zp sobu popisu, nebo aspo všechny výsledné implementace budou blízké implementaci optimální. Jak syntetizéry vyzrávají, získávají stále v tší inteligenci a schopnost optimum najít. Ne vždy však je takové optimum jednozna né. V n kterých aplikacích se nap íklad klade d raz na ešení, které spot ebuje co nejmén prost edk (resources) v cílovém obvodu a vede k nejnižší cen , jindy je d ležit jším kritériem rychlost reakce, op t jindy m že být optimem jistý kompromis. V praxi m že však být nejd ležit jším kritériem i rychlost nalezení p ijatelného ešení bez zvláštní optimalizace, která umožní rychlé uvedení výrobku na trh. Zkušený konstruktér dokáže odhadnout, co lze od ešení ur itého problému za daného stavu technologie o ekávat, a umí syntetizér p inutit, aby našel ešení, které je optimální pro daný p ípad. 1.3 DATOVÉ OBJEKTY Jazyk VHDL definuje ty i t ídy (classes) datových objekt : konstanty, signály, prom nné a soubory. Datové objekty musí být p ed svým užitím deklarovány. Konstanty (constants) mají hodnotu, která je nem nná. Ta je konstant p i azena p i její deklaraci. Konstanty zlepšují p ehlednost kódu. Mohou být v textu vícenásobn použity, a pokud se p i další úprav textu vyskytne pot eba hodnotu konstanty zm nit, sta í to u init v deklaraci. Nap íklad m že konstanta definovat ší ku registru: CONSTANT Width: integer := 8; Signály (signals) jsou datové objekty, které se v realizované konstrukci skute n vyskytují (obvykle ve form elektrických signál ). Pat í k nim i signály p íslušné branám, jak jsme je již poznali. Vnit ní signály konstrukce se deklarují užitím syntaxe podle p íkladu: 11 SIGNAL Count: bit_vector(3 DOWNTO 0); Signál m m že být v deklaraci p i azena po áte ní hodnota podobn jako konstantám. Pro syntézu toto p i azení nemá význam, je však respektováno p i simulaci. Signály deklarované jako brány mají definován mód (IN, OUT atd.), signály deklarované klí ovým slovem SIGNAL mód nemají definován. Prom nné (variables) nep edstavují skute né signály. Používají se jako pomocné objekty nap íklad pro po ítání cykl v behaviorálním popisu. Jejich použití v procesech m že pomoci p i algoritmickém vyjád ení signál (p ipome me, že p i azení prom nných je bezprost ední, zatímco p i azení signál v procesu je odložené), jak to bylo ukázáno v textech TXT1.4 a TXT1.5. Používají se asto v textech ur ených k simulaci, a také ve funkcích a v procedurách, zejména p i konverzi typ dat a podobn . P i psaní zdrojových text ur ených k syntéze je t eba mít na pam ti, že se z prom nných nevytvá ejí fyzické struktury v cílovém obvodu. N které sou asné systémy mohou mít s jejich zpracováním problémy. Nejedná-li se o použití, kde je jejich význam zcela jednozna ný a kde je jejich užití doporu eno v dokumentaci k použitému návrhovému systému, je lepší se jim v textech ur ených k syntéze vyhnout. Z výše uvedeného nevyplývá, že všechny signály, tj. objekty deklarované v textu jako SIGNAL, pop ípad PORT v hierarchickém popisu, také budou fyzicky p ítomny ve struktu e obvodu, která vznikne zpracováním textu systémem. P i tomto zpracování se provádí optimalizace, p i níž se n které signály mohou ukázat nadbyte nými (nap íklad p edstavuje-li signál mezivýsledek v kombina ním obvodu, který je možno zjednodušit do dvoustup ové struktury AND-OR s nevelkým po tem term ), a následn mohou být vypušt ny. Naopak p i syntéze složit jších kombina ních obvod bývá nutno zavést další signály, které umož ují automaticky syntetizovat funkce vyžadující v tší po et term než je k dispozici v jednotlivých makrobu kách obvod PLD (št pení sou t ). Analogicky to platí i u systém používajících jiných vstupních prost edk (nap íklad jazyk ABEL, schéma a podobn ). Pouze u velmi jednoduchých systém , jako je easyABEL, se všechny deklarované signály p i zpracovávání pln zachovají (systém s nimi neumí pracovat jinak než je zjednodušovat), ale systémy používající jazyk VHDL obvykle již jsou vybaveny inteligencí pot ebnou k automatickému provedení složit jší optimalizace v etn uvedeného vynechávání nadbyte ných signál , pop ípad p idávání dalších p i št pení sou t . Z prom nných se však žádné fyzické struktury nevytvá ejí. Na vzniku fyzické struktury se prom nná m že podílet pouze tak, že se nap íklad její hodnota p i adí signálu, který je pak syntetizován, jak je to t eba v textu TXT1.5. Soubory (files). Význam tohoto ozna ení v jazyku VHDL se shoduje s obvyklým významem. Soubory se používají nap íklad pro uložení vstupních a výstupních dat p i simulaci. Datovým objekt m jsou v deklaracích p i azeny identifikátory. N kdy m že být výhodné p i adit objekt m více identifikátor , což m žeme zajistit užitím alias . Nap íklad: SIGNAL Address: std_logic_vector(31 DOWNTO 0); ALIAS TopAdd: std_logic_vector( 3 DOWNTO 0) IS Address(31 DOWNTO 28); ALIAS RowAdd: std_logic_vector(11 DOWNTO 0) IS Address(23 DOWNTO 12); Aliasy se používají obvykle pro ozna ení ur itých skupin signál , které jsou leny vektoru, jak je to z ejmé z uvedeného p íkladu. asto m že být výhodné naopak sdružovat jednotlivé signály do v tších skupin. To je možno provést deklarací takové skupiny jako signál a p i azením jejích len signál m, které chceme sdružit. Viz nap . dále uvedený p íklad p evodníku kódu (TXT3.1.1). 12 1.3.1 Typy dat Jazyk VHDL je definován jako p ísn typový (strongly typed), což znamená, že p ed každým použitím n jakého objektu musí být deklarován jeho typ (type). Ten ur uje, jakých hodnot m že deklarovaný objekt nabývat, a jaké operace s ním jsou p ípustné. Datové objekty r zných typ nemohou být vzájemn p i azovány bez konverze. Podobn operátory mohou být užity jen pro datové typy, pro n ž jsou definovány, není-li uživatelem definováno jejich p etížení (overloaded operators). eský termín „p etížení“ není zvolen p íliš zda ile, patrn by bylo výstižn jší slovo rozší ení nebo p edefinování, ale je již vžitý. Nejpoužívan jší typy jsou definovány p ímo v p íslušných standardech, uživatel si však m že definovat i své vlastní typy podle pot eby, jak to poznáme nap íklad u stavových automat . Pro syntézu jsou nejd ležit jší skalární (scalar) a složené (composite) typy dat. Skalární typy mohou být: vý tové (enumeration), celo íselné (integer), s pohyblivou árkou (floating) a fyzické (physical). Složené typy jsou pole (array) a záznam (record). Vý tové typy jsou definovány vý tem hodnot, kterých objekt tohoto typu m že nabývat, uvedeným v závorce v deklaraci typu. Vý tové typy jsou uspo ádané (ordered). To znamená, že pro prvky takového typu jsou definovány rela ní operace, tj. operace <, > a podobn . Po adí, v n mž jsou ve vý tu uvedeny, definuje toto uspo ádání: nejlev jší položka se pokládá za nejmenší, každá další za v tší než p edchozí. Konstruktér si m že definovat vlastní vý tové typy; setkáme se s tím p edevším p i modelování stavových automat . Standard IEEE 1076 definuje dva vý tové typy d ležité pro syntézu: bit a boolean: TYPE bit IS ('0','1'); TYPE boolean IS (false,true); Typ bit m že p edstavovat b žné dvouhodnotové signály. Typ boolean lze chápat jako abstrakci p edchozího typu, kde nejsou zvoleny logické úrovn p i azené p íslušnému signálu. Standard IEEE 1164 definuje typ std_ulogic: TYPE std_ulogic IS ('U', 'X', '0', '1', 'Z', 'W', 'L', 'H', '-'); -- Uninitialized -- Forcing Unknown -- Forcing 0 -- Forcing 1 -- High Impedance -- Weak Unknown -- Weak 0 -- Weak 1 -- Don’t care Literály jako 'Z', 'L' a další musí zde být psány velkým písmem. Tento typ umož uje nap íklad práci s t ístavovými výstupy a dovoluje také vyjád it hodnotu, na níž nezáleží ('-') a využít jí ke zjednodušení výsledku syntézy (pokud to ovšem použitý syntetizér podporuje). Definuje také asto používaný subtyp std_logic, pro n jž je std_ulogic základním typem. Sada hodnot je stejná, ale tento subtyp má navíc p i azenu rozlišovací (vyhodnocovací) funkci (resolution function) nazvanou resolved. Tato rozlišovací funkce je d ležitá p i simulaci, kde dovoluje pracovat s obvody, které mají propojeny výstupy, jako je to nap . u obvod s otev eným kolektorem nebo s t ístavovými výstupy. Simulace však p i použití typu s rozlišovací funkcí probíhá pomaleji, protože simulátor tuto funkci musí p i každém zpracování signálu tohoto typu volat jako podprogram. Proto je p i simulaci rozsáhlých íslicových konstrukcí n kdy vhodn jší použít základní typ, u model ur ených k syntéze však obvykle tato skute nost nehraje významn jší roli. Podrobn ji je tato problematika popsána nap íklad v [4]. 13 Standard IEEE 1076 definuje dále pole std_ulogic_vector a std_logic_vector, n které další subtypy a také funkce pro p etížení operátor , konverzní funkce a další užite né pom cky. Chceme-li je použít, musíme p ed deklaraci entity zapsat následující odkazy: LIBRARY ieee; USE ieee.std_logic_1164.ALL; S typem std_logic a s odpovídajícím složeným typem std_logic_vector pracujeme p i syntéze nej ast ji. Celo íselné typy. Tyto typy a operátory pro rela ní a aritmetické operace s nimi jsou definovány v základním standardu jazyka VHDL. Nástroje zpracovávající texty v jazyku VHDL musí podporovat rozsah celých ísel od -(231 - 1) do +(231 - 1). Signál celo íselného typu, který má být syntetizován, musí být omezen rozsahem (range), z n hož vyplyne požadavek na po et bit , nap íklad: SIGNAL a: integer RANGE 0 TO 255; Subtyp natural obsahuje nulu a kladná celá ísla, subtyp positive jen kladná celá ísla. Typy pole. Objekt tohoto typu je složen z více prvk téhož typu. Nejb žn jší typy tohoto druhu jsou definovány ve standardech 1076 a 1164: TYPE bit_vector IS ARRAY (natural RANGE <>) OF bit; TYPE std_logic_vector IS ARRAY (natural RANGE <>) OF std_logic; V závorce uvedené slovo natural zde znamená typ index . Zápis RANGE <> znamená, že jde o neomezená pole, jejichž rozsah musí být vymezen p i jejich užití v deklaraci (TO, DOWNTO). P i zápisu hodnot objekt typu pole je možno užívat znakových et zc . Nap íklad je-li signál a deklarován zápisem: SIGNAL a: std_logic_vector(7 DOWNTO 0); je mu možno p i adit hodnotu a <= "00011011"; V takovém et zci se mohou vyskytovat i jiné prvky dovolené u p íslušného typu, jako 'Z', '-' apod. (viz nap . TXT2.3). Pro pole typu bit_vector lze užít i binárního, oktalového nebo hexadecimálního formátu. Standard VHDL-93 rozši uje tuto možnost pro všechny typy polí, které obsahují prvky '0' a '1'. Základ (X – hexadecimální, O – oktalový, B – binární zápis) se specifikuje takto: a <= X"1B"; Pokud není základ uveden, je p edpokládán zápis binární. Je-li žádoucí vyzna it v zápisu bitových vektor pomocí znakových et zc skupiny, je možno k tomu použít podtržítko (_), které se p i kompilaci ignoruje (n které systémy však použití podtržítka tímto zp sobem nedovolují). Je také možno využít funkce p evodu ísla typu integer na typ standard_logic_vector konverzní funkcí, nap . p i použití slohy std_logic_arith: a <= conv_std_logic_vector(27,8); nebo se zápisem prvního argumentu jako celého ísla v šestnáctkové soustav a <= conv_std_logic_vector(16#1B#,8); - první argument konverzní funkce je p evád né íslo, druhý je po et bit (ší ka) vektoru. Další možností je zápis ve tvaru agregátu (aggregate), který odpovídá tomu, co v jazyku ABEL nazýváme slovem sada. Výše uvedená hodnota se ve tvaru agregátu zapíše 14 a <= ('0','0','0','1','1','0','1','1'). V tomto zápisu mohou být i prvky jako 'Z', '-' apod, a také jednobitové signály i prom nné. Uvedený zápis p edstavuje p i azení pozi ní (positional association), kde jsou hodnoty uvedené v závorce p i azeny prvk m vektoru na základ jejich po adí ve shod s deklarací p íslušného typu (pozor na možnost sestupné nebo vzestupné deklarace – DOWNTO nebo TO), m žeme však použít i p i azení vyjmenováním (named association), kde p ed znakem => jsou hodnoty index p íslušných prvk : a <= (4=>'1',3=>'1',1=>'1',0=>'1',OTHERS=>'0'). Klí ové slovo OTHERS m že být uvedeno jen v poslední položce a dovoluje zde použít stejného zápisu pro vektory s r znou ší kou, která je dána jejich deklarací. I zde mohou být prvk m p i azeny jednobitové signály a prom nné. Je t eba upozornit na rozdíl od zápisu vložení komponenty (p íkaz PORT MAP), který je podobný, ale místo hodnot index jsou zde formální parametry. U n kterých systém ale mohou být problémy, je-li ší ka vektoru dána genericky, viz TXT3.6.5. Pokud pot ebujeme z objektu typu pole vybrat jeho ást, m žeme k tomu použít ez (slices), jak to bylo nazna eno v odstavci o aliasech. Jednotlivé prvky objektu m žeme zapsat s vyzna ením jeho indexu v závorce, nap . u výše uvedeného signálu a má a(7) hodnotu '0'. D ležitým pojmem je také subtyp (subtype). Subtyp je odvozen od základního typu p idáním omezení (constraint). R zné subtypy téhož základního typu mohou vystupovat v operacích, aniž vznikne chyba p i kompilaci (nesouhlas typ operand ). Subtypy se nej ast ji používají pro tyto ú ely: ∗ pro zkrácené ozna ení omezení typu, ∗ pro uvoln ní pravidel pro kontrolu typu, ∗ pro p i azení vyhodnocovací funkce k základnímu typu. První zp sob použití je velmi astý u deklarací polí. Nap íklad typ std_logic_vector je definován jako neomezený, a vymezením rozsahu index v deklaraci je implicitn definován jeho subtyp. Takový subtyp se ozna uje za anonymní (anonymous), protože nemá p i azen sv j vlastní identifikátor. P i druhém zp sobu použití se využívá toho, že základní typ a jeho subtypy je možno voln mísit ve výrazech a v p íkazech. Nap íklad lze psát: SUBTYPE Int03 IS integer RANGE 0 TO 3; SIGNAL b: Int03; VARIABLE a: integer; ... a <= b; Toto p i azení by bylo nesprávné, kdyby Int03 byl definován jako typ, nap íklad zápisem TYPE Int03 IS RANGE 0 TO 3; (místo definice v prvním ádku textu). V tomto p ípad by typ Int03 nem l s typem integer nic spole ného a výše uvedený zápis by p edstavoval syntaktickou chybu. Je-li však definován jak je výše uvedeno jako subtyp typu integer, je vše v po ádku. Uvedené vymezení rozsahu je d ležité p i syntéze, kdy je pot ebné definovat bitovou ší ku deklarovaného objektu. P íklad použití subtypu t etím zp sobem – vyhodnocovací funkce s ozna ením resolved v definici subtypu std_logic – byl uveden výše, podrobn jší údaje jsou nap . v [6]. 15 1.3.2 Atributy Atributy poskytují informaci o jejich nositelích. T mi mohou být typy, vektory, pole a podobn . Standardn jsou definovány atributy p íslušející p eddefinovaným typ m, uživatel si však m že vytvo it vlastní atributy pro uživatelsky definované typy. Nej ast ji se setkáme s následujícími atributy: 'left – nejlev jší hodnota ve vý tu v typu, levá hranice index ; 'right – nejprav jší hodnota ve vý tu v typu, pravá hranice index ; 'low – nejnižší index pole, 'high – nejvyšší index pole. 'length – délka, tj. po et prvk v poli (v e i ast ji ozna ovaný slovem ší ka – width), 'range – rozsah pole, tedy nap íklad 0 TO 7 nebo 7 DOWNTO 0 u osmibitového vektoru. Apostrof se v angli tin te jako „tick“, tedy tick-left apod. P íklad: Signál a a typy St, Cnt a Wrd jsou deklarovány zápisem SIGNAL TYPE St TYPE Cnt TYPE Wrd a: IS IS IS bit_vector(7 DOWNTO 0); (Idl,Prepar,Rd,Wr); integer RANGE 0 TO 63; ARRAY(31 DOWNTO 0) OF std_logic; -- States -- Count -- Word Uvedeme dále výraz s atributem a jeho význam: a'left a'right a'low a'high a'length a'range 7 St'left 0 St'right 0 St'low 7 St'high 8 St'length 7 DOWNTO 0 Idl Wr Idl Wr 4 Cnt'left Cnt'right Cnt'low Cnt'high Cnt'length Cnt'range 0 63 0 63 64 0 TO 63 Wrd'left Wrd'right Wrd'low Wrd'high Wrd'length Wrd'range 31 0 0 31 32 31 DOWNTO 0 Velmi asto se setkáme s atributem 'event – zm na i událost, dávající hodnotu typu boolean, která je true v p ípad , že u signálu, k n muž se atribut vztahuje, nastala zm na, jinak false. Povšimn te si rozdílu mezi klí ovým slovem RANGE a atributem 'range! Atribut m jsou syntakticky podobné tzv. vymezené výrazy (qualified expressions). Je-li nap íklad v kódu zapsáno '1', není z tohoto zápisu z ejmé, k jakému typu tato hodnota pat í – m že to být typ bit nebo std_logic a další. Chceme-li typ explicitn uvést (type casting), m žeme k tomu užít vymezeného výrazu podle syntaxe: typ'(literál nebo výraz) Nap íklad zápis: bit'('1') p edstavuje hodnotu '1' typu bit. Zde je nutno upozornit na klí ové slovo ATTRIBUTE. Atributy s ním spojené se používají k ízení kompilátoru a k podobným ú el m jako alternativa k použití r zných p epína („options“) v návrhových systémech. Zatímco výše uvedené atributy jsou sou ástí definice jazyka, atributy spojené s klí ovým slovem ATTRIBUTE jsou spíše sou ástí návrhových systém a zp sob jejich použití je nutno najít v dokumentaci k t mto systém m. Používají se nap íklad k p i azení vývod pouzdra signál m, k vyzna ení uzl , které se nemají z konstrukce eliminovat (nap íklad p i odstra ování hazard zavedením konsensu nebo u iterativních konstrukcí – viz [1]) a podobn . Jejich výskyt ve zdrojovém textu má asto za následek omezení jeho p enositelnosti na jiné systémy. Nebývá jich však v textu mnoho, takže to obvykle nep edstavuje vážný problém p i p echodu na jiný systém. 16 1.4 P ÍKAZY JAZYKA VHDL V jazyku VHDL mohou mít p íkazy soub žný nebo sekven ní charakter. N které p íkazy jsou jen jednoho druhu, jiné mohou být obojího druhu. Toto rozlišení se týká toho, ve které ásti popisu se p íkazy mohou používat. Pro stru nost budeme dále mluvit o soub žných a o sekven ních p íkazech, i když jde spíše o to, kde se tyto p íkazy nacházejí i mohou nacházet. Soub žné p íkazy (concurrent statements) se zapisují v textu jazyka mimo procesy, definice funkcí a procedur. Jsou to tyto druhy p íkaz : ∗ podmín né p i azovací p íkazy s klí ovým slovem WHEN-ELSE; ∗ výb rové p i azovací p íkazy s klí ovými slovy WITH-SELECT-WHEN; ∗ procesy jako celky; ∗ vložené komponenty. Sekven ní p íkazy (sequential statements) slouží k algoritmickému vyjád ení popisu. Tyto p íkazy mohou být zapsány jen v procesech, v definicích funkcí a procedur. Pat í k nim: ∗ p i azovací p íkazy pro prom nné (pozor na rozdíl mezi signálem a prom nnou); ∗ p íkazy s klí ovými slovy IF-THEN-ELSE (-ELSIF); ∗ p íkazy s klí ovými slovy CASE-WHEN; ∗ smy ky i s p íkazy užívaných k jejich organizaci (LOOP, NEXT, EXIT, RETURN) a p íkaz NULL. Soub žný i sekven ní charakter mohou mít p íkazy, které mohou být jak uvnit proces , definic funkcí a procedur, tak i mimo n (jejich druh je pak dán tímto umíst ním). Jsou to: ∗ jednoduché p i azovací p íkazy, tj. p íkazy obsahující pouze výrazy; ∗ volání funkcí a procedur; ∗ p íkazy ASSERT (-REPORT). U soub žných p íkaz nezáleží na po adí jejich zápisu. Výsledek kompilace sekven ních p íkaz však závisí na po adí jejich zápisu v textu. To je však dáno ani ne tak p íkazy samotnými, jako spíše zp sobem kompilace proces , funkcí a procedur, v nichž se tyto p íkazy nacházejí. Terminologie zde použitá se m že zdát pon kud zavád jící, pokud si neuv domíme, že výraz „sekven ní p íkazy“ se netýká modelování sekven ních subsystém , jak je známe ze základního kurzu íslicové techniky. Sekven ní p íkazy mohou být použity v procesech, funkcích a procedurách pro modelování kombina ních subsystém . Na druhé stran n které jednoduché sekven ní subsystémy, jako jsou klopné obvody RS a podobn , mohou být modelovány pomocí soub žných p íkaz bez použití proces . Probereme nyní základní jazykové konstrukty jazyka VHDL, z nichž se p íkazy sestavují, a p íkazy nejpoužívan jší v syntéze. 1.4.1 Výrazy a operátory Výrazy (expressions) jsou skupiny identifikátor vzájemn propojených operátory (operators), p i emž se pro vyzna ení po adí operací (tam, kde po adí není definováno standardem nebo kde je pot ebné toto po adí zm nit, p ípadn i jen pro lepší p ehlednost) užívají závorky. Výrazy mohou obsahovat také funkce. V jazyku VHDL se používají výrazy s datovými objekty r zných typ , p i emž je nutno rozlišovat, zda jde o výrazy, které mají být zpracovány syntézou, nebo o výrazy, které nejsou ur eny pro syntézu (výrazy s pomocnými prom nnými v cyklech, v deklaracích a podobn ), jejichž výb r je bohatší, protože se nemusí ešit problémy s jejich fyzickou realizací. Operátory uvedené v následujícím vý tu jsou definovány ve standardu VHDL-87 s výjimkou operátor posuvu a rotace, které jsou definovány standardem VHDL-93. Jejich použití m že být rozší eno p etížením, o n mž bude e dále. 17 Ve výrazech ur ených pro syntézu se používají: ∗ Logické operátory: AND, OR, NAND, NOR, XOR, XNOR a NOT. Mají b žn známý význam. Jsou definovány pro typy bit nebo boolean a pro jednorozm rná pole tohoto typu. Oba operandy musí mít tutéž délku (mimo p ípadu negace). Standard IEEE 1164 rozši uje tyto operátory na typy std_ulogic a std_logic a na jejich jednorozm rná pole. Není mezi nimi definována precedence, tu je nutno vyzna it závorkami, s výjimkou operátoru NOT; operace negace má nejvyšší prioritu. Zápis složit jších logických výraz je dosti t žkopádný. ∗ Rela ní operátory: =, /=, <, <=, >, >= s obvyklým významem. První dva jsou definovány pro všechny typy, ostatní pro skalární typy a pro pole s omezeným rozsahem. Na obou stranách operátoru musí být data téhož typu, pokud tyto operátory nejsou p etíženy. Výsledek rela ní operace je typu boolean, tj. true nebo false. ∗ Operátory posuvu a rotace: SLL, SRL (posuv vlevo a vpravo logický), SLA, SRA (posuv vlevo a vpravo aritmetický), ROL, ROR (rotace vlevo a vpravo) jsou definovány pro stejné typy jako logické operátory. ∗ Aritmetické operátory: + (s ítání) a - (od ítání nebo negace). Jsou definovány pro všechny numerické typy (ur ené pro zápis íselných informací). K aritmetickým operátor m se po ítá také operátor sjednocení (concatenation) zna ený symbolem &. Ve výrazech, které nejsou ur eny pro syntézu, se mohou používat i další operátory (v n kterých systémech jsou v omezeném rozsahu podporovány i pro syntézu): ∗ Operátory násobení a d lení: *, /, MOD, REM. ∗ Operátory mocniny a absolutní hodnoty: ** a ABS. Operace sjednocení se používá pro vytvá ení vícebitových signál z jejich díl ích ástí. Nap íklad signál "00111100" se ší kou 8 bit m žeme zapsat jako sjednocení dvou ty bitových signál : "0011" & "1100". Jsou-li ve výrazu použity operátory jen jednoho druhu, mluvíme o výrazu tohoto druhu, nap . o logickém, rela ním nebo aritmetickém výrazu. Výrazy ovšem mohou být i smíšené. Mezi uvedenými skupinami operátor platí priorita: ím níže je skupina uvedena, tím vyšší prioritu mají její operátory (s výjimkou operátoru NOT). Doporu uje se však používat závorek pro vyzna ení priority i tam, kde to není nezbytn nutné, m že-li vzniknout pochybnost o úmyslu konstruktéra. V možnosti použití r zných operátor se jednotlivé návrhové systémy mohou lišit, zejména pokud jde o možnost použití pro syntézu. P et žování operátor (operator overloading). Operátory jsou definovány standardem VHDL pro ur ité typy, p etížení operátor dovoluje používat je ve v tším rozsahu. Operátory mohou být p etíženy uživatelem definovanými funkcemi. Mnoho t chto funkcí je definováno ve standardech IEEE 1164 a 1076.3. V systému WebPACK jsou ve sloze std_logic_unsigned definovány funkce p et žující aritmetické a rela ní operátory tak, že je možno kombinovat typy std_logic_vector a integer, což dovoluje nap íklad následující zápis: LIBRARY ieee; USE ieee.std_logic_1164.ALL; USE ieee.std_logic_unsigned.ALL; ENTITY Compare IS PORT(a: IN std_logic_vector(3 DOWNTO 0); x: OUT std_logic); END Compare; ARCHITECTURE ArchCmp OF Compare IS BEGIN x <= '1' WHEN a = 123 ELSE '0'; END ArchCmp; 18 -- TXT1.7 Bez p etížení operátoru = by došlo k chyb p i kompilaci podmínky v p edposledním ádku, protože íslo 123 nepat í k typu std_logic_vector. V dalších návrhových systémech mohou být p íslušné funkce obsaženy v jiných slohách, které bývají optimalizovány pro podporované cílové obvody, takže je nutno místo slohy std_logic_unsigned užít p íslušnou slohu podle použitého systému. I když ur itý syntetizér m že být schopen zpracovat kód slohy jiného výrobce, m že se stát, že výsledek zpracování aritmetických a logických struktur nebude optimální, protože použitá sloha nebyla optimalizována pro tento systém. Významné použití nachází princip p et žování operátor u aritmetických operací. Aritmetické operátory jsou v základní definici jazyka definovány pro typy integer a floating (tento druhý typ se však pro syntézu nepoužívá). I když je možno pracovat p i syntéze s typem integer, asto je vhodn jší užít p etížení aritmetických operátor na další datové typy. Mnoho funkcí pro p etížení operátor je definováno ve standardech IEEE 1164 a 1076.3. Poslední z nich p et žuje operátory + a - (s ítání a od ítání) na páry operand s t mito typy: (unsigned, unsigned), (unsigned, integer), (signed, signed) a (signed, integer). Jsou definovány ve sloze numeric_std standardu 1076.3. Mnoho firem produkujících syntetizéry dodává slohy p et žující aritmetické operátory na datové typy std_logic a std_logic_vector. Ty obvykle definují také p etížení rela ních operátor na tyto typy, takže syntetizér je zpracovává tyto typy jako ísla bez znaménka nebo jako n kterou z reprezentací ísel se znaménkem, nej ast ji jako ísla v kódu dvojkového dopl ku. P i práci s aritmetickými operátory je t eba prostudovat dokumentaci k syntetizéru, který používáme – pot ebné údaje bývají uvedeny v ásti pojednávající o slohách. 1.4.2 Operace s objekty typu std_logic a std_logic_vector P i syntéze se nej ast ji používají typy std_logic a std_logic_vector, které jsou definovány navazujícím standardem IEEE 1164 ve sloze std_logic_1164. Ta bývá ve všech návrhových systémech zkompilována v knihovn ieee. V této sloze jsou definovány operátory pro logické operace, nejsou však zde definovány operátory pro aritmetické operace, protože objekty uvedeného typu je možno interpretovat jako íslo bez znaménka nebo se znaménkem (p ípadn i jinak) a provedení aritmetických operací je pro r zné tyto interpretace odlišné. Operátory pro srovnávání – rela ní operátory (=, /=, >, <, >=, <=) jsou v základní definici jazyka definovány pro objekty celo íselných a vý tových typ a pro objekty s typem jednorozm rného pole prvk t chto typ , tj. i pro objekty typu std_logic_vector. Tyto operátory fungují pro objekty typu pole podle b žných p edstav, tj. s jejich interpretací jako ísel bez znaménka, jen tehdy, mají-li dvojice porovnávaných objekt stejný po et prvk . Mají-li tyto dvojice odlišný po et prvk , mohli bychom o ekávat, že p i porovnání bude kratší pole zleva dopln no nulami. Je nutno zd raznit, že tomu tak není! Popis výsledku takového porovnání je pon kud komplikovaný a je podrobn uveden nap íklad v [5], s. 428. Chceme-li provád t porovnání objekt typu std_logic_vector s nestejným po tem prvk , m žeme postupovat podobn , jako je popsáno v následujícím odstavci pro aritmetické operace s použitím sloh std_logic_arith (numeric_std), std_logic_unsigned nebo std_logic_signed. V t chto slohách je definováno p etížení rela ních operátor dávající správné výsledky porovnání i v p ípad nestejné délky porovnávaných polí. Tam, kde je pot ebné provád t aritmetické operace (s ítání, od ítání, násobení) s objekty typu std_logic_vector, je nutno p íslušné operátory (pop ípad p etížení t chto operátor pro uvedené typy) definovat ve form funkce. Aby nebylo nutno deklarace t chto funkcí v každém textu vypisovat, jsou uvedeny ve slohách v knihovn ieee. Sloha, která dovoluje 19 ob uvedené interpretace (tj. jako íslo bez znaménka nebo se znaménkem), je ozna ena std_logic_arith, pop . numeric_std. V této sloze jsou definovány typy unsigned a signed a operace s t mito typy, jejichž provedení odpovídá interpretaci dané názvem typu. P i použití této slohy musíme objekty, s nimiž máme v úmyslu provád t aritmetické operace, deklarovat jako typ unsigned nebo signed, nebo jsou-li deklarovány jako typ std_logic_vector, musíme je na p íslušné typy p evést. P evod se nejsnadn ji provede explicitní konverzí typ – viz dále. Pokud používáme jen jednu z uvedených interpretací, m žeme jednodušeji provád t aritmetické operace p ímo s objekty typu std_logic_vector s použitím slohy std_logic_unsigned nebo std_logic_signed. (Uvedená pravidla snad na první pohled vypadají složit , sta í si však uv domit, že objekt typu std_logic_vector m že být interpretován jako íslo bez znaménka nebo jako íslo se znaménkem, a uvedeným výb rem slohy std_logic_unsigned nebo std_logic_signed požadovanou interpretaci definujeme. P i použití slohy std_logic_arith je však interpretace definována tím, jakého typu, tj. unsigned nebo signed, jsou operandy, a jsou-li typu std_logic_vector, ji musíme definovat tím, že operandy p evedeme na typ unsigned nebo signed, p i emž je patrn nejjednodušší použít explicitní konverze typ , jak uvidíme dále.) Ve všech t ech uvedených slohách jsou obsažena také p etížení aritmetických operátor tak, aby bylo možno provád t operace, kde je jeden operand n kterého z uvedených typ a druhý je celo íselný. Jako p íklad uve me popis modelu s íta ky: LIBRARY ieee; USE ieee.std_logic_1164.ALL; USE ieee.std_logic_unsigned.ALL; ENTITY AddVec IS PORT(a,b: IN std_logic_vector(3 DOWNTO 0); s1,s2: OUT std_logic_vector(3 DOWNTO 0)); END AddVec; -- TXT1.8 ARCHITECTURE Add4 OF AddVec IS BEGIN s1 <= a + b; s2 <= a + 2; END Add4; Signály zde mají ší ku jen 4 bity, i když výsledek m že být p tibitový. Operátor + však dává jako výsledek vektor o ší ce, která odpovídá operandu (s ítanci) s v tší ší kou. To dovoluje snadné modelování obvyklých binárních íta , u nichž není vytvo en p enosový bit, zápisem Cnt <= Cnt + 1; íta tímto zápisem popsaný p echází ze svého nejvyššího stavu do stavu vynulovaného. Pokud chceme vytvo it s íta ku s p enosovým bitem, m žeme ji popsat následujícím textem: LIBRARY ieee; USE ieee.std_logic_1164.ALL; USE ieee.std_logic_unsigned.ALL; ENTITY Add_w_ca IS PORT(a,b: IN std_logic_vector(3 DOWNTO 0); sum: OUT std_logic_vector(4 DOWNTO 0)); END Add_w_ca; ARCHITECTURE Add4Ca OF Add_w_ca IS BEGIN sum <= ('0' & a) + b; END Add4Ca; 20 -- TXT1.9 Pro konverzi typ je n kdy možno výhodn použít explicitní konverze typ (explicit type conversion). Jazyk VHDL dovoluje provád t konverzi tzv. blízce p íbuzných (closely related) typ zápisem názvu požadovaného typu následovaného hodnotou, která má být p evedena uvedenou v závorce. Dva typy p edstavující pole jsou blízce p íbuzné, obsahují-li prvky t chže typ , mají-li tentýž po et rozm r a stejné typy index (obvykle integer). Dv skupiny blízce p íbuzných typ p edstavují i celo íselné typy a typy p edstavující ísla s pohyblivou árkou. P íklad: USE ieee.std_logic_1164; USE ieee.std_logic_arith; ... Cnt: BUFFER std_logic_vector(7 DOWNTO 0); ... Cnt <= unsigned(Cnt) + 1; Zde je signál Cnt explicitn p eveden na typ unsigned. Pro ten je ve sloze std_logic_arith definována funkce p et žující operátor pro s ítání, p i emž je výsledek typu std_logic_vector: FUNCTION "+" (L: unsigned; R: integer) RETURN: std_logic_vector; Tento text najdeme v deklaraci slohy (package declaration). Je z n j patrný po et a typ argument a typ výsledku funkce. Pokud pot ebujeme zjistit podrobnosti o funkci, musíme prostudovat t lo slohy (package body). N kdy je deklarace slohy dopln na stru ným komentá em, kde jsou tyto podrobnosti uvedeny (p esto však, pot ebujeme-li zjistit p esné chování funkce, m že být nutné analyzovat t lo slohy). Texty sloh lze zpravidla najít v instala ních adresá ích návrhových systém . Shrnutí: Typ std_logic_vector: je vhodný pro b žné ú ely p i syntéze tam, kde není nutno d lat aritmetické operace s vektory s jejich r znou interpretaci, kde je pot ebné detekovat hrany signál a kde p ichází v úvahu použití signál typu tristate a open collector. Je možné provád t bez použití další slohy rela ní operace vektor tohoto typu chápaných jako ísla bez znaménka stejné délky, ne však vektoru a objektu celo íselného typu nebo vektor s r znou délkou. Pro rela ní operace s takovými operandy lze použít slohy std_logic_arith (numeric_std) s konverzí vektoru na typ unsigned nebo signed nebo p ímo (bez konverze) sloh std_logic_unsigned, std_logic_signed. Rovn ž pro aritmetiku – inkrementaci a dekrementaci, s ítání, od ítání a násobení vektor a celo íselných operand lze tento typ použít p i užití sloh, nap . std_logic_arith i numeric_std (s použitím konverze na typ unsigned nebo signed), nebo sloh std_logic_unsigned, std_logic_signed. Typy operand a výsledku musí odpovídat typ m uvedeným v deklaraci p íslušné slohy. Ve slohách std_logic_unsigned, std_logic_signed jsou uvedeny definice i p etížení operátor pro aritmetické operace vektor typu std_logic_vector (a také pro operace s operandy smíšených typ ), ve sloze std_logic_arith i numeric_std je to jen pro typy unsigned nebo signed s výsledkem t chto dvou typ nebo typu std_logic_vector. Typy unsigned a signed: jsou definovány ve sloze std_logic_arith jako pole prvk typu std_logic, a jsou vhodné pro aritmetické operace s ítání, od ítání, násobení, srovnávání i ve významu ísel s r zným po tem bit a také pro operace s dalším celo íselným operandem. Použití t chto typ je ast jší v textech ur ených pro simulaci s vyšší úrovní abstrakce, u model nižší úrovn (zejména ur ených k syntéze) je obvyklejší a vhodn jší 21 použít typ std_logic_vector. P i syntéze se obvykle vytvá ejí postfit (postroute) modely s typy std_logic_vector, a je-li p vodn objekt deklarován jako typ unsigned nebo signed, m že se pak stát, že model vytvo ený syntézou nebude zám nný p i p ípadné další simulaci s modelem, z n hož byla syntéza provedena, a že pro správné provedení asové simulace s modely vytvo enými p i syntéze bude nutné d lat v textech úpravy. Praktický záv r pro jednoduchou aritmetiku – pro popis íta , s íta ek apod. s datovými vstupy a výstupy chápanými nejobvyklejším zp sobem, tj. jako ísla bez znaménka: ∗ vstupy a výstupy t chto obvod lze deklarovat jako typ std_logic_vector a použít slohu std_logic_unsigned (nejjednodušší a nejpoužívan jší), ∗ nebo p i stejn deklarovaných vstupech a výstupech použít slohu std_logic_arith a konverzi typu operand (nejlépe explicitní – výhodné zejména tam, kde je nutno používat ob interpretace objekt typu std_logic_vector, tj. jako íslo bez znaménka i se znaménkem), ∗ nebo kone n deklarovat vstupy a výstupy jako typ unsigned a použít slohu std_logic_arith (p i asové simulaci však mohou nastat drobné problémy). Pro práci s ísly se znaménkem lze u init obdobné záv ry. Poznámka. V poslední dob se prosazuje doporu ení místo sloh std_logic_unsigned a používat rad ji slohy std_logic_arith nebo slohy numeric_std, která je tém shodná s poslední uvedenou slohou. D vodem je údajn nejednozna nost obsahu prvních dvou sloh. Sloha numeric_std je standardem IEEE, což o slohách std_logic_unsigned, std_logic_signed a std_logic_arith neplatí a t chto sloh existuje více verzí od r zných výrobc . Použití slohy std_logic_arith je velmi rozší ené a v sou asné dob není jasné, p evládne-li v budoucnosti užití této slohy nebo slohy numeric_std. Podrobnosti lze najít nap íklad v literatu e [3]. V mnoha sou asných návrhových systémech se však asto používají i slohy std_logic_unsigned, std_logic_signed (platí to i pro systém WebPACK) a z praktického hlediska lze íci, že se jejich údajné nevýhody zatím neprojevily. Za nejvhodn jší lze patrn pokládat užití sloh doporu ovaných v dokumentaci k používanému návrhovému systému, a pokud je zde uvedeno více možností, pak by bylo z ejm vhodné dát p ednost sloze numeric_std, p ípadn sloze std_logic_arith. std_logic_signed 1.4.3 Soub žné p íkazy Soub žné p íkazy mohou být zapsány v textu pouze mimo procesy, definice funkcí a procedur. Krom dále uvedených p íkaz a také proces a vložených komponent zde mohou být zapsány rovn ž jednoduché p i azovací p íkazy, volání funkcí a procedur a p íkazy ASSERT (- REPORT). P íkaz WHEN-ELSE (podmín ný p i azovací p íkaz) se zapisuje podle vzoru: Jméno_signálu <= Hodnota_a WHEN Podmínka_1 ELSE Hodnota_b WHEN Podmínka_2 ELSE ... ... ... ... ... ... ELSE Hodnota_x; Podmínkou bývá rela ní výraz, jehož vyhodnocením vznikne výsledek typu boolean. Je-li tento výsledek true, íkáme, že je podmínka spln na. Signálu Jméno_signálu je p i azena ta z hodnot, která je uvedena v prvním z ádk , v nichž je podmínka spln na. Po adí ádk zde tedy definuje jejich prioritu. Na rozdíl od výb rového p i azovacího p íkazu, který bude popsán dále, nejsou kladeny na podmínky v podmín ném p i azovacím p íkazu žádné dodate né požadavky. 22 Jako p íklad uvedeme popis prioritního enkodéru: LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY Priority IS PORT(a,b,c,d: IN std_logic; -- datové vstupy w,x,y,z: IN std_logic; -- podmínky f: OUT std_logic); -- výstup END Priority; -- TXT1.10 ARCHITECTURE ArchPri OF Priority IS BEGIN f <= a WHEN w = '1' ELSE b WHEN x = '1' ELSE c WHEN y = '1' ELSE d WHEN z = '1' ELSE '0'; END ArchPri; Pokud se v posledním p íkazu vypustí ást ELSE '0', nehlásí obvykle kompilátory syntaktickou chybu, ale u n kterých syntetizér to zp sobí vznik záchytného registru, podobn jako u p íkaz IF-THEN-ELSE (viz dále), u jiných (jako Altera MAX+PLUS II) nemá tato zm na na výsledek vliv. Aby byl výsledek jednozna ný, lze doporu it, aby záv re né p i azení (nap . zde zmín né ELSE '0'), k n muž dojde p i nespln ní všech podmínek, nebylo vypušt no i opomenuto. P íkaz WITH-SELECT-WHEN (výb rový p i azovací p íkaz) se zapisuje podle vzoru: WITH Výb rový_výraz SELECT Jméno_výrazu <= Hodnota_a WHEN Hodnota_1_výb rového_výrazu, Hodnota_b WHEN Hodnota_2_výb rového_výrazu, ... ... ... Hodnota_x WHEN Poslední_hodnota_výb rového_výrazu; Signálu Jméno_signálu je p i azena ta z hodnot, která je uvedena v ádku obsahujícím aktuální hodnotu výb rového výrazu. V tomto p íkazu musí být uvedeny všechny možné hodnoty výb rového výrazu. Proto výsledek kompilace nezávisí na po adí ádk v p íkazu a p íkazem tedy na rozdíl od p íkazu WHEN-ELSE není definována priorita. To m že vést k jednoduššímu výsledku kompilace. Zápis m žeme zestru nit využitím klí ových slov TO a OTHERS a symbolu | (n které systémy, jako nap íklad ISE nebo MAX+PLUS II, dovolují použít zde klí ové slovo TO jen pro s typu integer) podle následujícího vzoru: WITH s SELECT x <= a WHEN b WHEN c WHEN d WHEN "0000" TO "0100", "0101"|"0111", "1010", OTHERS; Klí ovým slovem TO v prvním ádku jsou pokryty hodnoty výb rového výrazu mezi uvedenými krajními hodnotami, v dalším symbol | teme jako "nebo" (význam je z ejmý). 23 Význam slova OTHERS vysv tlíme v následujícím p íkladu popisu multiplexoru ty bitových signál : ty LIBRARY ieee; -- TXT1.11 USE ieee.std_logic_1164.ALL; ENTITY Mux IS PORT(a,b,c,d: IN std_logic_vector(3 DOWNTO 0); -- datové vstupy s: IN std_logic_vector(1 DOWNTO 0); -- výb rový vstup x: OUT std_logic_vector(3 DOWNTO 0)); -- výstup END Mux; ARCHITECTURE ArchMux OF Mux IS BEGIN WITH s SELECT x <= a WHEN "00", b WHEN "01", c WHEN "10", d WHEN OTHERS; END ArchMux; Vyhrazené slovo OTHERS zde zastupuje všechny ostatní možné hodnoty výb rového signálu. Není to jen hodnota "11". Syntaxe jazyka vyžaduje, aby byly zastoupeny i další hodnoty p ípustné u typu std_logic_vector, jako "1X", "UU" a všechny další, celkem tedy 81 hodnot – možných variací dvou hodnot z devíti uvedených ve vý tu v definici typu std_logic. Pro syntézu má ovšem význam jen hodnota "11" z t chto zastupovaných hodnot. Vynecháme-li v deklaracích prom nnou d a nahradíme-li poslední ádek t la architektury textem "----" WHEN OTHERS;, provede se minimalizace s využitím nedefinované hodnoty x pro tyto hodnoty signálu s ke zjednodušení výsledku (to však platí jen pro systémy, které toto využití podporují, nap íklad pro WARP). Dalším zajímavým p íkladem je následující text popisující model detektoru hodnoty signálu s rozsahem od -8 do +7 kódovaného zápisem v dvojkovém dopl ku: ENTITY Detector IS PORT(InSig: IN bit_vector(3 DOWNTO 0); Limit: OUT bit); END Detector; -- TXT1.12 ARCHITECTURE ArchDet OF Detector IS BEGIN WITH InSig SELECT Limit <= '1' WHEN "0110"|"0111"|"1000"|"1011"|"1010", '0' WHEN OTHERS; END ArchDet; N které návrhové systémy dovolují nahradit vý et hodnot signálu InSig zápisem Signál Limit zde má jedni kovou hodnotu, je-li signál InSig v absolutní hodnot roven íslu 6 nebo v tšímu. "0110" TO "1010". Vkládání komponent (component instantiation). Komponenty vložené do textu p i strukturálním popisu jsou také druhem soub žných p íkaz . P íklad (TXT1.6) byl uveden v ásti pojednávající o tomto stylu. Další informace budou uvedeny v kapitole pojednávající o hierarchii. Procesy jako celky p edstavují také soub žné p íkazy. asto se uvádí, že soub žné jednoduché p i azovací p íkazy jsou zjednodušeným zp sobem zápisu procesu. Toto tvrzení vychází z postupu p i simulaci, který je u obou uvedených konstrukt v podstat shodný. 24 1.4.4 Sekven ní p íkazy Tyto p íkazy se používají v procesech, ve funkcích a v procedurách. P ipome me, že proces jako celek p edstavuje soub žný p íkaz, tj. nezáleží na po adí, v n mž jsou jednotlivé procesy a další soub žné p íkazy v kódu uvedeny. P íkazy uvnit procesu však mají sekven ní charakter a jejich po adí ovliv uje výsledek procesu. Nezam ujte je s modelováním sekvenních obvod ! Pomocí proces je možno modelovat kombina ní i sekven ní subsystémy. P íkaz IF-THEN-ELSE je sekven ním prot jškem p íkazu WHEN-ELSE. Používá se k výb ru skupiny p íkaz , která se má vykonat v závislosti na vyhodnocení podmínky, z n kolika takových skupin. Zapisuje se podle vzoru: IF Podmínka_1 THEN Skupina_p íkaz _1 ELSIF Podmínka_2 THEN Skupina_p íkaz _2 ELSIF ... ... ... ... ... ... ... ELSE Skupina_p íkaz _n END IF; Je-li Podmínka_1 spln na, bude platit Skupina_p íkaz _1. V opa ném p ípad , je-li spln na Podmínka_2, platí Skupina_p íkaz _2, atd. Syntaxe jazyka dovoluje zapsat tento p íkaz i s jen jednou podmínkou a s odpovídající skupinou p íkaz , bez ástí ELSIF a ELSE. Je-li v n které skupin p íkaz v p íkazu IF-THEN-ELSE p i azena ur itému signálu n jaká hodnota, pak se v jazyku VHDL p edpokládá, že signál má mít tuto hodnotu až do nového p i azení. Není-li v procesu, v n mž je p íkaz IF-THEN-ELSE zapsán, uvažovanému signálu p i azena p ed tímto p íkazem jiná hodnota a není-li tomu tak ani v jiné jeho skupin p íkaz , vytvo í se syntézou procesu struktura záchytného klopného obvodu nebo registru (latch – podrobn ji viz dále), jehož zapisovací signál je vytvo en z podmínky. To je významný rozdíl od jiných jazyk , nap íklad od jazyka ABEL. Této skute nosti se íká implicitní pam . Vznik záchytného klopného obvodu m že být nežádoucím d sledkem nepromyšlen zapsaného kódu. K tomu m že snadno dojít, má-li p íkaz IF-THEN-ELSE jen skupinu p íkaz bez ásti ELSE a není-li v procesu p edtím p i azena signálu n jaká hodnota. Vytvo ení nežádoucího záchytného registru m žeme snadno zabránit tím, že v procesu p ed p íkazem IF-THEN-ELSE zapíšeme definici tzv. defaultních hodnot signál , které z stanou v platnosti, pokud je tento p íkaz nezm ní, viz nap . text TXT1.3, nebo tím, že uvedeme ást ELSE s p i azením opa né hodnoty tomuto signálu (TXT1.2). P íklad procesu s p íkazem IF-THEN-ELSE – popis modelu multiplexoru: PROCESS (a,b,c,d,s) BEGIN IF s = "00" THEN x <= ELSIF s = "01" THEN x <= ELSIF s = "10" THEN x <= ELSE x <= END IF; END PROCESS; -- TXT1.13 a; b; c; d; Tento text by bylo možno p epsat s defaultním p i azením pro signál x takto: PROCESS (a,b,c,d,s) BEGIN x <= d; IF s = "00" THEN x <= a; ELSIF -- ... atd. po THEN x <= c; END IF; S p íkazy IF-THEN-ELSE se setkáme velmi asto p edevším p i modelování synchronních sekven ních subsystém , jako jsou registry, íta e a stavové automaty. P íklady budou uvedeny v kapitole pojednávající o t chto subsystémech. 25 P íkaz CASE-WHEN je dalším ze sekven ních p íkaz používaných v procesech. Je to sekven ní prot jšek p íkazu WITH-SELECT-WHEN. Jeho syntaxe je: CASE Výb rový_výraz IS WHEN Hodnota_1_výb rového_výrazu => Skupina_p íkaz _1 WHEN Hodnota_2_výb rového_výrazu => Skupina_p íkaz _2 ... ... ... WHEN Hodnota_n_výb rového_výrazu => Skupina_p íkaz _n Všechny možné hodnoty výb rového výrazu musí být uvedeny, a to jen jednou. P íkazy CASE-WHEN se používají nej ast ji p i modelování stavových automat . P íklady jejich použití jsou uvedeny v p íslušné kapitole. 1.4.5 Modelování pam ových prvk pomocí p íkaz IF-THEN-ELSE Pam ovými prvky rozumíme klopné obvody nebo registry, které mohou být ízeny staticky nebo hranou ídicího (hodinového) signálu. Registrem se v eském vyjad ování obvykle ozna uje soubor n kolika klopných obvod se spole nými ídicími signály. Staticky ízené klopné obvody i registry se v angli tin obvykle ozna ují slovním spojením transparent latch nebo stru n latch, obvody ízené hranou (jednoduché klopné obvody i registry) se pak nazývají register. Je zde tedy ur ité p ekrytí významu. Oba tyto obvody mohou být ze syntaktického hlediska správn popsány více zp soby. U behaviorálních model ur ených k syntéze je však vhodné používat ur ité standardní zp soby popisu – šablony (template), pro které jsou ve v tšin návrhových systémech zabudovány mechanismy rozpoznání (inferencing) t chto blok a které zajistí jejich správnou syntézu a implementaci. U klopných obvod typu D ízených staticky je p i implementaci t eba bu použít zvláš k tomu ur ených strukturních prvk vytvo ených na ipu, nebo p i jejich vytvo ení v programovatelném poli je nezbytné zajistit zachování konsensu (termu odstra ujícího hazard), což p i jiných zp sobech popisu nemusí být zajišt no. Dob e zpracovaný systém zajistí vytvo ení správn fungujícího obvodu i bez nutnosti zásahu konstruktéra pro zachování konsensu. Pro obvody ízené hranou se prakticky používají pouze speciální strukturní bloky. Proto je d ležité seznámit se s dokumentací systému, který používáme – zp soby popisu rozpoznávané systémem bývají zpravidla uvedeny jako šablony nebo v nápov d , takže jsou snadno dostupné p i zapisování kódu. I když mohou být v rozpoznávání uvedených blok mezi r znými návrhovými systémy ur ité rozdíly, lze íci, že tém všechny tyto systémy jsou správn schopny zpracovat texty, které nyní uvedeme. Tyto texty jsou založeny na použití procesu s p íkazem IF-THEN, který neobsahuje ást ELSE. Není-li v tomto p íkazu spln na podmínka, z stává hodnota signálu i prom nné v obvodu zachována (implicitní pam ), což je práv požadovaná funkce. Pro staticky ízený klopný obvod typu D, do n jž se vstupní signál Din zapisuje b hem jedni kové hodnoty ídicího signálu Gate, m žeme použít následující popis (viz také odst. 3.2.2): PROCESS (Gate, Din) BEGIN IF Gate = '1' THEN Dout <= Din; END IF; END PROCESS; Klopný obvod ízený vzestupnou hranou se nej ast ji popisuje s využitím atributu který p edstavuje zm nu hodnoty signálu. Uvedeme text modelující osmibitový registr, který se od textu pro jednoduchý klopný obvod liší jen deklarací brány vstupního a výstupního signálu, p i emž popis architektury je v obou p ípadech stejný: 'event, 26 LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY Reg_d IS PORT(d: IN std_logic_vector(7 DOWNTO 0); -- vstup q: OUT std_logic_vector(7 DOWNTO 0); -- výstup Clk: IN std_logic); END Reg_d; ARCHITECTURE AttrEvent OF Reg_d IS BEGIN PROCESS (Clk) BEGIN IF (Clk'event AND Clk = '1') THEN q <= d; END PROCESS; END AttrEvent; -- TXT1.14 END IF; Popis vychází z p edstavy, že se p i simulaci testuje, zda v sou asném simula ním kroku je hodnota signálu Clk odlišná od hodnoty v p edcházejícím kroku, a pokud tomu tak je, má výraz Clk'event jedni kovou hodnotu. Jde-li o vzestupnou hranu, je i hodnota signálu Clk v tomto kroku jedni ková a podmínka pro p i azení je spln na. Registr ízený sestupnou hranou se popisuje stejn s tím, že se testuje, zda je hodnota signálu Clk nulová. V seznamu citlivosti procesu je jen signál Clk, protože ostatní signály (zde d) výstup registru p ímo neovliv ují. Má-li registr mít asynchronní vstup (nulovací a podobn ), musí se p íslušný asynchronní signál objevit v deklaraci entity a do seznamu citlivosti procesu je nutno tento signál doplnit k hodinovému signálu. Je-li nap íklad asynchronní nulovací signál ozna en identifikátorem ARst, bude mít za átek popisu architektury zn ní: ARCHITECTURE AttrEventR OF Reg_d IS BEGIN PROCESS (Clk,ARst) BEGIN IF ARst = '1' THEN q <= '0'; ELSIF (Clk'event AND Clk = '1') THEN q <= d; ... –- žádné ELSE! P íklad synchronního nulování je uveden v kapitole o stavových automatech. Jiný používaný zp sob modelování téhož obvodu ízeného hranou spo ívá v použití funkcí rising_edge nebo falling_edge definovaných ve sloze std_logic_1164. Pracujeme-li se signály typu std_logic, musíme p ed deklarací entity uvést odkaz na tuto slohu, takže jsou dostupné i uvedené funkce: ARCHITECTURE FuncRisingEdge OF Reg_d IS BEGIN PROCESS (Clk) BEGIN IF rising_edge(Clk) THEN q <= d; ... –- žádné ELSE! Zápis IF (Clk'event AND Clk ='1') THEN... je nahrazen textem IF rising_edge(Clk) THEN..., jinak vše z stává beze zm ny. Z hlediska syntézy jsou oba tyto zp soby popisu ekvivalentní. Popis využívající atribut 'event nevyžaduje volání funkce a používá se ast ji. Ob as se setkáme i s jinými zp soby popisu klopných obvod , které patrn byly vyžadovány n kterými staršími návrhovými systémy. V dnešní dob však p edstavují spíše výjimky, které nemusí u sou asných systém vést ke správnému výsledku syntézy. 1.5 VYTVÁ ENÍ HIERARCHICKÝCH MODEL V JAZYKU VHDL Jazyk VHDL poskytuje možnosti pro modelování složitých íslicových systém , které mají hierarchickou stavbu. P i vytvá ení modelu se takový systém rozd lí na díl í bloky, jejichž popis je snadn ji zvládnutelný a p ehledn jší, a které m žeme samostatn odladit (simulovat). Tyto bloky bývá nej ast ji vhodné popsat behaviorálním stylem, není to však nezbytné. Jejich propojení se pak popíše strukturálním stylem. Tak vznikne hierarchická 27 struktura modelu. Ta bývá v nejjednodušším p ípad dvoustup ová. Není ale vylou eno použít i více stup hierarchie, pokud to je ú elné. Pak bývají bloky nejnižší úrovn modelovány behaviorálním stylem a ve vyšších hierarchických stupních se užívá styl strukturální. P íliš mnoho hierarchických stup však m že vést k nep ehlednosti modelu. Jako p íklad uvedeme popis modelu známého zapojení osmibitového asynchronního binárního íta e, který je vytvo en jako kaskáda klopných obvod typu T, na jejichž vstupy je p iveden konstantní signál logické jedni ky, takže každý tento obvod d lí sv j hodinový signál dv ma. Hodinový vstup každého klopného obvodu je p ipojen na výstup p edcházejícího, hodinový vstup prvního klopného obvodu je vstupem íta e. V tomto zapojení ítá íta zp t, drobnou úpravu zapojení pro získání íta e ítajícího vp ed ponecháme jako cvi ení tená i. Model íta e m že být fyzicky roz len n do dvou soubor , které budou tvo it dvoustup ovou hierarchickou strukturu. V prvním z nich je behaviorálním stylem popsán klopný obvod typu T (TXT1.15 – entita T_ff) p edstavující základní prvek íta e jako nejnižší stupe hierarchie. LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY T_ff IS PORT(Tin,Clk: IN std_logic; Qout: BUFFER std_logic); END T_ff; -- TXT1.15 ARCHITECTURE T_ff_arch OF T_ff IS BEGIN PROCESS (Clk) BEGIN IF (Clk'event AND Clk = '1') THEN IF (Tin = '1') THEN Qout <= NOT Qout; END IF; END PROCESS; END T_ff_arch; END IF; V textu TXT1.16, který zde p edstavuje druhou (nejvyšší) hierarchickou úrove , je uveden strukturální popis íta e. V popisu architektury je nejprve deklarována komponenta T_ff. To je nutné, aby do následujícího strukturálního popisu mohla být tato komponenta n kolikanásobn vložena. Deklarace komponenty je formáln velmi podobná deklaraci p íslušné entity. Její vložení zajiš ují v textu TXT1.16 p íkazy PORT MAP s navazujícím p i azením skute ných signál v íta i (a, ClkIn a q(0) až q(6), q(0) až q(7)) signál m lokálním (Tin, Clk, Qout) vyskytujícím se v popisu komponenty T_ff – klopného obvodu. Vstupním signálem klopných obvod je zde konstantní signál a. Zp sob p i azení uvedený v p íkladu se nazývá p i azení vyjmenováním (named association), kdy jsou vyjmenovány signály lokální a každému je za znakem => p i azen signál skute ný, je však možno použít i stru n jšího p i azení pozi ního (positional association), u n hož se uvedou jen skute né signály v poadí, v n mž jsou uvedeny v deklaraci komponenty. Má-li komponenta výstupy, které se nepoužívají v jednotce, do níž je komponenta vložena, ozna í se tyto výstupy místo skute ných signál , které by jim jinak byly p i azeny, klí ovým slovem OPEN. P íkladem m že být íta využívaný ve funkci d li e kmito tu, u n hož se využívá jen výstup nejvyššího bitu. Viz také text TXT3.1.4b. LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY AsynCnt IS PORT(ClkIn: IN std_logic; q: BUFFER std_logic_vector(7 downto 0)); END AsynCnt; 28 -- TXT1.16 ARCHITECTURE AsCntGen OF AsynCnt IS COMPONENT T_ff PORT(Tin,Clk: IN std_logic; Qout: BUFFER std_logic); END COMPONENT; SIGNAL a: std_logic := '1'; BEGIN Tff0: T_ff PORT MAP (Tin=>a, Clk=>ClkIn, Tff1: T_ff PORT MAP (Tin=>a, Clk=>q(0), Tff2: T_ff PORT MAP (Tin=>a, Clk=>q(1), ... ... ... Tff7: T_ff PORT MAP (Tin=>a, Clk=>q(6), END AsCntGen; Qout=>q(0)); Qout=>q(1)); Qout=>q(2)); Qout=>q(7)); Odlad né a zkompilované bloky, kterými mohou být popisy entit a odpovídajících architektur, slohy obsahující deklarace komponent, typ a podobn si uživatel m že uschovat v knihovnách (library). Jazyk VHDL nep edepisuje ur itý zp sob fyzické realizace knihoven, ten je zvolen až p i každé konkrétní implementaci jazyka v návrhovém systému. M že to být nap íklad adresá (directory), který obsahuje soubor se seznamem prvk knihovny a další soubory s t mito prvky. Každý návrhový systém obsahuje p eddefinovanou knihovnu ozna enou work. Do ní se ukládají prvky, na nichž uživatel práv pracuje. Tato knihovna je implicitní, tj. pokud se nespecifikuje práce s jinou knihovnou, pracuje se s touto. Pokud chceme využívat prvky jiné knihovny, musíme ji u init viditelnou (visible) pomocí klauzule LIBRARY. Tato klauzule uvedená p ed popisem entity u iní p íslušnou knihovnu viditelnou v tomto popisu a v p idružených popisech architektury. Do knihovny work umis ují návrhové systémy automaticky n které slohy – nap . WARP tam umístí slohu std_arith a n které další, které umož ují pracovat s obvody PLD a FPGA firmy Cypress. Tyto další slohy nemusí být fyzicky umíst ny v adresá i, který je vytvo en vždy p i vytvo ení knihovny work, ale v této knihovn jsou pak na n dostupné odkazy. Návrhové systémy dále obsahují standardn knihovnu ieee, ve které je obsažena sloha std_logic_1164 a n které další. Typy std_logic, std_logic_vector atd. deklarovaných v této sloze m žeme použít, jestliže je zviditelníme klauzulí USE, jak to již bylo uvedeno ve v tšin p íklad . Prvky hierarchické struktury nižší úrovn zkompilované v knihovn work nebo nacházející se ve slohách v jiných knihovnách zviditeln ných klauzulemi LIBRARY a USE pak deklarujeme v textu popisujícím vyšší hierarchickou úrove modelu jako komponenty, p ípadn tato deklarace m že být ve sloze, kterou musíme v tomto textu zviditelnit uvedeným zp sobem. Deklarace komponent popisuje jejich propojovací prost edky – brány, pomocí nichž propojíme komponenty ve vyšší hierarchické úrovni strukturálním stylem. Standard VHDL-93 dovoluje zjednodušení zvané p ímé vkládání entity (direct entity instantiation): p i n m není nutno deklarovat komponentu (v textu TXT1.16 odpadá tu n psaný úsek mezi slovy COMPONENT a END COMPONENT), a za p edpokladu, že entita T_ff je zkompilována v knihovn work, m žeme vložení prvního klopného obvodu popsat takto: Tff0: ENTITY work.T_ff PORT MAP (Tin=>a, Clk=>ClkIn, Qout=>q(0)); a podobn i pro další klopné obvody. Vložení entity je tak formáln zcela analogické používání podprogram v programovacích jazycích. Klí ové slovo COMPONENT se pak v textu v bec nevyskytuje. Z d vod návaznosti na standard VHDL-87 se však v anglických textech i v tomto p ípad asto setkáme s ozna ením tohoto postupu jako p ímé vkládání komponenty (direct component instantiation). 29 Prvky propojované do výsledného celku v textu nejvyšší úrovn m žeme do konstrukce vkládat p ímým vložením entit (to není ješt možné ve standardu VHDL-87) nebo jejich vložením pomocí komponent. Použití komponent, které je pon kud složit jší, umož uje v tší variabilitu ve vytvá ení struktury modelu pomocí konfigurací (configurations). Konfigurace se používají standardn p i simulaci, nejsou však obvykle podporovány nástroji pro syntézu. Pokud není popis konfigurace modelu explicitn uveden, p edpokládá se platnost tzv. implicitních pravidel pro vazbu mezi komponentami vloženými do architektury modelu a entitami, které jsou pro systém k dispozici (tj. zhruba e eno, které jsou popsány v souborech pat ících k projektu nebo jsou deklarovány zde nebo v knihovnách, které byly zviditeln ny a jejich zkompilované popisy jsou v knihovnách p ítomny). Implicitní pravidla p i azují komponent užité v architektu e entitu, která má stejný název a stejné brány. Popis konfigurace se m že za lenit do architektury, v níž jsou deklarovány p íslušné komponenty (pak mluvíme o specifikaci konfigurace – configuration specification), nebo m že p edstavovat samostatnou jednotku, která se za adí do projektu (pak jde o deklaraci konfigurace – configuration declaration). Ve strukturálních modelech se jako základní prvky mohou používat zkompilované bloky dodávané výrobci cílových obvod , které jsou optimalizované pro ur itý obvod ( íká se jim parametrizované moduly a podobn ). Pro ur itou funkci je možno použít r zné tyto moduly zam ené na r zné cílové obvody. P i zm n typu cílového obvodu je nutno takový blok nahradit blokem platným pro nový obvod. To je možno provést úpravou popisu v p íslušné úrovni hierarchie a novou kompilací celého modelu, nebo zm nou konfigurace a kompilací jen této konfigurace. Pomocí konfigurace je také možno ur ité deklaraci entity p i adit r zné popisy její architektury. Jako p íklad použití konfigurací uvedeme strukturální popis s íta ky vycházející z klasického zapojení dvou p ls íta ek a sou tového lenu, jak je uvád no v u ebnicích íslicové techniky. Na obr. 1.1(a) je znázorn na entita FullAdd p edstavující s íta ku. P edpokládáme, že v knihovn work je zkompilována entita HalfAdd p edstavující p ls íta ku – obr. 1.1(b) – se dv ma p i azenými architekturami, jedna z nichž je ozna ena identifikátorem Behavioral a druhá Structural. V další knihovn Hradla, která m že být vytvo ena uživatelem nebo dodána výrobcem obvod PLD, je zkompilována entita Lpo2 s architekturou Beh_Or. Vstupy a výstup této entity jsou v knihovn Hradla ozna eny i1, i2 a z, jak je nazna eno na obr. 1.1(c). Ta je užita jako komponenta Or_2 v architektu e FullAddArch a ozna ení jejích vývod zm n no na a, b, c podle obr. 1.1(d) pomocí klauzule PORT MAP. Specifikací konfigurace je vybrána pro vložení p ls íta ky H1 architektura Behavioral a pro vložení H2 architektura Structural. Výsledné zapojení s íta ky je nakresleno na obr. 1.2. Pro p ls íta ku HA, obr. 1.1(b) platí: Sum = a ⊕ b, Cy = a · b. Není obtížné dokázat, že zapojení podle obr. 1.2 p edstavuje úplnou s íta ku. Cin In1 In2 FA (a) Sum a Cout b HA (b) Sum i1 Cy i2 1 (c) z a 1 b c (d) Obr. 1.1. Úplná s íta ka FullAdd (a) a její komponenty – p ls íta ka HalfAdd (b) a sou tový len Or_2 (c,d) 30 H2 HA Cin In1 HA In2 s1 Sum s3 1 s2 H1 Cout O1 Obr. 1.2. Struktura úplné s íta ky FullAdd Popis s íta ky p edstavuje následující text: LIBRARY ieee; LIBRARY Hradla; USE ieee.std_logic_1164.ALL; ENTITY FullAdd IS PORT(In1,In2,Cin: IN std_logic; Sum,Cout: OUT std_logic; END FullAdd; -- TXT1.17 ARCHITECTURE FullAddArch OF FullAdd IS -- deklarace komponent -----COMPONENT HalfAdd PORT(a,b: IN std_logic; Sum,Cy: OUT std_logic; END COMPONENT; COMPONENT Or_2 PORT(a,b: IN std_logic; c: OUT std_logic); END COMPONENT; SIGNAL s1,s2,s3: std_logic; -- deklarace signál -- specifikace konfigurace architektury FullAddArch -----FOR H1: HalfAdd USE ENTITY work.HalfAdd(Behavioral); FOR H2: HalfAdd USE ENTITY work.HalfAdd(Structural); FOR O1: Or_2 USE ENTITY Hradla.Lpo2(Beh_Or) PORT MAP(i1=>a,i2=>b,z=>c); -- t lo architektury FullAddArch - vložení komponent -----BEGIN H1: HalfAdd PORT MAP(a=>In1,b=>In2,Sum=>s1, Cy=>s2); H2: HalfAdd PORT MAP(a=>Cin,b=>s1, Sum=>Sum,Cy=>s3); O1: Or_2 PORT MAP(a=>s3, b=>s2, c =>Cout); END FullAddArch; Význam jednotlivých ástí specifikace konfigurace: H1, H2, O1 – náv ští pro vkládané komponenty, HalfAdd, Or_2 – název vkládané komponenty deklarované v deklarativní ásti architektury, work, Hradla – knihovna, kde se nachází zkompilovaná entita uvedená za te kou, HalfAdd, Lpo2 – název entity, Behavioral, Structural, Beh_Or – použitá architektura. Tu n vypsanou ást, tj. specifikaci konfigurace architektury FullAddArch, je možno z jejího popisu vypustit a její konfiguraci popsat deklarací konfigurace, která bude za len na do projektu jako zvláštní jednotka. Ta m že být samostatn zkompilována a uložena v knihovn , a p i její p ípadné modifikaci není t eba kompilovat jiné jednotky, což je výhodné zejména p i simulaci rozsáhlých konstrukcí. Deklarace konfigurace tomu odpovídající je uvedena v následujícím textu, kde je navíc p íkaz pro každou komponentu zakon en klauzulí END FOR: 31 CONFIGURATION ConfigAdd OF FullAdd IS -- TXT1.18 FOR FullAddArch -- identifikátor konfigurované architektury FOR H1: HalfAdd USE ENTITY work.HalfAdd(Behavioral); END FOR; FOR H2: HalfAdd USE ENTITY work.HalfAdd(Structural); END FOR; FOR O1: Or_2 USE ENTITY Hradla.Lpo2(Beh_Or) PORT MAP(i1=>a,i2=>b,z=>c); END FOR; END FOR; END ConfigAdd; S íta ka popsaná v textu TXT1.17 a TXT1.18 je samoz ejm jen školní p íklad hierarchické konstrukce. Ve skute nosti se architektura této s íta ky m že v jazyku VHDL popsat mnohem jednodušším zp sobem, jak to bylo uvedeno nap íklad v textu TXT1.9, který navíc m že p edstavovat vícebitovou s íta ku. 1.6 PROST EDKY JAZYKA VHDL PRO ÚSPORNÝ ZÁPIS KÓDU Jazyk VHDL obsahuje prost edky, jejichž využitím je možno zapsat popis modelovaných subsystém s ur itou obecností a v konkrétních p ípadech zp esnit jejich implementaci jednoduchým zadáním íselné hodnoty parametr a podobn . Sem pat í konstrukty, které umož ují vytvo it strukturu v kódu VHDL se stejnou funkcí jako má ur itá posloupnost p íkaz , kterou je možno vygenerovat n jakým algoritmem. Tato struktura však m že být zapsána stru n ji a umož uje prakticky libovoln zvolit délku nahrazované posloupnosti p íkaz pouhým stanovením ur ité íselné konstanty. P íkazy skupiny GENERATE. Tyto p íkazy se používají pro úsporný zápis soub žných p íkaz . Formou p íkladu zde uvedeme p íkaz FOR-IN-TO-GENERATE. Tento p íkaz je asto užite ný p i použití strukturálního stylu, zejména u datových struktur s velkou bitovou ší kou, kde je nutno vkládat opakovan tytéž komponenty, m že však být použit i jinde. Text p edstavující vrcholovou úrove popisu asynchronního íta e z p edcházející kapitoly žeme s využitím p íkazu GENERATE zapsat stru n ji. Zapojení prvního klopného obvodu se od dalších liší tím, že jeho hodinový vstup p edstavuje vstup íta e, zatímco hodinové vstupy dalších klopných obvod jsou p ipojeny k výstup m p edcházejících. Proto bude vložení prvního tohoto obvodu provedeno zvláštním p íkazem, zatímco zbývajících sedm je popsáno p íkazem FOR-IN-TO-GENERATE s pomocnou prom nnou i. Tu není nutno zvláš deklarovat, pokud se používá uvedeným zp sobem v p íkazu FOR-IN-TO-GENERATE. P ed p íkazem GENERATE musí být uvedeno náv ští (g1 v následujícím textu): (TXT1.16) m Tff0: T_ff PORT MAP (Tin=>'1', Clk=>ClkIn, Qout=>q(0)); g1: FOR i IN 0 TO 6 GENERATE Tff: T_ff PORT MAP (Tin=>'1', Clk=>q(i), Qout=>q(i+1)); END GENERATE; Je zde využito zjednodušení ze standardu VHDL-93, dovolující zapsat v p íkazu PORT MAP výrazy, tedy i konstanty jako '1', takže není nutno deklarovat signál a. Nepravidelnosti v jednotlivých p íkazech vytvá ených p íkazem FOR-IN-TO-GENERATE mohou být ošet eny podmín ným p íkazem IF-GENERATE. V uvedeném p íkladu m že být první vložení komponenty zahrnuto do struktury p íkazu FOR-IN-TO-GENERATE takto: BEGIN g: FOR i IN 0 TO 7 GENERATE g0: IF i = 0 GENERATE TFF0: T_ff PORT MAP (Tin=>'1', Clk=>ClkIn, END GENERATE g0; 32 Qout=>q(0)); g1: IF i > 0 GENERATE Tff: T_ff PORT MAP (Tin=>'1', Clk=>q(i-1), Qout=>q(i)); END GENERATE g1; END GENERATE g; END AsCntGen; Tento zápis sice není stru n jší, je však v n m celý cyklus vytvá ení struktury íta e zahrnut do smy ky p íkazu FOR-IN-TO-GENERATE, takže m že být ve složit jších p ípadech p ehledn jší. Výhodné je, že p i zm n bitové ší ky íta e sta í zm nit rozsah v p íkazu smy ky. Tato výhoda je zvlášt patrná, je-li ší ka definována p íkazem GENERIC, který bude uveden dále. P íkaz IF-GENERATE má tvar p ipomínající sekven ní p íkaz IF-THEN-ELSE, je však vhodné si uv domit, že je to p íkaz vytvá ející soub žnou strukturu. P íkazy GENERATE jsou soub žnou formou smy ek, které budou popsány dále. Mohou obsahovat jakékoli soub žné p íkazy, tedy i procesy, vložení komponent, další vno ené p íkazy GENERATE apod. Jsou tedy obecn jší než smy ky. Podrobnosti lze najít nap . v literatu e [2], [4], [7]. P i zápisu sekven ních p íkaz uvnit proces je asto možné dosáhnout podobné úspory použitím smy ek (loop). Smy ky mohou být typu for nebo typu while. Mohou, ale nemusí být ozna eny náv štím, jak uvidíme dále. Jako p íklad si uve me zápis p edstavující asynchronní nulování pole registr o osmi prvcích, z nichž každý má 9 bit . Pole m že sloužit nap íklad jako pam ová struktura typu FIFO nebo LIFO (po dopln ní výstupních a ídicích bran a p íslušných ídicích obvod ): LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY RegArray IS PORT(Clk,Rst: IN std_logic; D_in: IN std_logic_vector(8 DOWNTO 0)); END RegArray; -- TXT1.19 -- vstup ARCHITECTURE Arch_rarr OF RegArray IS TYPE RegArr IS ARRAY(7 DOWNTO 0) OF std_logic_vector(8 DOWNTO 0); SIGNAL Registers: RegArr; -- pole osmi devítibitových registr BEGIN PROCESS (Clk,Rst,D_in) BEGIN IF Rst = '1' THEN FOR i IN 1 TO 7 LOOP RegArr(i) <= (OTHERS => '0'); -- asynchronní nulování END LOOP; ELSIF (Clk'event AND Clk = '1') THEN -- ... ... ... (popis synchronního pln ní a další funkce registr ) END IF; END PROCESS; END Arch_rarr; Podobn jako u p íkazu FOR-IN-TO-GENERATE, prom nná i je deklarována automaticky. Místo smy ky typu for m žeme použít smy ku typu while: PROCESS (Clk,Rst,D_in) VARIABLE i: integer; BEGIN i := 0; IF Rst = '1' THEN WHILE i < 7 LOOP RegArr(i) <= (OTHERS => '0'); i := i + 1; END LOOP; 33 -- TXT1.20 -- asynchronní nulování ELSIF (Clk'event AND Clk = '1') THEN ... ... ... (popis synchronního pln ní a další funkce registr ) END IF; END PROCESS; -- Zde je nutno prom nnou i deklarovat, inicializovat a inkrementovat. P ipome me, že p i azovací p íkazy u prom nných mají charakter bezprost edního p i azení (immediate assignment) na rozdíl od p i azovacích p íkaz užívaných v procesu pro signály (scheduled assignment), a zna í se také odlišným p i azovacím operátorem (:=). N které systémy jako WARP vyžadují, aby tato prom nná byla inicializována uvnit p íkazové ásti procesu, tedy mezi klí ovými slovy BEGIN a END v procesu, jiné dovolují inicializaci v jeho deklara ní ásti stru n ji zápisem VARIABLE i: integer := 0; Nemají-li se p íkazy ve smy ce provést pro všechny hodnoty pomocné prom nné, m žeme použít k ukon ení ur itého pr b hu smy kou podmín ného p íkazu NEXT: PROCESS (Clk,Rst,D_in) BEGIN -- TXT1.21 IF Rst = '1' THEN FOR i IN 1 TO 7 LOOP NEXT WHEN i = 4; -- vynech 4. registr RegArr(i) <= (OTHERS => '0'); -- ostatní nuluj END LOOP; ELSIF (Clk'event AND Clk = '1') THEN -- ... ... ... (popis synchronního pln ní a další funkce registr ) END IF; END PROCESS; Smy ky mohou být vno ovány do sebe (nested). V tomto p ípad je možno jednotlivé smy ky ozna it náv štím a v p íkazech NEXT, jsou-li použity, pak uvést, která smy ka se jimi ukon uje: s1: WHILE i < 10 LOOP s2: WHILE i < 10 LOOP -- ... ... ... (p íkazy) NEXT s2 WHEN i = j; -- ... ... ... (p íkazy) END LOOP s2; END LOOP s1; Smy ky pat í ke konstrukt m ve VHDL, u nichž se v sou asné dob mohou projevit ur ité rozdíly p i zpracování r znými systémy. P i jejich použití je proto vhodné ov it si, jak s nimi nakládá systém, s nímž pracujeme. K prost edk m pro úsporný zápis kódu m žeme také po ítat tzv. parametrizované komponenty, u nichž je n který rys (nap íklad bitová ší ka registru) definován parametrem, jehož íselná hodnota se zadává až p i vložení komponenty do jednotky vyšší hierarchické úrovn . Popis parametrizované komponenty je podobný popisu jakékoliv jiné komponenty, pouze s tím rozdílem, že ur itý rys, nap íklad bitová ší ka, je dána parametrem ozna eným klí ovým slovem GENERIC. V následujícím textu (TXT1.22) je popsáno jako parametrizovaná komponenta pole ty registr se ší kou zadanou generickým parametrem Width. Signál j vybírá registr, do n hož se p i aktivní hran hodinového signálu zapisují data D_in a jehož obsah je veden na výstup D_out. (Takové pole registr by patrn nem lo praktický smysl, ale nevelké rozší ení, kdy místo jednoho výb rového signálu budou dva, jeden pro vstup a druhý pro výstup, již smysl tomuto poli dává – ponecháme je na procvi ení tená i.) 34 Komponenty deklarované v popisu architektury jsou p ístupné jen uvnit této architektury. Hlavní smysl parametrizovaných komponent je však v jejich použití jako stavebních prvk ve vyšší hierarchické úrovni dalších konstrukcí. Výrobci obvod PLD a FPGA vytvá ejí pak pro asto používané bloky (registry, íta e apod.) p eddefinované moduly optimalizované pro p íslušnou strukturu cílových obvod . Deklarace t chto komponent se uvád jí ve slohách. Jednotky deklarované ve slohách jsou pak p ístupné i pro další konstrukce. Popis architektury t chto komponent pak m že být výrobcem dodán v knihovnách již ve zkompilovaném tvaru, takže není pro uživatele p ístupný jinak než pro vložení zkompilované komponenty do uživatelovy konstrukce.Uživatel tak nemá k dispozici zdrojový text pro tyto komponenty, ímž si jejich auto i chrání své duševní vlastnictví (intelectual property). Ve slohách mohou být krom komponent uvedeny i další jednotky, které pak m že uživatel zp ístupnit klauzulí USE ve svých konstrukcích. Tak jsme se již setkali s definicemi typ , nap íklad typu std_logic nebo std_logic_vector uvedených v knihovn IEEE ve sloze std_logic_1164. Rovn ž asto se využívají funkce p edstavující p etížené operátory, které jsou také obsaženy ve standardních slohách. 1.7 FUNKCE Funkce v jazyku VHDL pat í ke konstrukt m vyšší úrovn a používají se p edevším v modelech ur ených pro simulaci. V textech dosud uvedených jsme se setkali s funkcemi, které byly definovány ve slohách, které se dodávají spolu s návrhovým systémem. Byly to p edevším funkce p et žující operátor s ítání, které jsou v systému WebPACK obsaženy ve slohách std_logic_arith, std_logic_unsigned a std_logic_signed, umíst né v knihovn ieee (viz TXT1.8, kde je operátor s ítání p vodn definovaný pro signály typu integer p etížen tak, aby umožnil jeho užití pro signál typu std_logic_vector). To je nej ast jší použití funkcí v modelech ur ených k syntéze. Další obvyklá možnost použití funkce byla nazna ena v diskusi k textu TXT1.23, kde šlo o p evod signálu j typu std_logic_vector na signál Jint typu integer. Místo procesu Slv2int v tomto textu m žeme v systému WARP použít funkce to_integer, která je obsažena ve sloze std_arith. V tomto p ípad text uvedeného procesu nahradíme zápisem Jint <= to_integer(j); a sou asn do deklarativní ásti p idáme klauzuli USE work.std_arith.ALL; (p edpokládáme, že sloha std_arith je zkompilována v knihovn work). Podívejme se nyní na zjednodušený text funkce to_integer z uvedené slohy. Syntaxe zápisu funkce je z ejmá, takže se omezíme na poznámky vysv tlující význam jednotlivých p íkaz . FUNCTION To_integer (Arg: std_logic_vector) RETURN natural IS -- TXT1.24 CONSTANT Arg_left: integer := Arg'length - 1; VARIABLE Xarg: std_logic_vector(Arg_left DOWNTO 0); VARIABLE Result: natural := 0; BEGIN FOR i IN Xarg'range LOOP Result := Result + Result; IF Xarg(i) = '1' THEN Result := Result + 1; END IF; END LOOP; RETURN Result; END To_integer; 35 Funkce je uvedena klí ovým slovem FUNCTION následovaným identifikátorem funkce (uvádíme jej s velkým po áte ním písmenem, protože nejde o p esnou verzi této funkce z uvedené slohy; ta obsahuje ješt navíc kontrolu, zda argument není prázdný a zda neobsahuje jiné symboly než 0 a 1). V závorce je pak uveden identifikátor vstupního parametru Arg, za nímž je uveden jeho typ. Za závorkou následuje klí ové slovo RETURN, za nímž je uveden typ výsledku. (P ipome me, že natural je subtyp typu integer.) Dále je definována konstanta Arg_left a prom nná Xarg pomocí atribut vstupního argumentu, aby funkce mohla zpracovávat argumety r zné délky. To_integer Následující text mezi slovy BEGIN a END p edstavuje smy ku pro vlastní p evod. Klí ovým slovem RETURN je ozna en výsledek funkce, kterým se nahradí její volání p i jejím použití. Inverzní k popsané funkci je funkce to_std_logic_vector. Krom argumentu p edstavujícího vstupní íslo obsahuje ješt druhý argument udávající ší ku výsledného vektoru. Spolu s dále popsanou funkcí pro p etížení operátoru s ítání je tak jako funkce to_integer obsažena ve sloze std_arith v systému WARP. Podívejme se nyní na p íklad druhé asté aplikace funkcí v modelech ur ených k syntéze, a to p etížení operátoru s ítání tak, aby akceptoval sou et signálu typu std_logic_vector a signálu typu natural, který p edstavuje celé nezáporné íslo. Op t je uvedena funkce ze systému WARP: FUNCTION "+" (Lft: std_logic_vector; Rgt: natural) RETURN std_logic_vector IS BEGIN RETURN Lft + to_std_logic_vector(Rgt, Lft'length); END "+"; -- TXT1.25 Zde jsou symbolem Lft a Rgt ozna eny vstupní argumenty. P ed touto funkcí je ve sloze uvedena další funkce se stejným názvem, tj. "+", která p et žuje operátor s ítání tak, aby akceptoval jako operandy dva signály typu std_logic_vector. Takto p etížený operátor s ítání je nyní použit k vytvo ení sou tu operandu Lft a ísla Rgt p evedeného do typu std_logic_vector funkcí to_std_logic_vector. std_arith Naskýtá se otázka, která funkce bude vlastn v konkrétním p ípad použití operátoru + vyvolána, když více z nich má stejné ozna ení. Odpov zní tak, že p i kompilaci použije systém tu funkci, která odpovídá nejen ozna ení, ale i operand m, k nimž je použita (pokud je ovšem p etížení definováno a je-li p íslušná funkce viditelná). V systému WebPACK jsou konverzní funkce pro p evod argumentu typu unsigned a signed na typ integer ozna eny conv_integer a jsou obsaženy ve sloze std_logic_arith, ve slohách std_logic_unsigned a std_logic_signed jsou funkce se stejným názvem pro p evod argument typu std_logic_vector na typ integer. Pro zp tný p evod zde slouží funkce conv_std_logic_vector. Na typy unsigned a signed p evád jí argumenty všech uvedených typ funkce s názvem conv_unsigned a conv_signed. Tyto funkce mají dva argumenty, jeden p edstavuje p evád ný vektor a druhý, celo íselný, bitovou ší ku výsledku. Je jich tedy také možno použít ke zm n bitové ší ky prvního argumentu. Podrobný popis funkcí obsažených v aritmetických slohách (std_logic_arith, numeric_std) je uveden nap íklad v [3]. P íkladem použití konverzní funkce pro vytvo ení indexu (typ integer) ze vstupního signálu typu std_logic_vector v systému WebPACK je následující text popisující dekodér t íbitového vstupního signálu na kód 1 z 8: 36 LIBRARY ieee; -- TXT1.26 USE ieee.std_logic_1164.ALL; USE ieee.std_logic_unsigned.ALL; ENTITY Decoder IS PORT(a,b,c,g: IN std_logic; -- vstupy y_n: OUT std_logic_vector(7 DOWNTO 0)); -- inverzní výstup END Decoder; ARCHITECTURE DecodArch OF Decoder IS BEGIN PROCESS (a,b,c,g) BEGIN y_n <= (OTHERS => '1'); IF g = '1' THEN y_n(conv_integer(c&b&a)) <= '0'; END IF; END PROCESS; END DecodArch; Funkce mohou mít jen vstupní operandy, tj. operandy nemohou být funkcí modifikovány. Výsledkem funkce m že být jen jeden výstupní operand uvedený v definici funkce za klí ovým slovem RETURN. V tomto smyslu m žeme funkci považovat za zobecn ní p i azovacího p íkazu. V definici funkce nemohou být deklarovány signály, mohou tam však být deklarovány prom nné. Jejich platnost je omezena na tuto definici. Zobecn ním funkcí jsou procedury, jejichž popis m že tená najít ve specializované literatu e. P íklad procedury bude uveden v ásti týkající se testování konstrukcí. Seznámili jsme se s pravidly pro vytvá ení funkcí. V praxi se však v modelech ur ených k syntéze používají p edevším funkce, které jsou p eddefinovány ve standardních slohách, jako jsou std_logic_1164, std_logic_arith a podobn . Neznamená to, že si uživatel nem že definovat své vlastní funkce, ale syntetizéry a simulátory bývají optimalizovány pro užití sloh, které jsou dodávány jako ásti systému, a uživatelem definované funkce mohou být p í inou, že se tato optimalizace mine ú inkem. Proto se doporu uje p ed užitím funkcí seznámit se s funkcemi, které jsou dodávány jako p íslušenství systému. Bývají popsány v manuálech spolu se slohami (packages). Vlastní funkci se doporu uje vytvo it v p ípad pot eby až tehdy, není-li tam pot ebná funkce k dispozici. 2 POSTUP VYTVO ENÍ POPISU KONSTRUKCE V JAZYKU VHDL P i ešení úkolu spo ívajícího v návrhu složitého íslicového systému ( i subsystému) – nap íklad procesoru, pam ového subsystému po íta e a podobn není asto možné celý systém zpracovávat jako celek, protože jeho složitost se od ur itého stupn vymyká možnostem konstruktéra podržet si v hlav vše, co je pot eba ke globálnímu a p itom dostate n podrobnému pohledu na navrhovaný systém. Proto se postupuje obvykle tak, že se po formulaci zadání snažíme celý systém rozd lit na díl í subsystémy, jejichž zpracování (návrh, analýza atd.) je již jednodušší. V p ípad pot eby v d lení t chto subsystém na ješt jednodušší ásti pokra ujeme, až se dostaneme na úrove složitosti, kdy je již podrobný návrh jednotlivých ástí proveditelný. Vzniká tak hierarchická struktura. To je postup, který jsme nazvali návrh shora dol , který z metodického hlediska p edstavuje ideální p ístup. Nez ídka však musíme p i realizaci blok nejnižší úrovn vycházet z možností daných technologií realizace systému (strukturálními zvláštnostmi použitých cílových obvod ), takže je nutno výše stojící hierarchické bloky této technologii p izp sobit. Je pak nutno konstrukci procházet obráceným sm rem – postup zdola nahoru. Promítnutí zm n vynucených zm nami na nízké úrovni do vyšších úrovní hierarchie se íká zp tná anotace (back annotation). 37 asto se poda í rozd lit systém tak, aby bylo možno popsat bloky nejnižší úrovn behaviorálním stylem nebo stylem p edstavující popis toku dat. Typickými subsystémy, které se obvykle popisují behaviorálním stylem, jsou nap íklad: ∗ p evodníky kód , dekodéry, enkodéry, ∗ registry paralelní a sériové, íta e, ∗ jednodušší stavové automaty. V poslední položce je slovo „jednodušší“ z toho d vodu, že tém všechny dnes používané íslicové systémy je možno pokládat za stavové automaty a teoreticky je možné ešit je odpovídajícími zp soby. Je-li však po et možných stav takového automatu v tší než n kolik desítek, je obvykle p íliš obtížné p istupovat k n mu metodami užívanými pro práci se stavovými automaty. Takové systémy se pak snažíme rozd lit na jednodušší ásti, jak bylo popsáno výše. Bloky popsané behaviorálním stylem je pak nutno vhodn propojit, jak to vyžaduje funkce systému. Popis propojení takto vytvo ených blok (a samoz ejm nejen jich, ale jakýchkoliv blok ) umož ují jazyky HDL pomocí strukturálního stylu. Tento popis odpovídá blokovému schématu a je v podstat jeho textovým vyjád ením. Z hlediska snadnosti pochopení funkce popisovaného bloku je strukturální styl popisu mnohem mén p ehledný než styl behaviorální, a nutnost použít jej pro popis propojení ve vyšších úrovních hierarchie je možno v tomto smyslu považovat za ur ité slabé místo jazyk HDL. Pro dokumentaci m že proto být výhodné kombinovat textové formy popisu s formami grafickými, tabulkovými, p ípadn s dalšími, které asto bývají pro popis struktury p ehledn jší než textový popis v jazyku HDL. V jednodušších návrhových systémech je možno pracovat pouze s textovou formou popisu a jeho grafickou formu je nutno vytvo it jiným zp sobem – v krajním p ípad ru n , je však možno použít také r zných editor umož ujících práci s jednoduchými grafickými objekty. P i zp tné anotaci je pak p irozen nezbytné vrátit se do p íslušného editoru a zde provést p íslušné zm ny. Moderní složité návrhové systémy mají asto v sob zahrnuty prost edky pro více r zných zp sob popisu, mezi nimi i pro grafické formy, a ty nejpokro ilejší jsou schopny provád t automaticky i zp tnou anotaci. P íkladem je systém FPGA Advantage firmy Mentor Graphics. Podstatné zde je, že takové systémy jsou schopny ke grafické form popisu automaticky vygenerovat popis textový a naopak. (Je zde ur itá analogie s asemblery a disasemblery mikropo íta .) Tím je zajišt na p enositelnost kódu (textové formy popisu) mezi návrhovými systémy, která je dána standardy platnými pro jazyky HDL. Pro dokumentaci pak mohou být výhodn použity ty formy popisu, které jsou nejp ehledn jší, i když jejich p enositelnost mezi r znými systémy je omezená. Typický postup návrhu má tyto fáze: 1. Popis (sub)systému vstupními prost edky návrhového systému, p ípadná kontrola syntaxe. 2. Syntéza – vytvo ení modelu navrhovaného (sub)systému ve standardizovaném tvaru. 3. Implementace – vytvo ení podrobného popisu konfigurace cílového obvodu tak, aby fungoval jako navrhovaný (sub)systém. 4. Simulace (sub)systému. K bodu 1: Nejjednodušším prost edkem pro vytvo ení popisu jsou textové editory. Návrhové systémy obsahují asto editory s n kterými speciálními vlastnostmi, které usnad ují zápis zdrojového textu. Takovou vlastností bývá nap íklad zobrazení klí ových slov a n kterých dalších prvk textu (konstant, komentá a podobn ) jinou barvou než zobrazení základního textu, což umož uje snadno kontrolovat dodržení n kterých pravidel 38 syntaxe. Zápis textu bývá usnadn n použitím šablon (templates) n kterých jazykových konstrukt . Pro zápis zdrojového textu je však možno použít prakticky libovolného textového editoru, který umož uje vytvo ení „holého“ textu, tj. textu bez formátovacích znak , a tento text pak dále zpracovávat stejn jako texty vytvo ené editorem návrhového systému. Pro usnadn ní popisu složit jších strukturních prvk bývají asto v návrhových systémech bloky zvané pr vodci (wizards), které zajiš ují, že vygenerované úseky kódu jazyka HDL jsou v navazujícím zpracování (syntéza, implementace) správn rozpoznány. P íkladem je Xilinx Architecture Wizard, který pro obvody FPGA ady Spartan-3 p i požadavku na zahrnutí bloku DCM (Digital Clock Manager) do konstrukce generuje jeho popis. Dokonalejší návrhové systémy umož ují užití n kterých grafických zp sob popisu, jako jsou prost edky pro kreslení stavových diagram , pravdivostních tabulek a další, a poskytují možnost automatického p evedení t chto zp sob popisu do jazyka HDL, pop ípad i zp tnou anotaci. Tradi ní zp soby vytvá ení schémat v editorech, jako jsou OrCAD a podobn , jsou zejména mezi staršími konstruktéry dob e známé a je asto možno využít jich pro p evod do formátu, který jsou schopny zpracovat návrhové systémy. Výhodou je p edevším, že lze využít dosavadních znalostí práce s editory schématu. P i simulaci konstrukce tímto zp sobem popsané však je nutné pracovat se simulátory, které dokážou zpracovávat vstupní informace v tomto formátu, které již nejsou tak b žné, nebo p evést tyto informace do formátu (nap íklad do n kterého jazyka HDL), s nimiž mohou pracovat standardní simulátory. To ovšem pak p edpokládá, že pro lad ní by m l mít konstruktér ur ité znalosti tohoto jazyka. Jazyky HDL slouží také pro p enos informací mezi r znými návrhovými systémy. Mnoho firem a dalších organizací proto požaduje po svých partnerech, aby zpracovávali dokumentaci práv v jazycích HDL, v evropských firmách se žádá obvykle dokumentace v jazyku VHDL. K bodu 2: Syntézou se rozumí p evod informace ze vstupního tvaru (textového i grafického) do n kterého z forem, kterou mohou dále zpracovávat implementa ní nástroje. Tak se vytvo í model navrhovaného (sub)systému, který obsahuje strukturní prvky p edpokládané skupiny cílových obvod a jejich propojení (netlist). Provádí se programovým nástrojem, kterému íkáme syntetizér. Velmi asto používaným formátem, v n mž syntetizéry poskytují výsledky své innosti, je formát EDIF. P i syntéze se obvykle již provádí optimalizace se zam ením na ur itou technologii, v níž bude dále navrhovaná konstrukce realizována. Technologií se zde rozumí i struktura ur ité skupiny („rodiny“) cílových obvod , které asto obsahují vedle univerzálních struktur (struktury PAL, PLA apod.) i specifické struktury umož ující zvýšení efektivnosti využití prost edk dostupných v obvodu (nap . struktury pro alokaci a sdílení tem ) nebo podporující n které typy realizovaných operací (s íta ky a další aritmetické obvody, komparátory a podobn ). N kdy se p ed syntézou (nebo jako její sou ást) jako zvláštní krok provádí kompilace, ímž se rozumí p evod vstupních informací do tvaru, který p edstavuje p edstupe syntézy – nap íklad do zápisu tvaru SOP (sou et sou in ) a podobn . Také optimalizace se m že provád t v rámci syntézy nebo jako zvláštní stupe zpracování, p ípadn m že být zahrnuta do procesu implementace. K bodu 3: P i implementaci se již vytvá í struktura odpovídající ur itému konkrétnímu cílovému obvodu, který pat í do skupiny, pro niž byla provedena syntéza. Výsledkem implementace bývá soubor, který obsahuje údaje pro naprogramování (personifikaci) struktury cílového obvodu, nap íklad soubor JEDEC pro obvody PLD, i tzv. bitstream pro obvody FPGA. K bodu 4: Simulací si konstruktér ov uje, zda vytvo ený model navrhovaného (sub)systému pracuje podle požadavk zadání. 39 3 P ÍKLADY KONSTRUKCÍ V JAZYKU VHDL Zdrojové texty v jazyku VHDL byly ov ovány syntézou a simulací v n kolika systémech. Byly to zejména systémy WARP 2 firmy Cypress, MAX+PLUS II firmy Altera, ispDesignEXPERT firmy Lattice a WebPACK firmy Xilinx. Formáln se tyto systémy liší mimo jiné názvem slohy, ve které je definováno p etížení aritmetických operátor pro jejich použití na typ std_logic_vector: u systém WARP a MAX+PLUS II to je sloha std_arith uvedená v knihovn ieee, u systém ISPDesignEXPERT a WebPACK se tato sloha nazývá std_logic_unsigned a je rovn ž v knihovn ieee. Jak bylo uvedeno v ásti týkající se typ a operátor , prosazuje se v poslední dob tendence používat místo slohy std_logic_unsigned, jejíž výskyt je zde nej ast jší, slohu std_logic_arith nebo slohu numeric_std. Texty používající slohu std_logic_unsigned m žeme upravit na použití n které z t chto dvou sloh tak, že argumenty typu std_logic_vector v operacích, pro n ž je sloha pot ebná, p evedeme na typ unsigned nap íklad explicitní konverzí. Také atributy sloužící k p i azení ísel vývod signál m a k potla ení syntézy signálu (k rozvinutí zápisu do tvaru SOP s eliminací díl ích signál ) a p ípadn další detaily týkající se možnosti použití n kterých jazykových konstrukt jsou v r zných systémech r zné. V textech jsou uvedeny ty varianty, které odpovídaly systém m, na nichž byly texty ov ovány. P i p echodu k jinému systému je nutno odpovídající ásti textu upravit. Anotace jednotlivých p íklad 3.1.1 P evodník hexadecimálního kódu na kód sedmisegmentového displeje Obecný p evodník kódu s náhodným vztahem mezi vstupními a výstupními kódovými slovy. Hexadecimální zápis vstupních a výstupních signál . Použití atributu k p i azení signál vývod m pouzdra cílového obvodu (WARP) 3.1.2 P evodník kódu BCD na binární kód Použití aritmetických operátor . Srovnání výsledk implementace textu s operátory násobení a textu s rozepsáním této operace na sou ty 3.1.3 S íta ka v kódu BCD Dekadická korekce výsledku s ítání v binárním kódu. Nesprávné možnosti zápisu p i operaci s ítání 3.1.4 P evodník binárního kódu na kód BCD P íklad nesyntetizovatelného behaviorálního popisu p evodníku a jeho popis strukturálním stylem 3.2.1 Subsystémy s t ístavovými výstupy a s otev eným kolektorem P íklad multiplexoru s t ístavovým výstupem. Staticky ízený registr s obousm rnou bránou 3.2.2 Subsystémy s obousm rnými branami P íklad registru se statickým ízením (latch) a s jednou obousm rnou datovou bránou 3.4.1 Binární íta e Vratný íta s asynchronním i se synchronním nulováním a se synchronním napln ním 3.4.2 íta e pracující v kódu BCD íta s vynulováním každé dekády nacházející se v nepracovním rozsahu 3.5 Stavové automaty P íklady behaviorálního popisu a popisu s explicitním kódováním stav , synchronní nulování 40 3.1 KOMBINA NÍ OBVODY 3.1.1 P evodník hexadecimálního kódu na kód sedmisegmentového displeje Jedna z asto používaných metod popisu kombina ních obvod v jazycích typu ABEL, pravdivostní tabulka, nemá p ímý ekvivalent v jazyku VHDL. V tomto jazyku je však možno odpovídající úlohy ešit jinými prost edky. Jednoduchý zp sob p edstavuje použití p íkazu WITH-SELECT-WHEN. Jako p íklad uvedeme p evodník hexadecimálního kódu na kód sedmisegmentového displeje: LIBRARY ieee; -- TXT3.1.1 USE ieee.std_logic_1164.ALL; ENTITY Hex2Sevn IS PORT (r,s,t,u: IN std_logic; -- datové vstupy g,f,e,d,c,b,a: OUT std_logic); -- výstupy ATTRIBUTE pin_numbers OF Hex2Sevn: ENTITY IS -- ur eno pro WARP "r:2 s:3 t:4 u:5 g:17 f:18 e:19 d:20 c:21 b:23 a:24"; -- pro 22v10 PLCC, END Hex2Sevn; -- package JC ARCHITECTURE Truth_tb OF Hex2Sevn IS SIGNAL InHex: std_logic_vector(3 DOWNTO 0); SIGNAL OutSvn: std_logic_vector(7 DOWNTO 0); BEGIN InHex <= (r & s & t & u); g <= OutSvn(6); f <= OutSvn(5); e <= OutSvn(4); d <= OutSvn(3); c <= OutSvn(2); b <= OutSvn(1); a <= OutSvn(0); WITH InHex SELECT OutSvn <= X"40" WHEN X"0", X"00" WHEN X"8", X"79" WHEN X"1", X"10" WHEN X"9", X"24" WHEN X"2", X"08" WHEN X"A", X"30" WHEN X"3", X"03" WHEN X"B", X"19" WHEN X"4", X"46" WHEN X"C", X"12" WHEN X"5", X"21" WHEN X"D", X"02" WHEN X"6", X"06" WHEN X"E", X"78" WHEN X"7", X"0E" WHEN OTHERS; END Truth_tb; P i azení vývod signál m pomocí atributu pin_numbers odpovídá nap íklad požadavk m systému WARP. V jiných systémech m že být toto p i azení provedeno jinými prost edky. Poslední hodnota X"0E" je p i azena všem kombinacím, které nejsou uvedeny d íve. Je to nutné proto, že p íkaz WITH-SELECT-WHEN vyžaduje, aby byly vy erpány všechny možné kombinace vstupních signál , a typ std_logic obsahuje krom hodnot '0' a '1' ješt další hodnoty, jako 'U', 'X' atd. Klí ové slovo OTHERS zahrnuje všechny možné kombinace složené i z t chto hodnot. Pro syntézu však mají význam jen hodnoty '0' a '1', což odpovídá o ekávané hodnot X"F". Aby bylo možno zapsat vstupní a výstupní signály hexadecimálním zápisem, jsou deklarovány signály InHex a OutSvn. Hexadecimální zápis je možný jen pro skupiny bit , jejichž po et je násobkem ty , takže signál OutSvn je osmibitový, a jeho nejvyšší bit není využit. Kombinace vstupních signál , pro n ž u neúpln definovaných funkcí není zadána hodnota na výstupu (v našem p ípad by to bylo p i p evodu kódu BCD na kód zobrazova e), mohou být v textu uvedeny nap íklad zápisem "--------" WHEN OTHERS; 41 Tento zápis však neinterpretují všechny návrhové systémy stejným zp sobem. N které z nich, jako nap íklad WARP, skute n využijí nedefinované vstupní kombinace ke zjednodušení výsledku. Jiné však toto zjednodušení nevyužívají a místo hodnot '-' p i adí výstup m nuly. Tato druhá interpretace platí u v tšiny sou asn používaných systém . N kdy je možno uvedeného využití dosáhnout vhodným nastavením syntetizéru pomocí voleb („options“). Text TXT3.1.1 p edstavuje p íklad zcela obecného p evodníku kódu. Pokud by tento p evodník byl rozsáhlejší, bylo by snadné ud lat v zápisu chybu, která se pak dosti obtížn hledá. Proto tam, kde je možno najít vyjád ení pro p evod kódu n jakým algoritmem, je asto vhodn jší tento algoritmus využít k automatickému generování výstupních hodnot. P íkladem m že být následující p evodník. 3.1.2 P evodník kódu BCD na binární kód V následujícím textu (TXT3.1.2a) je popsán tento p evodník s využitím operace násobení. Tento zp sob popisu je stru ný a lze jej snadno pochopit. M že být použit jak pro syntézu, tak i pro simulaci. P etížení operátoru násobení pro operandy i pro výsledek typu std_logic_vector je obsaženo ve sloze std_logic_unsigned. Ve sloze std_logic_arith je pak definována konverzní funkce conv_std_logic_vector použitá pro úpravu ísla 100 a 10 jako druhého operandu p i násobení. Prom nná Sum je v procesu deklarována s ší kou 11 bit . Je to proto, že v definici p etížení operátoru násobení v uvedené sloze je ší ka výsledku sou tem ší ek operand . V našem p íkladu se však po ítá s osmibitovým výsledkem, takže hodnota vstupní veli iny BCDin bude nejvýše 255 (p edpokládá se, že to bude zajišt no zapojením obvodu generujícího vstupní signály). Nejvyšší t i bity prom nné Sum tedy m žeme v záv re ném p i azení této prom nné výstupnímu signálu BinOut ignorovat. LIBRARY ieee; USE ieee.std_logic_1164.ALL; USE ieee.std_logic_arith.ALL; USE ieee.std_logic_unsigned.ALL; ENTITY BCD2Bin IS PORT (BCDin: IN std_logic_vector(11 DOWNTO 0); BinOut: OUT std_logic_vector( 7 DOWNTO 0)); END BCD2Bin; -- TXT3.1.2a ARCHITECTURE BCD2BinMltArch OF BCD2Bin IS BEGIN PROCESS (BCDin) VARIABLE Sum: std_logic_vector(10 DOWNTO 0); BEGIN Sum := BCDin(11 DOWNTO 8) * conv_std_logic_vector(100,7); Sum := Sum + (BCDin( 7 DOWNTO 4) * conv_std_logic_vector(10,4)); Sum := Sum + BCDin( 3 DOWNTO 0); BinOut <= Sum(7 DOWNTO 0); END PROCESS; END BCD2BinMltArch; Nevýhodou tohoto zp sobu popisu je, že pro b žné syntetizéry p edstavuje operace násobení problém, s nímž se nemusí vypo ádat optimálním zp sobem. V tomto p ípad byl text zpracováván systémem WebPACK se zam ením na cílové obvody CPLD ady XC 9500XL. I když systém nakonec implementaci úsp šn zvládl, bylo nutno použít cílový obvod typu XC 95144XL. Jak uvidíme dále (TXT3.1.2b), rozepsáním textu na jednodušší operace (bez násobení) m žeme tentýž p evodník implementovat do obvodu XC 9572XL, tedy do obvodu s polovi ní velikostí. Deklarace entity bude stejná jako v p edcházejícím textu a nebudeme ji tedy znovu uvád t. Není zde pot ebná konverzní funkce jako v p edcházejícím textu, takže není nutno uvád t odkaz na slohu std_logic_arith. 42 ARCHITECTURE BCD2BinCaseArch OF BCD2Bin IS BEGIN PROCESS (BCDin) VARIABLE Sum: std_logic_vector(7 DOWNTO 0); BEGIN Sum := X"0" & BCDin(3 DOWNTO 0); CASE BCDin(7 DOWNTO 4) IS WHEN X"1" => Sum := Sum + 10; WHEN X"2" => Sum := Sum + 20; WHEN X"3" => Sum := Sum + 30; WHEN X"4" => Sum := Sum + 40; WHEN X"5" => Sum := Sum + 50; WHEN X"6" => Sum := Sum + 60; WHEN X"7" => Sum := Sum + 70; WHEN X"8" => Sum := Sum + 80; WHEN X"9" => Sum := Sum + 90; WHEN OTHERS => Sum := Sum; END CASE; CASE BCDin(11 DOWNTO 8) IS WHEN X"1" => Sum := Sum + 100; WHEN X"2" => Sum := Sum + 200; WHEN OTHERS => Sum := Sum; END CASE; BinOut <= Sum; END PROCESS; END BCD2BinCaseArch; -- TXT3.1.2b Tento text je pon kud delší než p edcházející, vede však na úsporn jší implementaci. Z obou text vyplývá, že pokud nám záleží na dobrém využití cílového obvodu, je zatím vhodn jší vyhnout se použití operátoru násobení (je však pravd podobné, že další vývoj syntetizér toto omezení p ekoná). 3.1.3 S íta ka v kódu BCD Model s íta ky pracující v binárním kódu byl uveden d íve – viz texty TXT1.8 a TXT1.9. Pro její úpravu na kód BCD použijeme známý algoritmus dekadické korekce používaný asto u mikropo íta – p i tení šestky k výsledku s ítání v binárním kódu, je-li tento výsledek v tší než 9: LIBRARY ieee; USE ieee.std_logic_1164.ALL; USE ieee.std_logic_unsigned.ALL; ENTITY AddBCD IS PORT(a,b: IN std_logic_vector(3 DOWNTO 0); Sout: OUT std_logic_vector(3 DOWNTO 0); Cin: IN std_logic; Cout: OUT std_logic); END AddBCD; ARCHITECTURE AddArch OF AddBCD IS SIGNAL SwC: std_logic_vector(4 DOWNTO BEGIN BCDadd: PROCESS (a,b,Cin) VARIABLE SwCvar: std_logic_vector(4 BEGIN SwCvar := ("0000" & Cin) + a + b; IF SwCvar > 9 THEN SwCvar := SwCvar SwC <= SwCvar; END PROCESS BCDadd; Cout <= SwC(4); Sout <= SwC(3 DOWNTO END AddArch; 43 0); -- Sum with Carry DOWNTO 0); + 6; END IF; 0); -- TXT3.1.3 Ve sloze std_logic_unsigned jsou p etíženy operátory s ítání tak, aby akceptovaly operandy typu std_logic_vector a integer, p i emž výsledek je typu logic_vector. V textu TXT3.1.3 se vyskytují operace sou tu, u nichž se m že za ínající konstruktér snadno dopustit n kterých na první pohled ne zcela z ejmých chyb. Upozorníme na nej ast jší z nich. P ipome me, že operátory sou tu a sjednocení mají stejnou prioritu, a že výsledkem sou tu je vektor s po tem bit , který je roven po tu bit nejširšího s ítance. P enos z nejvyššího bitu se p i sou tu ignoruje. Je-li ve výrazu zapsáno n kolik operací se stejnou prioritou, provád jí se operace v po adí, jak jsou zapsány zleva doprava. N které možnosti nesprávného zápisu jsou: a) SwCvar := a + b + Cin; Zde je syntaktická chyba: sou et na pravé stran je ty bitový a prom nná SwCvar byla deklarována jako p tibitová. Chybu automaticky odhalí kompilátor, stupe její nebezpe nosti je nízký. b) SwCvar := a + b + "0000" & Cin; Tento zápis je syntakticky správný, takže implementace se provede bez problém . Není však zde vyzna ena precedence operací, takže se nejprve se tou vektory a a b, p i emž s ítání je ty bitové s ignorováním p enosu. K tomuto sou tu se p i te konstantní vektor "0000" (zcela zbyte n , nic se tím nem ní) a k výsledku se pak zprava p ipojí p enosový bit. Celkový výsledek je tedy p tibitový, tj. syntakticky správný, ale chybný íseln : p ipojením bitu Cin se posunou bity sou tu vektor a a b o jednu pozici doleva, takže se sou et ve skute nosti násobí dv ma, a jak již bylo uvedeno, ignoruje se p enos z tohoto s ítání. Chybu je možno odhalit pouze simulací. c) SwCvar := a + b + ("0000" & Cin); Zápis je op t syntakticky správný. Je však ignorován p enos ze s ítání vektor a a b. Chyba se projeví jen p i takových hodnotách t chto vektor , jejichž sou et je v tší než 15. P enos Cin se k sou tu p i ítá správn . Pro odhalení této chyby je nezbytné provést simulaci s takovými hodnotami vstupních vektor , které dají chybný výsledek. Pokud si p edem neuv domíme, že se p i hodnotách vstupních vektor blízkých jejich nejv tší možné hodnot m že projevit chyba, která je skrytá p i menších hodnotách t chto vektor , m že tato chyba snadno ujít pozornosti. Z tohoto p íkladu je z ejmá d ležitost co nejv tšího pokrytí rozsahu vstupních hodnot testem. Z pravidel syntaxe jazyka vyplývá, že ve výrazu pro prom nnou SwCvar v textu TXT3.1.3 nemusí být závorka. Je tam jen pro lepší p ehlednost. Je také vhodné zde upozornit na to, že mnohé návrhové systémy ignorují p i ítání nuly k jinému operandu, takže u nich není o ekávaným zp sobem zpracován nap íklad zápis, u n hož se bitová ší ka vytvá í prvním nulovým operandem: SwCvar := "00000" + Cin + a + b; Je z ejmé, že zv tšování bitové ší ky u objekt typu std_logic_vector m že zp sobit problémy s p enositelností kódu. Dostupné návrhové systémy však zp sob zápisu uvedený v textu TXT3.1.3 akceptují. Je ale vhodné postupovat opatrn a p i p echodu na jiný systém tuto skute nost ov it, zejména pokud by mohlo dojít k chybám nezachyceným kontrolou syntaxe, jak je uvedeno v p íkladech b) a c). 44 3.1.4 P evodník binárního kódu na kód BCD Na p íkladu p evodníku kódu BCD na binární kód jsme poznali, že použití složit jších operátor m že zjednodušit popis modelu, jejich syntéza však bývá asto problematická. Ješt výrazn ji je tato skute nost z ejmá u zp tného p evodníku, tj. u p evodníku binárního kódu na kód BCD. Uvedeme nejprve zápis využívající aritmetické operace související s d lením. Tyto operace jsou pro syntézu ješt problemati t jší než operace násobení a sou asné syntetizéry je nepodporují. (Popisy TXT3.1.4a a TXT3.1.4c byly již uvedeny v kapitole pojednávající o zkušebních jednotkách, pro lepší návaznost textu je však nyní uvedeme znovu.) LIBRARY ieee; -- TXT3.1.4a USE ieee.std_logic_1164.ALL; USE ieee.std_logic_unsigned.ALL; ENTITY Bin2BCD IS PORT(BinIn: IN std_logic_vector( 7 DOWNTO 0); -- vstup BCDout: OUT std_logic_vector(11 DOWNTO 0)); -- výstup END Bin2BCD; ARCHITECTURE NotSynthesizable OF Bin2BCD IS BEGIN PROCESS (BinIn) VARIABLE IntBin,InMod10: integer; BEGIN IntBin := conv_integer(BinIn); FOR i IN 1 TO 3 LOOP InMod10 := IntBin MOD 10; CASE InMod10 IS WHEN 0 => BCDout((4*i - 1) DOWNTO (4*i – 4)) WHEN 1 => BCDout((4*i - 1) DOWNTO (4*i – 4)) WHEN 2 => BCDout((4*i - 1) DOWNTO (4*i – 4)) WHEN 3 => BCDout((4*i - 1) DOWNTO (4*i – 4)) WHEN 4 => BCDout((4*i - 1) DOWNTO (4*i – 4)) WHEN 5 => BCDout((4*i - 1) DOWNTO (4*i – 4)) WHEN 6 => BCDout((4*i - 1) DOWNTO (4*i – 4)) WHEN 7 => BCDout((4*i - 1) DOWNTO (4*i – 4)) WHEN 8 => BCDout((4*i - 1) DOWNTO (4*i – 4)) WHEN 9 => BCDout((4*i - 1) DOWNTO (4*i – 4)) WHEN OTHERS => NULL; END CASE; IntBin := IntBin/10; END LOOP; END PROCESS; END NotSynthesizable; <= <= <= <= <= <= <= <= <= <= x"0"; x"1"; x"2"; x"3"; x"4"; x"5"; x"6"; x"7"; x"8"; x"9"; Simulace tohoto modelu ne iní problémy, syntéza však u sou asných návrhových systém kon í hlášením o tom, že text obsahuje operace, které nejsou podporovány. Jde o operaci d lení a o operaci vytvá ející zbytek po d lení (MOD). Rozepsat tyto operace na jednodušší, jako to bylo u p evodníku kódu BCD na binární kód, není tím nejsnadn jším a patrn ani nejvhodn jším ešením. Ukážeme dva možné p ístupy, jak vytvo it syntetizovatelný kód. Oba budou spo ívat v postupném p evodu jednotlivých íslic binárního zápisu do kódu BCD po ínaje nejnižšími ády a jejich p i tení k dosavadnímu áste nému výsledku v kódu BCD. Nejprve vytvo íme strukturální model p evodníku. Použijeme p itom s íta ku v kódu BCD popsanou textem TXT3.1.3. Text strukturálního modelu je mnohem mén p ehledný než uvedený text behaviorálního modelu TXT3.1.4a, a proto je vhodné p ed jeho sestavením si nakreslit blokové schéma, jak je uvedeno na obr. 3.1. 45 Aa0 A Ba0 B '0' Cin AddBCD Cout C0out Sout S0out Aa1H A Ba1H B Ca1H Cin Aa1L A Ba1L B St0 AddBCD Cout Sout BCD1out St1H AddBCD Cout Aa0 = '0'&Bin(2 DOWNTO O) Ba0 = Bin(3)&"000" Aa1H = "000"&Bin(4) '0' Ba1H = "000"&C0out Cin Sout BCD0out St1L Aa1L = '0'&Bin(4)&Bin(4)&'0' Obr. 3.1. Blokové schéma p evodníku s p tibitovým vstupem Bin(4 DOWNTO 0) Nejnižší (nultý) stupe p evodníku bude p edstavovat s íta ka p evád jící ty bitový binární údaj na kód BCD. Nejnižší t i bity dávají hodnotu 0 až 7, což je již íslo v kódu BCD, a ty tedy mohou p edstavovat data na jednom vstupu s íta ky – bude to vstup A tohoto stupn s íta ky. Na druhý vstup s íta ky p ivedeme další bit s váhou 8 – bude-li tento bit nulový, nezm ní hodnotu výstupu s íta ky, a v opa ném p ípad se k prvnímu vstupu p i te íslo 8. Výstup s íta ky bude p edstavovat ty bitový sou et v rozsahu 0 až 9. P enosový bit pak p edstavuje nejnižší bit vyšší íslice. Pokud tato íslice m že mít hodnotu jen 0 nebo 1, není pro ni pot ebná další s íta ka. Tak zde mohou být zobrazena ísla s rozsahem 0 až 15. Další, tj. první stupe bude k výsledku nultého stupn p idávat p ísp vek pátého bitu s váhou 16. Toto íslo se bude p i ítat, bude-li pátý bit jedni kový. Výstup bude mít rozsah 0 až 31, takže zde již budou dv s íta ky, které jako celek tvo í s íta ku pro dv dekády. Na jeden vstup s íta ky vytvá ející nižší íslici (dále nižší s íta ka) p ivedeme ty bitový výstup s íta ky nultého stupn , na druhý íslo p edstavující 0, je-li vstupní bit nulový a íslo 6 (nižší íslice ísla 16) v opa ném p ípad . Na jeden vstup vyšší s íta ky p ivedeme p enosový bit z nultého stupn a na druhý op t podle hodnoty vstupního bitu s váhou 16 nulu nebo jedni ku. P irozen musíme propojit výstup p enosu nižší s íta ky prvního stupn se vstupem p enosu vyšší s íta ky. Podobným zp sobem bychom mohli p ipojovat bez omezení další stupn p evodníku, každý další vstupní bit je zpracován dalším stupn m. Pro p evodník osmibitového binárního ísla na kód BCD bychom tak pot ebovali celkem 5 stup , celkový po et s íta ek by pak byl 10 (v posledním stupni bude t ídekádová s íta ka složená ze t í jednodekádových blok AddBCD, které budou propojeny podobn jako s íta ka v druhém stupni na obr. 3.1). Strukturální popis vrcholové jednotky odpovídající blokovému schématu z obr. 3.1 je: LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY Bin2BCD2d IS PORT(Bin: IN std_logic_vector(4 DOWNTO 0); BCD1out,BCD0out: OUT std_logic_vector(3 DOWNTO 0)); END Bin2BCD2d; 46 -- TXT3.1.4b ARCHITECTURE Bin2BCD2darch OF Bin2BCD2d IS COMPONENT AddBCD PORT(a,b: IN std_logic_vector(3 DOWNTO 0); Sout: OUT std_logic_vector(3 DOWNTO 0); Cin: IN std_logic; Cout: OUT std_logic); END COMPONENT; SIGNAL Aa0: std_logic_vector(3 DOWNTO 0); SIGNAL Ba0: std_logic_vector(3 DOWNTO 0); SIGNAL Aa1H: std_logic_vector(3 DOWNTO 0); SIGNAL Ba1H: std_logic_vector(3 DOWNTO 0); SIGNAL Aa1L: std_logic_vector(3 DOWNTO 0); SIGNAL Ba1L: std_logic_vector(3 DOWNTO 0); SIGNAL Ca1H: std_logic; BEGIN Aa0 <= '0'&Bin(2 DOWNTO 0); Ba0 <= Bin(3)&"000"; St0: AddBCD PORT MAP(a=>Aa0,b=>Ba0,Cin=>'0',Sout=>Ba1L,Cout=>Ba1H(0)); Aa1H <= "000"&Bin(4); Ba1H(3 DOWNTO 1) <= "000"; Aa1L <= '0'&Bin(4)&Bin(4)&'0'; St1L: AddBCD PORT MAP(a=>Aa1L,b=>Ba1L,Cin=>'0', Sout=>BCD0out,Cout=>Ca1H); St1H: AddBCD PORT MAP(a=>Aa1H,b=>Ba1H,Cin=>Ca1H, Sout=>BCD1out,Cout=>OPEN); END Bin2BCD2darch; Zde jsou po deklaraci komponenty AddBCD deklarovány signály propojující jednotlivé s íta ky nakreslené na obr. 3.1. Následuje p íkazová ást popisu architektury s p i azovacími p íkazy pro tyto signály a s vložením s íta ek jako komponent. Struktura textu nazna uje, jak by se provedlo rozší ení p evodníku na v tší po et bit : v deklarativní ásti by byly deklarovány další signály propojující s íta ky ve vyšších stupních, a v p íkazové ásti by jim byly p i azeny pat i né hodnoty a byly by vloženy komponenty p edstavující další s íta ky. P irozen by bylo nutno modifikovat také brány p evodníku v deklaraci entity. Pozoruhodné je, že i když zapojení pro vícebitový p evodník vypadá na první pohled dosti složit , je výsledek implementace po optimalizaci jednodušší než podobný výsledek pro výše uvedený p evodník kódu BCD na binární kód. Je tomu tak z ejm proto, že v tšina s íta ek zde neprovádí plnohodnotné s ítání, ale pouze p i tení jedné ze dvou možných hodnot k druhému vstupu (a i ten má asto speciální tvar), a použitý systém dokáže tuto skute nost p i optimalizaci využít ke zjednodušení výsledné struktury. Pro osmibitové vstupní íslo byl p evodník získaný rozší ením textu TXT3.1.4b implementován systémem WebPACK do obvodu XC 9536XL, tedy polovi ního proti p evodníku podle textu TXT3.1.2b. Nep ehlednost strukturálního popisu vedla k vytvo ení grafických systém pro vstup údaj . V laborato i ÚREL je k dispozici systém FPGA Advantage firmy Mentor Graphics, v jehož vstupním bloku je možno zakreslit schéma podobné schématu z obr. 3.1, a z n j automaticky vygenerovat odpovídající kód VHDL. Uvedený systém umož uje velmi pohodlnou práci a p ehledný zp sob vedení dokumentace, p i emž p enositelnost na jiné systémy je zajišt na generovaným kódem VHDL. Bližší bude uvedeno na po íta ovém cvi ení. Pon kud p ehledn jší formou textového popisu než je TXT3.1.4b nabízí styl p edstavující p echod mezi behaviorálním stylem a stylem popisu toku dat, který zde uvedeme jako poslední variantu popisu p evodníku – TXT3.1.4c. Tato varianta popisu op t vychází ze schématu nakresleného na obr. 3.1, a jde op t o syntetizovatelný popis. Text popisu je zde rozší en na osmibitový vstupní údaj: 47 LIBRARY ieee; USE ieee.std_logic_1164.ALL; USE ieee.std_logic_unsigned.ALL; ENTITY BiBCDbhv IS PORT(BinIn: IN std_logic_vector(7 DOWNTO 0); BCDout: OUT std_logic_vector(11 DOWNTO 0)); END BiBCDbhv; -- TXT3.1.4c ARCHITECTURE BiBCDbhvArch OF BiBCDbhv IS BEGIN PROCESS(BinIn) VARIABLE Sum: std_logic_vector(11 DOWNTO 0); VARIABLE Sum5:std_logic_vector( 4 DOWNTO 0); BEGIN -- BinIn(2 DOWNTO 0) - inicializace ------------------------Sum := X"00" & '0' & BinIn(2 DOWNTO 0); -- BinIn(3) - 0. stupe : Add 8hex, BCDout max. 15 ----------IF (BinIn(3) = '1') THEN Sum := Sum + 8; IF Sum > "1001" THEN Sum := Sum + 6; END IF; END IF; -- BinIn(4) - 1. stupe : Add 16hex, BCDout max. 31 ---------IF (BinIn(4) = '1') THEN Sum := Sum + X"16"; IF Sum(3 DOWNTO 0) > "1001" THEN Sum := Sum + 6; END IF; END IF; -- BinIn(5) - 2. stupe : Add 32hex, BCDout max. 63 ---------IF (BinIn(5) = '1') THEN Sum := Sum + X"32"; IF Sum(3 DOWNTO 0) > "1001" THEN Sum := Sum + 6; END IF; END IF; -- BinIn(6) - 3. stupe : Add 64hex, BCDout max. 127 --------IF (BinIn(6) = '1') THEN Sum := Sum + X"64"; IF Sum(3 DOWNTO 0) > "1001" THEN Sum := Sum + 6; END IF; IF Sum(7 DOWNTO 4) > "1001" THEN Sum := Sum + X"60"; END IF; END IF; -- BinIn(7) - 4. stupe : Add 128hex, BCDout max. 255 -------IF (BinIn(7) = '1') THEN Sum5 := ('0'&Sum(3 DOWNTO 0)) + 8; -- výsledek m že být p tibitový IF Sum5 <= "1001" THEN Sum := Sum + 8; -- LSD z 128 ELSE Sum := Sum + X"E"; END IF; Sum5 := ('0'&Sum(7 DOWNTO 4)) + 2; IF Sum5 <= "1001" THEN Sum := Sum + X"120"; -- MSD z 128 ELSE Sum := Sum + X"180"; END IF; END IF; BCDout <= Sum; END PROCESS; END BiBCDbhvArch; P ipome me pro snadn jší pochopení algoritmus s ítání ísel v kódu BCD, na n mž je uvedený text založen: S ítají se íslice jednotlivých dekadických ád po ínaje nejnižším ádem. Je-li sou et íslic v tší než 9, musí se k n mu p i íst íslo 6. Sou et dvou dekadických íslic m že n kdy být v tší než 15, takže tento sou et je nezbytné chápat jako p tibitové íslo (není-li rozsahem s ítanc zajišt no, že je výsledek ty bitový). S ítání v nultém stupni p evádí nejnižší ty i vstupní bity do kódu BCD. Sta í tedy testovat, zda je výsledek v tší než 9, a v kladném p ípad k n mu p i íst 6. Ve prvním stupni se p i ítá íslo 6 (nižší íslice z váhy tvrtého vstupního bitu – 16) k nejnižší dekadické íslici p edstavující jednotky. Protože tato íslice m že být nejvýše 9, je výsledek s ítání vždy nejvýše ty bitový, takže op t sta í testovat, zda tento výsledek je v tší než 9. Podobné je to ve druhém stupni, kde se k nejnižší íslici p i ítá íslo 2. Ve všech t chto stupních nemohla být íslice p edstavující desítky v tší než 9, takže ji nebylo nutno testovat. 48 Ve t etím stupni již m že výsledek mít hodnotu až 127, takže po provedení sou tu je nutno testovat ob jeho dekadické íslice. Žádná z nich však nem že být v tší než 15 (p i ítají se ísla 6 a 4), takže op t vysta íme s testem ty bitového výsledku. V tvrtém stupni se k íslici na pozici jednotek p i ítá íslo 8, takže výsledek m že být p tibitový. Proto je zde použita prom nná ; pro zjišt ní, zda je tento výsledek v tší než 9, a v kladném p ípad se místo ísla 8 p i te íslo o 6 v tší. Totéž je zde provedeno pro íslici p edstavující desítky, což sice není nutné, protože se k této íslici p i ítá jen íslo 2, ale jak ukazují výsledky syntézy, p i minimalizaci dokáže systém tuto redundanci odstranit. P i p ípadném dalším rozši ování na v tší po et bit m že takový test být pot ebný a neud láme chybu, když jej za adíme i tehdy, není-li nezbytný. Ušet íme si tím as a vyhneme se možnosti opominutí testu, pokud by byl nezbytný. Není však p edem zaru eno, že syntetizér všechny p ebyte né testy dokáže správn vyhodnotit a vylou it. Zp sob dalšího p ípadného rozší ení p evodníku na vyšší po et bit je již z ejmý. Tento p íklad ilustruje skute nost, že pokud známe algoritmus vytvo ení výsledku, m žeme jej použít pro sestavení popisu behaviorálním stylem pomocí procesu, který je velmi blízký programování po íta e. Musíme však mít na pam ti, že má-li popis být syntetizován, je t eba vyhnout se použití jazykových konstrukt , které syntetizéry nedokážou zpracovat. V sou asné dob mezi n pat í nap íklad operace d lení (s výjimkou d lení mocninou ísla 2, které je ekvivalentní posuvu o jedno nebo více míst doprava), operace vytvo ení zbytku po d lení a podobn . V p íkladu p evodníku kódu BCD na binární kód (TXT3.1.2a, TXT3.1.2b) jsme vid li, že n kdy m že p sobit problémy i operace násobení. Jednotlivé syntetizéry se mohou vzájemn lišit v rozsahu operací, které jsou schopny zvládnout. Proces uvedený v p íkladu odpovídá schématu z obr. 3.1, což dává dobrý p edpoklad k možnosti jeho syntézy. Doporu uje se p i zápisu podobného textu myslet na to, zda a jak m že být zapisovaný proces p eveden do tvaru obvodového zapojení. Pokud použijeme nevhodného, i když syntakticky správného zápisu, m že se stát, že simulace prob hne bez problém , ale že syntetizér bu nebude schopen syntézu provést, nebo že vytvo í zapojení mnohem složit jší, než je nutné. Pak m že být na míst použít popisu nižší úrovn , nap íklad se strukturálním stylem. 3.2 SUBSYSTÉMY SE ZVLÁŠTNÍMI TYPY BRAN V této kapitole uvedeme zp sob modelování subsystém s t ístavovými výstupy, s otev eným kolektorem a s obousm rnými branami. Podobn jako jsme poznali u modelování pam ových prvk (odst. 3.4.5), i pro syntézu subsystém s takovými branami je pot ebné u behaviorálních model používat standardní zp sob popisu – šablonu, kterou systém rozpozná a vytvo í strukturu s odpovídajícím uspo ádáním výstup nebo obousm rných bran. 3.2.1 Subsystémy s t ístavovými výstupy a s otev eným kolektorem Uvedeme zde p íklad popisu multiplexoru s t ístavovým výstupem. Vlastní multiplexor bude mít výstup deklarován jako signál, který bude p iveden na vstup t ístavového zesilova e, jehož výstup bude p edstavovat bránu celého subsystému. V tšina návrhových systém rozeznává popis t ístavového výstupu ve tvaru procesu, který modeluje t ístavový výstupní zesilova . LIBRARY ieee; -- TXT3.2.1 USE ieee.std_logic_1164.ALL; ENTITY Mux_3s IS PORT(a,b,c,d: IN std_logic_vector(3 DOWNTO 0); -- datové vstupy s: IN std_logic_vector(1 DOWNTO 0); -- výb rový vstup Oe: IN std_logic; -- ídicí signál výstupu 49 X_3s: END Mux_3s; OUT std_logic_vector(3 DOWNTO 0)); -- t ístavový výstup ARCHITECTURE ArchMux_3s OF Mux_3s IS SIGNAL x: std_logic_vector(3 DOWNTO 0); BEGIN WITH s SELECT x <= a WHEN "00", b WHEN "01", c WHEN "10", d WHEN OTHERS; Tristate: PROCESS (Oe,x) BEGIN IF Oe = '1' THEN X_3s <= x; ELSE X_3s <= (OTHERS => 'Z'); END IF; END PROCESS Tristate; END ArchMux_3s; -- vnit ní uzel -- popis 3stavových -- výstup. zesilova P ipome me, že konstrukt OTHERS => 'Z' p edstavuje agregát – viz odst. 3.3.1 Typy dat. Mnoho systém také dovoluje zapsat místo procesu i soub žný p i azovací p íkaz: X_3s <= x WHEN Oe = '1' ELSE 'Z'; V n kterých knihách se uvádí, že s hodnotou 'Z' lze zacházet podobn jako s obvyklými hodnotami signál '0' a '1'. Jiní auto i, viz nap íklad [3], doporu ují držet se striktn šablony s procesem, chceme-li zajistit p enositelnost kódu na r zné systémy. Vzhledem k tomu, že rozdíl mezi ob ma zápisy není velký, bude asi vhodn jší držet se verze s p ísn jšími pravidly. Výstupy s otev eným kolektorem m žeme modelovat podobným zp sobem. Fyzicky se obvody PLD nebo FPGA s takovými výstupy vyskytují z ídka, m žeme je však emulovat tím zp sobem, že u t ístavového výstupního zesilova e p ivedeme vnit ní signál, který má být na výstupu, na ídicí vstup tohoto zesilova e, a na jeho datový vstup p ivedeme konstantní hodnotu 0 nebo 1 podle toho, jde-li o zesilova neinvertující i invertující. Behaviorální popis invertujícího výstupního zesilova e emulující výstup s otev eným kolektorem, na n mž se má objevit vnit ní signál x, pak m že být: X_oc <= '0' WHEN x = '1' ELSE 'Z'; Signál x bude podobn jako u uvedeného p íkladu multiplexoru deklarován v deklarativní ásti popisu architektury a v její p íkazové ásti bude popsán b žnými zp soby. 3.2.2 Subsystémy s obousm rnými branami Obousm rné brány se uvád jí v deklaraci entity v p íkazu PORT s módem INOUT. Jako p íklad uve me model registru se statickým ízením (latch): LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY RegBidir IS PORT(q: INOUT std_logic_vector(7 DOWNTO 0); En: IN std_logic; Oe: IN std_logic); END RegBidir; ARCHITECTURE ArchReg OF RegBidir IS SIGNAL Qa: std_logic_vector(7 DOWNTO 0); BEGIN Load: PROCESS (En,q) BEGIN IF (En = '1') THEN Qa <= q; END IF; END PROCESS Load; 50 -- TXT3.2.2 -- obousm rná brána -- latch enable -- ídicí signál výstupu -- vnit ní uzel -- napln ní -- implicitní pam Output: PROCESS (Oe,Qa) BEGIN IF Oe = '0' THEN q <= (OTHERS => 'Z'); ELSE q <= Qa; END IF; END PROCESS Output; END ArchReg; -- popis 3stavových -- výstupních zesilova Uvedený text je zpracován syntetizérem zpravidla bez problém , obsahuje-li cílový obvod hardwarové registry se statickým ízením. Není-li tomu tak, dokážou inteligentní syntetizéry vytvo it registr ve struktu e makrobun k, pokud to ovšem struktura cílového obvodu dovoluje. Nap íklad v obvodu 22V10 nelze vytvo it takový registr s t ístavovými výstupy, protože se zde zp tná vazba odebírá až za výstupem t ístavových zesilova a uvedou-li se tyto zesilova e do stavu vysoké impedance, rozpojí se tím smy ka zp tné vazby v registru. ešení by zde sice bylo ve vytvo ení b žného registru a v použití dalších makrobun k pro t ístavový zesilova , bylo by to však ešení dosti neekonomické. U syntetizér s menším stupn m inteligence mohou nastat problémy s hazardy, p ípadn m že být výsledek syntézy zcela chybný. Je proto vhodné zkontrolovat p íslušnou ást hlášení fitteru a provést simulaci postfit modelu. Možné problémy se však týkají jen pam ové funkce registru, nikoliv jeho t ístavové brány. 3.3 PAM OVÉ OBVODY SE ZP TNOU VAZBOU Mezi obvody tohoto druhu, s nimiž se setkáváme v íslicových systémech, po ítáme asynchronní klopné obvody RS a klopné obvody typu D se statickým ízením (latch). Existují sice i jiné druhy zp tnovazebních pam ových obvod , ty se však používají prakticky jen ve zcela speciálních p ípadech a zde o nich nebudeme uvažovat. Klopné obvody typu RS se v jazyku VHDL popisují nejlépe pomocí logických výraz a není zde žádný zvláštní problém. Staticky ízený klopný obvod typu D je možno popsat procesem – viz TXT3.2.2, ale i logickými výrazy, jak je z ejmé z následujícího p íkladu: LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY Latch IS PORT(d: IN std_logic; q: BUFFER std_logic; En: IN std_logic); END Latch; -- TXT3.3.1 -- vstup -- výstup -- latch enable ARCHITECTURE LogExpr OF Latch IS BEGIN q <= (d AND En) OR (q AND NOT En) OR (d AND q); END LogExpr; O možných problémech s vynecháním konsensu p i optimalizaci takového textu již byla diskuse v odst. 1.4.5 a nebudeme ji zde opakovat. Pro tyto problémy se uvedené obvody popisují zp sobem uvedeným v odst. 1.4.5 zopakovaným v textu TXT3.2.2 a jejich popis odpovídající textu TXT3.3.1 se obvykle nepoužívá, i když je možno íci, že lépe a jasn ji vyjad uje chování obvodu. 3.4 ÍTA E V této kapitole uvedeme základní zp soby realizace nejb žn jších íta . Budeme uvažovat jen synchronní íta e, které se používají nej ast ji. P íklad modelu asynchronního íta e byl uveden v kapitole o simulaci. 51 3.4.1 Binární íta e Binární íta pat í k subsystém m, které se vyskytují velmi asto. Jejich popis v jazyku VHDL je zcela standardní. Nebudeme se tedy zabývat r znými variantami íta , ale uvedeme popis ty bitového vratného íta e s asynchronním i se synchronním nulováním, s možností napln ní obsahem ze vstupní brány a s možností blokování ítání. Není obtížné v p ípad pot eby p ebyte né funkce vynechat. LIBRARY ieee; USE ieee.std_logic_1164.ALL; USE ieee.std_logic_unsigned.ALL; ENTITY Counter IS PORT(Clk,Dir,ARst,SRst,Load,CEn,: IN std_logic; Din: IN std_logic_vector(3 DOWNTO 0); Count: OUT std_logic_vector(3 DOWNTO 0)); END Counter; -- TXT3.4.1 ARCHITECTURE CountArch OF Counter IS SIGNAL CntInt: std_logic_vector(3 DOWNTO 0) := "1010"; -- po át. hodn. BEGIN PROCESS (Clk,ARst) BEGIN IF Rst = '1' THEN CntInt <= "0000"; -- asynchr.reset ELSIF (Clk'event AND Clk = '1') THEN -- aktivní hrana Clk IF SRst = '1' THEN CntInt <= "0000"; -- synchr.reset – max.priorita ELSIF Load = '1' THEN CntInt <= Din; -- synchr.napln ní ELSIF CEn = '1' THEN IF Dir = '1' THEN CntInt <= CntInt + 1; -- inkrement je-li povolen ELSE CntInt <= CntInt - 1; -- dekrement je-li povolen END IF; END IF; -- pro SRst, Load a CEn neaktivni se stav nemeni END IF; -- konec ásti ovlivn né aktivní hranou Clk END PROCESS; Count <= CntInt; END CountArch; P ipome me, že brána s módem OUT m že sloužit jen jako výstup signálu a hodnota jejího signálu není dostupná uvnit modelu. Proto je zde v deklarativní ásti popisu architektury deklarován signál CntInt, který je použitý jako sou asná hodnota obsahu íta e p i jeho inkrementaci a dekrementaci. Posledním p íkazem v popisu architektury soub žným s procesem je jeho hodnota p i azena výstupnímu signálu. Jinou možností by bylo deklarovat signál Count s módem INOUT. Pak by deklarace signálu CntInt mohla odpadnout a místo signálu CntInt by se v popisu pracovalo p ímo se signálem Count. P i simulaci je však práce s obousm rnými branami obtížn jší, a proto bývá vhodn jší p ístup uvedený v textu TXT3.4.1. Po áte ní hodnota íta e uvedená v deklaraci signálu CntInt se p i syntéze ignoruje, je však akceptována p i simulaci. Tímto zp sobem m žeme jednoduše ov it nap íklad chování íta s neúplným cyklem v nepracovních stavech. 3.4.2 íta e pracující v kódu BCD Z velkého množství variant t chto íta , které se vzájemn liší chováním v nepracovních stavech, uvedeme popis íta e, u n hož se každá dekáda nacházející se v nepracovním rozsahu, tj. v rozsahu 10 až 15, v následujícím taktu nuluje. Text je pro rozsah íta e dvou dekád, tedy od 0 do 99. Rozší ení na v tší po et dekád bude spo ívat v pot ebném po tu zopakování a malé modifikaci textu pro desítky (mezi komentá em -- desítky a –- nuluj...) a není obtížné. 52 LIBRARY ieee; USE ieee.std_logic_1164.ALL; USE ieee.std_logic_unsigned.ALL; -- TXT3.4.2 ENTITY BCDCit IS PORT(Clk: IN std_logic; Bcd0,Bcd1: OUT std_logic_vector(3 DOWNTO 0)); END BCDCit; ARCHITECTURE BCDCitArch OF BCDCit IS SIGNAL PrSt0: std_logic_vector(3 DOWNTO 0) := "0111"; SIGNAL PrSt1: std_logic_vector(3 DOWNTO 0) := "1010"; SIGNAL NxSt0,NxSt1: std_logic_vector(3 DOWNTO 0); BEGIN StComb: PROCESS (PrSt0,PrSt1) BEGIN -- kombina ní ást IF PrSt0 < X"9" THEN NxSt0 <= PrSt0 + 1; -- jednotky ELSE NxSt0 <= X"0"; END IF; IF PrSt0 = X"9" THEN -- desítky IF PrSt1 < X"9" THEN NxSt1 <= PrSt1 + 1; ELSE NxSt1 <= X"0"; END IF; ELSE NxSt1 <= PrSt1; END IF; IF PrSt1 > X"9" THEN NxSt1 <= X"0"; END IF; -- nuluj v neprac.stavech END PROCESS StComb; BCDClckd: PROCESS (Clk) BEGIN -- registr IF (Clk'event AND Clk = '1') THEN PrSt0 <= NxSt0; PrSt1 <= NxSt1; END IF; END PROCESS BCDClckd; Bcd0 <= PrSt0; -- p i azení vnit ních signál výstup m Bcd1 <= PrSt1; END BCDCitArch; V textu TXT3.4.2 se využívá skute nosti, že p i vícenásobném p i azení signál v procesu se p edcházející p i azení p epíše následujícím p i azením. U deklarace signál PrSt0 a PrSt1 jsou uvedeny po áte ní hodnoty t chto signál , které se p i syntéze ignorují, p i simulaci se však akceptují a dovolují tak ov it chování íta e v nepracovních stavech. P i uvedených po áte ních hodnotách se v prvním taktu nuluje dekáda desítek, zatímco dekáda jednotek ítá po ínaje od ísla 7. Dále již íta pokra uje v ítání b žným zp sobem. 3.5 STAVOVÉ AUTOMATY Stavové automaty p edstavují nejobecn jší íslicové subsystémy zahrnující jak kombina ní, tak i registrové podbloky. Není proto p ekvapením, že u jejich popisu v jazycích HDL existuje celá ada variant popisu téhož automatu. I když se popis stavového automatu stavovým diagramem zdá p ehledný, u složit jších automat existuje riziko výskytu chyb, které mohou mít jak syntaktický, tak i sémantický charakter. N které z t chto chyb jsou do jisté míry p edvídatelné, a proto moderní návrhové systémy mají zabudovánu adu r zných kontrolních mechanism , jak tyto chyby odhalit a opravit. Proto se i zde asto vyskytují ur ité šablony pro popis, které je vhodné používat, chceme-li t chto mechanism využít. Návrhové systémy umož ují popsat stavový automat v r zných úrovních abstrakce. N které ásti automatu, jako je stavový registr, asto slouží jen k vnit ní funkci automatu a na 53 vývodech se projevují jen zprost edkovan . Popis s vyšší úrovní abstrakce pracuje jen se vstupními a s výstupními signály automatu a ešení jeho vnit ní struktury ponechává na systému. Požadavky na konkrétní automaty však bývají velmi r znorodé a ne vždy je možno tyto požadavky splnit, aniž by bylo nutno dodat systému další informace. Proto návrhové systémy obsahují mnoho dodate ných ídicích nástroj , které umožní p izp sobit realizaci popisovaného automatu konkrétnímu zadání. ím vyšší je úrove abstrakce p i popisu automatu, tím více t chto nástroj je zapot ebí k vytvo ení jeho implementace. kombina ní VSTUPY Clk Rst ást A stavový registr STAV kombina ní ást B VÝSTUPY Vst B C Rst Obr. 3.2. Blokové schéma stavového automatu Jednodušší stavové automaty svou strukturou odpovídají blokovému schématu nakreslenému na obr. 3.2. Jsou možné n které modifikace tohoto schématu: v tev vstupních signál ozna ená VstB nemusí být realizována, totéž m že platit pro kombina ní ást B, nebo naopak za touto ástí m že být ješt registr a podobn . V p ípad pot eby tyto modifikace uvedeme slovn . Konkrétní podoba schématu v etn t chto modifiikací mohou ovliv ovat n které d ležité vlastnosti automatu, jako je nejvyšší p ípustný kmito et hodinového signálu, zpožd ní výstup za aktivní hranou tohoto signálu, existence hazard ve výstupech a podobn .. N které návrhové systémy obsahují také nástroje pro alternativní, nej ast ji grafické zp soby zadávání vstupních údaj . Jako p íklad lze uvést nástroje obsažené v systému WebPACK -StateCAD a State Bench umož ující pracovat p ímo s grafickou formou stavového diagramu. Tyto grafické formy zadání se kompilují p ed dalším zpracováním do textu v jazycích HDL a m ly by vytvo it spolu s implementa ními nástroji optimální konfiguraci cílového obvodu podle požadavk zadání. Mezistupe jazyka HDL také zajiš uje p enositelnost kódu na další systémy. Problém bývá v tom, že asto není snadné porozum t všem alternativám, které konstruktérovi systém p i vstupu dat nabízí, a m že se také n kdy stát, že pro dosažení požadovaného výsledku bude nutno na úrovni jazyka HDL provést ur ité úpravy. Je tedy nutno ov it, zda a nakolik výsledek syntézy a implementace spl uje zadané požadavky. To je možné jednak simulací, která však nemusí odhalit všechny d ležité okolnosti, jednak prostudováním výsledk kompilace – vytvo eného textu v jazyku HDL, a dalších hlášení systému. Proto i p i použití r zných grafických a podobných prost edk pro popis konstrukce je znalost jazyka HDL pot ebná. Uvedeme zde n kolik zp sob popisu stavových automat v jazyku VHDL. Nej ast ji tyto popisy vycházejí z blokového schématu podle obr. 3.2, p i emž se každý blok tohoto schématu popíše zvláštním procesem. Tak vznikne tzv. t íprocesový zp sob popisu. Je-li nap íklad kombina ní ást B jednoduchá, m že být ú elné nahradit proces pro její popis prostým 54 soub žným p íkazem; n kdy tato kombina ní ást m že zcela chyb t – pak jde o dvouprocesový zp sob popisu. U jednoduchých stavových automat m že být celý automat popsán jedním procesem p edstavujícím stavový registr, jehož p íští stav se popíše jako funkce sou asného stavu. Nej ast ji se však používá dvou- nebo t íprocesový zp sob popisu. Mimo toto d lení je možno popisy t ídit podle úrovn abstrakce, pop ípad i podle dalších kritérií. Ke zp sob m popisu je t eba poznamenat, že r zné syntetizéry a implementa ní nástroje se s jejich zpracováním mohou vypo ádat s r zným stupn m úsp šnosti a p iblížení k optimálnímu výsledku. Ten asto velmi záleží na tom, zda systém rozpozná v textu n jakou šablonu, kterou má zabudovánu. Výsledek implementace pak m že odpovídat více této šablon než doslovnému zn ní p vodního popisu. Rozpoznání stavového automatu v popisu je zpravidla systémem hlášeno v protokolu zpracování. P edpokládá se, že tená je seznámen s obecnými vlastnostmi stavových automat aspo v rozsahu odpovídajícím skript m [1]. Pro vysv tlení nej ast ji používaných zp sob popisu stavových automat v jazyku VHDL použijeme p íklad detektoru posloupnosti t í jedni kových bit uvedený v t chto skriptech. 3.5.1 Behaviorální popis s deklarací uživatelského typu pro stav Detektor t í jedni kových bit . Na výstupu detektoru je jedni ka, jsou-li p ijaty t i t sn po sob následující jedni ky na vstupu detektoru. Je-li p ijata tato posloupnost, objeví se na výstupu detektoru v následujícím taktu jedni ka a detektor za ne zase od po átku odpo ítávat novou posloupnost, p i emž až do dokon ení nové trojice p ijatých jedni kových bit je na výstupu detektoru nula. ešení: Budeme uvažovat Mealyho verzi automatu s registrovým výstupem – obr. 3.3. V tomto zp sobu popisu se používá abstraktní uživatelsky deklarovaný typ pro stavový vektor. Oba registry, stavový i výstupní, jsou v textu TXT3.5.1 popsány v jednom spole ném procesu StClckd, takže popis m žeme ozna it za dvouprocesový. LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY Det3Mea IS PORT(x,Clk,ARst: IN std_logic; z: OUT std_logic); END Det3Mea; -- TXT3.5.1 ARCHITECTURE Det3MeaArch OF Det3Mea IS TYPE StType IS (s0,s1,s2); -- uživatelský typ SIGNAL PrSt,NxSt: StType; SIGNAL Znxt: std_logic; BEGIN StComb: PROCESS (PrSt,x) BEGIN -- popis kombina ní ásti A a B CASE PrSt IS WHEN s0 => Znxt <= '0'; IF x = '1' THEN NxSt <= s1; ELSE NxSt <= s0; END IF; WHEN s1 => Znxt <= '0'; IF x = '1' THEN NxSt <= s2; ELSE NxSt <= s0; END IF; WHEN s2 => NxSt <= s0; IF x = '1' THEN Znxt <= '1'; ELSE Znxt <= '0'; END IF; END CASE; END PROCESS StComb; StClckd: PROCESS (Clk,ARst) BEGIN IF ARst = '1' THEN PrSt <= s0; z <= '0'; -- asynchronní reset ELSIF (Clk'event AND Clk = '1') THEN PrSt <= NxSt; -- popis stavového registru z <= Znxt; -- popis výstupního registru 55 END IF; END PROCESS StClckd; END Det3MeaArch; Ve srovnání s jinými texty, psanými dosud na úrovni RTL, využívá uvedený popis architektury vyšší úrovn abstrakce behaviorálního stylu, která je obvyklá p i popisu stavových automat . V jeho deklarativní ásti je deklarován typ StType, složený ze t í prvk p edstavujících stavy automatu, a signály PrSt, NxSt (present state, next state – sou asný a p íští stav automatu). Tato deklarace typu a stavových signál jsou sou ástí šablony rozpoznávané systémem jako popis stavového automatu. Na této úrovni abstrakce není definováno kódování stav ani typ stavového registru. Tyto podrobnosti automaticky vygeneruje systém p i zpracování textu. Zvolí p itom typ klopných obvod v registru (D, T, podle zabudované inteligence i jinak) tak, aby p i zvoleném kódování stav byla realizace automatu co nejjednodušší. Proto signály PrSt, NxSt nemusí odpovídat skute ným kódovým kombinacím na vstupu a na výstupu stavového registru po syntéze (jsou-li nap íklad n které klopné obvody, z nichž je stavový registr složen, typu T, je jejich výstupní signál v p íštím stavu ur en funk ní tabulkou tohoto obvodu a není totožný s jeho vstupním signálem v souasném stavu, jako je tomu u klopných obvod typu D). x z komb. ást A Clk ARst stavový registr NxSt PrSt komb. ást B Znxt výstupní registr z x (a) Clk ARst (b) ARst/0 Popis v tví: x / Znxt Popis stav s1,s2: stav / z (c) 1/1 1 s0 0/0 1 s1/0 0/0 s2/0 0/0 Obr. 3.3. Detektor posloupnosti t í jedni kových bit - Mealyho verze s registrovým výstupem: blokový symbol (a), podrobn jší blokové schéma (b) a stavový diagram (c) Popis stavového automatu na behaviorální úrovni, jehož p íkladem je text TXT3.5.1, vyžaduje od konstruktéra minimum dodate ných úvah o zp sobu implementace a je ú elný, pokud se smí íme s n kterými jeho nevýhodami. K nim pat í zejména nemožnost ur ení, co se bude dít v nepracovních stavech. Další možnou nevýhodou je, že stavové bity jsou nep ístupné a není jich možno využít jako výstupních signál , což by mohlo ušet it prost edky spot ebované na implementaci t chto signál , pokud se poda í zvolit vhodn kódování stav , jak je uvedeno ve skriptech [1] v kapitole o kódování stav . Chceme-li mít lepší kontrolu nad chováním automatu v nepracovních stavech, m žeme doplnit p vodní stavový diagram o další stavy tak, aby celkový po et stav byl celistvou mocninou dvou. Zadáme-li systému kódování v binárním kódu, budou všechny možné stavy diagramem vy erpány a m žeme snadno p edepsat chování automatu v t chto p ídavných stavech. Tento mechanismus bude fungovat za p edpokladu, že syntetizér kóduje stavy 56 logicky p edpokládaným zp sobem tak, že stav m postupn p i azuje kódové kombinace v p íslušném kódu tak, jak jsou stavy uvedeny v deklaraci. Tímto zp sobem skute n typické syntetizéry pracují. Není to však závazn stanoveno, a pokud nám záleží na ošet ení nepracovních stav , je vhodné p ekontrolovat, zda používaný syntetizér nepat í mezi výjimky z tohoto pravidla. P i použití kód nevyužívajících všech možných kódových kombinací, nap íklad kódu 1 z n, tento mechanismus nelze použít. Následující p íklad p edstavuje pon kud modifikovaný detektor, u n hož bude použit popis dovolující využití stavových bit jako výstupních signál . 3.5.2 Popis s explicitním kódováním stav Detektor dvou nebo t í jedni kových bit : P esné chování je op t z ejmé ze stavového diagramu – obr. 3.4. ARst x z Clk s0/0 ARst (a) (b) Popis stav : stav / z 1 1 s1/0 0 0 1 s2/1 0 1 s3/1 0 Obr. 3.4. Detektor posloupnosti dvou nebo t í jedni kových bit : blokový symbol (a) a stavový diagram (b) Zvolíme-li kódování stav tak, aby nap íklad nejvyšší stavový bit byl jedni kový ve stavech s2 a s3, m žeme tento bit použít p ímo jako výstupní signál z. Tuto skute nost m žeme využít následujícím zápisem zdrojového textu: LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY Det3Expl IS PORT(x,Clk,ARst: IN std_logic; z: OUT std_logic); END Det3Expl; -- TXT3.5.2 ARCHITECTURE Det3ExplArch OF Det3Expl IS SIGNAL State: std_logic_vector(1 DOWNTO 0); CONSTANT s0: std_logic_vector(1 DOWNTO 0) := "00"; CONSTANT s1: std_logic_vector(1 DOWNTO 0) := "01"; CONSTANT s2: std_logic_vector(1 DOWNTO 0) := "10"; CONSTANT s3: std_logic_vector(1 DOWNTO 0) := "11"; BEGIN StTrans: PROCESS (Clk,ARst) BEGIN -- popis stavových p echod IF ARst = '1' THEN State <= s0; ELSIF (Clk'event AND Clk = '1') THEN CASE State IS WHEN s0 => IF x = '1' THEN State <= s1; ELSE State <= s0; END WHEN s1 => IF x = '1' THEN State <= s2; ELSE State <= s0; END WHEN s2 => IF x = '1' THEN State <= s3; ELSE State <= s0; END WHEN OTHERS => IF x = '1' THEN State <= s1; ELSE State <= s0; END END CASE; END IF; END PROCESS StTrans; z <= State(1); -- popis výstupního signálu END Det3ExplArch; 57 IF; IF; IF; IF; Použití klí ového slova OTHERS je zde nezbytné, protože typ std_logic_vector signálu zahrnuje i hodnoty jako 'U', 'X' atd., které musí vý et v p íkazu CASE pokrýt. Tento popis je p íkladem jednoprocesového popisu stavového automatu. State V popisu s explicitním kódováním stav jsou definovány hodnoty stavových signál v jednotlivých stavech. 3.5.3 Synchronní nulování u stavových automat Synchronní nulování je do stavových automat možno zavést pomocí dalšího vstupního signálu, p i emž se ke stávajícím p echod m p idají další p echody odpovídající aktivaci tohoto signálu. P íklad dopln ní automatu z obr. 3.4 je nakreslen na obr. 3.5. Asynchronní nulování je zde pro jednoduchost vypušt no. p echody pro SRst = 1: x 1 z Clk s0/0 SRst (a) 0 1 s1/0 1 0 s2/1 1 0 s3/1 0 Obr. 3.4. Detektor posloupnosti dvou nebo t í jedni kových bit nulováním: blokový symbol (a) a stavový diagram (b) p echody pro SRst = 0: (p ipsána je hodnota x) (b) se synchronním P i p episu stavového diagramu do textu v jazyku HDL odpovídá nákresu na obr. 3.4 p idání nulovacích p echod do popisu všech stav . Tento zp sob nulování koncep n odpovídá všem dalším synchronním funkcím automatu, je však u rozsáhlejších automat nepohodlný. Výhodn jší je zavést synchronní nulování p ímo do registru. Nap íklad v textu TXT3.5.1 by zavedení synchronního resetu místo asynchronního mohlo být vyjád eno úpravou procesu StClckd popisujícího stavový a výstupní registr: StClckd: PROCESS (Clk) BEGIN IF (Clk'event AND Clk = '1') THEN IF SRst = '1' THEN PrSt <= s0; z <= '0'; ELSE PrSt <= NxSt; z <= Znxt; END IF; END IF; END PROCESS StClckd; Do stavového diagramu se synchronní nulování obvykle nekreslí, uvede se slovn . Jinou možností je úprava popisu kombina ní ásti – procesu StComb využívající skute nosti, že p i vícenásobném p i azení signálu v procesu se uplat uje jen poslední z nich (u podmín ných p íkaz samoz ejm jen poslední p íkaz z t ch p íkaz , u nichž je p íslušná podmínka spln na). Sta í tedy mezi p íkazy END CASE a END PROCESS StComb textu TXT3.5.1 vložit p íkaz: IF Srst = '1' THEN PrSt <= s0; z <= '0'; END IF; Jsou ješt další možnosti, jak synchronní nulování zajistit. S uvedenými dv ma však vysta íme ve v tšin aplikací. 58 3.6 P ÍKLADY ITERATIVNÍCH KONSTRUKCÍ Jako p íklady iterativních konstrukcí uvedeme p evodníky mezi binárním a Grayovým kódem a Gray v íta z nich vycházející. Podstata vytvo ení iterativní struktury spo ívá v ízení syntetizéru tak, aby nerozvinoval popis do zápisu ve tvaru SOP. K tomu je možno využít bu atributy zapsané ve zdrojovém textu, nebo ídicí prost edky návrhových systém , tzv. options. V prvním p ípad sta í p i implementaci konstrukce do cílového obvodu spustit p íslušný proces v systému (nap . u WebPACKu: Processes for Current Source), a implementace prob hne bez dalších zásah . Zápis atribut však nemusí být u r zných návrhových systém stejný a jejich použití omezuje p enositelnost kódu. Ve druhém p ípad není p enositelnost kódu narušena. 3.6.1 P evodník binárního kódu na Gray v a naopak Ve skriptech [1] jsou odvozeny výrazy pro p evod binárního kódu na Gray v: gn-1 = b n-1, g n-2 = b n-2 ⊕ b n-1, ..., g1 = b1 ⊕ b2, g0 = b0 ⊕ b1, a pro zp tný p evod b n-1 = g n-1, b n-2 = g n-2 ⊕ b n-1 = g n-2 ⊕ g n-1, ............................................. b1 = g1 ⊕ b2 = g1 ⊕ g2 ⊕ ... ⊕ g n-1, b0 = g0 ⊕ b1 = g0 ⊕ g1 ⊕ ... ⊕ g n-1. P evodník binárního kódu na kód Gray v je pak pro ty bitovou ší ku popsán textem: LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY Bin2Gray IS PORT(BinCode: IN std_logic_vector(3 DOWNTO 0); GrayCode: OUT std_logic_vector(3 DOWNTO 0)); END Bin2Gray; -- TXT3.6.1 ARCHITECTURE ArchBin2Gray OF Bin2Gray IS BEGIN GrayCode(3) <= BinCode(3); GrayCode(2 DOWNTO 0) <= BinCode(2 DOWNTO 0) XOR BinCode(3 DOWNTO 1); END ArchBin2Gray; P evodník pro zp tný p evod je pak popsán následujícím zápisem: LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY Gray2Bin IS PORT(GrayCode: IN std_logic_vector(3 DOWNTO 0); BinCode: BUFFER std_logic_vector(3 DOWNTO 0)); END Gray2Bin; -- TXT3.6.2 ARCHITECTURE ArchGray2Bin OF Gray2Bin IS BEGIN BinCode(3) <= GrayCode(3); BinCode(2 DOWNTO 0) <= GrayCode(2 DOWNTO 0) XOR BinCode(3 DOWNTO 1); END ArchGray2Bin; Text TXT3.6.2 je zapsán podle první z obou verzí, v nichž jsou uvedeny výchozí vztahy. V této verzi vystupuje na levé i na pravé stran vektor binárního kódu (p esn ji e eno jeho ást, nazývaná také ez). Proto musí být výstupní brána v módu BUFFER. Nahrazení tohoto módu módem OUT by zde bylo syntaktickou chybou, protože signál brány s módem OUT není 59 dostupný uvnit p íslušné architektury, a to i p esto, že jak uvidíme dále, p i syntéze m že být text p eveden na druhou verzi. N které systémy p i takové chyb odmítnou další pokra ování syntézy, jiné jen vydají upozorn ní a pokra ují dále. Pokud by tímto zp sobem byl vyjád en zápis skalárního signálu, byla by tak vytvo ena zp tná vazba a vznikl by tak záchytný registr (latch). Zde je však situace jiná: povšimn me si, že na levé stran je rozsah index (2 DOWNTO 0), zatímco na pravé stran to je (3 DOWNTO 1). Ve výrazu pro každý bit vektoru binárního kódu je tedy p ítomen vyšší bit téhož kódu, a ne tentýž bit. To je dob e vid t ze zápisu výchozích výraz , p i zápisu ve vektorovém tvaru však m že tato okolnost uniknout pozornosti. Pokud je p i syntéze zachována struktura obvodu v souhlasu s textem, tj. pokud na pravé stran z stane zachován vektor binárního kódu, vznikne iterativní zapojení, dob e známé z konstrukce s íta ek – vícebitová s íta ka m že být složena z jednobitových vzájemn propojených p enosovým signálem. Zde zm na bitu GrayCode(3) zm ní hodnotu bitu BinCode(3), ten je však p ítomen ve vyjád ení bitu BinCode(2), který dále figuruje ve výrazu pro BinCode(1) a ten ve výrazu pro BinCode(0). Prochází tedy zm na bitu GrayCode(3) postupn všemi bity a tomu odpovídá doba ustálení výstupu, která je p ímo úm rná po tu bit p evodníku. Necháme-li však syntézu prob hnout bez dalších zásah , vytvo í syntetizér automaticky zapojení odpovídající druhé verzi výchozích vztah , kde jsou za bity vektoru binárního kódu na pravé stran dosazeny hodnoty již vytvo ených vyšších bit vyjád ených pomocí bit vektoru Grayova kódu. Jde pak o jednopr chodové zapojení, kde doba ustálení výstupu nezávisí na po tu bit p evodníku. Výhoda krátké doby ustálení však je zaplacena v tší obvodovou složitostí p evodníku, protože operace EXCLUSIVE-OR provedená s více bity vyžaduje zna né množství term , které exponenciáln nar stá s po tem bit v této operaci, zatímco v iterativním zapojení nezávisí po et term pot ebných pro vytvo ení každého bitu na po tu bit p evodníku. Rozepsáním výrazu pro bit b0 zjistíme, že u ty bitového p evodníku je tento bit vyjád en pomocí osmi term , u p tibitového p evodníku by to bylo 16 term a každý další p idaný bit p evodníku tento po et zdvojnásobuje. Proto je p evodník s jednopr chodovým zapojením možno v obvodech PLD realizovat jen pro malé po ty bit . Obecn se funkce s v tším po tem term realizují v obvodech PLD technikou št pení sou t , p i níž se automaticky op t vytvá í struktura s více pr chody. P i syntéze p evodníku s v tším po tem bit se tedy touto technikou vytvá í také vícepr chodové zapojení. O jednopr chodovém zapojení lze pak p i p ekro ení ur itého po tu term pot ebných pro jednotlivé bity p evodníku hovo it jen teoreticky. Není-li v tší doba ustálení výstup na závadu, m žeme dát syntetizéru pokyn pro vytvo ení iterativního zapojení. Zp soby, jak toho dosáhneme, mohou být u r zných systém r zné. Nap íklad u systému WARP se k tomuto ú elu užívá atributu, který se za adí do deklarativní ásti popisu architektury: LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY Gray2Bin IS PORT(GrayCode: IN std_logic_vector(3 DOWNTO 0); BinCode: OUT std_logic_vector(3 DOWNTO 0)); END Gray2Bin; -- TXT3.6.3 ARCHITECTURE ArchGray2Bin OF Gray2Bin IS SIGNAL BinCd: std_logic_vector(3 DOWNTO 0); ATTRIBUTE synthesis_off OF BinCd: SIGNAL IS true; BEGIN BinCd(3) <= GrayCode(3); BinCd(2 DOWNTO 0) <= GrayCode(2 DOWNTO 0) XOR BinCd(3 DOWNTO 1); BinCode <= BinCd 60 END ArchGray2Bin; V tomto textu m že mít brána BinCode mód OUT, protože její signál je v p íkazové ásti popisu architektury nahrazen signálem BinCd, který je možno použít na pravé stran p i azovacího p íkazu (p ipome me, že identifikátor BinCode by zde nebylo možno použít, protože signál brány typu OUT není dostupný v popisu architektury). Zavedení signálu BinCd je nutné z toho d vodu, že atribut synthesis_off se musí vztahovat k signálu. P i syntéze textu TXT3.6.3 budou bity brány BinCode vyjád eny p esn podle zápisu v tomto textu, každý tedy pomocí dvou term , jen identifikátor BinCd bude nahrazen identifikátorem BinCode. U systému WebPACK má jako atribut synthesis_off obdobný význam atribut noreduce. V tomto systému je však navíc nutno tento atribut p edtím deklarovat zápisem, který m že být uveden na ádku p edcházejícím jeho p i azení požadovanému signálu: ATTRIBUTE noreduce: boolean; ATTRIBUTE noreduce OF BinCd: SIGNAL IS true; T mito dv ma ádky se nahradí v textu psaném pro systém WebPACK tu n uvedený ádek v textu TXT3.6.3. 3.6.2 Gray v íta S využitím text TXT3.6.1 a TXT3.6.2 sestavíme nyní popis íta e pracujícího v Grayov kódu. Ten bude založen na následující myšlence: sou asný stav p edstavovaný Grayovým kódem p evedeme do binárního kódu, ten inkrementujeme dob e známým zp sobem a p evedeme nazp t do Grayova kódu. Tím se vyhneme pot eb znát vyjád ení bit následujícího stavu Grayova íta e na základ bit sou asného stavu, které není jednoduché. Úloha vytvo ení výraz pro následující stav íta e tak p echází na kompilátor. P evody mezi ob ma kódy budou sou ástí popisu íta e. LIBRARY ieee; USE ieee.std_logic_1164.ALL; USE ieee.std_logic_unsigned.ALL; ENTITY CntGray IS PORT(Clk: IN std_logic; CntGray: BUFFER std_logic_vector(3 DOWNTO 0)); END CntGray; -- TXT3.6.4 ARCHITECTURE ArchCntGray OF CntGray IS SIGNAL BinCode,Added_1: std_logic_vector(3 DOWNTO 0); BEGIN -- Gray to Binary conversion: --------------------BinCode(3) <= CntGray(3); BinCode(2 DOWNTO 0) <= CntGray(2 DOWNTO 0) XOR BinCode(3 DOWNTO 1); -- Increment -------------------------------------Added_1 <= BinCode + 1; 61 -- Back Binary to Gray conversion, registered ----PROCESS (Clk) BEGIN IF Clk'EVENT AND Clk = '1' THEN CntGray(3) <= Added_1(3); CntGray(2 DOWNTO 0) <= Added_1(2 DOWNTO 0) XOR Added_1(3 DOWNTO 1); END IF; END PROCESS; END ArchCntGray; Na rozdíl od binárních íta , s nimiž se setkáváme nej ast ji, je zde vytvo ení signálu p edstavujícího p íští stav íta e složit jší a je rozd leno do uvedených t í ástí: p evod sou asného stavu kódovaného Grayovým kódem do binárního kódu, inkrement v binárním kódu a zp tný p evod z binárního kódu na Gray v kód s následujícím zachycením v registru. Tyto t i ásti zde figurují jako celek místo obvyklého jednop íkazového zápisu inkrementu u binárního íta e. V popisu posledního p evodu je obsažen registr p edstavující pam ový blok íta e. Pokud bychom v textu TXT3.6.4 cht li zm nit po et bit íta e, bylo by nutno ud lat opravu na mnoha místech. Výhodn jším zp sobem je v p ípad p edpokládané možnosti zm n po tu bit použít bitové ší ky zadané genericky, jak je to v následujícím textu TXT3.6.5. Doplníme také íta asynchronní inicializací – napln ním p edem zadaným obsahem, který v tomto p ípad bude dán konstantou GrInit: LIBRARY ieee; -- TXT3.6.5 USE ieee.std_logic_1164.ALL; USE work.std_arith.ALL; ENTITY CntGray IS GENERIC(Width: integer := 8); PORT(Clk,Init: IN std_logic; CntGray: BUFFER std_logic_vector(Width-1 DOWNTO 0)); END CntGray; ARCHITECTURE ArchCntGray OF CntGray IS CONSTANT GrInit: std_logic_vector(Width-1 DOWNTO 0) := ('1','1', OTHERS => '0'); SIGNAL BinCode,Added_1: std_logic_vector(Width-1 DOWNTO 0); BEGIN -- Gray to Binary conversion: --------------------BinCode(Width-1) <= CntGray(Width-1); BinCode(Width-2 DOWNTO 0) <= CntGray(Width-2 DOWNTO 0) XOR BinCode(Width-1 DOWNTO 1); -- Increment -------------------------------------Added_1 <= BinCode + 1; -- Back Binary to Gray conversion, registered ----PROCESS (Clk,Init) BEGIN IF Init = '1' THEN CntGray <= GrInit; ELSIF Clk'EVENT AND Clk = '1' THEN CntGray(Width-1) <= Added_1(Width-1); CntGray(Width-2 DOWNTO 0) <= Added_1(Width-2 DOWNTO 0) XOR Added_1(Width-1 DOWNTO 1); END IF; END PROCESS; END ArchCntGray; Po et bit je definován po áte ní hodnotou generické konstanty Width, jejíž hodnota je zde 8. Pokud bychom cht li zm nit bitovou ší ku íta e, sta í zm nit tuto hodnotu v deklaraci entity. Podobným zp sobem m žeme také definovat genericky ší ku u p evodník popsaných v textech TXT3.6.1 až TXT3.6.3. 62 P i asynchronní inicializaci íta e signálem Init získají nejvyšší dva bity hodnotu '1', ostatní budou nulové. Kdybychom nap íklad cht li, aby p i inicializaci byly nastaveny nap íklad bity CntGray(0) a CntGray(1) a ostatní byly vynulovány, dosáhli bychom toho nahrazením deklarace konstanty GrInit zápisem s p i azením hodnot bit jejich vyjmenováním: CONSTANT GrInit: std_logic_vector(Width-1 DOWNTO 0) := (0|1 => '1',OTHERS => '0'); Je však nutno upozornit, že ne všechny systémy jsou schopny zpracovat deklaraci s klí ovým slovem OTHERS, je-li ší ka definována genericky. Nedokáže to nap íklad systém WebPACK, a konstantu GrInit je zde nutno deklarovat nap íklad formou et zce, který je nutno p epsat p i zm n parametru Width. Podobn jako bylo vyloženo pro text TXT3.6.2, vytvo í se p i syntéze bez zvláštních opat ení z textu TXT3.6.5 vyjád ení bit íta e v p íštím stavu jako funkce t chto bit v souasném stavu ve známém tvaru zápisu SOP (Sum of Products, sou et sou in ). íta se pak v obvodech PLD realizuje bez problém jen pro nevelké po ty bit , nap íklad v obvodu GAL 22V10 m že být implementován šestibitový íta . Nejv tší po et term je pot ebný pro nejnižší bit CntGray(0) – u šestibitového íta e je zde pot eba 16 term . P i v tším po tu bit íta e pot ebný po et term rychle nar stá, a tento r st je exponenciální – p idání dalšího bitu znamená zdvojnásobení po tu term pro bit CntGray(0). P esv d íme se o tom snadno ze soubor (report) vytvá ených p i syntéze. Pot ebujeme-li íta s v tším po tem bit , m žeme požadavek na po et term snížit tím, že syntetizér p inutíme, aby vytvo il jako díl í mezivýsledky signál BinCode. U systému WARP toho dosáhneme za azením atributu synthesis_off do deklarativní ásti architektury za deklaraci signál BinCode a Added_1 (u systému WebPACK je to atribut noreduce, viz poznámku k textu TXT3.6.3): ATTRIBUTE synthesis_off OF BinCode: SIGNAL IS true; P evodník Grayova kódu na binární se pak stane samostatnou ástí výsledného obvodu a bude vytvo en stejn jako p i zpracování textu TXT3.6.3 i co do po tu term . V navazujícím obvodu provád jícím inkrementaci binárního kódu a zp tný p evod do Grayova kódu je pak pot ebný po et term nejvyšší pro dva nejvyšší bity íta e a je roven po tu bit íta e. Cenou za to je v tší zpožd ní kombina ní ásti obvodu, tedy snížení nejvyššího hodinového kmito tu, a zv tšení po tu makrobun k spot ebovaných pro signál BinCode. Pro v tší po ty bit íta e, kdy složitost obvodu vytvo eného bez uvedeného atributu rychle roste, se však stává toto ešení z hlediska nárok na spot ebované prost edky výhodn jším. Hranice výhodnosti mezi ob ma variantami je podle provedených zkoušek 7 bit . Nap íklad pro cílový obvod CY7C371I-143 firmy Cypress (nejmenší z ady 370, s 32 makrobu kami) je sedmibitový íta nejv tší, který lze implementovat bez atributu synthesis_off. Hodinový kmito et u tohoto íta e m že být p es 80 MHz. S tímto atributem se nejv tší po et bit zv tší na 14. Pak ale jde o zapojení s 15 pr chody, s nejvyšším hodinovým kmito tem kolem 14 MHz. Systém WebPACK dokáže bez použití atributu noreduce implementovat v obvodu XC9536XL íta s 11 bity, s tímto atributem až s 15 bity. 63 4 DODATEK 1: UŽIVATELSKÝ POPIS ZÁKLADNÍCH OBVOD SPLD V této ásti jsou popsány vybrané programovatelné logické obvody (jednoduché obvody PLD – Simple Programmable Logic Devices) tak, aby zde byly soust ed ny údaje pot ebné pro návrh aplikací t chto obvod , p i emž budou pominuty podrobnosti, které nejsou pro tento ú el nezbytné. Výb r uvedených obvod bral v úvahu dostupnost t chto obvod i návrhových prost edk pot ebných pro jejich aplikaci. Pro návrhá e je rovn ž d ležité znát firmy vyráb jící uvedené obvody. Nejd ležit jší z t chto firem jsou zde uvedeny zkratkou s následujícím významem: A – Altera, AT – Atmel, L – Lattice Semiconductor, NS – National Semiconductor, TI – Texas Instruments. Ne všichni výrobci však uvedené obvody ozna ují názvem, pod nímž jsou zde popsány. V takovém p ípad je tento název uveden v závorce. 4.1 OBVODY GAL 16V8 A GAL 20V8 Uspo ádání t chto obvod a jejich funkce jsou velmi podobné. Z hlediska uživatele jsou rozdíly pouze v po tu vstupních vývod . To umož uje popsat je spole n . Oba obvody mají osm výstupních makrobun k, p i emž každé z nich p ísluší osm term . Obvody mohou být naprogramovány do t í mód : 1 – jednoduchý, 2 – smíšený, 3 – registrový mód. Na obr. 4.1 a obr. 4.2 jsou vyzna eny vývody obou obvod a jejich funkce v jednotlivých módech. Vývody ozna ené symbolem IN t sn u obrysu obvodu mají ve všech módech funkci vstup p ivád jících signály do pole AND. Ostatní vývody vyjma napájecích (VCC a GND) mají v r zných módech r znou funkci, jak je z ejmé z tabulky na obrázcích. Dva vývody, a to vývod 1 u obou obvod a vývod 11 u GAL 16V8, resp. vývod 13 u GAL 20V8, mají v prvních dvou módech rovn ž funkci vstup do pole AND. V módu 3 plní vývod 1 funkci vstupu hodinového signálu a vývod 11, resp. 13, funkci vstupu OE . Zbývajících osm vývod je p ipojeno k výstupním makrobu kám. Na obr. 4.3 je vysv tlen význam symbol p edstavujících funkci t chto vývod . V módu 2 mají všechny jedinou funkci: krajní vývody (12 a 19, resp. 15 a 22), mají funkci t ístavového výstupu (TS), ostatní fungují jako kombina ní obousm rné vývody (I/O). Jeden z term vycházejících z pole AND je p itom v nován ízení t ístavového zesilova e, pro vytvo ení vlastní logické funkce tedy zbývá 7 term . V módu 1 vývody 15 a 16, resp. 18 a 19 plní pouze funkci kombina ního výstupu (OUT). Všech zbývajících šest vývod m že být v tomto módu vzájemn nezávisle naprogramováno do funkce vstupu (IN) nebo do funkce kombina ního výstupu se zp tnou vazbou (OUT/FB). V módu 3 mohou být všechny vývody op t vzájemn nezávisle nakonfigurovány bu do funkce kombina ních obousm rných vývod (I/O) nebo do funkce registrových výstup (REG). V registrovém módu máme k dispozici o dva vstupní vývody mén – jsou to vývody CLK a OE . Zato je u registrových výstup k dispozici plných osm term pro vytvo ení logické funkce. Zp tná vazba je v tomto módu vedena z výstupu klopného obvodu, což umož uje nap . innost íta vytvo ených ve struktu e obvodu i tehdy, jsou-li výstupní zesilova e ve stavu vysoké impedance. Výrobce: AT (ATF 16V8, ATF 20V8), L, NS 64 MÓD: 1 (SIMPLE) 2 (COMPLEX) 3 (REGISTERED) IN IN CLK VCC 1 20 IN 2 19 IN,OUT/FB TS I/O,REG IN 3 18 IN,OUT/FB I/O I/O,REG IN 4 17 IN 5 IN IN,OUT/FB I/O I/O,REG 16 OUT I/O I/O,REG 6 15 OUT I/O I/O,REG IN 7 14 IN,OUT/FB I/O I/O,REG IN 8 13 IN,OUT/FB I/O I/O,REG IN 9 12 IN,OUT/FB TS I/O,REG 10 11 IN IN OE GND GAL16V8 Obr. 4.1. Rozložení vývod u obvodu GAL 16V8 a jejich funkce v jednotlivých módech. Jsou-li uvedeny dv funkce vývod odd lené árkou, lze vybrat nezávisle pro každý vývod jednu z nich MÓD: 1 (SIMPLE) 2 (COMPLEX) 3 (REGISTERED) IN IN CLK 1 24 VCC IN 2 23 IN IN 3 22 IN,OUT/FB TS I/O,REG IN 4 21 IN,OUT/FB I/O I/O,REG IN 5 20 IN,OUT/FB I/O I/O,REG IN 6 19 OUT I/O I/O,REG IN 7 18 OUT I/O I/O,REG IN 8 17 IN,OUT/FB I/O I/O,REG GAL20V8 IN 9 16 IN,OUT/FB I/O I/O,REG IN 10 15 IN,OUT/FB TS I/O,REG IN 11 14 12 13 IN IN OE GND IN Obr. 4.2. Rozložení vývod u obvodu GAL 20V8 a jejich funkce v jednotlivých módech. Jsou-li uvedeny dv funkce vývod odd lené árkou, lze vybrat nezávisle pro každý vývod jednu z nich 4.2 OBVOD GAL 22V10 A JEHO VARIANTY Jak je z ejmé z obr. 4.5, má obvod GAL 22V10 deset vývod p ipojených k výstupním makrobu kám. Ty mohou být vzájemn nezávisle nakonfigurovány do funkce kombina - 65 pin = IN (vstup): pole AND pin pin = OUT (jednoduchý kombina ní výstup): pole AND 8 term pin MÓD 1 pin = OUT/FB (kombina ní výstup se zp tnou vazbou): pole AND 8 term pin pin = TS (kombina ní t ístavový výstup): pole AND 7 term pin pin = I/O (kombina ní obousm rný vývod): pole AND 7 term pin pin = REG (registrový výstup): CLK pole AND MÓD 2 MÓD 3 TE 8 term D pin C OE Obr. 4.3. Možné konfigurace výstupních makrobun k u obvod GAL 16V8 a 20V8. ozna ené hv zdi kou jsou spole né pro celý obvod 66 ásti pin = I/O (kombina ní obousm rný vývod): pole AND 8-16 term pin pin = REG (registrový výstup): CLK ar pole AND 8-16 term D TE pin C AR SP sp Obr. 4.4. Možné konfigurace výstupních makrobun k obvodu GAL 22V10. ozna ené hv zdi kou jsou spole né pro celý obvod ásti ního obousm rného vývodu (I/O) nebo registrového výstupu (REG). Po et term je u jednotlivých makrobun k r zný a pohybuje se od 8 do 16 – tento po et je uveden na obr. 4.5 vedle 67 každého vývodu. Celkový po et term takto využitých je 120. Navíc je pro každou makrobu ku vyhrazen další zvláštní term pro ízení t ístavového zesilova e. Dále jsou pro všechny makrobu ky k dispozici dva spole né termy, vytvá ející signály ar (asynchronní nulování) a sp (synchronní nastavení) pro jejich klopné obvody. Celkový po et sou inových term v poli AND je tedy 132. Hodinové vstupy všech klopných obvod jsou p ipojeny na spole ný signál CLK z vývodu 1, který m že být sou asn využit jako další vstup do pole AND. po et term : CLK,IN 1 24 VCC IN 2 23 I/O,REG 8 IN 3 22 I/O,REG 10 IN 4 21 I/O,REG 12 IN 5 20 I/O,REG 14 IN 6 19 I/O,REG 16 IN 7 18 I/O,REG 16 IN 8 17 I/O,REG 14 IN 9 16 I/O,REG 12 IN 10 15 I/O,REG 10 IN 11 14 I/O,REG 8 GND 12 13 IN GAL22V10 íslování a funkce vývod obvodu GAL 22V10 v pouzdru PLCC 28: funkce CLK,IN IN IN IN IN IN IN IN IN IN IN IN GND VCC íslo 2 3 4 5 6 7 9 10 11 12 13 16 14 28 funkce íslo po et term : I/O,REG 27 8 I/O,REG 26 10 I/O,REG 25 12 I/O,REG 24 14 I/O,REG 23 16 I/O,REG 21 16 I/O,REG 20 14 I/O,REG 19 12 I/O,REG 18 10 I/O,REG 17 8 Ve verzi isp slouží vývody zde neuvedené k p ivedení programovacích signál Obr. 4.5. Rozložení vývod u obvodu GAL 22V10 a jejich funkce Na rozdíl od obvod GAL 16V8 a GAL 20V8 je zde programovatelný invertor zapojen až za výstupem klopného obvodu, což má za následek, že p i p ipojení napájecího nap tí je stav výstupu ur en nakonfigurováním tohoto invertoru. Na n m také závisí, jak se projevuje ú inek nulování nebo nastavení klopných obvod na vývodech pouzdra. Zapojení vstupních vývod je shodné s zapojením vstup p edcházejících obvod (obr. 4.3 – pin = IN), výstupy s funkcí I/O a REG mají strukturu podle obr. 4.4. N kte í výrobci (nap . Lattice) za azují do struktury integrované rezistory, které jsou zapojeny mezi každým z vývod a p ívodem napájecího nap tí. Tím je odstran na nutnost p ipojovat tyto rezistory k nevyužitým vývod m pro definování jejich nap ové úrovn zevn . P esto však se v aplika ních listech obvykle doporu uje pro zlepšení odolnosti proti rušení p ipojovat nevyužité vstupní vývody a výstupní vývody ve stavu vysoké impedance k sousedním využitým vstup m nebo k zemnicímu, pop . k napájecímu p ívodu. Obvod GAL 22V10 pat í v zemích s vysp lou elektronikou k nejoblíben jším obvod m PLD, o emž sv d í velké množství firem vyráb jících jak tento obvod, tak i jeho r zné modifikace (nap . GAL 18V10, GAL 26CV12 atd.). Obvod GAL 18V10 je podmnožinou obvodu GAL 22V10. Jeho vnit ní struktura je shodná s vnit ní strukturou tohoto obvodu, pouze s tím rozdílem, že pro 8 výstupních makrobun k je k dispozici 8 term a pro dv další 10 term , a celkový po et vstup (v etn zp tnovazebních vedených z makrobun k) je 18. Pouzd en je v DIL 20. Pro rozsáhlejší aplikace je vyráb n obvod GAL 26CV12 s 12 makrobu kami shodného provedení jako u základního obvodu. Osm jeho makrobun k je vybaveno osmi termy, dv desíti a dv dvanácti termy, celkový po et vstup je 26. V pouzdru PLCC 28 vyrábí firma Lattice obvod ispGAL 22V10, který je programovatelný p ímo na desce, na níž je osazen, pouhým po íta em pomocí jednoduchého programovacího kabelu a p íslušného softwarového vybavení (není zapot ebí zvláštní programovací p ístroj). 68 5 LITERATURA [1] KOLOUCH, J.: Programovatelné logické obvody – p ednášky. [Skriptum FEKT VUT v Brn .] Brno, 2002 [2] OTT, D. E. – WILDEROTTER, T. J.: A Designer’s Guide to VHDL. Kluwer Academic Publishers, 1998 [3] RUSHTON, A.: VHDL for Logic Synthesis. J. Wiley, 2001 [4] SKAHILL, K.: VHDL for Programmable Logic. Addison-Wesley, 1996 [5] WAKERLY, J.: Digital Design – principles and practices. 3rd edition. Prentice Hall, 2001 [6] DEWEY, A.: Analysis and Design of Digital Systems with VHDL. PWS Publishing Company, 1997 [7] PELLERIN, D. – TAYLOR, D.: VHDL Made Easy. Prentice Hall, 1997 69