Está en la página 1de 28

Digitalna elektronika

SEMINARSKI RAD

Osnove VHDL-a i realizacija semafora u


VHDL-u

Vladimir imun 10/12 EA

Elektrotehniki fakultet u Podgorici, jun 2015. godine

SADRAJ:

1.1 VHDL
1.2 Struktura VHDL koda
o 1.2.1 Biblioteka
o 1.2.2 Entitet
o 1.2.3 Arhitektura
1.3 Tipovi podataka
1.4 Konkurentni kod
o 1.4.1 When konstrukcija
1.5 Sekvencijalno programiranje
1.6 Signali, konstante i varijable
1.7 Proces
o 1.7.1 If konstrukcija
o 1.7.2 Case konstrukcija
o 1.7.3 Wait konstrukcija
1.8 Operatori
o 1.8.1 Operatori dodjele
o 1.8.2 Logiki operatori
o 1.8.3 Aritmetiki operatori
o 1.8.4 Relacioni operatori
o 1.8.5 Operatori pomjeranja
1.9 Atributi
o 1.9.1 Atributi za opis vekotora (nizova)
o 1.9.2 Atributi za opis signala
2.1 Opis problema
2.2 Razrada
o 2.2.1 Semafor #1
o 2.2.2 Semafor #2
o 2.2.3 Semafor #3
2.3 Kod
2.4 Simulacija koda i rezultati simulacije
3 Zakljuak
4 Literatura

1.1 VHDL
VHDL je programski jezik koji prpada grupi HDL (Hardware Description Language) jezika,
odnosno jezika koji se koriste za opis hardverske implementacije. Pomou VHDL-a tekstualno
opisujemo osnovne djelove hardverske implementacije i veze izmeu njih. Za razliku od
klasinih programskih jezika, poput C, C++, Jave i drugih kod kojih se niz naredbi kompajlira
uvijek na istom hardveru tj. procesoru, kod VHDL-a to nije sluaj. Naime, VHDL treba da opie
hardversku implementaciju koja, u krajnjem sluaju, treba i da se realizuje tako da izvrava
odreeni skup logikih funkcija. U zavisnosti od toga koji skup logikih funkcija treba da se
izvrava, razlikovae se i implementirani hardver. Jo jedna razlika u odnosu na klasine
programske jezike jesu i tipini kriterijumi performansi. Za razliku od klasinih programskih
jezika, gdje su glavni kriterijumi bili broj instrukcija potreban za izvrenje neke funkcije ili
koliina memorije koja se zauzima, kod VHDL-a su tipini kriterijumi minimalno zauzimanje
fizikih resursa, minimalno kanjenje, maksimalna frekvencija koju realizacija podrava i sl.
Takoe, treba napomenuti i da VHDL jezik nije case sensitive tj. ne razlikuje velika i mala slova.

1.2 Struktura VHDL koda


Svaki hardverski blok (modul) koji izvrava odreene logike funkcije, opisan je odgovarajuim
VHDL kodom. Struktura VHDL koda jednog modula je organizovana imajui u vidu da su za
opis modula vane dvije stvari:
Za komunikaciju modula sa drugim modulima, odnosno okolinom, korisnike tog modula
ne zanima njegova interna struktura, tj. na koji nain je taj modul realizovan, ve im je
bitna samo funkcija tog modula.
Interna struktura koja definie princip rada modula, a samim tim i njegovu finkciju (ili
vie njih) je vana dizajneru modula, jer je cilj realizovati to optimalniju implementaciju
interne strukture modula, da bi modul to efikasnije obavljao svoju funkciju.
Otuda VHDL kod jednog modula ima tri osnovna dijela:
biblioteka (library)
entitet (entity)
arhitektura (architecture).

1.2.1 Biblioteka
Biblioteka u VHDL-u predstavlja skup razliitih paketa koji u sebi sadre razliite funkcije,
procedure, komponente, tipove i konstante. Organizacija biblioteke je prikazana na slici 1. U
VHDL-u postoje sistemske i korisnike biblioteke. Ukljuivanjem neke biblioteke u kod,

korisniku postaje dostupno sve to se nalazi unutar te biblioteke.


BIBLIOTEKA
PACKAGE

FUNKCIJE
PROCEDURE
KOMPONENTE
KONSTANTE
TIPOVI

Slika 1. Organizacija biblioteke

Pozivanje Biblioteke u VHDL kodu se izvrava na sljedei nain:


library ime biblioteke;
use ime_biblioteke.ime_paketa.dio_paketa;

Library je kljuna rije kojom se poziva biblioteka ime_biblioteke, a kljunom rijeju use se
specificira koji paket (ime_paketa) i koji dio paketa (dio_paketa) elimo ukljuiti. Ukoliko
elimo da ukljuimo sve djelove paketa u dio_paketa se stavlja all.
Najpoznatije sistemske biblioteke su std i ieee biblioteka i one su uvijek koriste u svakom VHDL
kodu. Std je standardna (sistemska) biblioteka koja sadri osnovne definicije tipova
promjenljivih i osnovne funkcije. Biblioteka work je korisniki definisana biblioteka i ona je
takoe uvijek ukljuena, tj. ne mora se eksplicitno pozivati. U njoj su sadrani svi dijelovi
projekta (VHDL fajlovi, ali i ostali fajlvi koji su ukljueni u projekat). U sluaju kada korisnik
eli da iskoristi pakete koje je sam kreirao unutar nekog VHDL koda mora ih pozvati upotrebom
komande use.

1.2.2 Entitet
Digitalni sistem je obino zamiljen kao kolekcija razliitih modula, pri emu svaki modul ima
svoje portove koji predstavljaju vezu sa spoljnim svijetom. Ulogu da opie te konekcije sa
spoljnim svijetom ima entitet, koji nije nita drugo do lista koja sadri specifikaciju ulaznih i
izlaznih portova. Sintaksa entiteta je sljedea:

entity ime_entiteta is
generic
port

(
o
o
o
o

ime_porta1 : mod tip;


ime_porta2 : mod tip;
....
ime_portaN : mod tip

);
end ime_entiteta;

Kljunom rijeju entity se deklarie entitet ije je ime ime_entiteta, a potom slijedi kljuna rije
is. Kao to su i kod veine programskih jezika postojala ogranienja prilikom imenovanja
promjenljivih, funkcija i sl., to je sluaj i u VHDL-u. Naziv entiteta je proizvoljan, ali je vano
da poinje slovom i da se ne koristi kljuna rije za naziv entiteta, zatim u nazivu ne smije biti ni
razmaka, niti dva uzastopna _ (underscore) simbola, ne smije se zavravati sa _ underscore
simbolom i ne smije sadrati zabranjene simbole (npr. ?). Unutar port dijela se definu
interfejsi (portovi, pinovi) tako to se prvo navede ime porta, a zatim, nakon dvotake i mod i tip
porta. Mod porta definie smjer porta i postoje etiri moda: in, out, inout i buffer. Kao to im i
ime govori in je ulazni mod, out je izlazni mod, inout je ulazno/izlazni mod, odnosno port moe
predstavljati i ulaz i izlaz. Buffer mod je slian out modu, jer je i on izlazni mod, ali ovaj mod
posjeduje dodatak da se vrijednost ovog porta moe oitavati unutar entiteta. Deklaracije portova
se odvajaju sa ; pri emu se iza posljednjeg porta ne stavlja ; ime se oznaava kraj deklarisanja
portova entiteta. U sluaju da ima vie portova koji su identinog moda i tipa, oni se mogu
navesti i u jednom redu na sljedei nain:
ime_porta1, ime_porta2, ime_portaN : mod tip;

Kljuna rije end oznaava kraj deklaracije entiteta, a slijedi je ime entiteta i ;.

1.2.3 Arhitektura
Jednom kada su portovi specificirani u deklaraciji entiteta potrebno je jednu ili vie uloga tog
entiteta opisati unutar arhitekture. Jedan isti entitet moe da ima vie razliitih arhitektura, pri
emu je unutar tijela svake od njih opisana neka od funkcija entiteta. Struktura arhitekture je
sljedea:
architecture ime_arhitekture of ime_entiteta is
deklaracije
begin
kod
end ime_arhitekture;

Kljuna rije architecture oznaava poetak deklaracije arhitekture ije je ime ime_arhitekture.
Nakon toga slijedi kljuna rije of koju prati ime_entiteta i na kraju ide kljuna rije is. S
obzirom da je ime arhitekture vidljivo samo unutar entiteta naziv arhitekture mora biti smislen
samo u sluaju kada za jedan entitet definiemo vie arhitekturi. Pritom sva pravila u vezi imena

koja su vaila za entitete vae i za arhitekture (ime mora poinjati slovom, ne smije sadrati dva
uzastopna _ (underscore) simbola ). Nakon definisanja naziva arhitekture slijedi dio u
okviru koga se definiu interni signali koji su vidljivi samo unutar te arhitekture. Takoe se
navode i funkcije, konstante, drugi entiteti itd. koji se koriste unutar tijela arhitekture. Tijelo
arhitekture poine kljunom rijeju begin. Unutar tijela arhitekture se opisuje interna struktura
modula, tj. ta zaista modul koji realizujemo treba da radi.

1.3 Tipovi podataka


VHDL prua veliki broj predefinisanih tipova podataka, ali i mogunost da korisnik sam kreira
neki svoj tip. Da bi bilo mogue koristiti neki tip, prethodno je neophodno ukljuiti biblioteke i
pakete i kojima su ti tipovi definisani. Iako veliki broj predefinisanih tipova ima mogunost
hardverske implementacije, postoje i tipovi koji se ne mogu hardverski implementirati. Njihova
uloga je da olakaju proces testiranja i simulacije. S druge strane, korisnik mora biti svjesan da
ovi tipovi nemaju svoj hardverski ekvivalent, pa treba biti obazriv prilikom njihovog korienja.
U tabeli 1. su dati opisi svih definisanih tipova kao i nazivi biblioteka i paketa u kojima su ovi
tipovi definisani.

Tip

Objanjenje

Biblioteka

Mogunost
hardverske
implementacije
Da

BIT

Binarni signal (0 ili 1)

Paket standard biblioteke std

BIT_VECTOR

Niz (vektor) bita


Proirenje BIT tipa sa
dodatnim stanjima
Niz (vektor) STD_LOGICA
Proirenje STD_LOGIC
tipa sa nerazrijeenim
stanjem (U)
Niz (vektor)
STD_ULOGIC-a
STD_LOGIC_VECTOR
ekvivalent za aritmetike
operacije u signed reimu
STD_LOGIC_VECTOR
ekvivalent za aritmetike
operacije u unsigned
reimu
Logika binarna
promjenljiva

Paket standard biblioteke std


Paket std_logic_1164
biblioteke ieee
Paket std_logic_1164
biblioteke ieee
Paket std_logic_1164
biblioteke ieee

Da
Da

Paket std_logic_1164
biblioteke ieee
Paket std_logic_arith
biblioteke ieee

Da

Paket std_logic_arith
biblioteke ieee

Da

Paket standard biblioteke std

Da

Cio broj

Paket standard biblioteke std

Da

STD_LOGIC
STD_LOGIC_VECTOR
STD_ULOGIC

STD_ULOGIC_VECTOR
SIGNED

UNSIGNED

BOOLEAN
INTEGER

Da
Da

Da

NATURAL

Cio nenegativan broj

Paket standard biblioteke std

Da

POSITIVE
REAL

Cio pozitivan broj


Realan broj

Paket standard biblioteke std


Paket standard biblioteke std

Da
Ne

CHARACTER
STRING

ASCII karakter
Niz ASCII karaktera
Nivo znaaja generisane
poruke u simulaciji

Paket standard biblioteke std


Paket standard biblioteke std
Paket standard biblioteke std

Ne
Ne
Ne

TIME

Vrijeme

Paket standard biblioteke std

Ne

DELAY_LENGTH
FILE_OPEN_KIND

Duina kanjenja
Mod rada otvorenog fajla

Paket standard biblioteke std


Paket standard biblioteke std

Ne
Ne

FILE_OPEN_STATUS

Rezultat otvaranja fajla

Paket standard biblioteke std

Ne

SEVERITY_LEVEL

Tabela 1. Pregled osnovnih tipova podataka u VHDL-u

Najee korieni tipovi su: STD_LOGIC, STD_LOGIC_VECTOR i INTEGER.


STD_LOGIC Ovaj tip je definisan u paketu std_logic_1164 biblioteke ieee, to znai da on nije
predefinisan, ve je za njegovo koritenje uvijek potrebno uljuiti navedeni paket iz biblioteke
ieee. STD_LOGIC predstavlja jedan signal odnosno liniju koja moe imati osam moguih nivoa:
o
o
o
o
o
o
o
o

'0' - logika 0;
'1' - logika 1;
'Z' - visoka impedansa;
'X' - neodreena vrijednost;
'W' - slab signal neodreene vrijednosti;
'L' - slab signal logike 0;
'H' - slab signal logike 1;
'-' - dont care vrijednost.

Prva tri nivoa signala (0, 1 i Z) se najee koriste u praksi, jer se bez ogranienja mogu
hardverski implementirati, dok je etvrti nivo X primjenu naao prije svega u okviru simulacija,
kao signalizacija neodreene vrijednosti signala. Ostali nivoi se takoe uglavnom koriste u
okviru simulacija. Signalu ovog tipa se dodijeljena vrijednost navodi unutar jednostrukih
navodnika,
ime_signala <= vrijednost_signala.

STD_LOGIC_VECTOR Predstavlja niz signala tipa STD_LOGIC, ili sa hardverskog stanovita


predstavlja magistralu (skup linija) gdje svaka linija moe uzeti jednu od osam moguih
vrijednosti. Ni ovaj tip nije predefinisan, ve je za njegovo koritenje potrebno ukljuiti paket
std_logic_1164 biblioteke ieee. Niz signala ovog tipa se moe deklarisati po little endian
principu kao STD_LOGIC_VECTOR (donja_granica to gornja_granica) ili po big endian

principu kao STD_LOGIC_VECTOR (gornja_granica downto donja_granica). Prirodnija je


upotreba big endian principa dodjele, jer se u tom sluaju vrijednost signala pie s lijeva na
desno, to znai da je MSB bit krajnji lijevi bit. U praksi su oba principa dodjele potpuno
ravnopravna, ali ne preporuuje se njihovo mijeanje, jer je upravo tu najei izvor greaka.
Kada se korisnik opredijeli za jedan princip dodjele treba mu je ostati dosledan do kraja. Za
dodjelu vrijednosti signal tipa STD_LOGIC_VECTOR koriste se dvostruki navodnici,
ime_signala <= vrijednost_signala.

Ako se vrijednost dodjeljuje samo jednom indeksu onda se koriste jednostruki navodnici, kao i
kod STD_LOGIC tipa,
ime_signala(indeks) <= vrijednost_signala.

Ukoliko se vri dodjela vrijednosti opsegu indeksa signala tipa STD_LOGIC_VECTOR opet se
moraju koristit dvostruki navodnici, ak i u sluaju kada je duina opsega jedan,
ime_signala(indeks1 to / downto indeks2) <= vrijednost_signala.

Signalu tipa STD_LOGIC_VECTOR se mogu dodjeljivati i vrijednosti zapisane oktalno ili


heksadecimalno, pri emu se ispred vrijednosti pod dvostrukim navodnicima stavlja X ako je u
pitanju heksadecimalni zapis, odnosno O ako je u pitanju oktalni zapis. Pritom je neophodno da
u sluaju heksadecimalnog zapisa opseg kome se dodjeljuje vrijednost bude duine koja je
djeljiva sa etiri ili duine koja je djeljiva sa tri u sluaju oktalnog zapisa,
ime_signala(indeks1 to / downto indeks2) <= Xheksadecimalna_vrijednost_signala
ime_signala(indeks1 to / downto indeks2) <= Ooktalna_vrijednost_signala.

Nad signalima tipa STD_LOGIC_VECTOR mogu se vriti samo logike operacije, dok su
aritmetike operacije nedozvoljene. Ukljuivanjem paketa std_logic_unsigned ili
std_logic_signed biblioteke ieee dobija se podrka i za aritmetike operacije nad signalima ovog
tipa.
INTEGER Rije je o predefinisanom tipu koji obino koristi 32 bita za predstavljanje cijelih
brojeva. Sa hardverskog stanovita INTEGER predstavlja 32 linije pri emu svaka linija moe
imati vrijednost 0 ili 1. Ukoliko korisniku nije neophodno svih 32 bita za predstavljanje opsega
nekog signala on moe pomou kljune rijei range ograniiti taj opseg na sljedei nain,
signal ime_signala : INTEGER range donja_granica to gornja_granica ;

U sluaju da korisnik ne koristi svih 32 bita za opisivanje nekog signala kompajler e u svakom
sluaju odraditi skraivanje opsega, iako korisnik to nije eksplicitno naveo. Vrijednosti signalu
ovoga tipa se dodjeljuju u decimalnom zapisu
ime_signala <= decimalni_broj;.

Osim velikog broja definisanih tipova, VHDL prua potpunu slobodu korisniku da definie nove
tipove podataka. Iako je ova mogunost veoma primamljiva na prvi pogled u praksi se ipak ne
zloupotrebljava previe. Uglavnom se definiu enumerisani tipovi koji slue da dizajniranje
automata stanja (state machine), gdje se stanja automata opisuju rijeima (nizom karaktera) i na
taj nain se postie vea razumljivost i preglednost koda. Takoe, veliki primjenu ima i
definisanje tipova koji predstavljaju nizove i matrice. Sintaksa enumerisanog tipa je:
type ime_enumeracije is (vrijednost1, vrijednost2, , vrijednostN);

Vrijednosti gornje enumeracije se automatski kodiraju sa najmanjim brojem bita neophodnim za


kodiranje svih vrijednosti (najmanji pozitivan cio broj koji je veci ili jednak od log2N).
Korisniki definisan tip moe biti i npr. opseg INTEGER-a, mada se u tom sluaju mnogo ee
kreira novi podtip (subtype). Razlog za to je to se razmjena vrijednosti izmeu dva razliita tipa
ne mogu vriti direktno, dok je razmjena vrijednosti izmeu tipa i podtipa dozvoljena.

1.4 Konkurentni kod


Ranije je naglaeno da se ponaanje nekog hardverskog modula opisuje unutar arhitekture. Dva
su naina da se to uradi konkurentni i sekvencijalni nain, pri emu upotreba jednog naina ne
iskljuuje upotrebu drugog, tj. oba naina se mogu potpuno ravnopravno koristiti unutar jedne
iste arhitekture.
Konkurentno ili kako se jo naziva paralelno kodiranje podrazumijeva izvravanje svih izraza
istovremeno (paralelno). To znai da se u toku jednog procesa vrijednost jednog signala ne moe
promijeniti vie od jednog puta. Ovaj nain kodiranja odgovara stvarnosti, jer u stvarnosti svi
hardverski djelovi istovremeno postoje i istovremeno obavljaju svoje funkcije. Konkurentno
(paralelno) kodiranje je jedna od bitnijih razlika VHDL-a u odnosu na ostale programske jezike.
Konstrukcije koje se se mogu koristiti u paralelnom programiranju su WHEN, GENERATE i
BLOCK. Upotreba varijabli unutar konkurentnog koda nije dozvoljena. Ovdje e biti dat samo
opis i sintaksa WHEN konstrukcije.

1.4.1 When konstrukcija


Kao to je prethodno reeno when je jedna od fundamentalnih komandi koje se koriste u
paralelnom programiranju. Smisao ove komande je da omogui selekciju izraza koji elimo da
aktiviramo u sluaju da je neki uslov ispunjen. Razlikujemo when/else konstrukciju i
when/select/when konstrukciju.
Sintaksa when/else konstrukcije je sljedea:
rezultat <= vrijednost_1 when uslov_1 else
vrijednost_2 when uslov_2 else

vrijednost_n-1 when uslov_n-1 else


vrijednost_n;

Sintaksa with/select/when konstrukcije je sljedea:


with selektor select
rezultat <= vrijednost_1 when vrijednost_selektora_1,

vrijednost_2 when vrijednost_selektora_2,

vrijednost_N when vrijednost_selektora_N;

With/select/when konstrukciju je mogue koristiti samo u sluaju kad pokrijemo sve vrijednosti
selektora. U sluajevima kada selektor moe uzeti veliki broj vrijednosti, a nama su od interesa
samo neke od njih, koristi se kljuna rije others kojom pokrivamo sve ostale vrijednosti
selektora (one koje nam nijesu od interesa). Ako znamo da signali tipa STD_LOGIC i sl. mogu
imati devet moguih nivoa, a skoro nikad ne uzimamo u obzir sve njih, to praktino znai da e
kljuna rije others da se koristi uvijek kada je selektor ovog tipa.
vrijednost_N when others;

Ukoliko nije potrebno izvriti nijednu akciju za neku vrijednost selektora koristi se kljuna rije
unaffected, kojom signaliziramo da elimo da se vrijednost rezultujueg signala ne mijenja,
unaffected when others;

1.5 Sekvencijalno programiranje


Ovaj model podrazumijeva pisanje naredbi koje se izvravaju sekvencijalno (jedna po jedna), ba
kao kod klasinih programskih jezika. Sekvencijalni kod se jo naziva i behavioral code, jer on
u sutini opisuje funkciju nekog logikog kola ne ulazei u njegovu strukturu. Sekvencijalno kod
se ne moe pisati bilo gdje, ve samo i iskljuivo unutar: procesa, funkcija i procedura. Unutar
svake od ovih cjelina koje sadre sekvencijalni kod mogu se upotrebljavati: operatori, if, wait,
case i loop konstrukcije. Unutar sekvencijalnog koda se osim signala mogu koristiti i varijable.

1.6 Signali, konstante i varijable


Signali slue za povezivanje komponenti dizajna. Sa hardverskog stanovita to su ice kojima su
djelovi hardvera meusobno povezuani. Ranije je reeno da se signali mogu koristiti i u
konkurentnom i u sekvencijalnom programiranju. Signale je mogue deklarisati u paketu,

entitetu ili deklarativnom dijelu arhitekture i gdje god da su deklarisani oni postaju globalne
promjenljive. Ako ih deklariemo u paketu, onda su vidljivi i u svim entitetima tog paketa, ako ih
deklariemo u entitetu, onda su vidljivi i u svim arhitekturama tog entiteta. Deklaracija signala
unutar entiteta nije nita do deklaracija portova tog entiteta. U stvarnosti se uvijek, bar jedan
signal mora deklarisati unutar entiteta, jer entitet mora imati bar jedan ulaz ili izlaz. S druge
strane, deklaracija signala u paketima nije ba popularna, jer ako se signal koristi u vie entiteta
njegva upotreba postaje dosta komplikovana. Sintaksa signala unutar paketa ili deklarativnog
dijela arhitekture je sljedea:
signal naziv_signala : tip_signala := inicijalna_vrijednost_signala;

Inicijalnu vrijednost signala nije neophodno navoditi.


Konstante predstavljaju posebnu vrstu signala i mogu se deklarisati ili u paketu ili u
deklarativnom dijelu arhitekture. Deklarisanje konstante u entitetu se uglavnom izbjegava.
Sintaksa konstanti je sljedea:
constant naziv_konstante : tip_konstante := vrijednost_konstante;

U ovom sluaju vrijednost konstante se mora navesti. Za dodjelu vrijednosti nekom signal se
koristi operator <=.
Varijable predstavljaju lokalne promjenljive karakteristine samo za sekvencijalni kod. U skladu
sa tim, one se mogu deklarisati samo u unutar tijela procesa, funkcije ili procedure i vidljive su
samo unutar istih. Varijable, za razliku od signala, ne mogu da se hardverski implementiraju ve
se koriste kao pomone promjenljive (slino kao u klasinim programskim jezicima). Druga
razlika izmeu varijabli i signala je u tome to signal dodijeljenu vrijednost dobija tek na kraju
procesa, dok je promjena vrijednosti varijable trenutna. I dok je signal mogue dodijeliti samo
jednu vrijednost u toku procesa, kod varijabli to nije sluaj. Sintaksa varijabli je sljedea:
variable naziv_varijable : tip_varijable := vrijednost_varijable;

Kao i kod signala i ovdje navoenje inicijalne vrijednosti varijable nije neophodno, tj. moe se
izostaviti. Vrijednost nekoj od varijabli se dodjeljuje pomou operatora =.

1.7 Proces
Sekvencijalni kod koji se koristi unutar tijela arhitekture nekog entiteta mora se nalaziti u proces
bloku. Sama proces naredba je paralelna, pa se na taj nain praktino postie da se i sekvencijalni
kod u VHDL-u izvrava istovremeno. Takoe, mogua je kombinacija proces bloka ili vie njih
sa paralelnim naredbama. Sintaksa procesa je sljedea:
ime_procesa : process (lista_osjetljivosti)
deklarativni_dio
begin

sekvencijalni kod
end process ime_procesa;

Ime procesa nije neophodno navoditi. U deklarativnom dijelu procesa se deklariu varijable koje
se koriste unutar procesa. Lista osjetljivosti predstavlja signal ili skup signala ijom promjenom
poinje da se izvrava sekvencijalni kod iz tijela procesa.

1.7.1 If konstrukcija
Slino kao i u klasinim programskim jezicima if naredba je nala veliku primjenu i u VHDL-u.
Sintaksa if konstrukcije je sljedea:
if (uslov1) then
sekvencijalni kod;
elsif (uslov2) then
sekvencijalni kod;
elsif (uslov3) then
sekvencijalni kod;

else
sekvencijalni_kod;
end if;

Elsif i else dio u if konstrukciji nijesu neophodni, tj. mogu se izostaviti.

1.7.2 Case konstrukcija


Case je jo jedna naredba koja se koristi u sekvencijalnom programiranju i ona predstavlja
ekvivalent with/select/when konstrukciji u paralelnom programiranju. Njena sintaksa je:
case (promjenljiva) is
when (vrijednost1) => sekvencijalni_kod;
when (vrijednost2) => sekvencijalni_kod;

end case;

Velika razlika u odnosu na klasine programske jezike je ta to se izvrava samo onaj dio
sekvencijalnog koda koji se nalazi desno od operatora => tj. nije dozvoljeno pisati vie linija
koda. Slino kao kod with/select/when konstrukcije i ovdje je zgodna upotreba kljune rijei
others koja imaju identinu ulogu,
when others => sekvencijalni kod;.

S druge strane, ako nije potrebno da se izvri bilo ta u nekoj selekciju, koristi se kljuna rije
null (kod with/select/when konstrukcije je to bila kljuna rije unaffected),
when (vrijednost1) => null;.

1.7.3 Wait konstrukcija


Wait je sekvencijalna komanda koja, u nekim sluajevima, predstavlja zamjenu za
listu_osjetljivosti procesa. Kao to je ve reeno, promjenom nekog od signala iz
liste_osjetljivosti poinje izvrenje procesa, koje dalje nije mogue kontrolisati. Upravo tu
mogunost kontrole procesa nam prua wait komanda. Razlikujemo sljedee wait naredbe: wait
until, wait on i wait for. Wait naredbe se ne mogu koristiti unutar procesa koji sadre
listu_osjetljivosti. Takoe, broj wait naredbi unutar tijela jednog procesa moe biti proizvoljan.
Wait until naredba zaustavlja izvrenje procesa dok se ne ispuni odreeni uslov koji mora biti
odreen vrijednou nekog signala. Sintaksa ove naredbe je:
wait until uslov_odreen_vrijednou_signala;

i ona obavezno mora ii na poetku procesa.


Wait on naredba zaustavlja izvrenje procesa dok ne ispuni uslov, koji moe biti odreen
vijednou vie od jednog signala. Sintaksa ove naredbe je:
wait on signal1, signal2,, signalN;

i ona je potpuno ekvivalentna listi_osjetlijvosti procesa, pa je na korisniku da odlui ta e


koristiti. Naravno, i za ovu naredbu vai pravilo da mora biti prva naredba unutar tijela procesa.
Wait for nareba zaustavlja izvrenje procesa za odreeno vrijeme, koje korisnik moe
specificirati. Njena hardverska implementacija nije mogua, ali ona ipak ima veliku primjenu,
uglavnom u okviru simulacija. Njena sintaksa je:
wait on specificirano_vrijeme;

i za razliku od ostalih, ona se moe nai na bilo kojem mjestu unutar tijela procesa.

1.8.1 Operatori dodjele


Predefinisani operatori u VHDL-u su: operatori dodjele, logiki operatori, aritmetiki operatori,
relacioni operatori, pomjeraki operatori i operator konkatanacije.
Osim ranije pobrojanih razlika izmeu signala i varijabli, postoji razlika i u samom nainu na
koji im se dodjeljuje neka vrijednost.
Operator := se koristi za dodjelu vrijednosti varijablama i konstantama, za postavljanje
inicijalnih vrijednosti signala i varijabli i generikih parametara, dok se za dodjelu vrijednosti
signalu koristi operator <=.
U nekim sluajevima je potrebno dodijeliti odreenu vrijednost samo nekim djelovima vektora, a
ostale elemente treba postaviti na zajedniku vrijednost. U tim situacijama se koristi operator =>
koji ide u kombinaciji sa kljunom rijeju others npr. x <= (0=>1, others => 0).
U tabeli 2. je dat opis operatora dodjele.

Operator
<=
Dodjela vrijednosti signal
:=

Opis

Dodjela vrijednosti varijabli, dodjela vrijednosti konstanti, dodjela difolt vrijednosti


parametru u generic dijelu entiteta, dodjela inicijalne vrijednosti signalu/varijabli

=>

Dodjela vrijednosti dijelovima vektora (koristi se uglavnom u kombinaciji sa


kljunom rijeju OTHERS), mapiranje signala na portove uvedene komponente
Tabela 2. Pregled operatora dodjele

1.8.2 Logiki operatori


Logiki operatori se koriste za izvravanje logikih operacija nad operandima tipa BOOLEAN,
BIT, BIT_VECTOR i STD_LOGIC baziranim signalima, pri emu operandi moraju biti istog
tipa. Izuzev operatora not koji ima najvei prioritet, svi ostali logiki operatori imaju najnii
prioritet. U Tabeli 3. je dat popis osnovnih logikih operatora.

Operator
NOT
AND
OR

Negacija
Logika I operacija
Logika ILI operacija

NAND
NOR
XOR
XNOR

Opis

Logika NI operacija
Logika NILI operacija
Logika ekskluzivno ILI operacija
Inverzna XOR operacija
Tabela 3. Osnovni logiki operatori

1.8.3 Aritmetiki operatori


Aritmetiki operatori se koriste za kreiranje aritmetikih funkcija. U tabeli 4. su prikazani
aritmetiki operatori.
Operator
+
*

Sabiranje
Oduzimanje
Mnoenje

Opis

/
**

Dijeljenje
Stepenovanje

MOD
REM

Moduo
Ostatak dijeljenja

ABS

Apsolutna vrijednost
Tabela 4. Aritmetiki operatori

Tipovi podataka nad kojima se mogu vriti aritmetike operacije su INTEGER i REAL.
Ukljuivanjem odgovarajuih biblioteka podrku za aritmetike operacije mogu dobiti i tipovi
SIGNED, UNSIGNED i STD_LOGIC_VECTOR. Poto ne postoji mogunost hardverske
implementacije tipa REAL primjena gore navedenih operatora je veoma ograniena. Praktino,
samo se sabiranje i oduzimanje mogu implementirati bez ogranienja. Kod mnoenja vektora se
mora voditi rauna o njihovoj duini, a kod mnoenja signala o broju bita koji se koristi za
predstavljanje proizvoda. Dijeljenje vektora je mogue samo ako je djelilac stepen dvojke i tada
se operacija dijeljenja svodi na pomjeranje udesno. Dijeljenje INTEGER tipova je mogue, ali se
pritom kao rjeenje uzima samo cio broj ispred decimalnog zareza.

1.8.4 Relacioni operatori


Ovi operatori slue za odreivanje odnosa izmeu dva signala. Kao rezultat vraaju BOOLEAN
tip, pa se iz tog razloga uglavnom koriste za definisanje uslova unutar raznih konstrukcija.
Operandi mogu biti tipa INTEGER, REAL, SIGNED, UNSIGNED, BOOLEAN, BIT i
BIT_VECTOR, ali i STD_LOGIC bazirani signali.
Operator
=
/=

Opis
Jednako
Nejednako

<
>

Manje
Vee

<=
>=

Manje ili jednako


Vee ili jednako
Tabela 5. Osnovni relacioni operatori

1.8.5 Operatori pomjeranja


Operatori pomjeranja se korise za realizaciju pomjerakih registara. Lijevi operand je uvijek
vektor i to obino BIT_VECTOR, mada se ukljuivanjem odgovarajuih biblioteka moe dobiti
podrka i za STD_LOGIC_VECTOR, SIGNED i UNSIGNED tipove. Desni operand je obino
tipa INTEGER. Rezultat je uvijek istog tipa kao i lijevi operand. Implementacija pomjerakih
registara u sluaju konstantnog desnog operanda je veoma jednostavna, a ako je rije o
promjenljivom operandu (vrijednost signala koja moe da se mijenja) onda se implementacija
ovih registara prilino uslonjava. U Tabeli 6. je dat pregled operatora pomjeranja.

Operator
SLL
SRL

Opis
Logiko pomjeranje ulijevo
Logiko pomjeranje udesno

Tip
BIT_VECTOR
BIT_VECTOR

SLA
SRA

Aritmetiko pomjeranje ulijevo


Aritmetiko pomjeranje udesno

BIT_VECTOR
BIT_VECTOR

ROL
ROR
SHL

Rotiranje ulijevo
Rotiranje udesno
Pomjeranje ulijevo

BIT_VECTOR
BIT_VECTOR
STD_LOGIC_VECTOR, SIGNED, UNSIGNED

SHR

Pomjeranje udesno
STD_LOGIC_VECTOR, SIGNED, UNSIGNED
Tabela 6. Pomjeraki operatori

1.9.1 Atributi za opis vektora


VHDL podrava nekoliko tipova atributa koji se koriste za opisivanje svojstava vektora (nizova),
signala i podataka tipa type. Atributi za opis vektora omoguavaju jednostavno odreivanje
nekih osobina vektora. Uvoenje atributa je rezultat prevelike slobode koja je data korisniku
prilikom definisanja vektora (nizova). Pristupanje atributu se vri tako to se iza naziva vektora
(niza) stavlja apostrof koga prati naziv atributa. U Tabeli 7. je dat pregled osnovnih atributa za
opis vektora.
Atribut
vektorleft(N)

Vraa
Indeks krajnjeg lijevog lana

vektorright(N)

Indeks krajnjeg desnog lana

vektorhigh(N)

Najvii indeks

vektorlow(N)

Najnii indeks

vektorlength(N)

Duinu vektora

vektorrange(N)

Opseg indeksa

vektorreverse_range(N)
Obrnuti opseg indeksa
Tabela 7. Osnovni atributi za opis vektora (nizova)

1.9.2 Atributi za opis signala


Slino kao kod vektora, postoje i atributi koji opisuju signale, odnosno neke osobine signala.
Uglavnom se koriste u simulacijama, mada je neke od njih mogue i hardverski implementirati.
Pristupanju atributu signala se vri na identian nain kao kod vektora, pomou apostrofa
praenog imenom atributa. Atributi koji opisuju signale su vremenski zavisni, tj. sa promjenom
signala se mijenjaju i oni sami. I dok je za vektorske atribute rezultat uglavnom bio INTEGER ili
opseg INTEGER-a, kod atributa za opis signala to nije sluaj. Njihovi rezultati mogu biti ak i
novi signali koji dalje mogu biti koriteni u okviru koda potpuno ravnopravno sa ostalim
signalima. Pregled osnovnih atributa za opsi signala dat je u Tabeli 7.

Naziv atributa
EVENT

Opis atributa
Vraa TRUE ako se dogodila promjena vrijednosti signala

STABLE

Vraa TRUE ako se nije dogodila promena vrijednosti signala

ACTIVE

Vraa TRUE ako signal ima vrijednost 1

QUIET <vrijeme>

Vraa TRUE ako nije bilo promjene vrijednosti signala za specificirano vrijeme

LAST_EVENT

Vraa vrijeme proteklo od trenutka posljednje promjene vrijednosti signala

LAST_ACTIVE

Vraa vrijeme proteklo od trenutka posljednje aktivne vrijednosti signala (1)

LAST_VALUE

Vraa vrijednost signala prije posljednjeg EVENT-a tj. promjene vrijednosti signala
Tabela 7. Atributi za opis signala

2.1 Definisanje problema


Potrebno je napisati kod koji simulira rad semafora na jednoj prostoj raskrsnici prikazanoj na
slici 1. Semafor ine etiri semaforske table (V) sa po tri signala (crveno, uto i zeleno) za
regulaciju saobraaja motornih vozila, odnosno osam semaforskih tabli (P) sa po dva signala
(crveno i zeleno) za regulaciju prolaska pjeaka. U obzir treba uzeti i situaciju kada je na svim
semaforima upaljeno uto svijetlo, tj. situaciju kada saobraaj regulie policajac. U tom sluaju
pretpostaviti da su svijetla na semaforima za pjeake ugaena.

P2

P3

P4
P1

V1
V2
V4
P8

V3

P7

P5

P6

Slika 1. Prosta raskrsnica sa semaforima.

2.2 Razrada
Posmatrajui raskrnicu sa slike 1. moe se zakljuiti da e odreene semaforske table raditi u
paraleli. Drugim rijeima, semaforske table V1 i V3 e uvijek imati ista pokazivanja, a to
naravno vai i za par V2-V4, odnosno grupe P1-P4-P5-P8 i P2-P3-P7-P7. Pretpostavimo na
samom poetku, da table V1-V3 reguliu saobraaj vozila po glavnom, a table V2-V4 po
sporednom putu. Radi jednostavnosti, par V1-V3 oznaimo G, par V2-V4 sa S, a grupe P1-P4P5-P8 i P2-P3-P6-P7 sa Ps i Pg, respektivno. Za regulaciju jednog pravca se koriste dvije grupe i
to jedna za vozila, a druga za pjeake.

2.2.1 Semafor #1
etiri grupe semaforskih tabli treba da obezbijede normalno funkcionisanje saobraaja. Raspored
svjetala na semaforskim tablama e se mijenjati u pravilnim intervalima i to je jo vanije,
ponavljae se u ciklusima. Razmotrimo koja su mogua stanja ovog primitivnog semafora.

Stanje 1.
U prvom sluaju, neka je stanje na semaforima G-zeleno, S-crveno, Pg-crveno i Ps-zeleno ili
drugim rijeima, glavni put je aktivan za vozila, a sporedni za pjeake. Ovaj raspored svjetala
treba da se zadri specificirano minimalno vrijeme. Nakon toga potrebno je prei u sljedee
stanje.
Stanje 2.
Raspored svjetala na semaforima je G-uto, S-crveno, Pg-crveno i Ps-zeleno. To je upozorenje
vozilima na glavnom putu da ponu da usporavaju. I ovo stanje traje odreeno vrijeme.
Stanje 3.
Raspored svjetala na semaforima je G-crveno, S-uto, Pg-crveno i Ps-crveno. Vozila na glavnom
putu se moraju zaustaviti, dok se vozila na sporednom putu pripremaju za polazak. U isto
vrijeme, pjeacima se zabranjuje kretanje.
Stanje 4.
Raspored svjetala na semaforima je G-crveno, S-zeleno, Pg-zeleno i Ps-crveno. Kreu vozai sa
sporednog puta i pjeaci preko glavnog puta. U ovom stanju semafori treba da se zadre isto
onoliko vremena koliko su proveli u stanju 1. Naravno, ovo vai pod pretpostavkom da je
frekvencija vozila i pjeaka preko obje saobraajnice ista.
Stanje 5.
Raspored svjetala na semaforima je G-crveno, S-uto, Pg-zeleno i Ps-crveno. Trajanje ovog
stanja je jednako trajanju stanja 1. ili 4.
Stanje 6.
Raspored svjetala na semaforima je G-uto, S-crveno, Pg-crveno i Ps-crveno. Poziv vozilima na
glavnom putu da se pripreme za polazak. Vozila na sporednom putu miruju. Trajanje ovog stanja

je otprilike isto kao i trajanje stanja 5. Nakon isteka specificiranog vremena sistem treba da pree
pre
opet u stanje 1. i sve tako u krug.

Prethodna priaa se jednostavno moe prikazati dijagramom stanja na slici 2. Oigledno, rad
gornjeg semafora nije nita drugo do beskona
beskonano
no ponavljanje navedenih est stanja, pri emu
svako stanje ima svoje vrijeme trajanja. Mana ovakve realizacije je u tome to nijesu ukljuene
uklju
informacije o prisustvu vozila ili pjeaka na putu koji nije
nije aktivan za saobraaj.
saobra Naime, moe se
desiti da je na glavnom putu veliki broj vozila, a da se na sporednom putu ne nalazi nijedno
vozilo, niti da ima pjeaka koji ekaju

prelazak
lazak preko glavnog puta. U tom sluaju semafor koji
funkcionie na prethodno opisani
isani nain
na
e zaustaviti saobraaj
aj na glavnom putu, a sporedni put
ee postati aktivan, to nikako ne valja. Isto tako moe se dogoditi i obrnuta situacija, da je guva
na sporednom putu, a glavni put je prazan. Iz tog razloga neophodno je u obzir uzeti i
informaciju o prisustvu/odsustvu vozila ili pjeaka na putu koji u tome trenutku nije aktivan.
aktivan

Slika 2. Dijagram stanja

2.2.2 Semafor #2
Kao to je ve reeno prethodni primitivni semafor ima veliku manu, jer u obzir ne uzima
informacije o prisustvu/odsustvu vozila ili pjeaka na neaktivnom putu. Ukoliko bi se i ove
informacije uzele u obzir rad semafora bi bio znatno efikasniji, jer bi se u nekim sluajevima
vrijeme ekanja znaajno smanjilo. Analizom prethodnih est stanja oigledno je da stanja 2., 3.,
5. i 6. predstavljaju stanja ije se vrijeme trajanja ne moe znaajno mijenjati, jer njegovo
poveanje nema smisla, a smanjenjem ovog vremena se moe ugroziti bezbjednost uesnika u
saobraaju. Dakle, mogue je poveati trajanje stanja 1. i 4. na osnovu informacija o saobraaju
na neaktivnom putu. Njihov uticaj se ogleda u sljedeem: sve dok sistem ne dobije informaciju
da se pojavilo vozilo ili pjeak na dijelu puta koji nije aktivan, trajanje stanja 1. ili 4. treba
produiti. Na ovaj nain je prevazien problem do koga je dolazilo u sluaju kada na nekom od
pravaca nema saobraaja. Meutim, kada je potrebno da saobraaj na raskrsnici regulie
policajac, ovaj reim rada semafora nije pogodan, pa je neophodno u obzir uzeti i informacije o
tome u kojem reimu radi semafor.

2.2.3 Semafor #3
Poto prethodni semafor ne moe funkcionisati u nekim vanrednim situacijama i taj problem je
potrebno prevazii. Kada je potrebno da saobraaj na raskrsnici regulie policajac, rad
prethodnog semafora treba prilagoditi i toj situaciji. U prethodnim analizama pjeake
semaforske table pokazivale samo dvije signalne boje (crvena i zelena), pa e se u ovom sluaju
smatrati da su ove semaforske table iskljuene. Dakle, potrebno je samo regulisati rad etiri
semaforske table za motorna vozila. U tom sluaju, na ovim tablama uto signalno svijetlo treba
da se naizmjenino pali i gasi. Na taj nain se dobija semafor koji moe da radi u dva reima:
normalnom i vanrednom, pri emu je pri radu u normalnom reimu rada vrijeme ekanja
minimalno. Na kraju, vano je napomenuti da se odgovarajuim podeavanjima iz ovog tipa
mogu izvesti oba prethodna tipa semafora.

2.3 Kod
Sva tri prethodno opisana semafora mogue je realizovati pomou programskog jezika VHDL
primjenom odgovarajueg kompajlera. Ovdje e biti dat VHDL kod koji simulira rad treeg
semafora. Malim korekcijama ovog koda, tj. izostavljanjem odgovarajuih uslova, moe se
jednostavno dobiti i VHDL kod prvog i drugog tipa semafora.

library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_unsigned.all;

entity semafor is
port (
clk: in STD_LOGIC;
clr: in STD_LOGIC;
nacin: in STD_LOGIC;
cekanje: in STD_LOGIC;
vozila: out STD_LOGIC_VECTOR(5 downto 0);
pjesacki: out STD_LOGIC_VECTOR(3 downto 0)
);
end semafor;
architecture shema of semafor is
type stanje_type is (s0, s1, s2, s3, s4, s5, s6, s7);
signal stanje: stanje_type;
signal brojac: STD_LOGIC_VECTOR(3 downto 0);
constant SEC5: STD_LOGIC_VECTOR(3 downto 0) := "1011";
constant SEC1: STD_LOGIC_VECTOR(3 downto 0) := "0011";
begin
process(clk, clr,cekanje,nacin)
begin
if clr = '1' then
o if nacin='1' then
stanje <= s0;
o elsif nacin='0' then
stanje <= s6;
o end if;
brojac <= X"0";
elsif (clk'event and clk = '1') then
o if nacin='1' then
case stanje is
when s0 =>

if (brojac < SEC5) then


o stanje <= s0;
o brojac <= brojac + 1;

else
o if(cekanje='0') then
o stanje <= s0;
o else
o stanje <= s1;
o brojac <= X"0";
o end if;

end if;
when s1 =>

if (brojac < SEC1 ) then


o stanje <= s1;
o brojac <= brojac + 1;

else
o stanje <= s2;
o brojac <= X"0";

end if;
when s2 =>

if (brojac < SEC1 ) then


o stanje <= s2;
o brojac <= brojac + 1;

o
o

else

o stanje <= s3;


o brojac <= X"0";

end if;
when s3 =>

if (brojac < SEC5 or (brojac > SEC5 and cekanje='0')) then


o stanje <= s3;
o brojac <= brojac + 1;
o else
o if(cekanje='0') then
o stanje <= s3;
o else
o stanje <= s4;
o brojac <= X"0";
o end if;

end if;
when s4 =>

if (brojac < SEC1 ) then


o stanje <= s4;
o brojac <= brojac + 1;

else
o stanje <= s5;
o brojac <= X"0";

end if;
when s5 =>

if (brojac < SEC1) then


o stanje <= s5;
o brojac <= brojac + 1;

else
o stanje <= s0;
o brojac <= X"0";

end if;
when others =>

stanje <= s0;


end case;
elsif nacin='0' then
case stanje is
when s6 =>

if (brojac < SEC1) then


o stanje <= s6;
o brojac <= brojac + 1;
o else
o stanje <= s7;
o brojac <= X"0";

end if;
when s7 =>

if (brojac < SEC1) then


o stanje <= s7;
o brojac <= brojac + 1;
o else
o stanje <= s6;
o brojac <= X"0";

end if;

when others =>

stanje <= s6;

o end case;
o end if;
o end if;
end process;
C2: process(stanje)
begin
case stanje is
when s0 => vozila <= "100001"; pjesacki <= "0110";
when s1 => vozila <= "100010"; pjesacki <= "0110";
when s2 => vozila <= "010100"; pjesacki <= "1010";
when s3 => vozila <= "001100"; pjesacki <= "1001";
when s4 => vozila <= "010100"; pjesacki <= "1001";
when s5 => vozila <= "100010"; pjesacki <= "1010";
when s6 => vozila <= "010010"; pjesacki <= "0000";
when s7 => vozila <= "000000"; pjesacki <= "0000";
when others => vozila <= "100001"; pjesacki <= "0110";
end case;
end process;
end shema;

Napomena: Bez obzira to se u prethodnom kodu pojavljuje osam umjesto est analiziranih
stanja, on potpuno odgovara analiziranom sluaju. Dodatna dva stanja su uvedena iz dva
razloga: zbog preglednosti (jer se ova dva stanja javljaju samo u jednoj - vanrednoj situaciji)
i iz razloga to u prethodnim analizama ne postoji stanje u kojemu su sve semaforske table
istovremeno ugaene. Takoe je veoma vano znati da vrijednost konstanti sec5 i sec1 same po
sebi ne znae mnogo. One u sutini zavisi od izbora clk - klok signala, tj. za razliite clk signale
vrijednosti ovih konstanti se moraju mijenjati da bi se dobili intervali istog trajanja.

2.4 Simulacija koda i rezultati simulacije


Posmatraju se etiri realne situacije koje se mogu desiti u toku rada treeg tipa semafora. Tri
situacije su vezane za rad semafora u standardnom reimu, a jedna posmatra sluaj kada
raskrsnicu kontrolie policajac (trepue uto). Za simulaciju rada semafora se koristi program
Altera Quartus II verzija 8.1. Ulazni signali e biti: signal koji opisuje mod u kome semafor radi
nacin, signal koji opisuje prisustvo saobraaja na sporednom putu ekanje, zatim klok (sat)
clk i na kraju signal koji omoguava reset sistema clr. Signal nacin uzima vrijednost nula ili
jedan (nula u sluaju kada saobraaj regulie policajac, a jedan u normalnom reimu rada).
Signal cekanje ima vrijednost nula sve dok nema vozila koja ekaju na putu koji nije aktivan, a
u suprotnom sluaju ima vrijednost jedan. Izlazni signali predstavljaju raspored svjetala na
semaforskim tablama za vozila i pjeake, a ija su imena vozila i pjesacki, respektivno. Izlazni
signal vozila je vektor od est elemenata, po tri za semaforsku tablu na glavnom i sporednom
putu, koji mogu uzimati vrijednosti 0 ili 1. Izlazni signal pjesacki je vektor od etiri elementa,
po dva za pjeake semaforske table na sporednom i glavnom putu.
U normalnom radnom reimu, posmatraju se tri karakteristina sluaja na intervalu ije je
trajanje jedan minut. U prvom sluaju vozila se kreu normalno du glavnog puta, a pjeaci

preko sporednog puta. Za itavih


itavih ezdeset sekundi na sporednom putu nema vozila koja ekaju,
niti ima pjeaka koji ekaju prelazak preko glavnog puta. U tom slu
sluaju
aju e signal cekanje biti
jednak nuli na itavom
itavom interval, pa samim
s
tim i neee biti potrebe da se mijenja prvobitno stanje
na semaforima. Na slici 2. je prikazan rezultat simulacije pod navedenim uslovima i kao to se
vidi on odgovara oekivanom.
ekivanom.

Slika 2. Sluaj
Slu kada nema saobraaja na sporednom putu (niko ne eka)

Drugi karakteristini sluaj


aj je potpuno suprotan od prvog. Signal ekanja e
uvijek biti jednak 1,
odnosno uvijek e neko ekati
ekati prolazak putem koji u tome trenutku nije aktivan. U ovom reimu
bi semafor uglavnom trebalo i da radi, jer u suprotnom se
se ne vidi svrha njegovog postojanja.
Dakle, u ovom sluaju
aju imamo pravilnu smjenu stanja semafora i trajanje tih stanja tano
ta
onoliko
koliko smo definisali. Na slici 3. su prikazani rezultati simulacije uz signal ekanje jednak 1
tokom svih ezdeset sekundi.

Slika 3. Sluaj
Slu kada se saobraaj odvija normalno (uvijek neko eka)

Trei karakteristini sluaj


aj
aj jeste kada se nakon nekog vremena pojavi vozilo ili pjeak na
saobraajnici
ajnici koja nije aktivna. Drugim rije
rijeima
ima kombinacija prethodna dva sluaja,
slu
ali sa
nepravilnim ciklusom. Pritom
tom je vrijeme nakon koga se pojavi vozilo ili pjeak namjerno uzeto
veee od minimalnog vremena potrebnog za promjenu toka saobra
saobraaja
aja sa glavne na sporednu
saobraajnicu, jer bi se inae
e i ovaj slu
sluaj sveo na prthodni (pojavilo bi se vozilo ili pjeak prije

isteka minimalnog vremena).. Takoe,


Tako
signali koji oznaavaju
avaju prisustvo vozila ili pjeaka na
sporednom putu - cekanje su uzeti kao kratkotrajni impulsi, to svakako ne odgovara njihovoj
stvarnoj prirodi, ali to je napravljeno iz razloga da se pokae da e sistem odmah reagovati na tu
promjenu. Rezultat simulacije je dat na slici 4. i opet se moe uo
uoiti
iti da sistem reaguje u skladu sa
oekivanjima.

Slika 4. Sluaj
Slu kada se pojavi vozilo ili pjeak na sporednom putu

Na kraju imamo sluaj


aj
aj kada raskrsnicu kontrolie policajac. Tada bi trebalo da na glavnim
semaforskim tablama imamo trep
trepuee uto svijetlo, a da su semaforske table za pjeake ugaene.
I u ovom sluaju
aju se rezultati simulacije poklapaju sa oekivanjima.
o
Vanoo je napomenuti da je u
ovom sluaju
aju na cijelom intervalu od ezdeset sekundi vrijednost signala nacin jednaka '0', dok
vrijednost signala cekanje nije ni bitna, jer ona ni u kom slu
sluaju ne utie
e na stanje u sistemu.

Slika 5. Sluaj
Slu kada saobraaj regulie policajac (trepue uto)

Kao to je na poetku reeno,


eno, ovdje je simuliran rad samo treeg
eg tipa semafora. Simulacija rada
prvog i drugog tipa semafora nije izvrena, ali njihov rad nije ni potrebno simulirati. Razlog je taj
to je rad drugog tipa semafora identian
identi
radu treeg tipa semafora u normalnom random reimu
(prva tri sluaja koja su gore simulirana)
simulirana),, dok prvom tipu semafora odgovara prethodno
simulirani drugi sluaj
aj (uvijek neko eka).

3. Zakljuak
U prvom dijelu rada, ukratko je opisan programski jezik VHDL, njegovi osnovni principi,
struktura, tipovi podtaka, sintaksa nekih naredbi i sl. Pritom je, uglavnom, opisan onaj dio
VHDL-a koji je korien u drugom dijelu rada. to se tie drugog dijela, u njemu je analiziran
rad semafora na jednoj prostoj raskrsnici. Bez obzira to je u samom startu bilo jasno koju ulogu
treba da ima posmatrani semafor, analiza je zapoeta od najprostijeg tipa semafora koji je kasnije
nadograivan. Cilj takvog pristupa je bio da se na najjednostavniji nain istakne osnovna uloga
semafora u razliitim situacijama, pri emu je, na kraju, ukazivano i na osnovne nedostatke
pojedinih tipova semafora. Na osnovu te analize i iz nje izvedenih zakljuaka je kreiran VHDL
kod koji simulira rad posljednjeg, ujedno i najsloenijeg tipa semafora. Rezultati simulacije koda
koji opisuje trei tipa semafora su na kraju i prikazani i prodiskutovani. Poto je kod napisan na
osnovu prethodne analize rada semafora, bilo je i oekivano da se rezultati u simulaciji poklope
sa onim to je zakljueno na osnovu te analize.

4. Literatura

[1] Elektrotehniki fakultet u Beogradu, Programranje komunikacionog hardvera skripta,


http://telekomunikacije.etf.rs/predmeti/te4ks/docs/PKH/PKH_02.pdf (Pristup: 25.06.2015.)

[2] Stojanovi, Radovan D., (2008), Automatizovano projektovanje digitalnih sistema (VHDL
I FPGA), University of Montenegro, Podgorica

[3] http://es.elfak.ni.ac.rs/Papers/Semafor.pdf (Pristup:25.06.2015.)

[4] http://www.lbebooks.com/downloads/exportal/VHDL_BASYS_Example62TrafficLights.pdf
(Pristup: 25.06.2015.)

También podría gustarte