SHDL | Sintaksa | Prevajanje in analiza
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.
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:
Če je v nastavitvah izbrana sintaksa jezika C, uporabimo ustrezne operatorje tega jezika: (&, |, ^, ~, <<, >>, ==, !=). V tej sintaksi ni na voljo operator spajanja vektorjev.
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 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