Bevezető
Típusok és operátorok a VHDL-ben
A VHDL nyelv vezérlési szerkezetei
Hieararchikus tervezés
Budapesti Műszaki és Gazdaságtudományi Egyetem
A VHDL áttekintése Nagy Gergely, Horváth Péter Elektronikus Eszközök Tanszéke
2014. augusztus 18.
Nagy Gergely, Horváth Péter
A VHDL áttekintése
1 / 57
Bevezető
Típusok és operátorok a VHDL-ben
A VHDL nyelv vezérlési szerkezetei
Hieararchikus tervezés
A VHDL
A VHDL A VHDL egy hardverleíró nyelv – neve egy rövítés: VHSIC Hardware Description Language, amelyben szintén van egy rövidítés: VHSIC – Very-High-Speed Integrated Circuit. A nyelvet az amerikai védelmi minisztérium (Department of Defense – DoD) készíttette az 1980-as években digitális ASIC áramkörök dokumentálására. Hamar nagy igény lett a dokumentáció szimulálására, majd később a logikai szintézisre. A megbízás 1983-ban történt, az első szabvány az IEEE 1076-1987 volt, majd ezt követte az IEEE-1164 és 1993-ban az IEEE-1076 új verziója. A nyelvnek létezik analóg és analóg-digitális rendszerek leírását lehetővé tevő verziója: a VHDL-AMS.
Nagy Gergely, Horváth Péter
A VHDL áttekintése
2 / 57
Bevezető
Típusok és operátorok a VHDL-ben
A VHDL nyelv vezérlési szerkezetei
Hieararchikus tervezés
A VHDL
A VHDL nyelv A VHDL alapjául az Ada nyelv szolgált, amit szintén a DoD rendelt meg. Az Ada egy erősen típusos nyelv, nagy megbízhatóságú rendszerek fejlesztésére hozták létre. A VHDL is ezt a hagyományt követi. Szintaktikájára jellemző, hogy kevesebb szimbólumot és több, egész szavas kulcsszót használ, mint más nyelvek. Előnye a könnyű olvashatóság és az áttekinthető, szabályos szerkezet, hátránya a sok foglalt szó. A VHDL nem különbözteti meg a kis- és nagybetűket! A nyelv folyamatos fejlesztés alatt áll a mai napig: verifikáció támogatása, OOP.
Nagy Gergely, Horváth Péter
A VHDL áttekintése
3 / 57
Bevezető
Típusok és operátorok a VHDL-ben
A VHDL nyelv vezérlési szerkezetei
Hieararchikus tervezés
Egyed deklaráció – entity
Egyed deklaráció – entity A VHDL-ben, más HDL-ekhez hasonlóan, a tervezés alapja a logikai egység – egyed. Az egyedek megadása két részletben történik: 1
entity blokk: az egyed interfésze (deklaráció)
2
architecture blokk: az egyed leírása (definíció)
a portjainak az iránya és típusa, viselkedési, strukturális leírás.
entity reg4 is port ( d0 , d1 , d2 , d3 , en , clk : in bit ; q0 , q1 , q2 , q3 : out bit ); end entity reg4 ;
A példa egy négybites flipflopot mutat be. Az egyes portok egybites logikai típusúak. Az end után az entity reg4 opcionális. Nagy Gergely, Horváth Péter
A VHDL áttekintése
4 / 57
Bevezető
Típusok és operátorok a VHDL-ben
A VHDL nyelv vezérlési szerkezetei
Hieararchikus tervezés
Egyed definíció – architecture
Egyed definíció – architecture Az egyedek definíciója architecture blokk(ok)ban történik. Egy egyedhez tartozhat több definíció is: ez lehetsőséget ad több absztrakciós szint párhuzamos kipróbálására: entity nand_gate is port (a , b : in bit ; q : out bit ); end entity nand_gate ; a r c h i t e c t u r e arch_1 of nand_gate is begin q <= not ( a and b ); end a r c h i t e c t u r e arch_1 ; a r c h i t e c t u r e arch_2 of nand_gate is signal internal : bit ; begin internal <= a and b ; q <= not internal ; end a r c h i t e c t u r e arch_2 ;
Nagy Gergely, Horváth Péter
A VHDL áttekintése
5 / 57
Bevezető
Típusok és operátorok a VHDL-ben
A VHDL nyelv vezérlési szerkezetei
Hieararchikus tervezés
Jelek létrehozása, értékadás jeleknek
Jelek létrehozása, értékadás jeleknek Egy egyed portjai jelek (signal). Az egyedeken belül definiálhatunk további jeleket is. A jeleket a deklarációs blokkban hozzuk létre, ami a begin kulcsszó előtt található. a r c h i t e c t u r e arch_2 of nand_gate is signal internal : bit ; -- lok á lis jel begin internal <= a and b ; q <= not internal ; end a r c h i t e c t u r e arch_2 ;
Az értékadás a <= operátorral történik jelek esetében. A jelek értékadása párhuzamosan kerül végrehajtásra – ezért lesz a fenti leírásból egy NAND kapu. A – utáni szöveg egy sorban: megjegyzés. Nagy Gergely, Horváth Péter
A VHDL áttekintése
6 / 57
Bevezető
Típusok és operátorok a VHDL-ben
A VHDL nyelv vezérlési szerkezetei
Hieararchikus tervezés
Típusok
Típusok I.
A jeleink típusa eddig bit volt, ami 0 és 1 értékeket tud felvenni. Hardver-modellezéshez ennél többféle érték szükséges. nagy impedancia, ismeretlen/érdektelen, stb.
Ilyen típust létre lehet hozni a nyelv saját eszközeivel (ld. később), de a szabványosítók elkészítettek a saját verzióikat. Érdemes ezeket használni, hiszen ezek széles körben elterjedtek és támogatottak és ezeket ismerik a szintézerek is.
Nagy Gergely, Horváth Péter
A VHDL áttekintése
7 / 57
Bevezető
Típusok és operátorok a VHDL-ben
A VHDL nyelv vezérlési szerkezetei
Hieararchikus tervezés
Típusok
Típusok II. A nagy VHDL projektek hierarchikus felépítésűek, így a típusdefiníciók is ebben a hierchiában jelentkeznek: Könyvtár (library): legmagasabb szintű egység, Csomag (package): a könyvtár alegysége.
Pl. az IEEE-1164 szabványban bevezetett típusok az ieee könyvtár std_logic_1164 csomagjában találhatóak. A kódban jelezni kell, ha egy könyvtár egyes csomagjait használjuk. Pl. ha a teljes std_logic_1164 csomagot használjuk: library ieee ; use ieee . st d_logic _1164 . all ;
Nagy Gergely, Horváth Péter
A VHDL áttekintése
8 / 57
Bevezető
Típusok és operátorok a VHDL-ben
A VHDL nyelv vezérlési szerkezetei
Hieararchikus tervezés
Típusok
Az std.standard típusai A legalapvetőbb típusok az std.standard csomagban vannak definiálva – ezt a legtöbb környezetben automatikusan beszerkeszti a fordító. Az itt található típusok: Az std.standard típusai Típus bit bit_vector character integer natural real time
Leírás 0 vagy 1 értékű bit több-bites érték karakter egész szám (méret: implementáció-függő) pozitív egész szám valós szám (a szintézerek általában nem támogatják) idő (megadható: sec, ms, us, ns, ps, fs egységekben)
Nagy Gergely, Horváth Péter
A VHDL áttekintése
9 / 57
Bevezető
Típusok és operátorok a VHDL-ben
A VHDL nyelv vezérlési szerkezetei
Hieararchikus tervezés
Típusok
Az ieee típusai: std_logic A nagy támogatottság és pontos modellezés érdekében érdemes az IEEE típusokat használni. Az std_logic logikai jeleket ír le. Az std_logic ’U’ ’X’ ’0’ ’1’ ’Z’ ’W’ ’L’ ’H’ ’-’
inicializálatlan kényszerített ismeretlen kényszerített 0 kényszerített 1 nagy impedancia gyenge ismeretlen gyenge 0 gyenge 1 érdektelen (don’t care)
Az egybites értékeket aposztrófok közt adjuk meg VHDL-ben.
Nagy Gergely, Horváth Péter
A VHDL áttekintése
10 / 57
Bevezető
Típusok és operátorok a VHDL-ben
A VHDL nyelv vezérlési szerkezetei
Hieararchikus tervezés
Típusok
Az ieee típusai: std_logic_vector Az std_logic_vector több-bites értékek tárolására jó. Használata: signal vec_a : std_l o g ic _ v e c t o r (0 to 3); -- MSB : 0 - s bit signal vec_b : std_l o g ic _ v e c t o r (3 downto 0); -- MSB : 3 - as bit ... vec_b (2) <= ’1 ’;
A Veriloghoz hasonlóan kétféleképpen lehet megadni vektort (tömböt). Mindkét példában egy négybites vektort hozunk létre, de az elsőben az MSB a 0 indexű elem lesz, az LSB a 3 indexű, a másodikban az MSB a 3 indexű elem lesz, az LSB a 0 indexű.
A második megoldást javasolt használni általában. Elemek elérése: a () operátorral.
Nagy Gergely, Horváth Péter
A VHDL áttekintése
11 / 57
Bevezető
Típusok és operátorok a VHDL-ben
A VHDL nyelv vezérlési szerkezetei
Hieararchikus tervezés
Típusok
Felhasználói típusok I. – Intervallumok A felhasználó is létrehozhat saját típusokat a type kulcsszó segítségével: type { azonosito } is { tipusleiras };
Például egész számok intervallumai: type small_int is range 0 to 1024; type word_length is range 31 downto 0; subtype data_word is word_length range 7 downto 0;
A subtype egy típus részhalmaza, amely kompatibilis vele (értékadásokban vegyesen szerepelhet egy típus és altípusai, de különböző típusok nem). Készíthető a beépített típusokhoz is altípus: subtype int_small is integer range -1024 to 1024;
Nagy Gergely, Horváth Péter
A VHDL áttekintése
12 / 57
Bevezető
Típusok és operátorok a VHDL-ben
A VHDL nyelv vezérlési szerkezetei
Hieararchikus tervezés
Típusok
Felhasználói típusok II. – Fizikai típusok Létrehozhatóak fizikai típusok reprezentációi, amelyek mértékegységekkel együtt adhatóak meg – ilyen a std.standard time típus is): type conductance is range 0 to 2e -9 units mho ; mmho = 1e -3 mho ; umho = 1e -6 mho ; nmho = 1e -9 mho ; pmho = 1e -12 mho ; end units conductance ;
Deklaráció a fenti típussal: constant LINE_COND : conductance := 125 umho ;
a constant kulcsszó konstansok létrehozására szolgál. A fizikai típusokat a szintézerek nem támogatják. Nagy Gergely, Horváth Péter
A VHDL áttekintése
13 / 57
Bevezető
Típusok és operátorok a VHDL-ben
A VHDL nyelv vezérlési szerkezetei
Hieararchikus tervezés
Típusok
Felhasználói típusok III. – Felsorolt típus
Más programnyelvekhez hasonlóan VHDL-ben is létezik a felsorolt típus: type mnemonics is ( load , store , add , sub , div , mult ); type three_state is ( ’0 ’ , ’1 ’ , ’Z ’); ... signal sig_1 : three_state := ’Z ’;
Inicializálatlan felsorolt típusú változók a felsorolás első értékét kapják kezdőértékként. A korábban megismert std_logic is egy felsorolt típus.
Nagy Gergely, Horváth Péter
A VHDL áttekintése
14 / 57
Bevezető
Típusok és operátorok a VHDL-ben
A VHDL nyelv vezérlési szerkezetei
Hieararchikus tervezés
Típusok
Felhasználói típusok IV. – Tömbök I.
Tömböket (array) a következőképpen lehet létrehozni: type word_type is array (15 downto 0) of std_logic ; type one_byte is array (7 downto 0) of integer ; ... signal data_addr : word_type ; signal mem_addr : word_type := B " 1 1 0 1 1 0 0 1 1 1 0 1 1 0 0 1 " ;
az inicializációnál látható, hogy több-bites értékeket idézőjelek közt ("") adhatunk meg jelölve a számrendszert, ami lehet: B, O, D, X. A számrendszerek közül a bináris az alapértelmezett, így a "1011" karaktersorozatot a fordító bináris számként értelmezi.
Nagy Gergely, Horváth Péter
A VHDL áttekintése
15 / 57
Bevezető
Típusok és operátorok a VHDL-ben
A VHDL nyelv vezérlési szerkezetei
Hieararchikus tervezés
Típusok
Felhasználói típusok V. – Tömbök II. Tömbtípus definiálásakor nem muszáj megadni a méretet: type vector_int is array ( integer range < >) of integer ;
Ilyenkor a jelek létrehozásakor kell megadni a méretet: signal my_vector : vector_int (2 downto -3) := (2 , 4 , 12 , 6 , 2);
A fenti példa egyben egy tömb inicializálást is mutat. Tömbök értékadásakor létezik egy egyszerűsítő leírás: signal bvec : bit_vector (3 downto 0); ... bvec <= (1= > ’1 ’ , others = > ’0 ’); -- bvec : ( ’0 ’ , ’0 ’ , ’1 ’ , ’0 ’)
az others önmagában az összes bitnek a megadott értéket adja. Ilyen tömb-típus a std_logic_vector is. Nagy Gergely, Horváth Péter
A VHDL áttekintése
16 / 57
Bevezető
Típusok és operátorok a VHDL-ben
A VHDL nyelv vezérlési szerkezetei
Hieararchikus tervezés
Típusok
Felhasználói típusok VI. – Rekordok A VHDL nyelv támogatja rekordok, másnéven strukúrák létrehozását is: type mo dule _pa r a m e t e r s is record rise_time : time ; fall_time : time ; size : integer range 0 to 200; data : s t d _l o g i c _ v e c t o r (15 downto 0); end record ; signal a , b : mo d u l e _ p a r a m e t e r s ; ... a . rise_time <= 5 ns ; b <= a ;
Nagy Gergely, Horváth Péter
A VHDL áttekintése
17 / 57
Bevezető
Típusok és operátorok a VHDL-ben
A VHDL nyelv vezérlési szerkezetei
Hieararchikus tervezés
Attribútumok
Attribútumok I.
A VHDL sokféle attribútumok ismer, amelyek információt szolgáltatnak egy adott jelről/értékről. Az attribútumok megadása: {jelnév}’{attribútum}.
Jelattribútumok I. signal_name’event signal_name’active signal_name’transaction signal_name’last_event signal_name’last_active
Nagy Gergely, Horváth Péter
igaz, ha a jel esemény részese volt igaz, ha értékadás történt értéke egy bit, ami értéket vált, ha a jelen tranzakció történik legutóbbi esemény óta eltelt idő legutóbbi tranzakció óta eltelt idő
A VHDL áttekintése
18 / 57
Bevezető
Típusok és operátorok a VHDL-ben
A VHDL nyelv vezérlési szerkezetei
Hieararchikus tervezés
Attribútumok
Attribútumok II. Jelattribútumok II. signal_name’last_value signal_name’delayed(T) signal_name’stable(T) signal_name’quiet(T)
a jel előző értéke T -vel késleltett másolata a jelnek igaz, ha T ideje nem volt változás igaz, ha T ideje nem volt tranzakció
Például egy jel felfutó élére a következőképp írhatunk ki vizsgálatot: if ( clock ’ event and clock = ’1 ’) then ...
Ugyanez megoldható az ieee könyvtár std_logic_1164 csomagjában található rising_edge függvény segítségével is: if ( rising_edge ( clock )) then ...
Nagy Gergely, Horváth Péter
A VHDL áttekintése
19 / 57
Bevezető
Típusok és operátorok a VHDL-ben
A VHDL nyelv vezérlési szerkezetei
Hieararchikus tervezés
Attribútumok
Attribútumok III. Skalár attribútumok scalar_type’left scalar_type’right scalar_type’low scalar_type’high scalar_type’ascending scalar_type’value(s)
az első vagy legbaloldalabbi eleme a típusnak az utolsó vagy legjobboldalabbi eleme a típusnak az intervallum legkisebb eleme az intervallum legnagyobb eleme igaz, ha ez egy növekvő intervallum az s által repezentált elem
type my_index is range 3 to 15; my_index ’ value (5) -- returns : "5" conductance ’ right -- returns : 1 e3 three_state ’ left -- returns : ’0 ’
Nagy Gergely, Horváth Péter
A VHDL áttekintése
20 / 57
Bevezető
Típusok és operátorok a VHDL-ben
A VHDL nyelv vezérlési szerkezetei
Hieararchikus tervezés
Attribútumok
Attribútumok IV.
Tömbi attribútumok array’left(N) array’right(N) array’high(N) array’low(N) array’length(N) array’range(N) array’reverse_range(N) array’ascending(N)
legbaloldalabbi elem indexe legjobboldalabbi elem indexe felső határ alsó határ az elemek száma intervallum fordított intervallum igaz, ha növekvő intervallum
A (N) a dimenziót adja meg, egydimenziós tömböknél elhagyható.
Nagy Gergely, Horváth Péter
A VHDL áttekintése
21 / 57
Bevezető
Típusok és operátorok a VHDL-ben
A VHDL nyelv vezérlési szerkezetei
Hieararchikus tervezés
A VHDL operátorai
A VHDL operátorai Logikai operátorok not and or nand nor xor xnor
Relációs operátorok = /= (nem-egyenlő) < <= > >=
Eltoló operátorok sll srl (0-t tol be), sla sra (szélső bitet másol), rol ror
Összeadó/kivonó operátorok + - & (összefűző operátor)
Előjel operátorok + -
Szorzás/osztás * / mod rem (maradék)
Egyéb operátorok abs ** (hatványozás) Nagy Gergely, Horváth Péter
A VHDL áttekintése
22 / 57
Bevezető
Típusok és operátorok a VHDL-ben
A VHDL nyelv vezérlési szerkezetei
Hieararchikus tervezés
A jelekről részletesebben
A jelek késleltetése I.
Láttuk, hogy a jelek értékadásai párhuzamosan, azonnal megtörténnek. Egy áramkör viselkedésének az elemzése szempontjából fontos, hogy tudjuk modellezni a késleltetéseket. Egy jel késleltetésének a megadása: output <= in1 and in2 after 5 ns ;
Ez az ún. tehetetlenségi (inertial) késleltetés, ami azt jelenti, hogy a megadott késleltetésnél nem rövidebb időtartamú jelváltások a késleltetési idővel eltolva továbbítódnak, az annál rövidebbek elnyelődnek.
Nagy Gergely, Horváth Péter
A VHDL áttekintése
23 / 57
Bevezető
Típusok és operátorok a VHDL-ben
A VHDL nyelv vezérlési szerkezetei
Hieararchikus tervezés
A jelekről részletesebben
A jelek késleltetése II.
A logikai kapuk késleltetései tipikusan tehetetlenségi jellegű. Külön meg lehet határozni, hogy mi legyen az az időtartam, amit egy kapu még elnyel (reject), illetve mekkora késleltetést iktasson be a jelútba: output <= reject 4 ns i n e r t i a l in1 and in2 after 10 ns ;
Ekkor a kapu a 4 ns-nál nem hosszabb jeleket elnyeli és minden változás 10 ns késéssel történik meg. Az inertial az alapértelmezett késleltetés, nem kell kiírni, csak reject esetén.
Nagy Gergely, Horváth Péter
A VHDL áttekintése
24 / 57
Bevezető
Típusok és operátorok a VHDL-ben
A VHDL nyelv vezérlési szerkezetei
Hieararchikus tervezés
A jelekről részletesebben
A jelek késleltetése III.
A vezetékekre az a jellemző, hogy minden jelet továbbítanak egy adott késleltetéssel. Ezt a VHDL-ben szállítási (transport) késleltetésnek hívják: output <= t r a n s p o r t in1 and in2 after 14 ns ;
Nagy Gergely, Horváth Péter
A VHDL áttekintése
25 / 57
Bevezető
Típusok és operátorok a VHDL-ben
A VHDL nyelv vezérlési szerkezetei
Hieararchikus tervezés
A jelekről részletesebben
A jelek késleltetése IV. – Összefoglalás
b1 <= in e r t i a l a after 10 ns ; b2 <= t r a n s p o r t a after 10 ns ; b3 <= reject 4 ns i n e r t i a l a after 10 ns ;
Valójában, ha nincs késleltetés megadva, a szimulátor akkor is feltételez egy infinitezimálisan kicsi, ún. ∆ késleltetést. Nagy Gergely, Horváth Péter
A VHDL áttekintése
26 / 57
Bevezető
Típusok és operátorok a VHDL-ben
A VHDL nyelv vezérlési szerkezetei
Hieararchikus tervezés
Jelek feltételes értékadása
Jelek feltételes értékadása I.
Jelek esetén létezik feltételes értékadás, amely lényegében a más nyelvekből (C, Verilog) ismert ?: operátor megvalósítása VHDL-ben: a r c h i t e c t u r e tri_inv_arch of tri_inv is begin output <= ’1 ’ when input = ’0 ’ and enable = ’1 ’ else ’0 ’ when input = ’1 ’ and enable = ’1 ’ else ’Z ’; end a r c h i t e c t u r e tri_inv_arch ;
Nagy Gergely, Horváth Péter
A VHDL áttekintése
27 / 57
Bevezető
Típusok és operátorok a VHDL-ben
A VHDL nyelv vezérlési szerkezetei
Hieararchikus tervezés
Jelek feltételes értékadása
Jelek feltételes értékadása II. Amennyiben az összes feltétel egy adott jel értékeihez van kötve, akkor létezik egy egyszerűbb írásmód (amely hasonló a case szerkezethez – ld. később): entity multiplexer is port (a , b , c , d : in std_logic ; sel : in s t d _ l o g i c _ v e ct o r (1 downto 0); q : out std_logic ); end entity multiplexer ; a r c h i t e c t u r e multi_select of multiplexer is begin with sel select q <= a when " 00 " , b when " 01 " , c when " 10 " , d when " 11 " ; end a r c h i t e c t u r e multi_select ;
Nagy Gergely, Horváth Péter
A VHDL áttekintése
28 / 57
Bevezető
Típusok és operátorok a VHDL-ben
A VHDL nyelv vezérlési szerkezetei
Hieararchikus tervezés
Jelek feltételes értékadása
Jelek feltételes értékadása III.
Arra is lehetőség van, hogy egynél több értéket felsoroljunk az ágakban, illetve, hogy megadjunk egy ágat az összes fel nem sorolt esetre: ... target <= value1 when " 000 " , value2 when " 001 " | " 011 " | " 101 " , value3 when others ; ...
Nagy Gergely, Horváth Péter
A VHDL áttekintése
29 / 57
Bevezető
Típusok és operátorok a VHDL-ben
A VHDL nyelv vezérlési szerkezetei
Hieararchikus tervezés
A folyamat – process
A folyamat – process I. Mivel egy hardverben a műveletek párhuzamosan történnek alapvetően, a leírás is az. Azonban az algoritmusaink szekvenciálisak illetve tartalmaznak szekvenciális utasítás-sorozatokat. Ezek modellezésére szolgál a folyamat (process). A process magjában lévő utasítások a megadott sorrendben kerülnek végrehajtásra. Egy process folyamatosan, ismétlődve fut. Lehet érzékenységi listája, amely esetben csak akkor fut le, ha az ott szereplő jelek valamelyikén változás történt.
Nagy Gergely, Horváth Péter
A VHDL áttekintése
30 / 57
Bevezető
Típusok és operátorok a VHDL-ben
A VHDL nyelv vezérlési szerkezetei
Hieararchikus tervezés
A folyamat – process
A folyamat – process II.
A folyamaton belül deklarálhatunk változókat, amelyek a jelekkel ellentétben azonnal megkapják értékadáskor az új értéket, értéküket megőrzik a folyamat futásai között.
A folyamaton belül más programnyelvekéihez hasonló vezérlési utasításokat használhatunk: értékadás jeleknek és változóknak, feltételes elágazás (if), case utasítás, ciklus (loop), várakoztató utasítás (wait), stb.
Nagy Gergely, Horváth Péter
A VHDL áttekintése
31 / 57
Bevezető
Típusok és operátorok a VHDL-ben
A VHDL nyelv vezérlési szerkezetei
Hieararchikus tervezés
A folyamat – process
A folyamat – process III. Például egy pozitív élre érzékeny, aszinkron törléssel rendelkező D flipflopot az alábbi módon modellezheztünk: entity d_flipflop is port ( clk , clear , d : in std_logic ; q : out std_logic ); end entity d_flipflop ; a r c h i t e c t u r e behavioral of d_flipflop is begin process ( clk , clear ) is begin if ( clear = ’1 ’) then Q <= ’0 ’; else if ( clk ’ event and clk = ’1 ’) then Q <= D ; end if ; end process ; end a r c h i t e c t u r e behavioral ;
Nagy Gergely, Horváth Péter
A VHDL áttekintése
32 / 57
Bevezető
Típusok és operátorok a VHDL-ben
A VHDL nyelv vezérlési szerkezetei
Hieararchikus tervezés
A folyamat – process
A folyamat – process IV. A változók használatát egy egyszerű számlálón mutatjuk be: entity cnt is port ( clk , rst : in std_logic ; q : out s t d _ l o g i c _ v e ct o r (3 downto 0)); end entity cnt ; a r c h i t e c t u r e behavioral of cnt is begin process ( clk ) is variable count : s t d _ l o g ic _ v e c t o r (3 downto 0); begin if ( clk = ’1 ’) then if ( rst = ’1 ’) then count := B " 0000 " ; else count := count + B " 001 " ; end if ; end if ; q <= count ; end process ; end a r c h i t e c t u r e behavioral ;
Nagy Gergely, Horváth Péter
A VHDL áttekintése
33 / 57
Bevezető
Típusok és operátorok a VHDL-ben
A VHDL nyelv vezérlési szerkezetei
Hieararchikus tervezés
A folyamat – process
A folyamat – process V. A jelek és változók viselkedése közti különbséget nézzük meg egy példán keresztül: signal a1 , a2 : integer ; ... process begin wait for 10 ns ; a1 <= a1 +1; a2 <= a1 +1; end process ; process v a r i a b l e a3 , a4 : integer ; begin wait for 10 ns ; a3 := a3 +1; a4 := a3 +1; end process ;
Nagy Gergely, Horváth Péter
Az értékek alakulása időben Idő 0 10 10 + ∆ 20 20 + ∆ 30 30 + ∆
A VHDL áttekintése
a1 0 0 1 1 2 2 3
a2 0 0 1 1 2 2 3
a3 0 1 1 2 2 3 3
a4 0 2 2 3 3 4 4
34 / 57
Bevezető
Típusok és operátorok a VHDL-ben
A VHDL nyelv vezérlési szerkezetei
Hieararchikus tervezés
Feltételes elágazások
Az if szerkezet Egy négybites multiplexer: entity MUX_4_1a is port ( S1 , S0 , A , B , C , D : in std_logic ; Z : out std_logic ); end entity MUX_4_1a ; a r c h i t e c t u r e behav_MUX41a of MUX_4_1a is begin process ( S1 , S0 , A , B , C , D ) begin if (( not S1 and not S0 )= ’1 ’) then Z <= A ; elsif (( not S1 and S0 ) = ’1 ’) then Z <= B ; elsif (( S1 and not S0 ) = ’1 ’) then Z <= C ; else Z <= D ; end if ; end process ; end a r c h i t e c t u r e behav_MUX41a ;
Nagy Gergely, Horváth Péter
A VHDL áttekintése
35 / 57
Bevezető
Típusok és operátorok a VHDL-ben
A VHDL nyelv vezérlési szerkezetei
Hieararchikus tervezés
Feltételes elágazások
Az case szerkezet Ugyanaz a négybites multiplexer: entity MUX_4_1 is port ( SEL : in s t d _ l o g i c _ v e ct o r (2 downto 1); A , B , C , D : in std_logic ; Z : out std_logic ); end entity MUX_4_1 ; a r c h i t e c t u r e behav_MUX41 of MUX_4_1 is begin process ( SEL , A , B , C , D ) begin case SEL is when " 00 " = > Z <= A ; when " 01 " = > Z <= B ; when " 10 " = > Z <= C ; when " 11 " = > Z <= D ; when others = > Z <= ’X ’; end case ; end process ; end a r c h i t e c t u r e behav_MUX41 ;
Nagy Gergely, Horváth Péter
A VHDL áttekintése
36 / 57
Bevezető
Típusok és operátorok a VHDL-ben
A VHDL nyelv vezérlési szerkezetei
Hieararchikus tervezés
Ciklusok
A while ciklus
Példa a while ciklusra: p1 : process ( signal_a ) is -- cimke e l h a g y h a t ó variable index : integer := 0; begin while_loop : -- a cimke e l h a g y h a t ó while index < 8 loop ray_out ( index ) <= ray_in ( index ); index := index +1; end loop while_loop ; end process p1 ;
A processek és a vezérlési szerkezetek megcímkézhetőek, és ezek a nevek feltűntethetőek az end utasítások után. Ez az olvashatóságot javíthatja.
Nagy Gergely, Horváth Péter
A VHDL áttekintése
37 / 57
Bevezető
Típusok és operátorok a VHDL-ben
A VHDL nyelv vezérlési szerkezetei
Hieararchikus tervezés
Ciklusok
A for ciklus
Példa a for ciklusra: process ( signal_a ) begin label_1 : for index in 0 to 7 -- index i m p l i c i t e n deklar á lva loop ray_out ( index ) <= ray_in ( index ); end loop label_1 ; end process ;
Nagy Gergely, Horváth Péter
A VHDL áttekintése
38 / 57
Bevezető
Típusok és operátorok a VHDL-ben
A VHDL nyelv vezérlési szerkezetei
Hieararchikus tervezés
Várakoztató utasítások
Várakoztató utasítások I. A wait utasításnak több alakja is létezik. A szintézerek általában nem támogatják. Az until addig vár, amíg egy feltétel igaz nem lesz (szintézerek ezt támogatják): wait until clk = ’1 ’; wait until signal ’ event and signal = value ; wait until not signal ’ stable and signal = value ;
Egy adott ideig várni a for segítségével lehet (tesztelésnél hasznos): wait for 2 ns ;
Az on hatására addig vár, amíg a megadott jel(ek)en változás nem történik: wait on sig1 , sig2 ;
Nagy Gergely, Horváth Péter
A VHDL áttekintése
39 / 57
Bevezető
Típusok és operátorok a VHDL-ben
A VHDL nyelv vezérlési szerkezetei
Hieararchikus tervezés
Várakoztató utasítások
Várakoztató utasítások II.
A wait önmagában örökké vár. Ennek hatására a szimuláció leáll, ha más változás nincsen: process begin in1 <= ’0 ’; in2 <= ’0 ’; wait for 5 ns ; in1 <= ’1 ’; -- " wait forever " -- le á ll a szimul á ci ó wait ; end process ;
Nagy Gergely, Horváth Péter
A VHDL áttekintése
40 / 57
Bevezető
Típusok és operátorok a VHDL-ben
A VHDL nyelv vezérlési szerkezetei
Hieararchikus tervezés
Alprogramok
Függvények I.
A leírások áttekinthetőbbé tétele érdekében bizonyos algoritmus részletek alprogramokba (függvények, eljárások) emelhetőek ki. A függvények jellemzői: egy visszatérési értékük van, minden paraméterük bemeneti paraméter, az utasításaik sorrendben hajtódnak végre, minden utasítás és szerkezet használható bennük, ami a folyamatokban is.
Nagy Gergely, Horváth Péter
A VHDL áttekintése
41 / 57
Bevezető
Típusok és operátorok a VHDL-ben
A VHDL nyelv vezérlési szerkezetei
Hieararchikus tervezés
Alprogramok
Függvények II. type log8 is array (0 to 7) of std_logic ; ... entity convert is port ( i1 : in log8 ; o1 : out integer ); end entity convert ; a r c h i t e c t u r e convert_fun of convert is function vector_to_int ( s : log8 ) return integer is variable result : integer := 0; begin for i in 0 to 7 loop result := result * 2; if s ( i ) = ’1 ’ then result := result + 1; end if ; end loop ; return result ; end function vector_to_int ; begin o1 <= vector_to_int ( i1 ); end a r c h i t e c t u r e convert_fun ;
Nagy Gergely, Horváth Péter
A VHDL áttekintése
42 / 57
Bevezető
Típusok és operátorok a VHDL-ben
A VHDL nyelv vezérlési szerkezetei
Hieararchikus tervezés
Alprogramok
Eljárások I.
Az eljárások hasonlóak a függvényekhez, azonban az eljárásoknak nincs dedikált visszatérési értékük, megadható a paramétereik iránya: in, out, inout.
Nagy Gergely, Horváth Péter
A VHDL áttekintése
43 / 57
Bevezető
Típusok és operátorok a VHDL-ben
A VHDL nyelv vezérlési szerkezetei
Hieararchikus tervezés
Alprogramok
Eljárások II.
p r o c e d u r e vector_to_int (
z : in s t d _ l o g i c _ v e c to r ; x_flag : out boolean ; q : inout integer ) is
begin q := 0; x_flag := false ; for i in z ’ range loop q := q * 2; if z ( i ) = ’1 ’ then q := q + 1; else if z ( i ) /= ’0 ’ then x_flag := true ; -- ha z ( i ) = ’Z ’ pl . end if ; end loop ; end p r o c e d u r e vector_to_int ;
Nagy Gergely, Horváth Péter
A VHDL áttekintése
44 / 57
Bevezető
Típusok és operátorok a VHDL-ben
A VHDL nyelv vezérlési szerkezetei
Hieararchikus tervezés
Generikus komponensek
Generikus komponensek I. Lehetőség van arra, hogy egy komponens bizonyos paramétereit ne tervezéskor, hanem példányosításkor határozzuk meg. Ezt hívjuk általános, vagy generikus tervezésnek (pl. Verilogban a parameter, C++ template-jei). A generikus paramétert definiálni kell az entity blokkban: entity piso is -- p a r a l l e l in serial out generic ( width : integer := 7); -- default : 7 port ( clk : in std_logic ; load : in std_logic ; in1 : in s t d _ l o g i c _ v ec t o r ( width downto 0); out1 : out std_logic ); end entity piso ;
Nagy Gergely, Horváth Péter
A VHDL áttekintése
45 / 57
Bevezető
Típusok és operátorok a VHDL-ben
A VHDL nyelv vezérlési szerkezetei
Hieararchikus tervezés
Generikus komponensek
Generikus komponensek II. A modulban úgy használhatjuk a generikus változót, mint egy konstanst: a r c h i t e c t u r e Behavioral of piso is signal temp : std _l o g i c _ v e c t o r ( width downto 0) := ( others = > ’0 ’); -- i n i t i a l i z e to zero begin process ( clk ) begin if ( load = ’0 ’) then -- load the r e g i s t e r temp <= in1 ; elsif ( clk ’ event and clk = ’1 ’) then out1 <= temp ( width ); temp ( width downto 1) <= temp ( width -1 downto 0); end if ; end process ; end a r c h i t e c t u r e Behavioral ;
Nagy Gergely, Horváth Péter
A VHDL áttekintése
46 / 57
Bevezető
Típusok és operátorok a VHDL-ben
A VHDL nyelv vezérlési szerkezetei
Hieararchikus tervezés
Generikus komponensek
Generikus komponensek III.
Példányosításkor a komponens megadásánál is szerepel a generic szerkezet (ugyanúgy, mint az entity blokkban. A tényleges példány létrehozásakor a port map rész előtt szerepel egy generic map szerkezet, ahol megadhatjuk a paraméter értékét (amennyiben nem az alapértelmezettet kívánjuk használni):
piso1 : piso generic map ( width = > 7) port map ( clk , load1 , in1 , o1 ); piso2 : piso generic map ( width = > 3) port map ( clk , load2 , in2 , o2 );
Nagy Gergely, Horváth Péter
A VHDL áttekintése
47 / 57
Bevezető
Típusok és operátorok a VHDL-ben
A VHDL nyelv vezérlési szerkezetei
Hieararchikus tervezés
Példányosítás
Komponensek I. A hierarchikus építkezés azt jelenti, hogy az egyedek tartalmazhatják más egyedek példányait. Az egyedek példányosítása előtt komponensként definiálnunk kell őket. Legegyszerűbb esetben a komponensdefiníció megegyezik az entity leírással. Amennyiben a neve is ugyanaz, akkor mást nem kell tenni a kapcsolat létrehozásához. entity nand_gate is port (a , b : in bit ; q : out bit ); end entity nand_gate ; a r c h i t e c t u r e testbench of nand_test is c o m p o n e n t nand_gate is port (a , b : in bit ; q : out bit ); end c o m p o n e n t nand_gate ; ...
Nagy Gergely, Horváth Péter
A VHDL áttekintése
48 / 57
Bevezető
Típusok és operátorok a VHDL-ben
A VHDL nyelv vezérlési szerkezetei
Hieararchikus tervezés
Példányosítás
Komponensek II.
A példányosításkor a létrejövő egyedet hozzá kell kapcsolni a környezetéhez: -- Itt fontos a sorrend : nand_gate_dut : nand_gate port map ( in1 , in2 , output ); -- Itt a p o r t o k h o z egyenk é nt rendelj ü k a jeleket : nand_gate_dut : nand_gate port map ( a = > in1 , b = > in2 , q = > output );
Sokportos egyedek esetén érdemes a második megoldást alkalmazni, mert olyankor nagyon nehéz a sorrendet követni – nehezen érthető kódot eredményez az első alak.
Nagy Gergely, Horváth Péter
A VHDL áttekintése
49 / 57
Bevezető
Típusok és operátorok a VHDL-ben
A VHDL nyelv vezérlési szerkezetei
Hieararchikus tervezés
Példányosítás
Komponensek III. Amennyiben egy egyednek többféle architektúrája van, akkor példányosításkor meg kell adnunk azt is, hogy melyik legyen felhasználva. Alapértelmezés szerint a legutolsó kerül felhasználásra. a r c h i t e c t u r e testbench of nand_gate_tb is c o m p o n e n t nand _gate_co mp port (a , b : in bit ; q : out bit ); end c o m p o n e n t nand_ gate_co mp ; for nand_gate_dut : n and_gate _comp use entity work . nand_gate ( arch_1 ); signal in1 , in2 , output : bit ; begin nand_gate_dut : nand_gat e_comp port map ( a = > in1 , b = > in2 , q = > output ); ...
A work az alapértelmezett könyvtárnév, ahová az aktuális projekt egyedei kerülnek. Nagy Gergely, Horváth Péter
A VHDL áttekintése
50 / 57
Bevezető
Típusok és operátorok a VHDL-ben
A VHDL nyelv vezérlési szerkezetei
Hieararchikus tervezés
Példányosítás
Komponensek IV.
Egy egyszerűbb módja az példányosításnak az ún. közvetlen beültetés. Ilyenkor a példányosítás kizárólag a begin után történik: a r c h i t e c t u r e testbench of nand_gate_tb is signal in1 , in2 , output : bit ; begin nand_gate_dut : entity work . nand_gate ( arch_1 ) port map ( a = > in1 , b = > in2 , q = > output ); ...
Nagy Gergely, Horváth Péter
A VHDL áttekintése
51 / 57
Bevezető
Típusok és operátorok a VHDL-ben
A VHDL nyelv vezérlési szerkezetei
Hieararchikus tervezés
Csomagok
Csomagok I. A csomagok célja típusok, konstansok, alprogramok megosztása tervezési egységek között. Egy csomagot két részben adunk meg: 1
csomag deklaráció: az egyes elemek deklarációja, vagyis típussal adott névfelsorolás: alprogram deklarációja, típus/altípus deklaráció, konstansok deklarációja, komponensek deklarációja, use kifejezések, stb.
2
csomag definíció: a csomag elemeinek definíciója, vagyis kifejtése: alprogramok definíciója, konstansok definíciója, stb.
Nagy Gergely, Horváth Péter
A VHDL áttekintése
52 / 57
Bevezető
Típusok és operátorok a VHDL-ben
A VHDL nyelv vezérlési szerkezetei
Hieararchikus tervezés
Csomagok
Csomagok II. – deklarációs rész
package cluster_pa ck ag e is type nineval is ( Z0 , Z1 , ZX , R0 , R1 , RX , F0 , F1 , FX ); type t_cluster is array (0 to 15) of nineval ; type t_clus_vec is array ( natural range < >) of t_cluster ; f unction resolve _ cl us te r ( s : t_clus_vec ) return t_cluster ; subtype t_wclus is r es ol ve _ cl us te r t_cluster ; c onstant undriven : t_wclus ; end package cluster _ pa ck ag e ;
Nagy Gergely, Horváth Péter
A VHDL áttekintése
53 / 57
Bevezető
Típusok és operátorok a VHDL-ben
A VHDL nyelv vezérlési szerkezetei
Hieararchikus tervezés
Csomagok
Csomagok II. – definíciós rész package body cluster _ pa ck ag e is c o n stant undriven : t_wclus := ( ZX , ZX , ZX , ZX ,
ZX , ZX , ZX , ZX ,
ZX , ZX , ZX , ZX ,
ZX , ZX , ZX , ZX );
f u n ction resolve_cl us te r ( s : t_clus_vec ) return t_cluster is variable result : t_cluster ; variable drive_count : integer ; begin if s ’ length = 0 then return undriven ; end if ; for i in s ’ range loop if s ( i ) /= undriven then drive_count := drive_count + 1; if drive_count = 1 then result := s ( i ); else result := undriven ; end if ; end if ; end loop ; return result ; end function res ol ve _ cl us te r ; end package body clu st er _ pa ck ag e ;
Nagy Gergely, Horváth Péter
A VHDL áttekintése
54 / 57
Bevezető
Típusok és operátorok a VHDL-ben
A VHDL nyelv vezérlési szerkezetei
Hieararchikus tervezés
Hardver generálás
Hardver generálás I.
Ahogy Verilogban is, a VHDL is lehetőséget ad hardver generálásra. Ez azt jelenti, hogy egy ciklusban tudunk hardvert példányosítani úgy, hogy az összeköttetéseket a ciklus futó változói határozzák meg. Így egyszerűbb kapukból bonyolult szerkezetet lehet képezni anélkül, hogy mechanikusan le kéne írni az összes elem bekötését. Tipikusan arra használják, hogy egybites elemeket sokbites adatok lekezélésére képes architektúrává építsék össze.
Nagy Gergely, Horváth Péter
A VHDL áttekintése
55 / 57
Bevezető
Típusok és operátorok a VHDL-ben
A VHDL nyelv vezérlési szerkezetei
Hieararchikus tervezés
Hardver generálás
Hardver generálás II.
a r c h i t e c t u r e test_generate of test_entity is signal s1 , s2 , s3 : bit_vector (7 downto 0); begin G1 : for N in 7 downto 0 g e n e r a t e and_array : and_gate generic map (2 ns , 3 ns ) port map ( s1 ( N ) , s2 ( N ) , s3 ( N )); end generate G1 ; end a r c h i t e c t u r e test_generate ;
Nagy Gergely, Horváth Péter
A VHDL áttekintése
56 / 57
Bevezető
Típusok és operátorok a VHDL-ben
A VHDL nyelv vezérlési szerkezetei
Hieararchikus tervezés
Hardver generálás
Hardver generálás III.
Lehetőség van feltételekhez kötni a generálást. Erre az if szerkezethasználható. Az else és elsif kulcsszavak generáláskor nem alkalmazhatóak. G1 : for N in 8 downto 0 g e n e r a t e G2 : if ( N < 7) g e n e r a t e or1 : or_gate generic map (3 ns , 3 ns ) port map ( s1 ( N ) , s2 ( N ) , s3 ( N )); end gener a t e G2 ; ... end generate G1 ;
Nagy Gergely, Horváth Péter
A VHDL áttekintése
57 / 57