semafori vhdl

28
Digitalna elektronika SEMINARSKI RAD Osnove VHDL-a i realizacija semafora u VHDL-u Vladimir Šimun 10/12 EA Elektrotehnički fakultet u Podgorici, jun 2015. godine

Upload: simun-vladimir

Post on 09-Dec-2015

134 views

Category:

Documents


4 download

DESCRIPTION

Semafori, VHDL, traffic lights

TRANSCRIPT

Page 1: Semafori VHDL

Digitalna elektronika

SEMINARSKI RAD

Osnove VHDL-a i realizacija semafora u VHDL-u

Vladimir Šimun 10/12 EA

Elektrotehnički fakultet u Podgorici, jun 2015. godine

Page 2: Semafori VHDL

SADRŽAJ:

• 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 Logički operatori o 1.8.3 Aritmetički 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 Zaključak • 4 Literatura

Page 3: Semafori VHDL

1.1 VHDL

VHDL je programski jezik koji prpada grupi HDL (Hardware Description Language) jezika, odnosno jezika koji se koriste za opis hardverske implementacije. Pomoću VHDL-a tekstualno opisujemo osnovne djelove hardverske implementacije i veze između njih. Za razliku od klasičnih 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 slučaj. Naime, VHDL treba da opiše hardversku implementaciju koja, u krajnjem slučaju, treba i da se realizuje tako da izvršava određeni skup logičkih funkcija. U zavisnosti od toga koji skup logičkih funkcija treba da se izvršava, razlikovaće se i implementirani hardver. Još jedna razlika u odnosu na klasične programske jezike jesu i tipični kriterijumi performansi. Za razliku od klasišnih programskih jezika, gdje su glavni kriterijumi bili broj instrukcija potreban za izvršenje neke funkcije ili količina memorije koja se zauzima, kod VHDL-a su tipični kriterijumi minimalno zauzimanje fizičkih resursa, minimalno kašnjenje, maksimalna frekvencija koju realizacija podržava i sl.

Takođe, 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 izvršava određene logičke funkcije, opisan je odgovarajućim VHDL kodom. Struktura VHDL koda jednog modula je organizovana imajući u vidu da su za opis modula važne dvije stvari:

� Za komunikaciju modula sa drugim modulima, odnosno okolinom, korisnike tog modula ne zanima njegova interna struktura, tj. na koji način je taj modul realizovan, već im je bitna samo funkcija tog modula.

� Interna struktura koja definiše princip rada modula, a samim tim i njegovu finkciju (ili više njih) je važna 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 različitih paketa koji u sebi sadrže različite funkcije, procedure, komponente, tipove i konstante. Organizacija biblioteke je prikazana na slici 1. U VHDL-u postoje sistemske i korisničke biblioteke. Uključivanjem neke biblioteke u kod,

Page 4: Semafori VHDL

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 izvršava na sljedeći način:

� library ime biblioteke; � use ime_biblioteke.ime_paketa.dio_paketa;

Library je ključna riječ kojom se poziva biblioteka ime_biblioteke, a ključnom riječju use se specificira koji paket (ime_paketa) i koji dio paketa (dio_paketa) želimo uključiti. Ukoliko želimo da uključimo 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 sadrži osnovne definicije tipova promjenljivih i osnovne funkcije. Biblioteka work je korisnički definisana biblioteka i ona je takođe uvijek uključena, tj. ne mora se eksplicitno pozivati. U njoj su sadržani svi dijelovi projekta (VHDL fajlovi, ali i ostali fajlvi koji su uključeni u projekat). U slučaju 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 obično zamišljen kao kolekcija različitih modula, pri čemu svaki modul ima svoje portove koji predstavljaju vezu sa spoljnim svijetom. Ulogu da opiše te konekcije sa spoljnim svijetom ima entitet, koji nije ništa drugo do lista koja sadrži specifikaciju ulaznih i izlaznih portova. Sintaksa entiteta je sljedeća:

� entity ime_entiteta is � generic � port

Page 5: Semafori VHDL

� ( o ime_porta1 : mod tip; o ime_porta2 : mod tip; o .... o ime_portaN : mod tip

� ); � end ime_entiteta;

Ključnom riječju entity se deklariše entitet čije je ime ime_entiteta, a potom slijedi ključna riječ is. Kao što su i kod većine programskih jezika postojala ograničenja prilikom imenovanja promjenljivih, funkcija i sl., to je slučaj i u VHDL-u. Naziv entiteta je proizvoljan, ali je važno da počinje slovom i da se ne koristi ključna riječ za naziv entiteta, zatim u nazivu ne smije biti ni razmaka, niti dva uzastopna ‘_’ (underscore) simbola, ne smije se završavati sa ‘_’ underscore simbolom i ne smije sadržati zabranjene simbole (npr. ‘?’). Unutar port dijela se definšu interfejsi (portovi, pinovi) tako što se prvo navede ime porta, a zatim, nakon dvotačke i mod i tip porta. Mod porta definiše 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 može predstavljati i ulaz i izlaz. Buffer mod je sličan out modu, jer je i on izlazni mod, ali ovaj mod posjeduje dodatak da se vrijednost ovog porta može očitavati unutar entiteta. Deklaracije portova se odvajaju sa ; pri čemu se iza posljednjeg porta ne stavlja ; čime se označava kraj deklarisanja portova entiteta. U slučaju da ima više portova koji su identičnog moda i tipa, oni se mogu navesti i u jednom redu na sljedeći način:

� ime_porta1, ime_porta2, … ime_portaN : mod tip; Ključna riječ end označava 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 više uloga tog entiteta opisati unutar arhitekture. Jedan isti entitet može da ima više različitih arhitektura, pri čemu je unutar tijela svake od njih opisana neka od funkcija entiteta. Struktura arhitekture je sljedeća:

� architecture ime_arhitekture of ime_entiteta is � deklaracije � begin � kod � end ime_arhitekture;

Ključna riječ architecture označava početak deklaracije arhitekture čije je ime ime_arhitekture. Nakon toga slijedi ključna riječ of koju prati ime_entiteta i na kraju ide ključna riječ is. S obzirom da je ime arhitekture vidljivo samo unutar entiteta naziv arhitekture mora biti smislen samo u slučaju kada za jedan entitet definišemo više arhitekturi. Pritom sva pravila u vezi imena

Page 6: Semafori VHDL

koja su važila za entitete važe i za arhitekture (ime mora počinjati slovom, ne smije sadržati dva uzastopna ‘_’ (underscore) simbola …). Nakon definisanja naziva arhitekture slijedi dio u okviru koga se definišu interni signali koji su vidljivi samo unutar te arhitekture. Takođe se navode i funkcije, konstante, drugi entiteti itd. koji se koriste unutar tijela arhitekture. Tijelo arhitekture počine ključnom riječju begin. Unutar tijela arhitekture se opisuje interna struktura modula, tj. šta zaista modul koji realizujemo treba da radi.

1.3 Tipovi podataka

VHDL pruža veliki broj predefinisanih tipova podataka, ali i mogućnost da korisnik sam kreira neki svoj tip. Da bi bilo moguće koristiti neki tip, prethodno je neophodno uključiti biblioteke i pakete i kojima su ti tipovi definisani. Iako veliki broj predefinisanih tipova ima mogućnost hardverske implementacije, postoje i tipovi koji se ne mogu hardverski implementirati. Njihova uloga je da olakšaju proces testiranja i simulacije. S druge strane, korisnik mora biti svjesan da ovi tipovi nemaju svoj hardverski ekvivalent, pa treba biti obazriv prilikom njihovog korišćenja. U tabeli 1. su dati opisi svih definisanih tipova kao i nazivi biblioteka i paketa u kojima su ovi tipovi definisani.

Mogućnost

Tip Objašnjenje Biblioteka hardverske

implementacije

BIT Binarni signal (‘0’ ili ‘1’) Paket standard biblioteke std Da

BIT_VECTOR Niz (vektor) bita Paket standard biblioteke std Da

STD_LOGIC Proširenje BIT tipa sa Paket std_logic_1164 Da

dodatnim stanjima biblioteke ieee

STD_LOGIC_VECTOR Niz (vektor) STD_LOGIC- Paket std_logic_1164 Da

A biblioteke ieee

Proširenje STD_LOGIC Paket std_logic_1164 Da

STD_ULOGIC tipa sa nerazriješenim biblioteke ieee

stanjem (’U’)

STD_ULOGIC_VECTOR Niz (vektor) Paket std_logic_1164 Da

STD_ULOGIC-a biblioteke ieee

STD_LOGIC_VECTOR Paket std_logic_arith Da

SIGNED ekvivalent za aritmetičke biblioteke ieee

operacije u signed režimu

STD_LOGIC_VECTOR Paket std_logic_arith Da

UNSIGNED ekvivalent za aritmetičke biblioteke ieee

operacije u unsigned

režimu

BOOLEAN Logička binarna Paket standard biblioteke std Da

promjenljiva

INTEGER Cio broj Paket standard biblioteke std Da

Page 7: Semafori VHDL

NATURAL Cio nenegativan broj Paket standard biblioteke std Da

POSITIVE Cio pozitivan broj Paket standard biblioteke std Da

REAL Realan broj Paket standard biblioteke std Ne

CHARACTER ASCII karakter Paket standard biblioteke std Ne

STRING Niz ASCII karaktera Paket standard biblioteke std Ne

SEVERITY_LEVEL Nivo značaja generisane Paket standard biblioteke std Ne

poruke u simulaciji

TIME Vrijeme Paket standard biblioteke std Ne

DELAY_LENGTH Dužina kašnjenja Paket standard biblioteke std Ne

FILE_OPEN_KIND Mod rada otvorenog fajla Paket standard biblioteke std Ne

FILE_OPEN_STATUS Rezultat otvaranja fajla Paket standard biblioteke std Ne

Tabela 1. Pregled osnovnih tipova podataka u VHDL-u

Najčešće korišćeni tipovi su: STD_LOGIC, STD_LOGIC_VECTOR i INTEGER.

STD_LOGIC – Ovaj tip je definisan u paketu std_logic_1164 biblioteke ieee, što znači da on nije predefinisan, već je za njegovo korištenje uvijek potrebno uljučiti navedeni paket iz biblioteke ieee. STD_LOGIC predstavlja jedan signal odnosno liniju koja može imati osam mogućih nivoa:

o '0' - logička 0; o '1' - logička 1; o 'Z' - visoka impedansa; o 'X' - neodređena vrijednost; o 'W' - slab signal neodređene vrijednosti; o 'L' - slab signal logičke 0; o 'H' - slab signal logičke 1; o '-' - don’t care vrijednost.

Prva tri nivoa signala (0, 1 i Z) se najčešće koriste u praksi, jer se bez ograničenja mogu hardverski implementirati, dok je četvrti nivo X primjenu našao prije svega u okviru simulacija, kao signalizacija neodređene vrijednosti signala. Ostali nivoi se takođe 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 stanovišta predstavlja magistralu (skup linija) gdje svaka linija može uzeti jednu od osam mogućih vrijednosti. Ni ovaj tip nije predefinisan, već je za njegovo korištenje potrebno uključiti paket std_logic_1164 biblioteke ieee. Niz signala ovog tipa se može deklarisati po little endian principu kao STD_LOGIC_VECTOR (donja_granica to gornja_granica) ili po big endian

Page 8: Semafori VHDL

principu kao STD_LOGIC_VECTOR (gornja_granica downto donja_granica). Prirodnija je upotreba big endian principa dodjele, jer se u tom slučaju vrijednost signala piše s lijeva na desno, što znači da je MSB bit krajnji lijevi bit. U praksi su oba principa dodjele potpuno ravnopravna, ali ne preporučuje se njihovo miješanje, jer je upravo tu najčešći izvor grešaka. 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 vrši dodjela vrijednosti opsegu indeksa signala tipa STD_LOGIC_VECTOR opet se moraju koristit dvostruki navodnici, čak i u slučaju kada je dužina 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 slučaju heksadecimalnog zapisa opseg kome se dodjeljuje vrijednost bude dužine koja je djeljiva sa četiri ili dužine koja je djeljiva sa tri u slučaju oktalnog zapisa,

� ime_signala(indeks1 to / downto indeks2) <= X“ heksadecimalna_vrijednost_signala” � ime_signala(indeks1 to / downto indeks2) <= O“ oktalna_vrijednost_signala” .

Nad signalima tipa STD_LOGIC_VECTOR mogu se vršiti samo logičke operacije, dok su aritmetičke operacije nedozvoljene. Uključivanjem paketa std_logic_unsigned ili std_logic_signed biblioteke ieee dobija se podrška i za aritmetičke operacije nad signalima ovog tipa.

INTEGER – Riječ je o predefinisanom tipu koji obično koristi 32 bita za predstavljanje cijelih brojeva. Sa hardverskog stanovišta INTEGER predstavlja 32 linije pri čemu svaka linija može imati vrijednost 0 ili 1. Ukoliko korisniku nije neophodno svih 32 bita za predstavljanje opsega nekog signala on može pomoću ključne riječi range ograničiti taj opseg na sljedeći način,

� signal ime_signala : INTEGER range donja_granica to gornja_granica ;

U slučaju da korisnik ne koristi svih 32 bita za opisivanje nekog signala kompajler će u svakom slučaju odraditi skraćivanje opsega, iako korisnik to nije eksplicitno naveo. Vrijednosti signalu ovoga tipa se dodjeljuju u decimalnom zapisu

� ime_signala <= decimalni_broj;.

Page 9: Semafori VHDL

Osim velikog broja definisanih tipova, VHDL pruža potpunu slobodu korisniku da definiše nove tipove podataka. Iako je ova mogućnost veoma primamljiva na prvi pogled u praksi se ipak ne “zloupotrebljava” previše. Uglavnom se definišu enumerisani tipovi koji služe da dizajniranje automata stanja (state machine), gdje se stanja automata opisuju riječima (nizom karaktera) i na taj način se postiže veća razumljivost i preglednost koda. Takođe, 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). Korisnički definisan tip može biti i npr. opseg INTEGER-a, mada se u tom slučaju mnogo češće kreira novi podtip (subtype). Razlog za to je što se razmjena vrijednosti između dva različita tipa ne mogu vršiti direktno, dok je razmjena vrijednosti između tipa i podtipa dozvoljena.

1.4 Konkurentni kod Ranije je naglašeno da se ponašanje nekog hardverskog modula opisuje unutar arhitekture. Dva su načina da se to uradi – konkurentni i sekvencijalni način, pri čemu upotreba jednog načina ne isključuje upotrebu drugog, tj. oba načina se mogu potpuno ravnopravno koristiti unutar jedne iste arhitekture. Konkurentno ili kako se još naziva paralelno kodiranje podrazumijeva izvršavanje svih izraza istovremeno (paralelno). To znači da se u toku jednog procesa vrijednost jednog signala ne može promijeniti više od jednog puta. Ovaj način 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 rečeno when je jedna od fundamentalnih komandi koje se koriste u paralelnom programiranju. Smisao ove komande je da omogući selekciju izraza koji želimo da aktiviramo u slučaju da je neki uslov ispunjen. Razlikujemo when/else konstrukciju i when/select/when konstrukciju.

Sintaksa when/else konstrukcije je sljedeća:

� rezultat <= vrijednost_1 when uslov_1 else � vrijednost_2 when uslov_2 else � …

Page 10: Semafori VHDL

� vrijednost_n-1 when uslov_n-1 else

� vrijednost_n;

Sintaksa with/select/when konstrukcije je sljedeća:

� 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 moguće koristiti samo u slučaju kad pokrijemo sve vrijednosti selektora. U slučajevima kada selektor može uzeti veliki broj vrijednosti, a nama su od interesa samo neke od njih, koristi se ključna 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 mogućih nivoa, a skoro nikad ne uzimamo u obzir sve njih, to praktično znači da će ključna riječ others da se koristi uvijek kada je selektor ovog tipa.

� vrijednost_N when others;

Ukoliko nije potrebno izvršiti nijednu akciju za neku vrijednost selektora koristi se ključna riječ unaffected, kojom signaliziramo da želimo da se vrijednost rezultujućeg signala ne mijenja,

� unaffected when others;

1.5 Sekvencijalno programiranje

Ovaj model podrazumijeva pisanje naredbi koje se izvršavaju sekvencijalno (jedna po jedna), baš kao kod klasičnih programskih jezika. Sekvencijalni kod se još naziva i “behavioral code”, jer on u suštini opisuje funkciju nekog logičkog kola ne ulazeći u njegovu strukturu. Sekvencijalno kod se ne može pisati bilo gdje, već samo i isključivo unutar: procesa, funkcija i procedura. Unutar svake od ovih cjelina koje sadrže 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 služe za povezivanje komponenti dizajna. Sa hardverskog stanovišta to su žice kojima su djelovi hardvera međusobno povezuani. Ranije je rečeno da se signali mogu koristiti i u konkurentnom i u sekvencijalnom programiranju. Signale je moguće deklarisati u paketu,

Page 11: Semafori VHDL

entitetu ili deklarativnom dijelu arhitekture i gdje god da su deklarisani oni postaju globalne promjenljive. Ako ih deklarišemo u paketu, onda su vidljivi i u svim entitetima tog paketa, ako ih deklarišemo u entitetu, onda su vidljivi i u svim arhitekturama tog entiteta. Deklaracija signala unutar entiteta nije ništa 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 više entiteta njegva upotreba postaje dosta komplikovana. Sintaksa signala unutar paketa ili deklarativnog dijela arhitekture je sljedeća:

� 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 sljedeća:

� constant naziv_konstante : tip_konstante := vrijednost_konstante; U ovom slučaju vrijednost konstante se mora navesti. Za dodjelu vrijednosti nekom signal se koristi operator <=.

Varijable predstavljaju lokalne promjenljive karakteristične 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 pomoćne promjenljive (slično kao u klasičnim programskim jezicima). Druga razlika između 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 moguće dodijeliti samo jednu vrijednost u toku procesa, kod varijabli to nije slučaj. Sintaksa varijabli je sljedeća:

� variable naziv_varijable : tip_varijable := vrijednost_varijable; Kao i kod signala i ovdje navođenje inicijalne vrijednosti varijable nije neophodno, tj. može se izostaviti. Vrijednost nekoj od varijabli se dodjeljuje pomoću 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 način praktično postiže da se i sekvencijalni kod u VHDL-u izvršava istovremeno. Takođe, moguća je kombinacija proces bloka ili više njih sa paralelnim naredbama. Sintaksa procesa je sljedeća:

� ime_procesa : process (lista_osjetljivosti) � deklarativni_dio � begin

Page 12: Semafori VHDL

� sekvencijalni kod � end process ime_procesa;

Ime procesa nije neophodno navoditi. U deklarativnom dijelu procesa se deklarišu varijable koje se koriste unutar procesa. Lista osjetljivosti predstavlja signal ili skup signala čijom promjenom počinje da se izvršava sekvencijalni kod iz tijela procesa.

1.7.1 If konstrukcija

Slično kao i u klasičnim programskim jezicima if naredba je našla veliku primjenu i u VHDL-u. Sintaksa if konstrukcije je sljedeća:

� 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 klasične programske jezike je ta što se izvršava samo onaj dio sekvencijalnog koda koji se nalazi desno od operatora => tj. nije dozvoljeno pisati više linija koda. Slično kao kod with/select/when konstrukcije i ovdje je zgodna upotreba ključne riječi others koja imaju identičnu ulogu,

� when others => sekvencijalni kod;.

Page 13: Semafori VHDL

S druge strane, ako nije potrebno da se izvrši bilo šta u nekoj selekciju, koristi se ključna riječ null (kod with/select/when konstrukcije je to bila ključna riječ unaffected),

� when (vrijednost1) => null; .

1.7.3 Wait konstrukcija

Wait je sekvencijalna komanda koja, u nekim slučajevima, predstavlja zamjenu za listu_osjetljivosti procesa. Kao što je već rečeno, promjenom nekog od signala iz liste_osjetljivosti počinje izvršenje procesa, koje dalje nije moguće kontrolisati. Upravo tu mogućnost kontrole procesa nam pruža wait komanda. Razlikujemo sljedeće wait naredbe: wait until, wait on i wait for . Wait naredbe se ne mogu koristiti unutar procesa koji sadrže listu_osjetljivosti. Takođe, broj wait naredbi unutar tijela jednog procesa može biti proizvoljan.

Wait until naredba zaustavlja izvršenje procesa dok se ne ispuni određeni uslov koji mora biti određen vrijednošću nekog signala. Sintaksa ove naredbe je:

� wait until uslov_određen_vrijednošću_signala;

i ona obavezno mora ići na početku procesa.

Wait on naredba zaustavlja izvršenje procesa dok ne ispuni uslov, koji može biti određen vijednošću više 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 odluči šta će koristiti. Naravno, i za ovu naredbu važi pravilo da mora biti prva naredba unutar tijela procesa.

Wait for nareba zaustavlja izvršenje procesa za određeno vrijeme, koje korisnik može specificirati. Njena hardverska implementacija nije moguća, ali ona ipak ima veliku primjenu, uglavnom u okviru simulacija. Njena sintaksa je:

� wait on specificirano_vrijeme;

i za razliku od ostalih, ona se može naći na bilo kojem mjestu unutar tijela procesa.

Page 14: Semafori VHDL

1.8.1 Operatori dodjele

Predefinisani operatori u VHDL-u su: operatori dodjele, logički operatori, aritmetički operatori, relacioni operatori, pomjerački operatori i operator konkatanacije.

Osim ranije pobrojanih razlika između signala i varijabli, postoji razlika i u samom načinu na koji im se dodjeljuje neka vrijednost.

Operator := se koristi za dodjelu vrijednosti varijablama i konstantama, za postavljanje inicijalnih vrijednosti signala i varijabli i generičkih parametara, dok se za dodjelu vrijednosti signalu koristi operator <=.

U nekim slučajevima je potrebno dodijeliti određenu vrijednost samo nekim djelovima vektora, a ostale elemente treba postaviti na zajedničku vrijednost. U tim situacijama se koristi operator => koji ide u kombinaciji sa ključnom riječju others npr. x <= (0=>’1’, others => ‘0’).

U tabeli 2. je dat opis operatora dodjele.

Tabela 2. Pregled operatora dodjele

1.8.2 Logički operatori

Logički operatori se koriste za izvršavanje logičkih 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 najveći prioritet, svi ostali logički operatori imaju najniži prioritet. U Tabeli 3. je dat popis osnovnih logičkih operatora.

Operator Opis

<= Dodjela vrijednosti signal

:= 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

ključnom riječju OTHERS), mapiranje signala na portove uvedene komponente

Page 15: Semafori VHDL

Operator Opis NOT Negacija

AND Logička I operacija

OR Logička ILI operacija

NAND Logička NI operacija

NOR Logička NILI operacija

XOR Logička ekskluzivno ILI operacija

XNOR Inverzna XOR operacija

Tabela 3. Osnovni logički operatori

1.8.3 Aritmetički operatori

Aritmetički operatori se koriste za kreiranje aritmetičkih funkcija. U tabeli 4. su prikazani aritmetički operatori.

Tabela 4. Aritmetički operatori

Tipovi podataka nad kojima se mogu vršiti aritmetičke operacije su INTEGER i REAL. Uključivanjem odgovarajučih biblioteka podršku za aritmetičke operacije mogu dobiti i tipovi SIGNED, UNSIGNED i STD_LOGIC_VECTOR. Pošto ne postoji mogućnost hardverske implementacije tipa REAL primjena gore navedenih operatora je veoma ograničena. Praktično, samo se sabiranje i oduzimanje mogu implementirati bez ograničenja. Kod množenja vektora se mora voditi računa o njihovoj dužini, a kod množenja signala o broju bita koji se koristi za predstavljanje proizvoda. Dijeljenje vektora je moguće samo ako je djelilac stepen dvojke i tada se operacija dijeljenja svodi na pomjeranje udesno. Dijeljenje INTEGER tipova je moguće, ali se pritom kao rješenje uzima samo cio broj ispred decimalnog zareza.

Operator Opis + Sabiranje

- Oduzimanje

* Množenje

/ Dijeljenje

** Stepenovanje

MOD Moduo

REM Ostatak dijeljenja

ABS Apsolutna vrijednost

Page 16: Semafori VHDL

1.8.4 Relacioni operatori

Ovi operatori služe za određivanje odnosa između dva signala. Kao rezultat vraćaju 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.

Tabela 5. Osnovni relacioni operatori

1.8.5 Operatori pomjeranja

Operatori pomjeranja se korise za realizaciju pomjeračkih registara. Lijevi operand je uvijek vektor i to obično BIT_VECTOR, mada se uključivanjem odgovarajućih biblioteka može dobiti podrška i za STD_LOGIC_VECTOR, SIGNED i UNSIGNED tipove. Desni operand je obično tipa INTEGER. Rezultat je uvijek istog tipa kao i lijevi operand. Implementacija pomjeračkih registara u slučaju konstantnog desnog operanda je veoma jednostavna, a ako je riječ o promjenljivom operandu (vrijednost signala koja može da se mijenja) onda se implementacija ovih registara prilično usložnjava. U Tabeli 6. je dat pregled operatora pomjeranja.

Operator Opis Tip SLL Logičko pomjeranje ulijevo BIT_VECTOR

SRL Logičko pomjeranje udesno BIT_VECTOR

SLA Aritmetičko pomjeranje ulijevo BIT_VECTOR

SRA Aritmetičko pomjeranje udesno BIT_VECTOR

ROL Rotiranje ulijevo BIT_VECTOR

ROR Rotiranje udesno BIT_VECTOR

SHL Pomjeranje ulijevo STD_LOGIC_VECTOR, SIGNED, UNSIGNED

SHR Pomjeranje udesno STD_LOGIC_VECTOR, SIGNED, UNSIGNED

Tabela 6. Pomjerački operatori

Operator Opis = Jednako

/= Nejednako

< Manje

> Veće

<= Manje ili jednako

>= Veće ili jednako

Page 17: Semafori VHDL

1.9.1 Atributi za opis vektora

VHDL podržava nekoliko tipova atributa koji se koriste za opisivanje svojstava vektora (nizova), signala i podataka tipa “type”. Atributi za opis vektora omogućavaju jednostavno određivanje nekih osobina vektora. Uvođenje atributa je rezultat prevelike slobode koja je data korisniku prilikom definisanja vektora (nizova). Pristupanje atributu se vrši 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 Vraća

vektor‘left(N) Indeks krajnjeg lijevog člana

vektor’right (N) Indeks krajnjeg desnog člana

vektor’high(N) Najviši indeks

vektor’low(N) Najniži indeks

vektor’length(N) Dužinu vektora

vektor’range(N) Opseg indeksa

vektor’reverse_range(N) Obrnuti opseg indeksa Tabela 7. Osnovni atributi za opis vektora (nizova)

1.9.2 Atributi za opis signala

Slično kao kod vektora, postoje i atributi koji opisuju signale, odnosno neke osobine signala. Uglavnom se koriste u simulacijama, mada je neke od njih moguće i hardverski implementirati. Pristupanju atributu signala se vrši na identičan način kao kod vektora, pomoću apostrofa praćenog 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 slučaj. Njihovi rezultati mogu biti čak i novi signali koji dalje mogu biti korišteni u okviru koda potpuno ravnopravno sa ostalim signalima. Pregled osnovnih atributa za opsi signala dat je u Tabeli 7.

Page 18: Semafori VHDL

Naziv atributa Opis atributa EVENT Vraća TRUE ako se dogodila promjena vrijednosti signala

STABLE Vraća TRUE ako se nije dogodila promena vrijednosti signala

ACTIVE Vraća TRUE ako signal ima vrijednost ’1’

QUIET <vrijeme> Vraća TRUE ako nije bilo promjene vrijednosti signala za specificirano vrijeme

LAST_EVENT Vraća vrijeme proteklo od trenutka posljednje promjene vrijednosti signala

LAST_ACTIVE Vraća vrijeme proteklo od trenutka posljednje aktivne vrijednosti signala (’1’)

LAST_VALUE Vraća 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 saobraćaja motornih vozila, odnosno osam semaforskih tabli (P) sa po dva signala (crveno i zeleno) za regulaciju prolaska pješaka. U obzir treba uzeti i situaciju kada je na svim semaforima upaljeno žuto svijetlo, tj. situaciju kada saobraćaj reguliše policajac. U tom slučaju pretpostaviti da su svijetla na semaforima za pješake ugašena.

P2 P3

P4 P1 V1 V2

V4

P8 V3 P5

P7 P6

Slika 1. Prosta raskrsnica sa semaforima.

Page 19: Semafori VHDL

2.2 Razrada Posmatrajući raskrnicu sa slike 1. može se zaključiti da će određene semaforske table raditi u paraleli. Drugim riječima, semaforske table V1 i V3 će uvijek imati ista pokazivanja, a to naravno važi i za par V2-V4, odnosno grupe P1-P4-P5-P8 i P2-P3-P7-P7. Pretpostavimo na samom početku, da table V1-V3 regulišu saobraćaj vozila po glavnom, a table V2-V4 po sporednom putu. Radi jednostavnosti, par V1-V3 označimo G, par V2-V4 sa S, a grupe P1-P4-P5-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 pješake. 2.2.1 Semafor #1 Četiri grupe semaforskih tabli treba da obezbijede normalno funkcionisanje saobraćaja. Raspored svjetala na semaforskim tablama će se mijenjati u pravilnim intervalima i što je još važnije, ponavljaće se u ciklusima. Razmotrimo koja su moguća stanja ovog “primitivnog” semafora. Stanje 1. U prvom slučaju, neka je stanje na semaforima G-zeleno, S-crveno, Pg-crveno i Ps-zeleno ili drugim riječima, glavni put je aktivan za vozila, a sporedni za pješake. Ovaj raspored svjetala treba da se zadrži specificirano minimalno vrijeme. Nakon toga potrebno je preći u sljedeće 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 počnu da usporavaju. I ovo stanje traje određeno 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, pješacima se zabranjuje kretanje. Stanje 4. Raspored svjetala na semaforima je G-crveno, S-zeleno, Pg-zeleno i Ps-crveno. Kreću vozači sa sporednog puta i pješaci preko glavnog puta. U ovom stanju semafori treba da se zadrže isto onoliko vremena koliko su proveli u stanju 1. Naravno, ovo važi pod pretpostavkom da je frekvencija vozila i pješaka preko obje saobraćajnice 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

Page 20: Semafori VHDL

je otprilike isto kao i trajanje stanja 5. Nakon isteka specificiranog vremena sistem treba da preopet u stanje 1. i sve tako u krug. Prethodna priča se jednostavno može prikazati dijagramom stanja na slicigornjeg semafora nije ništa drugo do “beskonasvako stanje ima svoje vrijeme trajanja. Mana ovakve realizacije je u tome što nijesu ukljuinformacije o prisustvu vozila ili pješaka na putu koji nidesiti da je na glavnom putu veliki broj vozila, a da se na sporednom putu ne nalazi nijedno vozilo, niti da ima pješaka koji čfunkcioniše na prethodno opisani naće postati aktivan, što nikako ne valja. Isto tako može se dogoditi i obrnuta situacija, da je gužva na sporednom putu, a glavni put je prazan. Iz tog razloga neophodno je u obzir uzeti i informaciju o prisustvu/odsustvu vozila ili pješaka na putu koji u tome

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

a se jednostavno može prikazati dijagramom stanja na slicigornjeg semafora nije ništa drugo do “beskonačno” ponavljanje navedenih šest stanja, pri svako stanje ima svoje vrijeme trajanja. Mana ovakve realizacije je u tome što nijesu ukljuinformacije o prisustvu vozila ili pješaka na putu koji nije aktivan za saobraćdesiti da je na glavnom putu veliki broj vozila, a da se na sporednom putu ne nalazi nijedno vozilo, niti da ima pješaka koji čekaju prelazak preko glavnog puta. U tom

isani način će zaustaviti saobraćaj na glavnom putu, a sporedni put e postati aktivan, što nikako ne valja. Isto tako može se dogoditi i obrnuta situacija, da je gužva

na sporednom putu, a glavni put je prazan. Iz tog razloga neophodno je u obzir uzeti i informaciju o prisustvu/odsustvu vozila ili pješaka na putu koji u tome trenutku nije aktivan

Slika 2. Dijagram stanja

je otprilike isto kao i trajanje stanja 5. Nakon isteka specificiranog vremena sistem treba da pređe

a se jednostavno može prikazati dijagramom stanja na slici 2. Očigledno, rad no” ponavljanje navedenih šest stanja, pri čemu

svako stanje ima svoje vrijeme trajanja. Mana ovakve realizacije je u tome što nijesu uključene je aktivan za saobraćaj. Naime, može se

desiti da je na glavnom putu veliki broj vozila, a da se na sporednom putu ne nalazi nijedno lazak preko glavnog puta. U tom slučaju semafor koji

aj na glavnom putu, a sporedni put e postati aktivan, što nikako ne valja. Isto tako može se dogoditi i obrnuta situacija, da je gužva

na sporednom putu, a glavni put je prazan. Iz tog razloga neophodno je u obzir uzeti i trenutku nije aktivan.

Page 21: Semafori VHDL

2.2.2 Semafor #2

Kao što je već rečeno prethodni “primitivni” semafor ima veliku manu, jer u obzir ne uzima informacije o prisustvu/odsustvu vozila ili pješaka na neaktivnom putu. Ukoliko bi se i ove informacije uzele u obzir rad semafora bi bio znatno efikasniji, jer bi se u nekim slučajevima vrijeme čekanja značajno smanjilo. Analizom prethodnih šest stanja očigledno je da stanja 2., 3., 5. i 6. predstavljaju stanja čije se vrijeme trajanja ne može značajno mijenjati, jer njegovo povećanje nema smisla, a smanjenjem ovog vremena se može ugroziti bezbjednost učesnika u saobraćaju. Dakle, moguće je povećati trajanje stanja 1. i 4. na osnovu informacija o saobraćaju na neaktivnom putu. Njihov uticaj se ogleda u sljedećem: sve dok sistem ne dobije informaciju da se pojavilo vozilo ili pješak na dijelu puta koji nije aktivan, trajanje stanja 1. ili 4. treba produžiti. Na ovaj način je prevaziđen problem do koga je dolazilo u slučaju kada na nekom od pravaca nema saobraćaja. Međutim, kada je potrebno da saobraćaj na raskrsnici reguliše policajac, ovaj režim rada semafora nije pogodan, pa je neophodno u obzir uzeti i informacije o tome u kojem režimu radi semafor.

2.2.3 Semafor #3

Pošto prethodni semafor ne može funkcionisati u nekim vanrednim situacijama i taj problem je potrebno prevazići. Kada je potrebno da saobraćaj na raskrsnici reguliše policajac, rad prethodnog semafora treba prilagoditi i toj situaciji. U prethodnim analizama pješačke semaforske table pokazivale samo dvije signalne boje (crvena i zelena), pa će se u ovom slučaju smatrati da su ove semaforske table isključene. Dakle, potrebno je samo regulisati rad četiri semaforske table za motorna vozila. U tom slučaju, na ovim tablama žuto signalno svijetlo treba da se naizmjenično pali i gasi. Na taj način se dobija semafor koji može da radi u dva režima: “normalnom” i “vanrednom”, pri čemu je pri radu u “normalnom” režimu rada vrijeme čekanja minimalno. Na kraju, važno je napomenuti da se odgovarajućim podešavanjima iz ovog tipa mogu izvesti oba prethodna tipa semafora.

2.3 Kod Sva tri prethodno opisana semafora moguće je realizovati pomoću programskog jezika VHDL primjenom odgovarajućeg kompajlera. Ovdje će biti dat VHDL kod koji simulira rad trećeg semafora. Malim korekcijama ovog koda, tj. izostavljanjem odgovarajućih uslova, može 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;

Page 22: Semafori VHDL

• 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;

Page 23: Semafori VHDL

• 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;

o elsif nacin='0' then o 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;

Page 24: Semafori VHDL

� 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 slučaju. 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 ugašene. Takođe je veoma važno znati da vrijednost konstanti sec5 i sec1 same po sebi ne znače mnogo. One u suštini zavisi od izbora clk - klok signala, tj. za različite 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 trećeg tipa semafora. Tri situacije su vezane za rad semafora u standardnom režimu, a jedna posmatra slučaj kada raskrsnicu kontroliše policajac (trepćuće ž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 saobraćaja na sporednom putu – čekanje, zatim klok (sat) – clk i na kraju signal koji omogućava reset sistema – clr. Signal nacin uzima vrijednost nula ili jedan (nula u slučaju kada saobraćaj reguliše policajac, a jedan u normalnom režimu rada). Signal cekanje ima vrijednost nula sve dok nema vozila koja čekaju na putu koji nije aktivan, a u suprotnom slučaju ima vrijednost jedan. Izlazni signali predstavljaju raspored svjetala na semaforskim tablama za vozila i pješake, 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 pješačke semaforske table na sporednom i glavnom putu. U normalnom radnom režimu, posmatraju se tri karakteristična slučaja na intervalu čije je trajanje jedan minut. U prvom slučaju vozila se kreću normalno duž glavnog puta, a pješaci

Page 25: Semafori VHDL

preko sporednog puta. Za čitavih šezdeset sekundi na sporednom putu nema vozila koja niti ima pješaka koji čekaju prelazak preko glavnog puta. U tom slujednak nuli na čitavom interval, pa sna semaforima. Na slici 2. je prikazan rezultat simulacije pod navedenim uslovima i kao što se vidi on odgovara očekivanom.

Slika 2. Sluč

Drugi karakteristični slučaj je potpuno suprotan od prvog. Signal odnosno uvijek će neko čekati prolazak putem koji u tome trenutku nije aktivan. U ovom režimu bi semafor uglavnom trebalo i da radi, jer u suprotnom sDakle, u ovom slučaju imamo pravilnu smjenu stanja semafora i trajanje tih stanja takoliko smo definisali. Na slici 3. su prikazani rezultati simulacije uz signal tokom svih šezdeset sekundi.

Slika 3. Sluč

Treći karakteristični slučaj jeste kada se nakon nekog vremena pojavi vozilo ili pješak na saobraćajnici koja nije aktivna. Drugim rijenepravilnim ciklusom. Pritom je vrijeme nakon koga se pojavi vozilo ili pješak namjerno uzeto veće od minimalnog vremena potrebnog za promjenu toka saobrasaobraćajnicu, jer bi se inače i ovaj slu

čitavih šezdeset sekundi na sporednom putu nema vozila koja čekaju prelazak preko glavnog puta. U tom slučaju ć

itavom interval, pa samim tim i neće biti potrebe da se mijenja prvobitno stanje na semaforima. Na slici 2. je prikazan rezultat simulacije pod navedenim uslovima i kao što se

ekivanom.

Slika 2. Slučaj kada nema saobraćaja na sporednom putu (niko ne čeka)

čaj je potpuno suprotan od prvog. Signal čekanja ćčekati prolazak putem koji u tome trenutku nije aktivan. U ovom režimu

bi semafor uglavnom trebalo i da radi, jer u suprotnom se ne vidi svrha njegovog postojanja. aju imamo pravilnu smjenu stanja semafora i trajanje tih stanja ta

koliko smo definisali. Na slici 3. su prikazani rezultati simulacije uz signal

Slika 3. Slučaj kada se saobraćaj odvija normalno (uvijek neko čeka)

čaj jeste kada se nakon nekog vremena pojavi vozilo ili pješak na ajnici koja nije aktivna. Drugim riječima kombinacija prethodna dva slu

tom je vrijeme nakon koga se pojavi vozilo ili pješak namjerno uzeto e od minimalnog vremena potrebnog za promjenu toka saobraćaja sa glavne na sporednu

če i ovaj slučaj sveo na prthodni (pojavilo bi se vozilo ili pješak prije

itavih šezdeset sekundi na sporednom putu nema vozila koja čekaju, čaju će signal cekanje biti

e biti potrebe da se mijenja prvobitno stanje na semaforima. Na slici 2. je prikazan rezultat simulacije pod navedenim uslovima i kao što se

čeka)

čekanja će uvijek biti jednak 1, ekati prolazak putem koji u tome trenutku nije aktivan. U ovom režimu

e ne vidi svrha njegovog postojanja. aju imamo pravilnu smjenu stanja semafora i trajanje tih stanja tačno onoliko

koliko smo definisali. Na slici 3. su prikazani rezultati simulacije uz signal čekanje jednak 1

aj jeste kada se nakon nekog vremena pojavi vozilo ili pješak na ima kombinacija prethodna dva slučaja, ali sa

tom je vrijeme nakon koga se pojavi vozilo ili pješak namjerno uzeto ćaja sa glavne na sporednu

bi se vozilo ili pješak prije

Page 26: Semafori VHDL

isteka minimalnog vremena). Takosporednom putu - cekanje su uzeti kao kratkotrajni impulsi, što svakako ne odgovara njihovoj stvarnoj prirodi, ali to je napravljeno promjenu. Rezultat simulacije je dat na slici 4. i opet se može uoočekivanjima.

Slika 4. Sluč

Na kraju imamo slučaj kada raskrsnicu kontroliše policajac. Tada bi trebalo da na glavnim semaforskim tablama imamo trepI u ovom slučaju se rezultati simulacije poklapaju sa oovom slučaju na cijelom intervalu od šezdeset sekundi vrijednost signala vrijednost signala cekanje nije ni bitna, jer ona ni u kom slu

Slika 5. Sluč

Kao što je na početku rečeno, ovdje je prvog i drugog tipa semafora nije izvršena, ali njihov rad nije ni potrebno simulirati. Razlog je taj što je rad drugog tipa semafora identi(prva tri slučaja koja su gore simulirana)simulirani drugi slučaj (uvijek neko

. Takođe, signali koji označavaju prisustvo vozila ili pješaka na su uzeti kao kratkotrajni impulsi, što svakako ne odgovara njihovoj

stvarnoj prirodi, ali to je napravljeno iz razloga da se pokaže da će sistem odmah reagovati na tu promjenu. Rezultat simulacije je dat na slici 4. i opet se može uočiti da sistem reaguje u skladu sa

Slika 4. Slučaj kada se pojavi vozilo ili pješak na sporednom putu

čaj kada raskrsnicu kontroliše policajac. Tada bi trebalo da na glavnim semaforskim tablama imamo trepćuće žuto svijetlo, a da su semaforske table za pješake ugašene.

aju se rezultati simulacije poklapaju sa očekivanjima. Važno je napomenuti da je u aju na cijelom intervalu od šezdeset sekundi vrijednost signala

nije ni bitna, jer ona ni u kom slučaju ne utiče na stanje u sistemu.

Slika 5. Slučaj kada saobraćaj reguliše policajac (trepćuće žuto)

čeno, ovdje je simuliran rad samo trećeg tipa semafora. Simulacija rada prvog i drugog tipa semafora nije izvršena, ali njihov rad nije ni potrebno simulirati. Razlog je taj

semafora identičan radu trećeg tipa semafora u normalnom random režimugore simulirana), dok prvom tipu semafora odgovara prethodno

aj (uvijek neko čeka).

avaju prisustvo vozila ili pješaka na su uzeti kao kratkotrajni impulsi, što svakako ne odgovara njihovoj

će sistem odmah reagovati na tu čiti da sistem reaguje u skladu sa

aj kada raskrsnicu kontroliše policajac. Tada bi trebalo da na glavnim e žuto svijetlo, a da su semaforske table za pješake ugašene.

o je napomenuti da je u aju na cijelom intervalu od šezdeset sekundi vrijednost signala nacin jednaka '0', dok

če na stanje u sistemu.

eg tipa semafora. Simulacija rada prvog i drugog tipa semafora nije izvršena, ali njihov rad nije ni potrebno simulirati. Razlog je taj

u normalnom random režimu , dok prvom tipu semafora odgovara prethodno

Page 27: Semafori VHDL

3. Zaključak

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 korišćen u drugom dijelu rada. Što se tiče 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 započeta od najprostijeg tipa semafora koji je kasnije nadograđivan. Cilj takvog pristupa je bio da se na najjednostavniji način istakne osnovna uloga semafora u različitim situacijama, pri čemu je, na kraju, ukazivano i na osnovne nedostatke pojedinih tipova semafora. Na osnovu te analize i iz nje izvedenih zaključaka je kreiran VHDL kod koji simulira rad posljednjeg, ujedno i najsloženijeg tipa semafora. Rezultati simulacije koda koji opisuje treći tipa semafora su na kraju i prikazani i prodiskutovani. Pošto je kod napisan na osnovu prethodne analize rada semafora, bilo je i očekivano da se rezultati u simulaciji poklope sa onim što je zaključeno na osnovu te analize.

Page 28: Semafori VHDL

4. Literatura

[1] Elektrotehnički 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.)