VHDL

**VHDL** (lühend sõnadest *VHSIC Hardware Description Language* ehk väga kiirete integraallülituste riistvara kirjeldamise keel) on riistvarakirjelduskeel, mida kasutatakse elektroonilise disaini automatiseerimisel (EDA ehk *Electronic Design Automation*) selleks, et kirjeldada digitaalseid ja segasignaalide süsteeme, näiteks väliprogrammeeritavaid väravamassiive (FPGA) ja integraallülitusi.

## Ajalugu

Algselt loodi VHDL Ameerika Ühendriikide Kaitseministeeriumi korraldusel selleks, et dokumenteerida, kuidas käituvad rakendusspetsiifilised integraallülitused ASIC-ud (*Application Specific Integrated Circuit*), mille tarnijad seadmetega kaasa panid. Võib öelda, et VHDL loodi alternatiiviks käsiraamatutele, mis kasutusspetsiifiliste detailide tõttu olid mahukad ja keerulised.

Sellise dokumentatsiooni simuleerimise idee oli nii atraktiivne, et selle alusel arendati välja loogikasimulaatorid, mis suutsid lugeda VHDL-faile. Järgmise sammuna loodi loogika sünteesimise tööriistad, mis suutsid lugeda nii VHDL-faile kui ka väljastada andmeid mikroskeemi füüsilise rakendamise kohta.

Kaitseministeeriumi nõudmisel põhines VHDL programmeerimiskeel Ada süntaksil, et vältida Ada arendamise käigus juba põhjalikult testitud ideede taasleiutamist. VHDL-i alusideed ja süntaks laenati Ada programmeerimiskeelelt.

Esialgne VHDL-i versioon, mis disainiti IEEE standarditele 1076–1987, sisaldas mitmeid andmetüüpe, sealhulgas numbrilist (täisarv- ja reaalarv-tüüpi andmed), loogilisi (bitt ja tõeväärtus), tähemärke ja aega, lisaks eelpool nimetatutele ka bit-massiive bit_vector ja charactermassiive, nagu näiteks sõne.

Antud versioon ei lahendanud aga "mitmevalentse loogika" probleeme, mille puhul tuleb arvestada ka signaali juhtimistugevust (puuduv, nõrk või tugev) ning tundmatuid väärtusi. Seda nõudis IEEE standard 1164, mis defineeris 9-väärtuselised loogikastandardi tüübid: skalaar std_ulogic ja tema vektorversioon std_ulogic_vector.

1933. aastal uuendatud IEEE 1076 muutis süntaksi palju terviklikumaks, võimaldas paindlikumaid nimetusi, laiendas prinditavate ISO-8859-1 tähemärkide võimaldamiseks `character`-tüüpi, lisas operaatori `XNOR`, jne.

Väiksemad standardi muudatused (aastatel 2000 ja 2002) lisasid kaitstud tüüpide idee (sarnaneb C++ klassi ideega) ning eemaldasid mõned piirangud portide ühenduse ümbersuunamise (*port forwarding*/*port mapping*) reeglites.

Lisaks IEEE standardile 1164 lisati keele funktsionaalsuse suurendamiseks ka mõned väike-standardid. IEEE standard 1076.2 lisas reaal- ja kompleksandmetüüpide parema töötluse. IEEE standard 1076.3 juurutas *signed* (kirjastatud) ja *unsigned* (kirjastamata) tüüpe, et aidata vektorite aritmeetilisi tehteid hõlpsamaks muuta. IEEE standard 1076.1 (tuntud kui VHDL-AMS) pakkus skeemidisaini laiendusi analoog- ja segasignaalile.

Ka mõned teised standardid toetavad VHDL-i laiemat kasutusala, eriti VITAL (*VHDL Initiative Towards ASIC Libraries*) ja mikrolainete skeemidisaini laiendused.

2006. aasta juunis kinnitati *VHDL Technical Committee of [[Accellera]]* (IEEE poolt määratud järgmise standardi uuendust välja töötama) poolt niinimetatud VHDL-2006 *Draft* 3.0. Uues väljapakutud standardis säilitati täielik ühilduvus vanemate versioonidega ning selles võimaldati mitmeid laiendusi, mis muutsid VHDL-koodi kirjutamise ja hoolduse palju lihtsamaks. Põhilised muutused sisaldasid väikestandardite (1164, 1076.2, 1072.3) ühendumist peamise standardiga 1076, laiendatud operaatorite komplekti, suurema paindlikkusega protsessi ja genereerimise deklaratsiooni süntaksit, VHPI (C/C++ keelte kasutajaliides) lisamist ja *[[Property Specification Language|PSL]]* (omaduste spetsifitseerimise keel *Property Specification Language*) alamrühma. Need muudatused täiustasid sünteesitava VHDL-koodi kvaliteeti, muutsid testimiskeskkonna paindlikumaks ning võimaldasid VHDL-i laiemat kasutamist süsteemipõhistes kirjeldustes.

2008. aasta veebruaris kinnitas Accellera VHDL-i versiooni 4.0 (tuntud ka kui VHDL 2008), mis keskendus versiooni 3.0 katseperioodil avastatud rohkem kui 90 probleemile ning hõlmas ka parandatud üldtüüpe. 2008. aastal andis Accellera VHDL-i versiooni 4.0 hääletamiseks üle IEEE-le, et lisada see uude standardisse. 2009. aasta jaanuaris väljastati VHDL-i standard IEEE 1076–2008.

## Disain

Tavaliselt kasutatakse VHDL-i tekstimudelite kirjutamiseks, mis kirjeldavad loogikaskeeme. Selliseid mudeleid töödeldakse sünteesiprogrammis, kuid ainult juhul, kui see on loogikadisaini osa. Loogikadisaini testimiseks kasutatakse simulatsiooni programmi, mis kasutab simulatsioonimudeleid selleks, et esitada loogikaskeeme, mis liidestuvad antud disainiga. Taolist simulatsioonimudelite kogumit nimetatakse tavaliselt testimiskeskkonnaks (*testbench*).

VHDL-il on konstruktsioonid riistvara disainis sisalduva paralleelsuse käsitlemiseks, kuid need konstruktsioonid (*processes*) erinevad Ada (*tasks*) paralleelsuse protsessidele omasest süntaksist. Nagu Ada, on ka VHDL kindlalt tüüpide põhine ning ei ole tõstutundlik. Selleks, et vahetult esitada riistvarale omaseid operatsioone, on VHDL-is mitmeid omadusi, mida Adas ei leidu. VHDL-is on näiteks laiendatud Boole'i operaatorite valik, sealhulgas **NING-EI** (**NAND**) ja **VÕI-EI** (**NOR**) operatsioonid. VHDL võimaldab ka määrata massiivide viiteid vastavalt kas kasvavas või kahanevas suunas; mõlemat meetodit kasutatakse riitvaras, samal ajal kui Adas ja enamikus teistes programmeerimiskeeltes on võimalik ainult kasvavas järjekorras viitamine.

VHDL-il on failide sisestamise ja väljastamise võimekus ning seetõttu saab seda kasutada teksti töötlemise üldotstarbelise keelena, kuigi testkeskkond kasutab selle faile tavaliselt simulatsiooni andmete stiimuli või ehtsuse kontrolliks. Olemas on ka mõned VHDL-i kompilaatorid, mis loovad käivitatavaid kahendfaile. Sel juhul on võimalik VHDL-i kasutada testkeskkonna kirjutamiseks, et peremeesarvutis asuvaid faile kasutades üle kontrollida disaini funktsionaalsust, et määrata stiimul, suhelda kasutajaga ning võrrelda tulemusi oodatud tulemustega. Kuid enamasti jätavad disainerid selle töö simulaatorile.

Algajal arendajal on suhteliselt lihtne luua kood, mis edukalt simuleerib õigesti, kuid mida ei ole võimalik sünteesida reaalsele seadmele või kood on ebapraktiliselt suur. Üheks konkreetseks eksimuseks on elementide talletamiseks kogemata asünkroonse ''flip-flop'' trigeri kasutamine D-tüüpi trigeri asemel.

Riistvara saab disainida VHDL IDE (*Integrated Development Evironment* ehk integreeritud arenduskeskkond) keskkonnas (FPGA implementeerimiseks, nagu näiteks Xilinx ISE, Altera Quartus, Synopsys Synplify või Mentor Graphics HDL Designer), et luua soovitud mikroskeemi RTL-skeem. Pärast seda saab skeemi üle kontrollida, kasutades simulatsiooni tarkvara, mis näitab pärast kindla testikeskkonna loomist mikroskeemi sisendite ja väljundite ühendusi. Et luua sobiv testikeskkond kindlale mikroskeemile või VHDL-koodile, peavad sisendid olema õigesti defineeritud. Näiteks kella sisendile on vaja tsükli protseduuri või iteratiivset lauset.

Lõpuks, kui VHDL-mudel tõlgitakse "väratiteks ja juhtmeteks", mida on kaardistatud programmeeritavale loogikaseadmele CPLD või FPGA, siis seadistatakse tegelik riistvara, selle asemel, et "käivitada" VHDL-i kood mõne protsessori kiibi vormina.

## Eelised

Kui kasutada VHDL-i süsteemidisainis, on tema peamiseks eeliseks võimalus kirjeldada (modelleerida) ja üle kontrollida (simuleerida) soovitud süsteemi enne, kui sünteesitööriistad tõlgivad selle disaini reaalseks riistvaraks (väratiteks ja juhtmeteks).

Teine eelis on see, et VHDL võimaldab kirjeldada samaaegseid süsteeme. VHDL on andmevoo keel, mis erineb teistest protseduurilistest arvutikeeltest, nagu näiteks BASIC, C ja *assembly* kood, mis kõik töötavad järjestikuliselt ja ühe käsu kaupa.

VHDL-i projekt on mitmeotstarbeline. Üks kord loodud arvutuse plokki saab kasutada paljudes teistes projektides. Ka mitmeid asendi- ja funktsionaalplokkide parameetreid saab muuta (mahtuvuse parameetrid, mälu suurus, elemendi baas, ploki kompositsioon ja sidumise struktuur).

VHDL-i projekt on ülekantav. Kui ühele elemendibaasile on arvuti seadme projekt loodud, on seda võimalik üle kanda ka teisele elemendibaasile, näiteks VLSI koos mitmesuguste tehnoloogiatega.

## Disaini näited

VHDL-is koosneb disain minimaalselt sellisest tervikust (*entity*), mis kirjeldab liidest ja arhitektuuri (*architecture*) ning moodustab tegeliku rakenduse (*implementation*). Enamik disaine impordivad lisaks sellele ka teegi mooduleid (*library modules*). Mõned disainid sisaldavad ka mitut arhitektuuri ja konfiguratsiooni (*configurations*).

Lihtne NING värat võib välja näha selline:


```vhdl
-- (nii kommenteeritakse VHDL-koodis)

-- importida IEEE kogust std_logic
library IEEE;
use IEEE.std_logic_1164.all;

-- see on olem
entity ANDGATE is
  port ( 
    I1 : in std_logic;
    I2 : in std_logic;
    O  : out std_logic);
end entity ANDGATE;

-- selline on arhitektuur
architecture RTL of ANDGATE is
begin
  O <= I1 and I2;
end architecture RTL;
```


(`RTL` tähistab registri ülekande taseme disaini) Kui eelpool toodud näide võib tunduda algajast HDL-i kasutajale paljusõnalisena, siis mitmed osad on tegelikult kas soovituslikult valikulised või neid peab kõigest ühe korra kirjutama. Üldiselt on taolised lihtsad funktsioonid suuremate käitumismoodulite osad ja iga lihtsa asja jaoks pole eraldi moodulit vaja. Samuti võib alguses tunduda std_logic-tüüpi elementide kasutamine üleliigsena. Kasutada saab ju ka sisse ehitatud bit-tüüpi ja hoiduda alguses teegi importimisest. Kuid 9-väärtuseliste mitmevalentsete loogikate (<tt>U</tt>,<tt>X</tt>,<tt>0</tt>,<tt>1</tt>,<tt>Z</tt>,<tt>W</tt>,<tt>H</tt>,<tt>L</tt>,<tt>-</tt>) kasutamine lihtsate bittide (0,1) asemel pakub disainerile väga võimsa simulatsiooni ja *debugg*-imise tööriista, mida pole üheski teises HDL-is.

Järgnevates näidetes on näha, et VHDL-i koodi on võimalik kirjutada väga kompaktses vormis. Kogenumad disainerid hoiduvad tavaliselt taoliste kompaktsete vormide kasutamisest ning kasutavad loetavuse ja hooldatavuse tagamiseks paljusõnalisemat kodeerimise stiili. Paljusõnalise kodeerimise teiseks eeliseks on ressursside väiksem kogus, mida kasutatakse täisprogrammeeritava loogikaseadme programmeerimiseks.

### Sünteesitavad protsessid ja VHDL-i šabloonid

Tihti kasutatakse VHDL-i kahel erineval eesmärgil: elektroonikadisainide simuleerimiseks ja selliste disainide sünteesimiseks. Sünteesimiseks nimetatakse protsessi, mille puhul VHDL-kood kompileeritakse ja kaardistatakse implementeeritavale tehnoloogiale, nagu näiteks FPGA või ASIC. Mitmetel FPGA tarnijatel on tasuta tööriistu VHDL-i sünteesimiseks nende mikrokiipide peale, kuna ASIC-tööriistad on tihti väga kallid.

VHDL-i kõik protsessid ei ole sobivad sünteesiks. Näiteks enamik protsesse, mis tegelevad ajastamisega, nagu näiteks wait for 10 ns; ei ole vaatamata simuleeritavusele võimalik sünteesida. Kuna erinevatel sünteesimise tööriistadel on erinevad võimalused, siis eksisteerib ühine VHDL-i sünteesimise alamhulk, mis defineerib, millised keele protsessid ja idioomid ühilduvad paljude sünteesimise tööriistade ühise riistvaraga. IEEE 1076.6 defineerib keele alamhulga, mida loetakse ametlikuks sünteesimise alamhulgaks. Üldiselt loetakse heaks tavaks kirjutada sünteesimiseks väga idiomaatilist koodi, kuna mittestandardsete protsesside jaoks võivad olla tulemused valed või optimaalsest madalamad.

Mõned sünteesitavate koodide näited:

### MUX näide

Multipleksor on väga lihtne komponent riistvara disainis. Järgnev näide demonstreerib lihtsamat 
kaks-ühte multipleksorit, milles on sisendid A ja B, juhtsignaal S ja väljund X. Sama multipleksorit on VHDL-is võimalik mitmeti väljendada.


```vhdl
X <= A when S = '1' else B;
```


### Trigeri näide

Triger on üks bitt mälu, mida uuendatakse, kui lubatud signaal on kõrges olekus (1). Jällegi on VHDL-is palju teisi väljendusvõimalusi.


```vhdl
-- latch template 1:
Q <= D when Enable = '1' else Q;

-- latch template 2:
process(D,Enable)
begin
  if Enable = '1' then
    Q <= D;
  end if;
end process;
```


### D-tüüpi triger (''flip-flop'')

D-tüüpi triger diskreedib siseneva signaali muutumise (tõusmise või langemise) mõõdetaval ajaühikul. Antud näitel on asünkroonne, aktiivne-kõrge 
*reset* ja diskreetimine toimub tõusva signaali korral.


```vhdl
DFF : process(RST, CLK)
begin
  if RST = '1' then
    Q <= '0';
  elsif rising_edge(CLK) then
    Q <= D;
  end if;
end process DFF;
```


Veel üks levinud viis oleku muutusel põhinevat käitumist VHDL-is kirjutada on 'sündmuse' (' *event* ') signaali omadusega. Üksainus ülakoma tuleb kirjutada signaali nime ja omaduse nime vahele.


```vhdl
DFF : process(RST, CLK)
begin
  if RST = '1' then
    Q <= '0';
  elsif CLK'event and CLK = '1' then
    Q <= D;
  end if;
end process DFF;
```


## Vaata ka
* Verilog
* SystemC
* Registri ülekande taseme disain
* Automatiseeritud elektrooniline disain (EDA)
* CPLD
* FPGA
* ASIC
* AHDL

## Lisalugemist
* Volnei A. Pedroni, "Circuit design with VHDL", London : MIT Press, 2004.
* Stephen Brown ja Zvonko Vranesic, "Fundamentals of digital logic with VHDL design", McGraw-Hill, 2009.

## Viited