Sintaktična pravila za visokonivojsko modeliranje logike

Visokonivojski model pozna 3 vrste stavkov: kombinacijsko prireditev, sekvenčno prireditev in pogojni stavek. V stavkih in pogojih uporabljamo operatorje, ki so v obliki operatorjev jezika VHDL (privzeta nastavitev VHDL operators). Model vezja sestavljajo:

*Če želimo le preizkusiti, kako se kakšen stavek prevede, lahko deklaracijo vezja izpustimo in program bo uporabil privzeto ime vezja.

Signali in vrednosti

Signale deklariramo s pomočjo tabele Ports & Signals, kjer določimo imena, mode: in ali out za zunanje oz. prazno za notranje signale, ter podatkovni tip (u1, u8, s4...). Ko izpolnimo tabelo, naredimo novo ogrodje opisa vezja s klikom na New in dodamo v urejevalnik stavke. Ta postopek uporabimo, ko delamo novo vezje z enostavnimi podatkovnimi tipi. Sicer pa sami napišemo deklaracije v urejevalniku med entity in begin, nato pa v tabeli le naštejemo signale za opazovanje na simulatorju.

Enostavni podatkovni tip

Sestavljeni podatkovni tip

Signalom lahko ob deklaraciji določimo začetno vrednost:

 a: u1 = '0';
 b: s4 = -2;
 c: 3u4 = "0001", "0010", "0100";

Načini zapisa številskih vrednosti:

Operatorji

  1. Operatorji jezika VHDL
  2. Primerjalni operatorji VHDL

Če je v nastavitvah izbrana sintaksa jezika C, uporabimo ustrezne operatorje tega jezika: (&, |, ^, ~, <<, >>, ==, !=). V tej sintaksi ni na voljo operator spajanja vektorjev.

Prireditveni stavki

Prireditveni stavki z operatorjem = opisujejo kombinacijsko logiko, ki izračuna izhod ob spremembi kateregakoli signala z desne strani prireditve. Uporabljamo ga tudi za nastavljanje konstant. Primer:

max = 10;   -- nastavi konstanto
b0 = g0 xor g1;  -- logična operacija
sum = a + b + 1; -- aritmetična operacija
more = 1 when a>1 else 0; -- pogojna prireditev

Prireditveni stavek z operatorjem <= predstavlja sekvenčno logiko, ki se ovrednoti enkrat ob vsakem ciklu ure. Primer:

cnt <= cnt + 1;  -- binarni števec

Pogojni stavek

Pogojni stavek opisuje izvajanje prireditev ob določenih pogojih in predstavlja izbiralnike v modelu vezja. Pogoj zapišemo med oklepaji za njim pa sledi en stavek v isti vrstici ali pa blok stavkov med then in end. Pogoj je lahko tudi vrednost nekega signala - pogoj bo izpolnjen, če je različen od 0. Pogojnemu stavku lahko dodamo else, ki izvede blok stavkov, kadar pogoj ni izpolnjen. Primer:

if (enable) q <= d; -- enovrstični opis D flip-flopa z omogočanjem (enable)

if rst then -- D flip-flop z resetom
 q2 <= 0;
else 
 q2 <= d;
end 

Pogojne stavke lahko gnezdimo - zapišemo enega v drugem. Prireditve znotraj pogojnih stavkov so kombinacijske in/ali sekvenčne, poskrbeti moramo le za doslednost pri prirejanju istemu signalu. Če nekemu signalu priredimo vrednost s sekvenčnim operatorjem, morajo biti vse kasnejše prireditve temu signalu tudi sekvenčne. Primer:

q = 0;
if enable=1 then -- D flip-flop z enable
 q <= d;
end 

V kodi je napaka, ker mešamo različne prireditvene operatorje za isti signal. Pravilno bi bilo, da je tudi pri prvem stavku uporaben sekvenčni operator: q <= 0; Pravilen pa je npr. model števca s prelivom, kjer je števec sekvenčna, preliv pa kombinacijska koda:

if cnt<5 then 
 cnt <= cnt+1; ov = 0
else 
 cnt < = 0; ov = 1 
end

Kadar imamo več zaporednih pogojev, jih zapišemo v enem pogojnem stavku z več vejitvami (elsif). Primer opisa izbiralnika:

if sel=3 then y=d(3)
elsif sel=2 then y=d(2)
elsif sel=1 then y=d(1)
else y=d(0) 
end