A VHDL hardver leíró nyelv

Kifejezések, operátorok

Értékadások

Egy hardver leíró nyelvvel, így a VHDL segítségével is, egy elkészítendő hardver statikus leírását fogalmazzuk meg. Emiatt az értékedások is úgy értelmezendők, mint egy-egy statikus hardvermodul kimenetének összekötése valamely másik alkotóelem bemenetével. Az említett modulok jellemzően kétfélék lehetnek. Egyik esetben ezekre adatokat mozgató vezetékekként, más esetben pedig adatokat tároló regiszterekként kell gondolnunk.

A VHDL-ben a vezetékek nyelvi szintű megjelenései a signal-ként, a regisztereké pedig a variable-ként deklarált objektumok.

Párhuzamos értékadás

A signal objektumok értékadása az úgynevezett párhuzamos értékadás. Ez annyit jelent, hogy az szekvenciálisan felsorolt értékadások egymástól függetlenül, párhuzamosan hajtódnak végre, ugyanis mindezek a megvalósítás során egy-egy valamely portra bekötött vezetéket fognak jelenteni, amelyek mindegyikén az értékadás balértékeként megadott objektum irányába folyik majd az áram.

Az fenti alapértelmezett viselkedés egy esetben módosul, ha az értékadás egy process blokk belsejében fordul elő, mivel ekkor ez is szekvenciálissá válik. (A process blokk jelentőségéről később.)

Az értékadás operátora: <=

Az alábbi példa egy bemenő adat egy bittel balra fogatott változatát jeleníti meg a kimeneten, valamint a kiforduló bitet egy flag nevű szignálra irányítja.

data_out(width downto 1) <= data_in(width-1 downto 0);
data_out(0) <= ’0’;
flag <= data_in(width);

Szekvenciális értékadás

A variable objektumok csakis úgy tekinthetők, mint egy-egy időben változó tartalmú regiszter. Ennek megfelelően a tartalmuk függ attól, hogy melyik időpillanatban írtuk és olvastuk azt. Mindezek miatt az értékadása a többi utasításhoz képest mindig szekvenciálisan hajtódik végre.

Az értékadása az Ada-ból átvett := operátorral történik.

Operátorok

A VHDL operátorainak nagy részét nem meglepő módon az Ada-ból ismert aritmetikai, relációs és logikai operátorok alkotják. Ezeken túl, mivel a hardverben leginkább biteket manipulálunk, natívan megjelennek a nyelvben a különböző bitszintű műveletek operátorai is, mint az eltoló, forgató vagy a bitszintű logikai műveletek.

Az alábbiakban egy táblázatban foglalom össze a nyelv jellemző operátorait. A szimbólomok egyértelműek, ezért nem fűzök hozzájuk magyarázatot. A táblázat fentről lefelé növekvő precedencia szerint tartalmazza az operátorcsaládokat.

CSALÁD OPERÁTOROK
Logikai and or nand nor xor xnor not
Relációs = /= < <= > >=
Eltoló, forgató sll srl sla sra rol ror
Összeadó + - &
Szorzó * / mod rem
Egyéb matematikai abs **
Nem műveleti => <= ??

Csupán az utolsó család tagjairól írnék néhány szót.

A <= az értékadásokról szóló részből ismert, a => pedig az Ada-ból is ismerős paraméter megfeleltető jel. Tehát maradt a ??, ami arra használható, hogy egy feltétel vizsgálatakor az STD_LOGIC típusú értékekből BOOLEAN típusút készítsen, amiken már elvégezhető a feltételvizsgálat. (Az IEEE 1076-2008 szabvány már implicit módon elvégzi a konverziót, tehát két STD_LOGIC vagy STD_LOGIC_VECTOR típusú értéket is össze tudunk hasonlítani a relációs operátorokkal.)

Példa a ?? használatára:

if A = '1' and B = '1' then ...
	-- ahol A és B STD_LOGIC típusúak
if ?? A and B then ...
	-- ez ugyanaz, csak már BOOLEAN-ként vizsgálja őket
if A and B then ...
	-- bizonyos körülmények között implicit módon megtörténik a konverzió