Professional Documents
Culture Documents
2 VHDL ..........................................................................................................15
1.1 Uvod............................................................................................................ Error! Bookmark not defined.
2.1.1 Struktura VHDL kôda ..............................................................................................................15
2.1.2 Stilovi projektovanja ................................................................................................................18
2.2 Tipovi podataka .................................................................................................................................23
2.2.1 Objekti podataka ......................................................................................................................23
2.2.2 Predefinisani tipovi podataka ...................................................................................................23
2.2.3 Korisnički tipovi podataka .......................................................................................................26
2.2.4 Podtipovi ..................................................................................................................................27
2.2.5 Polja .........................................................................................................................................27
2.2.6 Polja portova ............................................................................................................................29
2.2.7 Označeni i neoznačeni tipovi podataka ....................................................................................29
2.2.8 Konverzija podataka.................................................................................................................30
2.3 Operatori i atributi .............................................................................................................................31
2.3.1 Operatori ..................................................................................................................................31
2.3.2 Atributi .....................................................................................................................................34
2.3.3 Korisnički-definisani atributi ...................................................................................................35
2.3.4 Preklapanje operatora...............................................................................................................36
2.3.5 GENERIC ................................................................................................................................36
2.3.6 Primeri......................................................................................................................................37
2.3.7 Pregled operatora i atributa ......................................................................................................40
2.4 Konkurentni kôd ................................................................................................................................41
2.4.1 Konkurentni i sekvencijalni kôd...............................................................................................41
2.4.2 Konkurentna naredba dodele....................................................................................................41
2.4.3 WHEN......................................................................................................................................42
2.4.4 GENERATE.............................................................................................................................50
2.5 Sekvencijalni kôd...............................................................................................................................52
2.5.1 PROCESS ................................................................................................................................52
2.5.2 Signali i varijable .....................................................................................................................53
2.5.3 IF ..............................................................................................................................................54
2.5.4 WAIT .......................................................................................................................................56
2.5.5 CASE .......................................................................................................................................57
2.5.6 LOOP .......................................................................................................................................59
2.5.7 Sekvencijalni kôd za kombinaciona kola .................................................................................63
2.5.8 Leč kola i flip-flopovi ..............................................................................................................65
2.6 Signali i varijable...............................................................................................................................66
2.6.1 CONSTANT ............................................................................................................................66
2.6.2 SIGNAL ...................................................................................................................................67
2.6.3 VARIABLE .............................................................................................................................68
2.6.4 Poređenje signala i varijabli .....................................................................................................68
2.6.5 Sinteza registara .......................................................................................................................70
2.7 Konačni automati...............................................................................................................................75
2.7.1 Kôdni šablon #1 .......................................................................................................................76
2.7.2 Konačni automati Murovog tipa ..............................................................................................77
2.7.3 Konačni automati Milijevog tipa..............................................................................................82
2.7.4 Kôdni šablon #2 .......................................................................................................................85
2.7.5 Kodiranje stanja .......................................................................................................................87
2
2.7.6 Algoritamske mašine stanja .....................................................................................................88
2.8 Memorijske komponente ...................................................................................................................93
2.9 Paketi i komponente ..........................................................................................................................96
2.9.1 PACKAGE...............................................................................................................................96
2.9.2 COMPONENT.........................................................................................................................98
2.9.3 PORT MAP............................................................................................................................102
2.9.4 GENERIC MAP.....................................................................................................................102
2.9.5 GENERATE naredba u strukturnom opisu ............................................................................106
2.10 Funkcije i procedure ........................................................................................................................108
2.10.1 Funkcije..................................................................................................................................108
2.10.2 Pozicija funkcije.....................................................................................................................110
2.10.3 Procedure ...............................................................................................................................114
2.10.4 Pozicija procedure..................................................................................................................115
2.10.5 Poređenje funkcija i procedura...............................................................................................117
2.10.6 ASSERT.................................................................................................................................117
3 RTL projektovanje...................................................................................118
3.1 Projektovanje odozgo-naniže...........................................................................................................118
3.2 Opis ponašanja.................................................................................................................................118
3.2.1 Interfejs ..................................................................................................................................118
3.2.2 Konverzija algoritma u ASM dijagram ..................................................................................121
3.2.3 ASM dijagrami Milijevog tipa ...............................................................................................127
3.3 Razrada ............................................................................................................................................131
3.4 Realizacija .......................................................................................................................................136
3
1 Uvod u projektovanje digitalnih sistema
Od vremena prvih digitalnih kola do danas, broj tranzistora koji se mogu integrisati na jednom integrisanom
kolu (IC) rastao je eksponencijalno. Sa takvim tempom razvoja, danas srećemo digitalna IC sa više stotina, više
hiljada, pa sve do više stotina miliona tranzistora. U prošlosti, digitalna kola su nalazila glavnu primenu u
računarskim sistemima. Međutim, vremenom, kako su digitalna IC postajala sve manja, brža, sa sve većim
mogućnostima i u isto vreme sve jeftinija, mnogi elektronski, komunikacioni i upravljački sistemi su interno
˝digitalizovani˝ korišćenjem digitalnih kola za memorisanje, obradu i prenos informacija.
Kako su primene postajale veće i složenije, tako je zadatak projektovanja digitalnih kola i sistema postajao sve
teži. Praktično je nemoguće na nivou tranzistora, pa čak ni na nivou logičkih kola, projektovati digitalni sistem
čija je složenost veća od nekoliko hiljada tranzistora. Tako složeni sistemi se moraju projektovati na višem
nivou apstrakcije, uz korišćenje softverskih alata za projektovanje. Zadatak projektanta je da osmisli sistem i
formalno ga opiše, a zadatak softverskog alata da izvrši sintezu sistema, tj. transformiše apstraktni opis u oblik
pogodan za direktnu realizaciju.
Osnovna tema ovog kursa je proučavanje tehnika projektovanja i sinteze digitalnih sistema na registarskom
nivou apstrakcije, tj. na RTL (Register-Transfer Level), odnosno mikro-arhitekturalnom nivou. Na ovom nivou,
projektant konstruiše sistem pomoću modula kao što su: aritmetičke jedinice (sabirač, komparator), registarske
komponente (registri, brojači), i drugi kombinacioni (multiplekser, dekoder) i sekvencijalni moduli (konačni
automati). Na RTL nivou, sistem se opisuje u jeziku za opis hardvera (HDL - Hardware Description Language),
kao što je VHDL ili Verilog. Takav jedan opis ima dvostruku namenu. Prvo, služi kao ulaz u HDL simulator
pomoću kojeg je moguće verifikovati funkcionalnost sistema pre izvršene realizacije. Drugo, koriste se kao ulaz
u softverski alat za sintezu digitalnog hardvera. U ovom predmetu, izučavaćemo jezik VHDL sa naglaskom na
korišćenje u cilju sinteze.
Na Sl. 1-1 prikazan je dijagram koja ukazuje na međuzavisnosti i uslovljenosti različitih teorijskih osnova,
tehnika i metoda koje čine osnovu projektovanja savremenih digitalnih sistema. Osenčena oblast na Sl. 1-1
ukazuje na materiju obuhvaćenu ovim predmetom.
Uopšteno govoreći, projektovanje elektronskih kola i sistema kreće od fizike čvrstog stanja i tehnoloških
postupaka za fabrikaciju poluprovodničkih integrisanih kola, koji određuju tipove i osobine većine osnovnih
elektronskih komponenti, kao što su tranzistori, otpornici i kondenzatori. Ove komponente se zatim povezuju u
digitalna ili analogna kola, shodno osnovnim zakonima elektronike. Digitalna kola procesiraju signale koji
mogu imati samo mali broj fiksnih vrednosti, obično dve, što ih čini robusnim i lakim za projektovanje. Ove dve
osobine su glavni razlog zbog kojeg se danas za obradu informacija prevashodno koriste digitalna kola.
Sa druge strane, analogna kola obrađuju signale koji mogu imati bilo koju vrednost unutar datog opsega. Većina
signala koje čovek generiše ili prepoznaje, kao što je tekst, govor, slika i zvuk su analogni signali. Pošto se
celokupno procesiranje izvodi u digitalnom domenu, jedan generalni elektronski sistem najpre konvertuje
analogne signale u digitalne, zatim u digitalnom domenu obavlja sva potrebna izračunavanja, transformacije i
komunikacije, da bi konačno, rezultat konvertovao nazad u analogni domen. Konverzija iz analognog u digitalni
domen i obrnuto se obavlja uz pomoć interfejsnih kola, kao što su A/D i D/A konvertori.
Digitalno projektovanje kreće od nivoa gejtova (logičkih kola) i flip-flopova. Šta više, projektant digitalnog
hardvera ne mora da poznaje detalje koji se odnose na fabrikaciju logičkih komponenti i VLSI projektovanje,
već je njegov zadatak da koristeći raspoložive komponente kreira opis sistema kojeg projektuje. Teorijsku
osnovu digitalnog projektovanja čini Bulova algebra i teorija konačnih automata, što je u bliskoj vezi sa
načinima reprezentacije podataka u binarnom brojnom sistemu. Koristeći tehnike logičkog projektovanja,
kreiraju se kombinacioni i sekvencijalni moduli, koji predstavljaju bazične gradivne blokove procesorskih
komponenti. Projektovanje procesorskih komponenti zasnovano je funkcionalnom opisu u vidu dijagrama toka
ili kôda u jeziku za opis hardvera (kao što je VHDL). Standardne i specijalizovane procesorske komponente,
4
zajedno sa interfejsnim komponentama i elektro-mehaničkim uređajima, kao što su hard-disk i tastatura koriste
se za projektovanje različitih tipova računarskih sistema opšte i posebne namene, kao što su personalni računari,
radne stanice i komunikacioni kontroleri. Računarski sistemi se dalje koriste za projektovanje složenijih, tzv.
embedded sistema koji se primenjuju u oblastima kao što su digitalna obrada signala, robotika, komunikacije,
medicinska instrumentacija, multimedija i mnoge druge.
1.1 IC tehnologije
Fabrikacija integrisanih kola
Integrisano kolo je sačinjeno od slojeva dopiranog silicijuma, polisilicijuma, metala i silicijum dioksida
poređanih jedan iznad drugog na silicijumskom podlozi. Na nekim od ovih slojeva formiraju se tranzistori dok
se drugi koriste za izvođenje provodnika za povezivanje tranzistora. Osnovni korak u fabrikaciji IC-a je
formiranje jednog sloja, procesom koji se zove litografija. Raspored materijala na jednom sloju definisan je
maskom. Slično fotografskom filmu, maska se koristi da bi se određene oblasti na površini silicijuma izložile
dejstvu hemikalija u cilju kreiranja različitih slojevi materijala na površini jednog sloja. Izgled maske se naziva
5
layout-om. Savremene IC tehnologije koriste od 10 do 15 slojeva, što znači da u toku fabrikacije jednog
integrisanog kola, litografski proces mora biti ponovljen 10 do 15 puta, uvek sa različitom maskom.
Važan parametar poluprovodničke tehnologije je dužina najmanjeg tranzistora koji se može realizovati u datoj
tehnologiji (obično izražena u mikronima - milioniti deo metra). Sa napretkom poluprovodničke tehnologije,
veličina tranzistora se neprekidno smanjivala i danas se približava dužini od 1/10 mikrona.
Klasifikacija IC tehnologija
Digitalna kola se mogu realizovati u različitim implementacionim, tzv. IC tehnologijama. Jedna od glavnih
karakteristika svake IC tehnologije je način na koji se obavlja prilagođenje ili dorada IC-a u cilju realizacije
željene funkcije. Da bi se smanjili troškovi proizvodnje, kod nekih IC tehnologija veći broj slojeva se uvek
izvodi na isti način, pomoću istih maski, nezavisno od funkcije koju IC treba da realizuje, dok se preostale
maske kreiraju u skladu sa zahtevima konkretne primene. Proces dorade je složen i skup, i može se obaviti samo
u fabrici poluprovodnika. Naručilac IC-a dostavlja fabrici poluprovodnika specifikaciju IC-a u odgovarajućem
obliku, na osnovu koje se u fabrici kompletira set maski, a zatim fabrikuju IC i isporučuju naručiocu. Kod
drugih IC tehnologija, fabrika poluprovodnika isporučuje naručiocima univerzalna IC, koja nemaju unapred
definisanu funkciju, ali se zato mogu programirati. Programiranje vrši sam korisnik, ˝na terenu˝, punjenjem
konfiguracionih podataka u internu memoriju IC-a ili ˝sagorevanjem internih silicijumskih osigurača˝. Prva
grupa IC, koja se dorađuju u fabrici, poznata su pod skraćenicom ASIC, koja potiče od pojma aplikaciono-
specifična IC (Application-Specific Integrated Circuit). Druga grupa IC, koje prilagođava, tj. programira, krajnji
korisnik, poznata su kao programabilne logičke komponente, ili PLD, od Probrammable Logic Devices. Svaka
od ove dve grupe sadrži više specifičnih tehnologije. Tako, ASIC tehnologije se dele na:
IC ˝potpuno po narudžbi˝ (full-custom). Ne koriste se prefabrikovane maske ili slojevi, već se IC ˝iz
početka˝, do nivoa pojedinačnih tranzistora i veza, projektuje i proizvodi za tačnu određenu primenu.
Omogućava integraciju najvećeg broja tranzistora i realizaciju IC-a najveće brzine rada. Međutim, s
obzirom da je projektovanje na nivou tranzistora složeno i dugotrajno, full-custom tehnologija se koristi
samo za IC male složenosti ili za projektovanje bazičnih logičkih komponenti koje se mogu koristiti za
realizaciju većih sistema.
Standardne ćelije (semi-custom). Deo troškova koji prati projektovanje IC potpuno po narudžbi može se
izbeći ako se koristi tehnologija standardnih ćelija (standard cell). Standardne ćelije su moduli
jednostavne funkcije (tipa NOT, AND, OR, NAND, flip-flop i slična), unapred projektovani do nivoa
layout-a, koje se u vidu gradivnih blokova koriste za konstrukciju složenijih struktura na čipu. U poređenju
sa full-suctom tehnologijom, projektovanje je značajno pojednostavljeno, jer projektant umesto na nivou
tranzistora, sistem projektuje na nivou logičkih kola. Međutim, iako je layout pojedinačnih standardnih
ćelija unapred definisan, layout kompletnog IC zavisi od rasporeda i povezanosti standardnih ćelija. Zbog
toga je proces fabrikacija identičan kao kod full custom tehnologije - svi slojevi se iznova kreiraju za svako
novo IC.
Gejtovska polja (gate array). Tehnologija gejtovskih polja zasnovana je na korišćenju polu-fabrikovanih
integrisanih kola. U gejtovskom polju, pojedini delovi čipa su unapred fabrikovani dok se preostali
dorađuju shodno zahtevima konkretne primene. Kod tehnologije gejtovskih polja, proizvođači sprovode
najveći broj koraka, tipično one koji se tiču kreiranja tranzistora, unapred, nezavisno od ciljne primene.
Rezultat je silicijumska pločica nedovršenog čipa. Tipično, gejtovsko polje čini veliki broj identičnih
gejtova raspoređenih na silicijumskoj pločici u vidu regularne dvodimenzione matrice. Gejtovi su obično 3-
ili 4-ulazna NI ili NILI kola, a na jednoj pločici ih može biti i do više miliona. Naknadnom doradom, koja
podrazumeva kreiranje metalnih veza, gejtovi se povezuju na način koji diktira konkretna primena. Ušteda
u proizvodnji, u odnosu na tehnologiju standardnih ćelija, se postiže zato što proizvođač može da
amortizuje cenu fabrikacije gotovih čipova masovnom proizvodnjom polufabrikovanih, identičnih pločica
gejtovskih polja.
Programabilne logičke komponente se dele na:
SPLD (od Simple PLD - Jednostavne PLD komponente). U ovu grupu PLD komponenti spadaju
programabilne strukture kao što su: PLA, PAL i PROM. Koncept SPLD kola zasnovan je na činjenici da se
bilo koja logička funkcija može realizovati u vidu zbira logičkih proizvoda. S toga, glavni deo SPLD kola
čine dve logičke mreže: AND mreža u kojoj se formiraju logički proizvodi i OR mreža na čijim izlazima se
dobijaju logičke sume proizvoda formiranih u AND mreži. Kod PLA obe mreže su programabilne, kod
PAL-a AND mreža je progrmabilna, a OR fiksna, dok je kod PROM-a AND mreža fiksna, a OR
programabilna. Danas se SPLD komponente više ne proizvode u vidu integrisanih kola, već se koriste kao
unutrašnji blokovi ASIC IC ili složenijih tipova PLD kola.
6
CPLD (od Complex PLD - Složene PLD komponente). Sadrži veći broj programabilnih logičkih blokova
spregnutih putem centralizovane programabilne prekidačke matrice. Svaki programabilni logički blok po
strukturi je sličan PLA ili PAL. Programiranjem CPLD komponente definiše se kako funkcija logičkih
blokova tako način na koji su logički blokovi međusobno povezani.
FPGA (od Field-Programmable Gate Array) Arhitektura FPGA kola nije zasnovana na prekidačkim
mrežama, kao što je to slučaj sa SPLD i CPLD komponentama. Umesto toga, kod FPGA se za realizaciju
logičkih funkcija koriste logičke ćelije koje nalikuju ćelijama gejtovskog polja i tipično sadrže D flip-flop i
tzv. look-up tabelu (u obliku RAM-a malog kapaciteta) za realizaciju logičkih funkcija. Logičke ćelije su
raspoređene u dvodimenziono polje, dok su veze i prekidači smešteni u horizontalnim i vertikalnim
kanalima za povezivanje. Kanali sadrže veze i programabilne prekidače putem kojih se ostvaruje željeno
interno povezivanje logičkih ćelija.
Savremena FPGA kola omogućavaju realizaciju digitalnih sistema složenosti od nekoliko desetina hiljada
do nekoliko miliona ekvivalentnih gejtova. Sa tako velikim logičkim kapacitetom na raspolaganju, primena
FPGA kola nije ograničena samo na realizaciju relativno jednostavnih digitalnih struktura, kao što je to
slučaj kod SPLD i CPLD, već pružaju mogućnost realizacije kompletnih sistema na jednom čipu
zasnovanih na mikroprocesoru.
7
Nivo apstrakcije Bihejvioralna Strukturne komponente Fizički objekti
reprezentacija
Tranzistorski nivo Diferencijalne jednačine, U-I Tranzistori, otpornici, Analogne i digitalne
dijagrami kondenzatori ćelije
Nivo gejtova Logičke funkcije, konačni Logička kola, flip-flopovi Moduli, funkcionalne
automati jedinice
Registarski nivo Algoritmi, dijagrami toka, Sabirači, komparatori, registri, Čipovi
(RTL) ASM dijagrami brojači, multiplekseri
Sistemski nivo Izvršna specifikacija, Procesori, kontroleri, memorije, Štampane ploče,
programi ASIC kola mikročip-moduli
8
realizaciju. Uopšteno govoreći, projektovanje digitalnog sistema je proces razrade i validacije (provere). Sistem
se postepeno transformiše, počev od apstraktnog opisa visokog nivoa, pa sve do nivoa layout-a, odnosno maski.
Nakon svake faze razrade, projektant verifikuje funkcionalnost razrađenog opisa sistema kako bi pronašao i
korigovao eventualne greške u projektovanju i osigurao da će konačni proizvod korektno funkcionisati i ispoljiti
zahtevane performanse.
Glavni zadaci (aktivnosti) u procesu razvoja digitalnog sistema su:
• Sinteza
• Fizičko projektovanje
• Verifikacija i
• Testiranje
Sinteza
Sinteza je proces razrade čiji je cilj da se uz pomoć komponenti raspoloživih na nižem nivou apstrakcije
realizuje sistem opisan na višem nivou apstrakcije. Polazni opis može biti strukturni ili funkcionalni, dok je
rezultujući opis uvek strukturni ali na nižem apstraktnom nivou. Kako proces sinteze napreduje, tako opis
sistema postaje sve detaljniji. Konačni rezultat je strukturna reprezentacija gejtovskog nivoa koja sadrži bazične
ćelije ciljne implementacione tehnologije. Proces sinteze se obično deli na nekoliko manjih koraka, od kojih
svaki ima za cilj da obavi neku specifičnu vrstu transformacije. Glavni koraci u sintezi digitalnog sistema su:
Sinteza visokog nivoa - transformacija algoritma u funkcionalni RTL opis. Algoritam, koji može biti dat u
programskom jeziku, kao što je C, se transformiše u funkcionalni opis, prilagođen hardverskoj realizaciji,
tipično, u jeziku za opis hardvera, kao što je VHDL.
RTL sinteza - transformacija funkcionalnog RTL opisa u strukturni opis korišćenjem komponenti sa RTL
nivoa, praćena izvesnim optimizacijama sa ciljem da se smanji broj potrebnih komponenti.
Logička sinteza - transformacija strukturnog RTL opis u mrežu logičkih kola (tj. u kombinacionu ili
sekvencijalnu mrežu). Inicijalna transformacija je praćena optimizacijom mreže kako bi se minimizovala
njena veličina i/ili propagaciono kašnjenje. Za sintezu se koriste standardne logičke komponente (I, ILI,
NE, flip-flopovi), a optimizacija se vrši metodama kao što su Karnoove mape, McClusky-jeva metoda i sl.
Logička sinteza je nezavisna od ciljne implementacione tehnologije.
Tehnološko mapiranje - transformacija logičke mreže u mrežu koja sadrži ćelije raspoložive u ciljnoj
tehnologiji (standardne ćelije, za tehnologiju standardnih ćelija, NI ili NILI kola, za tehnologiju gejtovskih
polja, odnosno, logičke blokove, za FPGA tehnologiju). Ovo je poslednji korak u sintezi i, očigledno,
zavistan je od ciljne tehnologije.
Fizičko projektovanje
Fizičko projektovanje uključuje dva aspekta. Prvi se odnosi na transformaciju strukturne u fizičku
reprezentaciju, npr. konverzija mreže dobijene nakon tehnološkog mapiranja u layout. Drugi aspekt se tiče
analize i optimizacije električnih karakteristika kola. Glavni zadaci fizičkog projektovanja su: prostorno
planiranje, raspoređivanje i povezivanje.
U fazi prostornog planiranja, projektant deli sistem na manje funkcionalne blokove (podsisteme) i raspoređuje ih
na odgovarajuće lokacije na čipu (npr. procesor u gornji levi ugao čipa, memorija u donji levi ugao, ostali
moduli u preostalom delu čipa). Na ovaj način, obezbeđuje se da sve komponente koje pripadaju istom bloku
budu fizički raspoređene u definisanu oblast na čipu. U fazi raspoređivanja, određuje se tačna fizička pozicija
svake komponente, dok se u fazi povezivanja, kreiraju sve potrebne veze, pri čemu se za svaku vezu pronalazi
optimalna (najkraća) putanja. Na taj način se kreira konačni layout IC-a.
Nakon obavljenog raspoređivanja i povezivanja, poznate su tačne pozicije i dužine svih veza u kolu, što
omogućava proračun pratećih parazitnih kapacitivnosti i otpornosti. Ovaj proces se naziva ekstrakcijom kola.
Podaci, ekstrahovani iz layout-a, se potom koriste kako bi se obavio proračun propagacionih kašnjenja u kolu.
Verifikacija
Verifikacija se odnosi na proveru da li ostvareni dizajn (projekat) zadovoljava postavljene funkcionalne zahteve
i zadate performanse (npr. brzina rada) i sprovodi se nakon svakog koraka razrade (sinteze), kao i nakon
obavljenog fizičkog projektovanja. Postoje dva aspekta verifikacije: funkcionalni i performansni. Funkcionalna
verifikacija daje odgovor na pitanje: da li sistem generiše očekivani odziv na zadatu pobudu? Performanse se
predstavljaju izvesnim vremenskim ograničenjima (npr. maksimalno kašnjenje signala od ulaza od izlaza).
9
Vremenska verifikacija (ili verifikacija tajminga) znači proveru da li sistem generiše odziv u granicama
postavljenih vremenskih ograničenja.
Metodi za verifikaciju
Simulacija je najčešće korišćeni metod za verifikaciju i podrazumeva: konstrukciju modela sistema,
izvršenje ovog modela na računaru i analizu odziva. Na primer, model može biti opis sistema u jeziku za
opis hardvera (HDL). Takav jedan opis, zajedno sa opisom ulazne pobude, se učitava u HDL simulator i
izvršava, a simulator generiše odziv modela na zadatu pobudu (npr. u obliku talasnih oblika izlaznih
signala). Simulacija nam omogućava da ispitamo rad sistema i detektujemo eventualne greške pre nego što
je sistem i fizički realizovan. Međutim, ispravan rad modela sistema u simulatoru ne predstavlja 100%-nu
garanciju korektnost sistema. Model može da dâ ispravan odziv na sve stimulanse kojima je pobuđen, ali
može se desiti da ni jedan od stimulansa nije doveo do pobude nekog specifičnog dela modela koji
eventualno poseduje grešku. S druge strane, naročito u slučajevima kada model sadrži veliki broj
komponenti, broj stimulansa (kaže se i test-vektora) koji je potreban da bi se postigla potpuna provera može
biti toliko veliki da je računarsko vreme potrebno za simulaciju enormno veliko.
Vremenska analiza je metod verifikacije fokusiran na tajming. Vremenska analiza podrazumeva: analizu
strukture kola kako bi se odredile sve moguće putanje signala od ulaza do izlaza, proračunala propagaciona
kašnjenja duž ovih putanja i odredili relevantni vremenski parametri kola, kao što su: maksimalno
propagaciono kašnjenje i maksimalna frekvencija taktnog signala.
Formalna verifikacija podrazumeva određivanje osobina kola primenom matematičkih tehnika. Jedan takav
metod je provera ekvivalentnosti, koji se koristi za upoređivanje dve formalne reprezentacije sistema kako
bi se ustanovimo da li imaju istu funkciju. Ovaj metod se često primenjuje nakon sinteze kako bi se
proverilo da li je funkcija sintetizovanog kola identična funkciji polaznog funkcionalnog opisa. Za razliku
od simulacije, formalna verifikacija, budući da je zasnovana na rigoroznom matematičkom aparatu, može
garantovati korektnost sintetizovane strukture. Međutim, s obzirom na veliku kompleksnost matematičkih
izračunavanja koje podrazumeva, njena primena je ograničena samo na sisteme male složenosti.
Hardverska emulacija podrazumeva fizičku realizaciju prototipa koji će oponašati rad sistema koji se
projektuje. Primer hardverske emulacije je realizacija FPGA kola koje emulira rad ASIC kola.
Testiranje
Značenje reči ˝verifikacija˝ i ˝testiranje˝, u jezičkom smislu, je približno isto. Međutim, u procesu razvoja
digitalnog sistema, verifikacija i testiranje su dva različita zadatka. Kao što je već rečeno, verifikacija se odnosi
na proveru funkcionalne korektnosti i ostvarenosti zadatih performansi dizajna. Sa druge strane, testiranje je
proces detektovanja (pronalaženja) fizičkih defekta (kvarova) u gotovom proizvodu koji mogu nastati tokom
proizvodnje. Testiranje se obavlja nakon fabrikacije proizvoda sa ciljem da se dobre jedinice razdvoje od loših.
Procedura testiranja se, tipično, obavlja tako što se na jedinicu koja se testira primenjuje odgovarajuća test
sekvenca (niz ulaznih kombinacija), a odziv jedinice na svaku ulaznu kombinaciju poredi sa odzivom koji se
očekuje od jedinice koja radi ispravno. Međutim, zbog ogromnog broja ulaznih kombinacija, ovakav pristup je
praktično neizvodljiv. Umesto toga, projektanti koriste posebne algoritme kako bi, za dato kolo, kreirali što
manji skup test-vektora kojima će kolo biti što potpunije testirano. Ovaj proces je poznat kao generisanje test
sekvenci.
CAD alati
Razvoj većih digitalnih kola i sistema zahteva upotrebu složenih algoritama i manipulaciju velikom količinom
podataka. Zato se za automatizaciju pojedinih zadataka u procesu projektovanja koristi računarski softver, tj.
alati za projektovanje pomoću računara ili CAD (Computer-Aided Design) alati. Postavlja se pitanje da li je
moguće automatizovati kompletan proces projektovanja (uz pretpostavku da su nam dostupni dovoljno moćni
računari). U idealnom scenariju, zadatak projektanta bi bio da razvije polazni, funkcionalni opis visokog nivoa,
a zadatak CAD alata da automatski, i na optimalan način obavi sintezu i fizičko projektovanje. Nažalost ovako
nešto nije izvodljivo, ne zbog neadekvatne moći izračunavanja sadašnjih i budućih računara, već zbog prirode
kombinatornih problema, kakvi su većina problema koji se javljaju i sintezi i fizičkom projektovanju. Bez obzira
na to CAD alati su nezamenljiva podrška projektovanju i koriste se u svim fazama projektovanja. Međutim, alat
za sintezu ne može da promeni prvobitno osmišljenu arhitekturu sistema, niti može loše osmišljeni dizajn da
konvertuje u dobar. Kvalitet krajnjeg rešenja prevashodno zavisi od kvaliteta inicijalnog opisa (zamisli), što u
svakom slučaju predstavlja odgovornost projektanta.
10
Shodno ulozi koju imaju u procesu projektovanja, savremeni CAD alati se mogu podeliti u sledećih pet
kategorija: (1) alati za opis i modelovanje; (2) alati za sintezu; (3) alati za verifikaciju i simulaciju; (4) alati za
raspoređivanje i povezivanje i (5) alati za generisanje test sekvenci.
Tok projektovanja
U suštini, projektovanje digitalnih kola i sistema predstavlja proces razrade i verifikacije, kojim se polazni
apstraktni opis visokog nivoa postepeno transformiše u detaljni strukturni opis niskog nivoa. Konkretne faze i
aktivnosti koje čine ovaj proces zavise kako od veličine sistema koji se projektuje tako i od ciljne
implementacione tehnologije.
Algoritmi za optimizaciju koji se koriste u softverima za sintezu su veoma složeni. Potrebna moć izračunavanja
i memorijski prostor, neophodni za njihovo izvršenje, drastično rastu sa povećanjem veličine sistema.
Savremeni CAD alati za sintezu su najefikasniji za digitalne sisteme srednjeg nivoa složenosti (2000 - 50000
gejtova). Za veće sisteme, neophodno je izvršiti podelu sistema na manje blokove i nezavisno procesirati svaki
blok.
Drugi faktor koji utiče na tok projektovanja je ciljna implementaciona tehnologija. Procesi fabrikacije FPGA i
ASIC se značajno razlikuju. FPGA je unapred projektovano i testirano IC. Sa druge strane, ASIC mora proći
kroz dugotrajan i složen proces fabrikacije, što zahteva dodatne korake u projektovanju kako bi se obezbedila
korektnost konačnog fizičkog IC.
Kao primer, u nastavku će biti izložen tok projektovanja digitalnih sistema srednje složenosti u FPGA
tehnologiji. Projektovanje sistema srednje složenosti (do 50000 gejtova) ne zahteva prethodnu podelu dizajna na
manje blokove. Primeri ovakvih sistema su jednostavni mikroprocesori ili moduli za složenija aritmetička
izračunavanja. Tok projektovanja je prikazan dijagramom sa Sl. 1-3. Dijagram je podeljen na tri kolone, koje
odgovaraju ˝pod-tokovima˝ sinteze, fizičkog projektovanja i verifikacije.
Projektovanje započinje kreiranjem opisa dizajna, najčešće u obliku opisa RTL nivoa (u jeziku VHDL) - dizajn
datoteka na Sl. 1-3. Posebna datoteka, poznata pod nazivom testbenč, sadrži opis virtuelnog eksperimentalnog
okruženja za simulaciju i verifikaciju dizajna. Testbenč sadrži kôd (program) koji generiše ulazne stimulanse i
nadgleda generisane odzive u toku simulacije. Tok projektovanja (u idealnom slučaju) podrazumeva sledeće
korake:
1. Razvoj dizajn-datoteke i testbenča.
2. Funkcionalna simulacija, čiji je cilj verifikacija polaznog opisa.
3. Sinteza. Rezultat sinteze je strukturni opis na nivou gejtova. Rezultujuća logička mreža je opisana
tekstualno u obliku tzv. netliste.
4. Datoteka koja sadrži netlistu se koristi za simulaciju i vremensku analizu kako bi se verifikovala
funkcionalna korektnost sintetizovane logičke mreže i obavila preliminarna provera tajminga.
5. Raspoređivanje i povezivanje.
6. Ekstrakcija preciznih podataka o tajmingu. Netlista, proširena ovim podacima se koristi za simulaciju i
vremensku analizu u cilju verifikacije korektnosti raspoređivanja i povezivanja i provere da li kolo
zadovoljava postavljena vremenska ograničenja.
7. Generisanje konfiguracionog fajla i programiranje FPGA kola
8. Verifikacija rada fizičke komponente.
Opisani tok projektovanja odgovara idealnom scenariju, kada polazni opis dizajna uspešno prolazi funkcionalnu
simulaciju i ispunjava vremenska ograničenja. U realnosti, tok projektovanja može sadržati više iteracija radi
korekcije grešaka ili problema u tajmingu. To, obično, zahteva reviziju polaznog opisa i fino podešavanje
parametara u softverima za sintezu, raspoređivanje i rutiranje.
Veći i složeniji digitalni sistemi mogu sadržati nekoliko stotina ili čak nekoliko miliona gejtova. CAD alati za
sintezu ne mogu efikasno da obavljaju transformacije i optimizacije nad ovako velikim sistemima. Zato je
neophodno da se sistem podeli na manje blokove, adekvatne veličine i funkcionalnosti, i svaki pojedinačni blok
nezavisno projektuje, pre nego što se ˝konstruiše˝ kompletan sistem. Za neke blokove možemo koristiti ranije
projektovane i verifikovane podsistema ili komercijalnih IP jezgara (Intelectualy Property Cores). Drugi
blokovi moraju biti projektovani ˝iz početka˝ na prethodno opisani način.
11
Legenda Proces Datoteka
:
RTL
Testbenč
opis 1 1
Sinteza 3 2 Simulacija
Datoteka
Netlista
kašnjenja
Raspoređivanje 5 Simulacija
i povezivanje
4
Konfiguracioni Datoteka
fajl kašnjenja
Programiranje Simulacija/
7
komponente Vremenska
analiza
6
FPGA
8
čip
12
mogao da obuhvati navedene karakteristike hardvera, što nameće potrebu za specijalizovanim jezicima (tj.
HDL-ovima) koji su prevashodno namenjeni modelovanju digitalnog hardvera.
Upotreba HDL programa
Tradicionalni programski jezici se koriste za pisanje programa koji treba da reši neki konkretan problem.
Program prihvata ulazne vrednosti, sprovodi izračunavanja i generiše odgovarajuće izlazne vrednosti. Program
se najpre kompajlira u mašinske instrukcije, a zatim izvršava na računaru. Sa druge strane, primena HDL
programa je značajno drugačija. Naime, HDL programi imaju trostruku namenu:
Formalna dokumentacija
Rad na razvoju digitalnog sistema obično počinje tekstualnim opisom. Nažalost, govorni jezik nije dovoljno
precizan, a tekstualni opis je često nekompletan, dvosmislen i podložan različitim interpretacijama. S obzirom
da HDL-ovi poseduju strogu sintaksu, opis sistema u obliku HDL programa je tačan i precizan. Dakle, HDL
program se može koristiti za formalnu specifikaciju sistema koja se u obliku razumljive i nedvosmislene
dokumentacije može razmenjivati između projektanta i projektantskih grupa.
Ulaz u simulator
Kao što je napomenuto u prethodnoj sekciji, simulacija se koristi za analizu i verifikaciju rada sistema pre nego
što je on i fizički realizovan. U suštini, HDL simulator predstavlja okvir za modeliranje konkurentnih operacija
na seckvencijalnom računaru. Simulator za konkretni HDL u stanju je da tumači semantičko značenje jezičkih
konstrukcija i interpretira program napisan u tom konkretnom HDL-u. HDL program, kombinovan sa
programom za genrisanje test vektora i prikupljanjem podataka, čini testbenč, koji se koristi kao ulaz u HDL
simulator. U toku izvršenja, simulator interpretira HDL program i generiše odgovarajuće odzive.
Ulaz u alat za sintezu
Savremeni tok projektovanja zasnovan je procesu razrade kojim se funkcionalni opis visokog nivoa postepeno
konvertuje u strukturni opis niskog nivoa. Pojedini koraci razrade se mogu obaviti uz pomoć CAD alata za
sintezu. Softver za sintezu, kao ulaz prihvata HDL program i generiše odgovarajuće kolo sačinjeno od
komponenti iz raspoložive biblioteke komponenti. Izlaz alata za sintezu je novi HDL program, ali koji sada
predstavlja strukturni opis sintetizovanog kola.
Karakteristike savremenih HDL-ova
Fundamentalne karakteristike digitalnih kola i sistema se definišu konceptima: entitet, povezanost,
konkurentnost i tajming. Entitet je bazični gradivni blok, modelovan po ugledu na realno kolo. Entitet je samo-
dovoljan i nezavisan i ne poseduje bilo kakve informacije o drugim entitetima. Povezanost modeluje veze koje
povezuju delove sistema i omogućava interakciju između entiteta. Tipično, više entiteta su aktivni u isto vreme,
a mnoge operacije se izvršavaju u paraleli. Konkurentnost opisuje ovakav način ponašanja. Tajming je u vezi sa
konkurentnošću; definiše početak i završetak svake operacije, kao i redosled izvršenja operacija.
Kao što je opisano u prethodnoj sekciji, digitalni sistem može biti opisan na četiri različita nivoa apstraktnosti i
u tri različita domena. Idealno bi bilo posedovati HDL koji bi pokrio sve nivoe i domene. Međutim, to je teško
ostvarljivo zbog velikih razlika koje postoje između različitih nivoa apstrakcije, kao i između različitih domena.
Savremeni HDL-ovi omogućavaju kreiranje opisa u strukturnom i bihejvoralnom (funkcionalnom) domenu, ali
ne i u fizičkom. Takođe, pružaju podršku za modelovanje na nivou gejtova i RTL nivou i, u izvesnoj meri, na
procesorskom i tranzistorskom nivou. Zajedničke karakteristike savremenih HDL-ova su:
• Semantika jezika pruža podršku za koncepte: entitet, povezanost, konkurentnost i tajming.
• U jeziku se mogu predstaviti propagaciona kašnjenja i informacije o tajmingu
• Jezik poseduje konstrukcije kojima se na direktan način može opisati strukturna implementacija kola (npr.
blok dijagram).
• Jezik sadrži konstrukcije kojima se na bihejvioralni način može opisati rad kola, uključujući i konstrukcije
koje nalikuju onima iz tradicionalnih programskih jezika (if-then-else, for, while, ...).
• Jezik može efikasno da modeluje operacije i strukture na gejtovskom i RTL nivou.
• Jezik poseduje konstrukcije za podršku procesu hijerarhijskog projektovanja.
13
1.6 Sadržaj i ciljevi predmeta
Predmet ˝Arhitektura mikrosistema˝ primarno je fokusiran na projektovanje i sintezu digitalnih kola i sistema na
RTL nivou (odnosno, mikro-arhitekturalnom nivou) apstrakcije. Za opis dizajna koristiće se podskup jezika
VHDL, namenjen sintezi. Predmet nema ambiciju da pokrije sve aspekte ASIC i FPGA projektovanja. Ostali
aspekti, kao što su fizičko projektovanje, simulacija i testiranje, biće razmatrani samo iz perspektive RTL
projektovanja i u meri koja je neophodna za razumevanje principa i tehnika RTL projektovanja i sinteze.
Cilj kursa ˝Arhitektura mikrosistema˝ je uvođenje studenata u problematiku projektovanja digitalnih sistema,
kroz izučavanje metodologije sistematskog razvoja efikasnog, portabilnog RTL dizajna koji se može lako
integrisati u veće sisteme. Nakon uspešnog savladavanja materije obuhvaćene ovim predmetom, student bi
trebalo da bude u mogućnosti da samostalno projektuje RTL sisteme i podsisteme. Sveobuhvatno projektovanje
IC, bilo ASIC bilo FPGA, zahteva kako dodatna teorijska znanja tako i poznavanje specijalizovanih CAD alata,
što će biti teme nekih drugih kurseva.
14
2 VHDL
2.1 Uvod
Nagli razvoj tehnologije integrisanih kola, koji se desio osamdesetih godina prošlog veka, nametnuo je potrebu
za unifikacijom metodologija projektovanja digitalnih kola. VHDL je razvijen kao jedan od rezultata napora
učinjenih u tom pravcu. Vremenom, VHDL je postao standardni jezik za opis digitalnih kola i sistema.
VHDL i Verilog su danas dva najšire korišćena HDL-a. Iako su, po sintaksi i ˝izgledu˝, ova dva jezika veoma
različita, nihove mogućnosti i oblasti primene su približno iste. Oba jezika su industrijski standardi i podržani su
većini alata za projektovanje. Prednost VHDL-a je bolja podrška za paremtrizovano projektovanje.
VHDL je skraćenica od “VHSIC Hardware Description Language“ (VHSIC jezik za opis hardvera), gde je
VHSIC takođe skraćenica od “Very High Speed Integrated Circuits” (Integrisana kola veoma velike brzine
rada). Prvobitni VHDL standard usvojen je 1987. godine od strane međunarodne organizacije za standardizaciju
IEEE (Institute of Electrical and Electronics Engineers), pod oznakom IEEE 1076. Revidiran i trenutno aktuelni
VHDL standard, IEEE 1164, usvojen je 1993. godine.
Prvobitno, VHDL je imao dvostruku namenu. Prvo, bio je korišćen kao dokumentacioni jezik za opisivanje
strukture složenih digitalnih sistem. S obzirom da se radi o internacionalnom standardu, VHDL je značajno
olakšao razmenu dokumentacije između različitih projektantskih organizacija. Drugo, s obzirom da poseduje
jezičke konstrukcije za modeliranje ponašanja digitalnih kola, VHDL je korišćen i kao ulaz u softvere koji su u
to vreme bili korišćeni za simulaciju rada digitalnih kola.
U novije vreme, pored korišćenja za dokumentovanje projekta i simulaciju, VHDL je takođe postao popularno
sredstvo za unos dizajna u CAD sisteme za sintezu. Savremeni CAD alati su u mogućnosti da obave sintezu
VHDL kôda u odgovarajuću hardversku implementaciju. Jednom napisan i verifikovan VHDL kôd može se
iskoristiti za realizaciju opisanog kola u različitim tehnologijama, kao što su: programabilne logičke
komponente (PLD - Programmable Logic Devices) ili aplikaciono-specifična integrisana kola (ASIC -
Application Specific Integrated Circuits). U ovoj skripti VHDL će prevashodno biti korišćen za sintezu.
VHDL je kao jezik izuzetno obiman i složen. Učenje svih detalja ovog jezika zahteva dosta napora i vremena,
kao i dobro poznavanje naprednijih tehnika digitalnog projektovanja. Međutim, za upotrebu u sintezi, bitan je
samo jedan manji deo mogućnosti VHDL jezika. U ovoj skripti biće razmatrani samo oni aspekti VHDL jezika
koji će biti korišćeni u prezentovanim primerima. Međutim, nakon upoznavanja sa materijom u vezi VDHL-a
koji će biti izložena u skripti, čitalac bi trebalo da bude u mogućnosti da projektuje širok spektar digitalnih kola.
Napomenimo da je za razliku od programskih jezika koji su sekvencijalni, VHDL u osnovi konkurentni
(paralelni) jezik. Iz tog razloga uobičajeno je da se u kontekstu VHDL-a govori o kôdu, a ne o programu, kao
što je to slučaj kod jezika kao što su C/C++ ili Pascal.
15
Sl. 2-1 Struktura VHDL kôda.
LIBRARY
LIBRARY (biblioteka) je kolekcija često korišćenih delova VHDL kôda. Izvorni kôd biblioteke se sastoji iz
jednog ili više paketa (PACKAGE) koji sadrže funkcije (FUNCTIONS), procedure (PROCEDURES),
komponente (COMPONENTS), konstante (CONSTANTS) i tipove podataka (TYPES) ( Sl. 2-2). Takav izvorni
kôd se jednom piše i kompajlira u biblioteku (LIBRARY) koja se potom može koristiti u različitim projektima
ili razmenjivati sa drugim projektantima.
16
Biblioteka ieee sadrži nekoliko paketa, od kojih su najvažniji sledeći:
- std_logic_1164: definiše višenivovske logičke sisteme: STD_LOGIC (8 nivoa) i STD_ULOGIC (9
nivoa).
- std_logic_arith: definiše tipove podataka SIGNED i UNSIGNED zajedno sa odgovarajućim
aritmetičkim operacijama i funkcijama za konverziju podataka koje omogućavaju da se podatak jednog
tipa konvertuje u podatak nekog drugog tipa.
- std_logic_signed: sadrži funkcije koje omogućavaju da se sa podacima tipa STD_LOGIC_VECTOR
manipuliše na isti način kao sa podacima tipa SIGNED.
- std_logic_unsigned: sadrži funkcije koje omogućavaju da se sa podacima tipa STD_LOGIC_VECTOR
manipuliše na isti način kao sa podacima tipa UNSIGNED.
Detaljniji opis navedenih biblioteka biće dat u sekciji 2.2.2.
ENTITY
Sekcija ENTITY sadrži spisak svih ulaznih i izlaznih pinova, ili portova (PORTS) kola. ENTITY ima sledeću
sintaksu:
ENTITY ime_entiteta IS
PORT (
ime_porta : mode_signala tip_signala;
ime_porta : mode_signala tip_signala;
... );
END ime_entiteta;
Entitetu se mora dati ime, koje se navodi u prvoj i poslednoj liniji sekcije ENTITY. Deklaracija portova se
nalazi u delu sekcije koja počinje ključnom rečju PORT. Za svaki port se navodi ime, mode i tip. Mode, ili režim
rada, porta može biti: IN, OUT ili INOUT. Kao što je prikazano na Sl. 2-3(a), mode IN definiše ulazne, a OUT
izlazne portove kola. Mode INOUT se koristi za deklaraciju dvosmernih portova, tj. portova koji se po potrebi
mogu koristiti bilo kao ulazi, bilo kao izlazi. Preko portova kolo razmenjuje signale sa svojim okruženjem. Tip
signala može biti BIT, STD_LOGIC, INTEGER i td. Više reči o tipovima podataka biće u poglavlju 2.2.
(a) (b)
Sl. 2-3: (a) Mode-ovi portova; (b) NI kolo.
Primer: NI kolu sa Sl. 2-3(b) odgovara entitet:
ENTITY ni_kolo IS
PORT (a, b : IN BIT;
c : OUT BIT);
END ni_kolo;
Značenje gornje ENTITY deklaracije je sledeće: Opisuje se kolo koje ima dva ulazna (a i b) i jedan izlazni port
(c). Sva tri porta su tipa BIT. Kolu je dodeljno ime ni_kolo. Dakle, ENTITY ne govori ništa o funkciji kola, već
samo opisuje spoljni pogled na kolo, tj. interfejs kola. Treba obratiti pažnju na sledeće pojedinosti: Više portova
istog mode-a i tipa mogu biti deklarisani u istoj liniji (kao što je to slučaj sa portovima a i b). Svaka linija u
okviru PORT konstrukcije završava se znakom ΄;΄, osim poslednje, nakon koje sledi zagrada koja zatvara PORT
deklaraciju.
Slično većini programskih jezika, VHDL definiše pravila za formiranje imena entiteta, portova, signala, varijabli
i td. Ime može da sadrži bilo koje slovo ili cifru, kao i crtu za podvlačenje “_”. Ograničenja su da ime ne može
početi cifrom i da ključne reči VHDL jezika ne mogu biti korišćene kao imena. Takođe treba napomenuti da
VHDL ne pravi razliku između malih i velikih slova, kako kod pisanja imena, tako i prilikom pisanja ključnih
reči. Tako, a i A, ni_kolo i NI_Kolo, kao i Port, port i PORT znače isto.
ARHITECTURE
Da bi VHDL opis nekog kola bio kompletan, osim entiteta, koji definiše ulaze i izlaze kola (tj. Interfejs)
neophodno je napisati još jednu programsku celinu koja se zove arhitektura (ARHITECTURE), a koja sadrži
opis funkcionisanja, ili ponašanja, kola. Njena sintaksa je sledeća:
17
ARCHITECTURE ime_arhitekture OF ime_entiteta IS
[deklaracije]
BEGIN
[kôd]
END ime_arhitekture;
Kao i kod entiteta, ime arhitekture može biti proizvoljno izabrano. Arhitektura je uvek pridružena jednom
konkretnom entitetu, čije se ime navodi posle reči OF. Sekcija ARCHITECTURE se sastoji iz dva dela:
deklarativni deo (koji je opcioni), gde se, između ostalog, deklarišu interni signali i konstante i deo za kôd
(počev od ključne reči BEGIN pa do kraja). Sve naredbe koje čine kôd arhitekture se zovu konkurentne naredbe
i izvršavaju se u paraleli (istovremeno).
Pr. 2-1 NI kolo
Razmotrimo ponovo NI kolo Sl. 2-3(b). Funkcionisanje ovog kola se može opisati sledećom arhitekturom:
ARCHITECTURE ni_funkcija OF ni_kolo IS
BEGIN
c <= a NAND b;
END ni_funkcija;
Gornji kôd se tumači na sledeći način: kolo obavlja NI operaciju (NAND) nad dva ulazna signala, a i b, i
rezultat dodeljuje (˝<=˝) izlaznom pinu c. U ovom primeru ne postoji deklarativni deo, a kôd sadrži samo jednu
naredbu dodele. Naredba se izvršava uvek kada se na nekom od signala a ili b desi događaj. Događaj na signalu
znači da je došlo do promene vrednosti signala. Kaže se da je naredba dodele senzitivna na promenu vrednosti
bilo kog signala sa leve strane znaka <=. U konkretnom primeru, naredba je senzitivna na a i b.
18
redosled naredbi u konkurentnom kôdu nije od značaja. Identičnu funkciju imao bi i kôd u kome bi dve naredbe
iz gornje arhitekture zamenile mesta:
x <= a NAND b;
y <= x NAND c;
Pretpostavimo da je mreža sa Sl. 2-4 u stabilnom stanju u kome su svi ulazi postavljeni na 1-cu, a=b=c=1. Pod
ovim uslovima na izlazu mreže je y = (1 NAND 1) NAND 1 = 1. Neka se u nekom momentu vrednost ulaza a
promeni na a=0. Ovaj događaj utiče na naredbu iz linije 11 (x<=a NAND b), zato što je ona senzitivna na signal
a, ali ne i na naredbu iz linije 10 (y <= x NAND c), jer kod nje signal a ne postoji kao operand. Kao rezultat
izvršenja naredbe iz linije 11 signal x dobija novu vrednost x= (0 NAND 1)= 1. Ova promena vrednosti signala x
ima za posledicu izvršenje naredbe iz linije 10, koja na izlaz y postavlja y = 1 NAND 1 = 0. Ovakav način
izvršenja naredbi naziva se dataflow model, ili model toka podataka, s obzirom da je redosled izvršenja naredbi
uslovljen propagacijom ulazne promene.
Iako VHDL kôd iz ovog primera striktno prati strukturu polazne mreže, to u opštem slučaju ne mora biti tako.
Dataflow model, pre svega, omogućava modeliranje (opisivanje) funkcije ili ponašanja kola bez ulaženja u
strukturne detalje. Na primer, funkcija mreže sa Sl. 2-4 može se predstaviti u obliku tabele istinitosti:
a b c y
0 0 0 1
0 0 1 0
0 1 0 1
0 1 1 0
1 0 0 1
1 0 1 0
1 1 0 1
1 1 1 1
Ova funkcija se može u VHDL-u opisati pomoću SELECT naredbe (sekcija 2.4.3), kao u sledećoj arhitekturi:
ARCHITECTURE dataflow OF primer IS
BEGIN
WITH (a & b & c) SELECT
y <= '1' WHEN "000",
'0' WHEN "001",
'1' WHEN "010",
'0' WHEN "011",
'1' WHEN "100",
'0' WHEN "101",
'1' WHEN "110",
'1' WHEN "111";
END dataflow;
Kao što možemo videti, sada kôd nema nikakve veze sa strukturom, već isključivo opisuje funkciju mreže.
Naredba je senzitivna na sva tri ulaza, a, b i c, koji su operatorom & povezana u tro-bitni vektor. Uvek kada se
desi događaj ne nekom od ulaznih signala, naredba se izvrši, tako što izlazu y dodeli vrednost koja odgovara
trenutnoj vrednosti ulaza.
Tehnika (ili stil) programiranja u VHDL-u koji opisuje funkciju kola naziva se bihejvioralno ili funkcionalno
modeliranje. Osnovu bihejvioranog modeliranja čine konkurentne i sekvencijalne naredbe.
Sekvencijalni procesi
Pr. 2-3: D flip-flop sa asinhronim resetom
19
Postoji nekoliko načina kako se D flip-flop sa Sl. 2-5 može opisati u VHDL-u. Jedno moguće rešenje
predstavljeno je ispod. Za razliku od standardnih programskih jezika koji su sekvencijalni (naredbe se izvršavaju
jedna za drugom), VHDL je u suštini konkurentni jezik. To znači da prilikom izvršenja VHDL kôda, simulator
pravi iluziju istovremenog (konkurentnog) izvršavanja različitih delova kôda. Ovakav model je pogodan za opis
hardvera gde različiti podsistemi jednog složenog sistema rade u paraleli. Međutim, ponašanje pojedinih
podsistema, ili kola, često je lakše opisati sekvencijalnim kôdom. Konstrukcija PROCESS, iskorišćena u
arhitekturi D flip-flopa, predstavlja jedan od načina kako se u VHDL-u može nametnuti sekvencijalno izvršenje
naredbi. Naime, naredbe obuhvaćene procesom izvršavaju se sekvencijalno (jedna za drugom), kao kod bilo kog
programskog jezika. Drugim rečima, kao što ARCHITECTURE predstavlja okvir za konkurentni, tako
PROCESS predstavlja okvir za sekvencijalni kôd.
1 -----------------------------------------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 -----------------------------------------------
5 ENTITY dff IS
6 PORT (d, clk, rst: IN STD_LOGIC;
7 q: OUT STD_LOGIC);
8 END dff;
9 -----------------------------------------------
10 ARCHITECTURE behavior OF dff IS
11 BEGIN
12 PROCESS (rst,clk)
13 BEGIN
14 IF(rst='1') THEN
15 q <= '0';
16 ELSIF (clk'EVENT AND clk='1') THEN
17 q <= d;
18 END IF;
19 END PROCESS;
20 END behavior;
21 -----------------------------------------------
Objašnjenje:
Linije 2 – 3: Deklaracija ieee biblioteke. (Biblioteke std i work uključene su po automatizmu). U ovoj biblioteci,
odnosno u njenom paketu std_logic_1164 definisan je tip podataka STD_LOGIC koji se koristi u ovom kôdu.
Linije 5 – 8: Entitet dff. Opisuje ulaze i izlaze D flip-flopa.
Linije 10 – 20: Arhitektura behavior. Opisuje unutrašnjost D flip-flopa.
Linija 6: Ulazni portovi. (Mode ulaznog porta može biti samo IN). U ovom primeru svi signali su tipa
STD_LOGIC.
Linija 7: Izlazni port (Mode izlaznog porta može biti OUT ili INOUT). Tip izlaznog porta je takođe
STD_LOGIC.
Linije 12 – 19: PROCESS. Kôd unutar procesa izvršava se sekvencijalno.
Linija 12: PROCESS se izvrši jedanput uvek kada se promeni neki od signala iz njegove liste senzitivnosti. U
ovom primeru, svaka promena signala rst ili clk iniciraće izvršenje procesa.
Linije 14 – 15: Ako je rst=1, flip-flop se resetuje bez obzira na clk (asinhroni reset).
Linije 16 – 17: Ako rst nije aktivan i clk se promenio (desio se EVENT (događaj) na signalu clk) i promena je
takva da je nova vrednost signala clk jednaka 1, tada se vrednost ulaznog signala (d) pamti u flip-flopu (q <= d) .
Linije 15 i 17: Operator ˝<=˝ se koristi za dodelu vrednosti signalu (tj. podatku tipa SIGNAL). Za dodelu
vrednosti promenljivama (tj. podacima tipa VARIABLE) koristi se operator ˝:=˝. Portovi entiteta su uvek
signali.
Linije 1, 4, 9 i 21: Komentarisane linije. (˝--˝ označava komentar). Koristi se radi preglednijeg prikaza kôda.
Simulacija VHDL kôda
Značaj bihejvioralnog modeliranja leži u činjenici da se jedan takav opis digitalnog kola može simulirati i na taj
način verifikovati njegova funkcija. Za simulaciju se koriste namenski softveri, tzv. VHDL simulatori. VHDL
kôd se najpre kompajlira, a zatim se učitava u simulator koji ima mogućnost da izvršava VHDL kôd shodno
20
dataflow i sekvencijalom modelu. Kao rezultat, simulator generiše vremenske dijagrame signala iz VHDL kôda
kako se oni menjaju u toku izvršenja kôda.
Na Sl. 2-6 prikazani su rezultati simulacije VHDL kôda iz Pr. 2-3. Grafikon se može lako interpretirati. U prvoj
koloni navedeni su mode-ovi signala, a drugoj njihova imena. Treća kolona sadrži talasne oblike posmatranih
signala. U zaglavlju ove kolone naznačeni su vremenski trenutci (u ovom primeru u nanosekundama, ns). U
ovom primeru, svi signali su binarni i s toga su njihove vrednosti ΄0΄ ili ΄1΄. Kada se koriste vektori, tj. više-bitni
signali, njihove trenutne vrednosti biće prikazane u obliku binarnog, decimalnog ili heksadecimalnog broja.
Oblik ulaznih signala (rst, d i clk) može se proizvoljno zadati u simulatoru. Na osnovu oblika ulaznih signala i
VHDL kôda, simulator određuje oblik izlaznih signala (u ovom slučaju postoji samo jedan izlaz, q. Poređenjem
rezultata sa Sl. 2-6, sa očekivanim ponašanjem D flip-flopa sa asinhronim resetom, možemo zaključiti da VHDL
kôd sa Sl. 2-5 predstavlja ispravan opis ovog kola.
21
Sl. 2-8 Rezultati simulacije VHDL kôda iz Pr. 2-4
Strukturni opis
Za razliku od bijhejvioralnog modeliranja koje je usredsređeno na funkciju kola, strukturno modeliranje opisuje
složenije kolo kao skup povezanih pod-kola manje složenosti. Strukturno modeliranje u VHDL-u zasnovano je
na konceptu komponenti. Komponenta je celoviti VHDL opisi (entitet plus arhitektura) koji se jednom piše, a
onda koristi za konstrukciju složenijih modela. Tipično, više komponenti se pakuje u jedan paket, koje se smešta
u biblioteku (Sl. 2-2).
Ispod je dat strukturni opis kola sa Sl. 2-7. U kôdu se koriste dva komponente, ni_kolo i dff. Pretpostavka je da se
funkcionalni opisi ovih komponenti nalaze u paketu nas_paket iz biblioteke nasa_biblioteka. U samom kôdu,
najpre su uključeni biblioteka i paket (linije 3 i 5), zatim su korišćene komponente deklarisane u deklarativnom
delu arhitekture (linije 13-22), i konačno instancirane i na odgovarajući način povezane u telu arhitekture (linije
25 i 26). Deklaracija komponente, slično entitetu, definiše ulazne i izlazne portove komponente. Naredba iz
linije 25 instancira (kreira) jedan primerak komponente ni_kolo i povezuje ga sa portovima i internim signalima
kola koje se projektuje. Tako, port d1, povezuje se na port a, port d2 na port b, a signal x na port q komponente
ni_kolo. Slično, u naredbi iz linije 26, kreira jedan dff i povezuje sa signalom x, i portovima clk i q.
1 ------------------------------------------------
2 LIBRARY ieee;
3 LIBRARY nasa_biblioteka;
4 USE ieee.std_logic_1164.all;
5 USE nasa_bibloteka.nas_paket.all;
6 ------------------------------------------------
7 ENTITY primer IS
8 PORT( d1, d2, clk: IN BIT;
9 q : OUT BIT);
10 END primer;
11 ------------------------------------------------
12 ARCHITECTURE struct OF primer IS
13 ---- komponenta dff -------------------
14 COMPONENT dff IS
15 PORT (d, clk: IN STD_LOGIC;
16 q: OUT STD_LOGIC);
17 END COMPONENT;
18 ---- komponenta ni_kolo ---------------
19 COMPONENT ni_kolo IS
20 PORT (a, b : IN STD_LOGIC;
21 c: OUT STD_LOGIC);
22 END COMPONENT;
23 SIGNAL x : STD_LOGIC;
24 BEGIN
25 K1: ni_kolo PORT MAP(d1, d2, x);
26 K2: dff PORT MAP(x, clk, q);
27 END struct;
28 ------------------------------------------------
Krajnji cilj projektovanja je svakako realizacija fizičkog sistema. Sa jedne strane, rad na višem nivou apstrakcije
predstavlja prirodnu težnju projektanta (projektant je usredsređen na funkciju (algoritma rada) sistema). Sa
druge strane, fizički sistem se može realizovati samo na osnovu preciznog strukturnog modela. Tipično, sistem
se projektuje u više faza, gde se na početku kreira opis visokog nivoa, koji se potom razrađuje postepenim
ubacivanjem strukturnih detalja. U ovom procesu, uloga alata za sintezu je od ključne važnosti. Savremeni alati
za sintezu u mogućnosti su da tumače bihejvioralni opisa relativno visokog nivoa apstrakcije i kreiraju
ogovarajući implementacioni strukturni opis. Na primer, svi primeri VHDL kôd iz ovog poglavlja se mogu
sintetizovati. Međutim, alati za sintezu ne mogu da sintetišu bilo koju VHDL konstrukciju. U tom smislu, cilj
projektanta koji radi u VHDL-u, nije u kreiranju preciznog strukturnog opisa, već opisa koji će biti prihvatljiv
kao ulaz u alat za sintezu, tj. može se sintetizovati. Tipično, opisi složenijih sistema su hijerarhijski
22
organizovani, tako što na najvišem nivou hijerarhije postoji opis strukture koju čine nekoliko podsistema. Neki
od podsistema su opisani bihejvioralno, a drugi strukturno, pomoću još jednostavnijih komponenti, tako da se na
najnižem nivou hijerahije nalaze bihejvioralno opisane komponente koje se mogu sintetizovati.
23
SIGNAL w : BIT_VECTOR(0 TO 7);
-- w je 8-bitni vektor. Krajnji desni bit je bit najveće težine (MSB).
SIGNAL z : BIT := ´1´;
-- z je jednobitni signal inicijalne vrednost ´1´.
U gornjim primerima, signal x je skalar (može da sadrži samo jednu binarnu vrednost), a signali y i w vektori
(sadrže niz bitova). Uočimo da je deklaracija vektorskog tip praćena konstrukcijom (n DOWNTO m), odnosno
(n TO m) koja definiše dužinu vektora i opseg indeksa. n i m su vrednosti početnog i krajnjeg indeksa u nizu. Za
DOWNTO važi n≥m, a za TO n≤m. Vektor sadrži m-n+1 elemenata, za DOWNTO, odnosno n-m+1 elemenata,
za TO varijantu. U gornjim primerima, y je vektor dužine 3-0+1=4, a w vektor dužine 7-0+1=8 bita. Svakom
elementu vektora pridružen je indeks koji ukazuje na njegovu poziciju u vektoru. Ključne reči DOWNTO i TO
ukazuju da li kretanjem kroz niz, s leva na desno, indeksi opadaju ili rastu. Za DOWNTO važi da krajnji levi
element vektora ima najveći, a krajnji desni najmanji indeks. Za TO važi obrnuto, krajnji levi element ima
najmanji, a krajnji desni najveći indeks. Kod tipova koji služe za predstavljanje binarnih vrednosti (kao što su
BIT ili STD_LOGIC) element (bit) na poziciji indeksa najveće vrednosti naziva se bitom najveće težine (MSB -
Most Sifnicant Bit). Bit na poziciji najmanjeg indeksa je bit najmanje težine (LSB - Last Significant Bit) .
Prilikom deklaracije signala (varijable), dozvoljeno je postaviti početnu (inicijalnu) vrednost, kao u poslednjem
primeru. Inicijalna vrednost se navodi posle znaka :=. Treba napomenuti da inicijalne vrednosti signala i
varijabli imaju značaj samo u simulaciji, dok se prilikom sinteze ne uzimaju u obzir.
Sledeće naredbe dodele su legalne:
x <= ΄1΄;
-- jednobitnom signalu x dodeljuje se vrednost ‘1΄. Za pisanje
-- jednobitnih vrednosti koriste se jednostruki znaci navoda (΄ ΄).
y <=˝0111˝;
-- 4-bitnom signalu se dodeljuje vrednost ˝0111˝ (MSB=΄0΄). Vektori se
-- pišu pod dvostrukim navodnicima (˝ ˝).
w <=˝01110001˝;
-- 8-bitnom signalu w dodeljuje se vrednost ˝01110001˝ (MSB=΄1΄).
Skalarne vrednosti se pišu pod jednostrukim, a vektorske pod dvostrukim navodnicima. Za pristup pojedinačnim
elementima vektora koristi se indeksiranje. Na primer, elementi vektora y, kod koga važi DOWNTO redosled,
su y(3), y(2), y(1) i y(0), čije su vrednosti redom, ´0´, ´1´, ´1´ i ´1´. Elementi vektora w (TO redosled), su w(0),
w(1), ..., w(7), čije su vrednosti redom ´0´, ´1´, ..., ´1´.
DOWNTO redosled se obično koristi ako se vektor tumači kao binarni broj. Navikli smo da kod zapisivanja
binarnih brojeva krajni levi bit bude bit najveće težine. Tako, zapis ˝0111˝ predstavlja broj 7. Da je signal y bio
deklarisan sa indeksima u TO redosledu (SIGNAL y : BIT_VECTOR(0 DOWNTO 3)), tada bi vrednost
binarnog broja y <=˝0111˝ bila 14.
STD_LOGIC (i STD_LOGIC_VECTOR): definiše 8-nivovski logički sistem. Dozvoljene vrednosti su
sledeće:
΄X΄ Nepoznata vrednost
΄0΄ Nizak nivo (sintetiše se kao logička ΄0΄)
΄1΄ Visok nivo (sintetiše se kao logička ΄1΄)
΄Z΄ Visoka impedansa (sintetiše se kao tro-statički bafer)
΄W΄ ˝Slaba˝ nepoznata vrednost
΄L΄ ˝Slab˝ nizak nivo
΄H΄ ˝Slab˝ visok nivo
΄-΄ Proizvoljna vrednost
SIGNAL x : STD_LOGIC;
-- deklariše x kao jednobitni (skalarni) signal tipa STD_LOGIC
SIGNAL y : STD_LOGIC_VECTOR(3 DOWNTO 0) := ˝0001˝;
-- deklariše y kao 4-bitni vektor i dodeljuje mu inicijalnu vrednost ˝0001˝
-- Inicijalna vrednost je opciona, a dodeljuje se operatorom ˝:=˝ .
-- Krajnji levi bit je bit najveće težine (MSB).
Tip STD_LOGIC je prevashodno namenjen modelovanju električnih veza u digitalnim sistemima. Svaka fizička
veza se pobuđuje najčešće jednim izlazom nekog digitalnog kola (drajver veze). Drajver može da pobuđuje vezu
logičkom ΄1΄ ili ΄0΄. Takođe, izlaz drajvera može biti u stanju visoke impedanse ΄Z΄. U upotrebi su i digitalna
kola sa izlazom tipa ˝otvoreni kolektor˝ koja zahtevaju ugradnju spoljašnjeg otpornika (tzv ΄pull-up΄). Drajver
tipa otvoreni kolektor postavlja ˝jaku˝ ΄0΄, ali ˝slabu˝ ΄1΄, tj. slab visok nivo (΄H΄). Drajver koji zahteva ugradnju
24
˝pull-down˝ otpornika postavlja ˝jaku˝ ΄1΄ i ˝slabu˝ ΄0΄, tj. slab nizak nivo (΄L΄). U nekim slučajevima više
drajvera mogu da pobuđuju istu vezu (tipičan primer su magistrale). S obzirom da u jednom momentu na vezi
može da postoji samo jedan logički nivo, problem se javlja kada drajveri generišu različite logičke vrednosti
(pojava konflikta). Konflikti se razrešavaju tako što se signalu dodeljuje vrednost ˝najjačeg˝ od svih logičkih
nivoa kojima je veza pobuđena. Na primer, ako neku vezu pobuđuju dva drajver, tako da je jedan u stanju
visoke impedanse (΄Z΄), a drugi generiše ΄1΄, rezultujuća vrednost signala na liniji biće ΄1΄. Ili, ako jedan drajver
generiše ΄1΄, a drugi ΄0΄, rezultujuća vrednost biće nepoznata (΄X΄). Pravila za razrešavanje konflikta u logičkom
sistemu tipa STD_LOGIC navedena su u tabeli. Većina dozvoljenih vrednosti tipa STD_LOGIC koriste se samo
u simulaciji. U VHDL kôdu koji je namenjen sintezi dozvoljeno je signalima ovog tipa dodeljivati samo
vrednosti ΄1΄, ΄0΄ ili ΄Z΄.
X 0 1 Z W L H -
X X X X X X X X X
0 X 0 X 0 0 0 0 X
1 X 0 1 1 1 1 1 X
Z X 0 1 Z W L H X
W X 0 1 W W W W X
L X 0 1 L W L W X
H X 0 1 H W W H X
- X X X X X X X X
STD_ULOGIC (i STD_ULOGIC_VECTOR): definiše 9-nivovski logički sistem (΄U΄, ΄X΄, ΄0΄, ΄1΄, ΄Z΄, ΄W΄,
΄L΄, ΄H΄, ΄-΄). U suštini, tip STD_LOGIC je podtip tipa STD_ULOGIC koji definiše još jednu dodatnu vrednost
΄U΄ - nerazrešena vrednost. Za razliku od tipa STD_LOGIC, kod koga se konfliktne vrednosti automatski
razrešavaju, STD_ULOGIC ne dozvoljava ˝kratke spojeve˝, tj. ne predviđa mogućnost da više od jednog
drajvera pobuđuje istu vezu. Ako se to ipak desi, signal dobija vrednost ΄U΄, što ukazuje na projektantsku
grešku.
BOOLEAN: definiše logičke vrednosti true (tačno) i false (netačno).
INTEGER: 32-bitni celi (integer) brojevi. Opseg dozvoljenih vrednosti je -2,147,483,647 do +2,147,483,647
NATURAL: nenegativni celi (prirodni) brojevi (od 0 do +2,147,483,647).
REAL: realni brojevi iz opsega -10 38 do +10 38. (ne sintetišu se).
Fizičke jedinice: za označavanje fizičkih veličina kao što su vreme, napon i td. Korisni u simulaciji, ali nisu
dozvoljene u kôdu za sintezu.
Karakteri: pojedinačni ASCII karakteri (slova, cifre i specijalni znaci) ili stringovi ASCII karaktera.
SIGNED i UNSIGNED: po obliku su identični tipu STD_LOGIC_VECTOR, ali dozvoljavaju primenu
aritmetičkih operacija karakterističnih za tip INTEGER.
Primeri:
x0 <= ΄1΄; -- tip signala x0 može biti bit, std_logic ili std_ulogic
x1 <= ˝00011111˝; -- tip signala x1 može biti bit_vector, std_logic_vector,
-- std_ulogic_vector, signed ili undigned
x2 <= ˝0001_1111˝;-- dozvoljena crta za podvlačenje (poboljšava čitljivost)
x3 <= ˝101111˝; -- binarna reprezentacija decimalnog broja 47
x3 <= B˝101111˝; -- binarna reprezentacija decimalnog broja 47
x3 <= O˝57˝; -- oktalna reprezentacija decimalnog broja 47
x3 <= X˝2F˝; -- heksadecimalna reprezentacija decimalnog broja 47
n <= 1200; -- n je integer
IF ready THEN ... –- ready je tipa boolean. THEN grana se izvršava
-- ako je ready = True
y <= 1.2E-5; -- y je signal tipa real.
q <= d after 10 ns; -- ns je fizička jedinica za vreme (nanosekunde).
Primeri:
SIGNAL a: BIT;
25
SIGNAL b: BIT_VECTOR(7 DOWNTO 0);
SIGNAL c: STD_LOGIC;
SIGNAL d: STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL e: INTEGER RANGE 0 TO 255;
...
a <= b(5); -- ispravno (a i b(5) su skalari tipa BIT)
b(0) <= a; -- ispravno (b(0) i a su skalari tipa BIT)
a <= d(5); -- ispravno (a i d(5) su skalari tipa STD_LOGIC)
d(0) <= c; -- ispravno (d(0) i c su skalari tipa STD_LOGIC)
a <= c; -- neispravno (neslaganje tipova: a - BIT c – STD_LOGIC)
b <= d; -- neispravno (neslaganje tipova: b – BIT_VECTOR
-- d – STD_LOGIC_VECTOR)
e <= b; -- neispravno (neslaganje tipova: e – INTEGER,
-- b – BIT_VECTOR)
e <= d; -- neispravno (neslaganje tipova: e – INTEGER,
-- b – STD_LOGIC_VECTOR)
26
Deklaracija nabrojivog tipa definiše tip podataka koji čini skup korisnički-definisanih vrednosti. Na primer,
deklaracija tipa boja osim imena tipa (boja) sadrži i imena dozvoljenih vrednosti pridruženih ovom tipu (crvena,
zelena, plava i bela). Ove vrednosti su apstraktne jer ne predstavljaju ni brojnu vrednost ni fizičku veličinu, već
imaju značenje koje je poznato samo korisniku (projektantu). Korišćenje korisničkih tipova poboljšava čitljivost
(razumljivost) kôda i smanjuje mogućnost greške u pisanju kôda. Treba napomenuti da je svakoj vrednosti iz
deklaracije nabrojivog tipa implicitno pridružen redni broj koji odgovara njenoj poziciji u spisku navedenih
vrednosti. Tako, vrednost crvena, iz poslednje navedene deklaracije, ima redni broj 0, zelena 1 i td. Poredak
vrednosti je od značaja ako se one koriste u relacionim izrazima (<, >, =). Tako, na primer, izraz (crvena <
plava) je tačan, a izraz (bela < zelena) netačan. Predefinisani tipovi BIT, STD_LOGIC i STD_ULOGIC su
takođe nabrojivi tipovi.
2.2.4 Podtipovi
Podtip (SUBTYPE) je tip sa ograničenjem. Ograničenje definiše podskup vrednosti osnovnog tipa koje se
pridružuju podtipu. Podtip nasleđuje sve operacije osnovnog tipa.
Sledeći podtipovi izvedeni su iz tipova definisanih u prethodnoj sekciji.
SUBTYPE natural IS INTEGER RANGE 0 TO INTEGER΄HIGH;
-- prirodni brojevi su podtip (podskup) celih brojeva
-- INTEGER'HIGH znači ˝najveća vrednosti tipa INTEGER˝
SUBTYPE nasa_logika IS STD_LOGIC RANGE ΄0΄ TO ΄Z΄;
-- STD_LOGIC = (΄X΄,΄0΄,΄1΄,΄Z΄,΄W΄,΄L΄,΄H΄,΄-΄)
-- nasa_logika = (΄0΄,΄1΄,΄Z΄)
SUBTYPE nasa_boja IS boja RANGE crvena TO plava;
-- boja = (crvena, zelena, plava, bela)
-- nasa_boja = (crvena, zelena, plava)
SUBTYPE mali_integer IS INTEGER RANGE -32 TO 32;
-- podtip tipa INTEGER
Uporedimo definiciju podtipa mali_integer sa definicijom istoimenog tipa iz prethodne sekcije. Oba tipa su
izvedena iz tipa INTEGER, imaju identičan skup vrednosti i skup dozvoljenih operacija. Čini se da se radi o
ekvivalentnim deklaracijama. Međutim, postoji jedna bitna razlika. Vrednosti tipa mali_integer ne mogu se
kombinovati sa vrednostima tipa INTEGER u operacijama kao što su ΄+΄ i ΄-΄. Sa druge strane, dozvoljeno je, u
istom izrazu, kombinovati vrednosti podtipa mali_integer i vrednosti tipa INTEGER.
Primeri:
TYPE nova_logika IS STD_LOGIC RANGE ΄0΄ TO ΄1΄;
SUBTYPE nasa_logika IS STD_LOGIC RANGE ΄0΄ TO ΄1΄;
SIGNAL a: BIT;
SIGNAL b: STD_LOGIC;
SIGNAL c: nasa_logika;
SIGNAL d: nova_logika;
...
b <= a; -- neispravno (b je STD_LOGIC, a je BIT)
b <= c; -- ispravno (isti osnovni tip)
b <= d; -- neispravno (b je STD_LOGIC, d je nova_logika)
2.2.5 Polja
Polja su kolekcije objekata istog tipa. Polja mogu biti jednodimenziona (1D ili vektori), dvodimeniziona (2D ili
matrice) ili 1D x 1D. Polja viših dimenzija (npr. 3D ili 2D x 2D) se ređe koriste i obično nisu podržana u alatima
za sintezu. Na Sl. 2-9 je ilustrovana organizacija polja. Pojedinačna vrednost (ili skalar) prikazana je na Sl. 2-9(a),
vektor (1D polje) na 3-1(b), polje vektora (1D x 1D polje) na 3-1(c) i polje skalara (2D polje) na 3-1(d).
27
(a) (b) (c) (d)
Sl. 2-9 (a) skalar, (b) 1D, (c) 1D x 1D, (d) 2D polja.
Svi predefinisani tipovi podataka su ili skalari ili vektori (jednodimenziona polja skalara). Sledeći predefinisani
tipovi se mogu sintetizovati:
- Skalari: BIT, STD_LOGIC, STD_ULOGIC i BOOLEAN.
- Vektori: BIT_VECTOR, STD_LOGIC_VECTOR, STD_ULOGIC_VECTOR, INTEGER, SIGNED i
UNSIGNED.
Ne postoje predefinisana 2D ili 1D x 1D polja. Ako su neophodna, takva polja mogu biti definisana od strane
projektanta. Novo polje se definiše shodno sledećoj sintaksi:
TYPE ime_tipa IS ARRAY (opseg_indeksa) OF tip;
28
y(2)(0)<= v(0)(0);
y(0)(0)<= w(3,3);
w(l,l) <= x(7);
w(3,0) <= v(0)(3);
----------- Vektorske naredbe dodele: ------------------------------------
x <= y(O); --ispravno (isti tip podataka: vrsta)
x <= v(l); --neispravno (neusklađeni tipovi: vrsta x
--STD-LOGIC-VECTOR)
x <= w(2); --neispravno (pogrešno indeksiranje, w je 2D)
x <= w(2, 2 DOWNTO 0); --neispravno (neusklađeni tipovi: vrsta x i w STD_LOGIC)
v(O) <= w(2, 2 DOWNTO 0); --neispravno (neusklađeni tipovi:
--STD_LOGIC_VECTOR v i STD_LOGIC w)
v(0) <= w(2); --neispravno (w je 2D)
y(l) <= v(3); --neispravno (neusklađeni tipovi: vrsta y i
--STD_LOGIC_VECTOR) v
y(1)(7 DOWNTO 3)<= x(4 DOWNTO 0); --ispravno (isti tip, ista veličina)
v(1)(7 DOWNTO 3)<= v(2)(4 DOWNTO 0); --ispravno (isti tip, ista veličina)
w(l,5 DOWNTO 1) <= v(2)(4 DOWNTO 0); --neispravno (nausklađeni tipovi)
Obratimo pažnju kako se pristupa elementima polja različite dimenzionalnosti. Za pristup 1D polju (vektoru)
koristi se jednodimnezioni indeks (npr. vrsta(2)). Za pristup 1Dx1D polju koristi se par jednodimenzionih
indeksa (npr. y(4)(2) - prvi indeks, (4), se odnosi na vektor, drugi, (2), na element u vektoru). Elementima
matrice se pristupa dvodimenizionim indeksom (npr. w(2,3)). Takođe, VHDL omogućava pristup delovima
polja. Na primer, v(2)(4 DOWNTO 0) označava sve bitove od četvrtog do nultog, drugog vektora polja v.
29
SIGNAL y: UNSIGNED(O TO 3);
Uočimo da je sintaksa više liči na sintaksu STD_LOGIC_VECTOR nego na INTEGER, kao što bi se možda
moglo očekivati.
Vrednost tipa UNSIGNED je broj koji nikada nije manji od nule. Na primer, ˝0101˝ predstavlja decimalno 5, a
˝1101˝ decimalno 13. Tip SIGNED sadrži i pozitivne i negativne brojeve (izražene u formatu dvojičnog
komplementa). To znači da SIGNED vrednost ˝0101˝ predstavlja decimalno 5, a ˝1101˝ decimalno -3.
Tipovi SIGNED i UNSIGNED u suštini predstavljaju proširenje tipa STD_LOGIC_VECTOR koje omogućava
primenu aritmetičkih operacija. Nasuprot tome, logičke operacije nisu dozvoljene. U pogledu relacija
(poređenja) ne postoje razlike.
Pr. 2-9. Ispravne i neispravne operacije sa označenim/neoznačenim tipom podataka:
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_arith.all; -- dodatni paket je neohodan
. . .
SIGNAL a: SIGNED(7 DOWNTO 0);
SIGNAL b: SIGNED(7 DOWNTO 0);
SIGNAL c: SIGNED(7 DOWNTO 0);
. . .
c <= a + b; -- ispravno (aritmetičke operacije su dozvoljene)
c <= a AND b; -- neispravno (logičke operacije nisu dozvoljene)
30
Paket std_logic_arith iz biblioteke ieee sadrži nekoliko funkcija za konverziju podataka. To su:
- conv_integer(p) : Konvertuje vrednost parametra p tipa INTEGER, UNSIGNED, SIGNED, ili
STD_ULOGIC u vrednost INTEGER tipa. Uočimo da tip STD_LOGIC_VECTOR nije podržan.
- conv_unsigned(p, b) : Konvertuje vrednost parametra p tipa INTEGER, UNSIGNED, SIGNED, ili
STD_ULOGIC u b-bitnu vrednost tipa UNSIGNED.
- conv_signed(p, b) : Konvertuje vrednost parametra p tipa INTEGER, UNSIGNED, SIGNED, ili
STD_ULOGIC u b-bitnu vrednost tipa SIGNED.
- conv_std_logic_vector(p, b) : Konvertuje vrednost parametra p tipa INTEGER, UNSIGNED, SIGNED,
ili STD_LOGIC u b-bitnu vrednost tipa SIGNED.
Pr. 2-11 Konverzija podataka.
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_arith.all;
. . .
SIGNAL a: UNSIGNED(7 DOWNTO 0);
SIGNAL b: UNSIGNED(7 DOWNTO 0);
SIGNAL y: STD_LOGIC_VECTOR(7 DOWNTO 0);
. . .
y <= CONV_STD_LOGIC_VECTOR((a+b),8);
-- ispravna operacija: a+b se konvertuje iz UNSIGNED u
-- 8-bitnu STD_LOGIC_VECTOR vrednost koja se dodeljuje signalu y
Druga mogućnost je ona pomenuta u prethodnoj sekciji, a odnosi se na korišćenje paketa std_logic_signed ili
std_logic_unsigned iz biblioteke ieee. Ovi paketi omogućavaju da se operacije nad podacima tipa
STD_LOGIC_VECTOR obavljaju kao da se radi o podacima tipa SIGNED ili UNSIGNED, respektivno.
31
w <= (0=>'1', 3=>'1', OTHERS => '0') -- w(0)=w(3)= ΄1΄, ostali bitovi su ΄0΄.
-- Ekvivalentno prethodnoj naredbi.
Obratimo pažnju na poslednja dva od gore navedenih primera naredbi dodele. Notacija “10000000” iz naredbe
w <= “10000000” predstavlja kompaktnu reprezentaciju 8-bitnog binarnog vektora, gde se podrazumeva da
krajnji levi bit ima indeks 0, sledeći 1, i td. U sledećoj naredbi, koja ima isti efekat kao i prethodna, sadržaj
vektora definisan je na drugačiji način. Pojedinačnim elementima vektora se direktno pridružuju vrednosti
notacijom i => v, gde je i indeks elementa, a v vrednost koja je dodeljuje tom elementu. (Na primer, 0=>'1'
znači da se bitu sa indeksom 0, dodeljuje vrednost '1'). Kod ovakvog načina predstavljanja vektora, ključna reč
OTHERS ima posebno značenje jer zamenjuje sve indekse kojima nije direktno dodeljena vrednost. Ova
mogućnost je posebno bitna u slučajevima kada dužina vektora unapred nije poznata. Dozvoljeno je i sledeća
konstrukcija:
w <= (OTHERS => '0');
koja inicijalizuje vektor w na sve nule.
Logički operatori:
Koriste se za obavljanje logičkih operacija. To su:
• NOT
• AND
• OR
• NAND
• NOR
• XOR
• XNOR
Logički operatori su definisani za sledeće predefinisane tipove podataka: BIT, BOOLEAN, STD_LOGIC,
STD_ULOGIC i odgovarajuća 1D polja (BIT_VECTOR, STD_LOGIC_VECTOR i
STD_ULOGIC_VECTOR). Operator NOT je unarni i ima viši prioritet od svih ostalih operatora.
Pr. 2-13 Logičke operacije nad skalarima
SIGNAL a, b, c, y: STD_LOGIC;
. . .
y <= NOT a AND b; -- (a΄b)
y <= NOT (a AND b); -- (ab)΄
y <= a NAND b; -- (ab)΄
Operatori NAND i NOR nisu asocijativni. Zbog toga, sledeća sintaksa nije ispravna:
y <= a NAND b NAND c;
neophodne su zagrade:
y <= (a NAND b) NAND c;
Aritmetički operatori:
Koriste se za obavljanje aritmetički operacija. Primenjivi su na podatke tipa INTEGER, SIGNED, UNSIGNED,
ili REAL. Ako je u projekat uključen paket std_logic_signed ili std_logic_unsigned iz biblioteke ieee, tada se
32
operatori sabiranja i oduzimanja mogu direktno primenjivati i nad podacima tipa STD_LOGIC_VECTOR.
Podržani su sledeći operatori:
+ Sabiranje
– Oduzimanje
* Množenje
/ Deljenje
** Stepenovanje
MOD Deljenje po modulu
REM Ostatak deljenja
ABS Apsolutna vrednost
U kôdu za sintezu ne postoje striktna ograničenja koja se odnose na korišćenje operacija sabiranja i oduzimanja.
U opštem slučaju to važi i za operaciju množenja. Kod deljenja, dozvoljeni su samo delioci koji imaju vrednost
stepena dvojke (svodi se na operaciju pomeranja). Stepenovanje je dozvoljeno samo prilikom definisanja
vrednosti konstante (osnova i eksponent mogu biti samo konkretne vrednosti). Alati za sintezu, po pravilu, ne
podržavaju poslednja tri operatora (MOD, REM i ABS). Rezultat operacije x REM y je ostatak celobrojnog
deljenja x/y (= x – (x/y)*y). Znak rezultata isti je kao znak levog operanda. Npr. 7 REM 4 = 3; (-7) REM 4 = -3;
7 REM (-4) = 3. Rezultat operacije x MOD y jednak je x – y*N, gde je N najveći ceo broj za koji važi x ≤ y*N.
Znak rezultata isti je kao znak desnog operanda. Npr. 7 MOD 4 = 3; 7 MOD (-4) = -1.
Operatori poređenja
Koriste se u relacionim izrazima za poređenje vrednosti podataka. Primenljivi su na sve prethodno pomenute
tipove podataka. Raspoloživi su sledeći operatori poređenja, tj. relacioni operatori:
= Jednako
/= Različito
< Manje
> Veće
<= Manje ili jednako
>= Veće ili jednako
Operatori pomeranja:
Koriste se za pomeranje/rotiranje podataka. Sintaksa je sledeća: <levi operand> <operator pomeranja> <desni
operand>. Levi operand (onaj koji se pomera) mora biti 1D vektor (BIT_VECTOR, STD_LOGIC_VECTOR,
...), a desni (iznos pomeranja) INTEGER. Ako je iznos pomeranja negativan broj, izvršava se ista operacija
pomeranja, ali u suprotnom smeru. Raspoložive su sledeće operacije pomeranja:
sll logičko pomeranje ulevo (pozicije sa desne strane popunjavaju se ΄0΄)
srl logičko pomeranje udesno (pozicije sa leve strane popunjavaju se ΄0΄)
sla aritmetičko pomeranje ulevo (pozicije sa desne strane popunjavaju se krajnjim desnim bitom)
sra aritmetičko pomeranje udesno (pozicije sa leve strane popunjavaju se krajnjim levim bitom)
rol rotacija na levo
ror rotacija na desno
Prva četiri operatora obavljaju pomeranje, a poslednja dva rotiranje vektora. Kod pomeranja, gubi se onoliko
elementi za koliko pozicija se vektor pomera. Kod rotiranja, elementi se ne gube, jer se oni koji bi ˝ispali˝ iz
vektora vraćaju na drugi kraj vektora. Postoje dve varijante pomeranja: logičko i aritmetičko. Razlika je u
načinu na koji se tretiraju pozicije koje bi nakon pomeranja ostale prazne. Kod logičkog pomeranja, takve
pozicije se popunjavaju krajnjom levom vrednošću odgovarajućeg tipa (npr. za tip BIT_VECTOR to je ´0´, a za
tip STD_LOGIC_VECTOR ´X´, videti definiciju ovih tipova u sekciji 2.2.2). Aritmetičko pomeranja ulevo (sla)
ispražnjenje pozicije popunjava vrednošću krajnjeg desnog, a aritmetičko pomeranja udesno (sra) vrednošću
krajnjeg levog elementa vektora koji se pomera. Napomenimo da je VHDL u kôdu namenjenom sintezi
operatore pomeranja dozvoljeno koristiti samo nad operandima tipa BIT_VECTOR.
Primeri: Ako je BIT_VECTOR x = ˝01001˝, tada važi:
y <= x sll 2; -- y <= ˝00100˝, logičko pomeranje na levo za dve pozicije
y <= x sla 2; -- y <= ˝00111˝, aritmetičko pomeranje na levo za 2 pozicije
y <= x srl 3; -- y <= ˝00001˝, logičko pomeranje na desno za 3 pozicije
y <= x sra 3; -- y <= ˝00001˝, aritmetičko pomeranje na desno za 3 pozicije
y <= x rol 2; -- y <= ˝00101˝, rotacija na levo za 2 pozicije
y <= x ror 2; -- y <= ˝01010˝, rotacija na desno za 2 pozicije
y <= x srl -2; -- isto što i srl 2
33
Operatori konkatenacije:
Koriste se za grupisanje vrednosti. Podržani su isti tipovi podatak kao kod logičkih operacija. Postoje dva
operatora konkatenacije (nadovezivanja): & i (, , ,). Na primer:
z <= x & “10000000”; -- ako je x = ΄1΄, tada z <= ˝11000000˝
z <= (΄1΄,΄1΄,΄0΄,΄0΄,΄0΄,΄0΄,΄0΄,΄0΄); -- isto što i z <= ˝11000000˝
2.3.2 Atributi
Atributi su dodatne informacije pridružene tipovima podataka, signalima i drugim objektima deklarisanim u
VHDL kôdu. Postoje brojni predefinisani atributi, kao i mogućnost da projektant definiše svoje, korisničke
atribute. Za referenciranje atributa koristi se apostrof (˝΄˝). Na primer, notacija x΄attr se odnosi na atribut attr
tipa ili objekta x. Razmotrićemo dve grupe atribute:
- atributi vektora: sadrže informacije (vrednosti) koje se odnose na vektor
- atributi signala: služe za nadgledanje signala
Atributi vektora:
Predefinisani atributi vektora, dozvoljeni u sintezi, su:
d΄LOW vraća najmanji indeks vektora d
d΄HIGH vraća naveći indeks vektora d
d΄LEFT vraća krajnji levi indeks vektora d
d΄RIGHT vraća krajnji desni indeks vektora d
d΄LENGTH vraća veličinu (dužinu) vektora d
d΄RANGE vraća opseg vektora d
Primer: Za signal:
SIGNAL d : STD_LOGIC_VECTOR(7 DOWNTO 0);
važi:
d΄LOW=0 d΄LENGTH=8
d΄HIGH=7 d΄RANGE=(7 downto 0)
d΄LEFT=7 d΄REVERSE_RANGE=(0 to 7)
d΄RIGHT=0
34
Primer: Razmotrimo signal:
SIGNAL d : STD_LOGIC_VECTOR(0 TO 7);
Sledeće četiri LOOP naredbe su ekvivalentne i mogu se sintetizovati (brojač i uzima redom sve vrednosti
definisane pridruženim opsegom):
FOR i IN RANGE (0 TO 7) LOOP . . .
FOR i IN x΄RANGE LOOP . . .
FOR i IN RANGE (x΄LOW TO x΄HIGH) LOOP . . .
FOR i IN RANGE (0 TO x΄LENGTH-1) LOOP . . .
Za signale nabrojivog tipa raspoloživi su sledeći atributi:
d΄VAL(pos) vraća vrednost sa navedene pozicije
d΄POS(vrednost) vraća poziciju navedene vrednosti
d΄LEFTOF(vrednost) vraća vrednost sa pozicije levo od navedene vrednosti
d΄VAL(vrsta, kolona) vraća vrednost sa navedene pozicije
Primer: za korisnički definisan nabrojivi tip:
TYPE boja IS (crvena, zelena, plava, bela);
važi:
boja΄VAL(1) = zelena boja΄POS(zelena) = 1 boja΄LEFTOF(plava) = zelena
Atributi signala:
Neka je s signal. Tada važi:
s΄EVENT vraća TRUE ako se na signalu desio događaj
s΄STABLE vraća TRUE ako se na signalu nije desio događaj
s΄ACTIVE vraća TRUE ako je s = ΄1΄
s΄QUIET<vreme> vraća TRUE ako se u navedenom vremenu na signalu nije desio događaj
s΄LAST_EVENT vraća vreme proteklo od poslednjeg događaja na signalu s
s΄LAST_ACTIVE vraća vreme proteklo od kada je signal poslednji put imao vrednost s = ΄1΄
s΄LAST_VALUE vraća vrednost signala s neposredno pre poslednjeg dogadjaja
Pojam ˝događaj na signalu˝ odnosi se na promenu vrednosti signala. Većina navedenih atributa koristi se samo u
simulaciji. Za sintezu, dozvoljena su samo prva dva (΄EVENT i ΄STABLE). Pri tome, najčešće se koristi atribut
΄EVENT.
Primer: Sledeće četiri naredbe su ekvivalentne i mogu se sintetizovati. Svaka od naredbi vraća TRUE ako se na
signalu clk desio događaj (tj. ako je došlo do promene vrednosti signal clk) i nova vrednost signala je clk=΄1΄
(drugim rečima ako se javila rastuća ivica signala clk).
IF (clk΄EVENT AND clk=΄1΄) ... -- atribut EVENT u IF naredbi
IF (NOT clk΄STABLE AND clk=΄1΄) ... -- atribut STABLE u IF naredbi
WAIT UNTIL (clk΄EVENT AND clk=΄1΄); -- atribut EVENT u WAIT naredbi
IF RISING_EDGE(clk) ... -- poziv funkcije
35
Primer:
ATTRIBUTE broj_ulaza : INTEGER; -- deklaracija
ATTRIBUTE broj_ulaza OF nand3: SIGNAL IS 3; -- specifikacija
. . .
ulazi <= nand3΄broj_ulaza; -- poziv atributa, vraća 3
Primer: Nabrojivo kodiranje.
U mnogim alatima za sintezu dostupan je korisnički-definisani atribut enum_encoding, koji omogućava
promenu načina kodiranja vrednosti nabrojivih tipova podataka. Podrazumevano, nabrojivi tipovi podataka se
kodiraju sekvencijalno. Na primer, vrednosti tipa boja:
TYPE bolja IS (crvena, zelena, plava, bela)
kodirane su shodno poziciji u listi nabrajanja: crvena=˝00˝, zelena=˝01˝, plava=˝10˝ i bela=˝11˝. Atribut
enum_encoding omogućava da se podrazumevano kodiranje promeni. Na primer,
ATTRIBUTE enum_encoding OF boja: TYPE IS ˝11 00 10 01˝;
menja kodove u: crvena=˝11˝, zelena=˝00˝, plava=˝10˝ i bela=˝01˝.
Korisnički-definisani atributi mogu biti deklarisani bilo gde u kôdu, osim u telu paketa.
2.3.5 GENERIC
GENERIC je mehanizam VHDL jezika koji omogućava definisanje generalizovanih, ili generičkih parametara,
tj. statičkih parametara koji se lako mogu modifikovati ili prilagoditi različitim primenama.
36
GENERIC naredba se deklariše unutar entiteta, a navedeni parametri vidljivi su u celom projektu. Sintaksa
GENERIC naredbe je sledeća:
GENERIC (ime_parametra : tip_parametra := vrednost_parametra);
Primer: GENERIC naredba, iz VHDL kôda koji sledi, definiše parametara n tipa INTEGER sa inicijalnom
vrednošću 8. Generički parametar vidljiv je u celom projektu, tj. u entitetu i pratećim arhitekturama. Svuda u
kôdu gde se javlja parametra n, podrazumeva se da je njegova vrednost 8. Generički parametri čine kôd
fleksibilnijim i lakšim za ponovno korišćenje. Na primer, ako se javi potreba da se n promeni, to se čini samo na
jednom mestu u kôdu, u GENERIC naredbi.
ENTITY nas_entitet IS
GENERIC(n : INTEGER := 8);
PORT( . . . );
END my_entity;
ARCHITECTURE nasa_arhitetkura OF nas_entitet IS
. . .
END nasa_arhitektura;
Entite može sadržati definicije više od jednog generičkog parametra. Na primer:
GENERIC(n: INTEGER := 8; vektor: BIT_VECTOR := ˝00011100˝);
2.3.6 Primeri
U cilju potpunije ilustracije primene operatora, atributa i GENERIC konstrukcije, u ovoj sekciji biće izloženo
više kompletnih primera VHDL kôda. U dosadašnjem toku izlaganja bavili smo se isključivo osnovama VHDL
jezika, ali ne i tehnikama kôdiranja, čemu su posvećena naredna dva poglavlja. Iz tog razloga, čitaocu koji po
prvi put čita ovaj deo teksta, pojedine konstrukcije u narednim primerima mogu biti nerazumljive. Cilj primera
je ilustracija primene operatora, atributa i GENERIC naredbe. Čitaocu se preporučuje da se ponovo vrati na ove
primere nakon što prouči naredna dva poglavlja.
Pr. 2-17: Generički dekoder
Na Sl. 2-10 prikazan je blok dijagram generičkog dekodera m-u-n. Kolo ima dva ulazna porta: m-bitni ulaz za
selekciju, sel, i jednobitni ulaz za dozvolu rada, ena, i jedan izlazni port: n-to bitni izlaz x. Pretpostavićemo da je
n stepen dvojke, tako da važi m=log2n. Ako je ena=΄0΄, tada ni jedan izlaz dekodera nije aktivan; ako je
ena=΄1΄, aktivan je samo izlazni bit x(i), gde je i ceo broj jednak binarnoj vrednosti prisutnoj na ulazu sel.
Tabela istinitosti dekodera 2-u-4 data je na Sl. 2-10(b).
ena sel x
0 00 0000
1 00 0001
01 0010
10 0100
11 1000
(a) (b)
Sl. 2-10 Generički dekoder: (a) blok dijagram; (b) tabela istinitosti.
Arhitektura iz VHDL kôda koji sledi u potpunosti je generička, jer ne zavisi od konkretnih vrednosti parametara
n i m. To je omogućeno time što se u kôdu arhitekture koriste atributi signala (x'HIGH, sel'RANGE), a ne
konkretne vrednosti za granice opsega ulaznih portova. Ako želimo da kreiramo opis dekodera za neke druge
vrednosti parametara n i m, dovoljno je u entitetu promeniti opsege signala sel i x (u linijama 7 i 8, respektivno).
1 ---------------------------------------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 ---------------------------------------------
5 ENTITY dekoder IS
6 PORT ( ena : IN STD_LOGIC;
7 sel : IN STD_LOGIC_VECTOR (2 DOWNTO 0);
8 x : OUT STD_LOGIC_VECTOR (7 DOWNTO 0));
37
9 END dekoder;
10 ---------------------------------------------
11 ARCHITECTURE generic_dekoder OF dekoder IS
12 BEGIN
13 PROCESS (ena, sel)
14 VARIABLE temp1: STD_LOGIC_VECTOR (x'HIGH DOWNTO 0);
15 VARIABLE temp2 : INTEGER RANGE 0 TO x'HIGH;
16 BEGIN
17 temp1 := (OTHERS => '0' );
18 temp2 := 0;
19 IF (ena='1') THEN
20 FOR i IN sel'RANGE LOOP --opseg signala sel je (2 downto 0)
21 IF (sel(i)='1') THEN --binarno-decimalna konverzija
22 temp2 := 2*temp2+1;
23 ELSE
24 temp2 := 2*temp2;
25 END IF;
26 END LOOP;
27 temp1 (temp2):='1';
28 END IF;
29 x <= temp1;
30 END PROCESS;
31 END generic_dekoder;
32 ---------------------------------------------
U kôdu arhitekture postoji samo jedna naredba, PROCESS u okviru koje se sekvencijalnim algoritmom opisuje
rad dekodera. U suštini, u procesu se binarna vrednost prisutna na ulazu za selekciju, sel, najpre konvertuje u
celobroju vrednost (linije 18-26), koja se potom koristi kao indeks bita u izlaznom vektoru koji će biti postavljen
na 1 (linija 27). Takođe uočimo da se za izračunavanja u procesu koriste dve pomoćne varijable, temp1 i temp2.
U datom kôdu korišćeni su sledeći operatori: ˝+˝ (linija 22), ˝*˝ (linije 22 i 24), ˝:=˝ (linije 17, 18, 22, 24 i 27),
˝<=˝ (linija 29) i ˝=>˝ (linija 17) i atributi: HIGH (linije 14, 15) i RANGE (linija 20).
Na Sl. 2-10 prikazani su rezultati simulacije, koji verifikuju funkcionalnost generičkog dekodera. Kao što se
može videti, kada je ena = ΄0΄, svi izlazi su na niskom nivou, tj. x = ˝00000000˝ (decimalno 0). Ako je signal
dozvole aktiviran (ena = ΄1΄), samo jedan izlazni bit, određen vrednošću signala sel, je na visokom nivou: kada
je sel = ˝000˝ (decimalno 0), izlaz je x = ˝00000001˝, kada je sel = ˝001˝ (decimalno 1), izlaz je x = ˝00000010˝
(decimalno 2), kada je sel = ˝011˝ (decimalno 3), izlaz je x = ˝00000100˝ (decimalno 4) i td.
38
5 output: OUT BIT);
6 END detector_parnosti;
7 ---------------------------------------------
8 ARCHITECTURE parnost OF detector_parnosti IS
9 BEGIN
10 PROCESS (input)
11 VARIABLE temp: BIT;
12 BEGIN
13 temp := '0';
14 FOR i IN input'RANGE LOOP
15 temp := temp XOR input(i);
16 END LOOP;
17 output <= temp;
18 END PROCESS;
19 END parnost;
20 --------------------------------------------
Jedan od načina kako se može odrediti parnost višebitne vrednosti jeste da se nad svim bitovima primeni
operacija isključivo ILI (XOR). Deo kôda u linijama 13-16 upravo ima tu namenu. Ponovo, za izračunavanja u
procesu se koristi varijabla, temp, čija se konačna vrednost prenosi na izlaz output. Rezultati simulacije
prikazani su na Sl. 2-13. Uočimo da za ulaz input=˝00000000˝ (paran broj jedinica), izlaz ima vrednost ΄0΄. Ulaz
input=˝00000001˝ sadrži neparan broj jedinica i izlaz je ΄1΄, i td.
39
22 END parnost;
23 ----------------------------------------------
T 2-2 Atributi.
Primena Atributi Vrednost
Za regularne podatke d΄LOW najmanji indeks vektora
d΄HIGH najveći indeks vektora
d΄LEFT krajnji levi indeks vektora
d΄RIGHT krajnji desni indeks vektora
d΄LENGTH veličinu (dužinu) vektora
d΄RANGE opseg vektora
d΄REVERSE_RANGE opseg vektora u obrnutom redosledu
Za nabrojive podatke d΄VAL(pos) ● vrednost sa navedene pozicije
d΄POS(pos) ● pozicija navedene vrednosti
d΄LEFTOF(vrednost) ● vrednost sa pozicije levo od navedene vrednosti
d΄VAL(vrsta, kolona) ● vrednost sa navedene pozicije
Za signale s΄EVENT TRUE ako se na signalu desio događaj
s΄STABLE TRUE ako se na signalu nije desio događaj
s΄ACTIVE ● TRUE ako je s = ΄1΄
40
2.4 Konkurentni kôd
VHDL kôd može biti konkurentan (paralelan) ili sekvencijalan. Dobro razumevanje osobina i razlika između
ova dva tipa kôda predstavlja osnovu za razumevanje osnovnih koncepta VHDL jezika. U ovom poglavlju
bavićemo se konkurentnim kôdom, dok će sekvencijalnom biti posvećeno poglavlje 6.
Konkurentne naredbe VHDL-a su WHEN i GENERATE. Naredbe dodele koje sadrže isključivo operatore
(AND, NOT, +, *, sll i slične) takođe mogu biti korišćenje za pisanje konkurentnog kôda.
s1
a
b
b y
MUX y
c
c
d
s1 s0 d
Sl. 2-16 Multiplekser 4-u-1: (a) grafički simbol; (b) kombinaciona mreža.
Pr. 2-20 Multiplekser (varijanta 1)
Na Sl. 2-16(a) prikazan je grafički simbol multipleksera 4-u-1. Vrednost selekcionih ulaza (s1, s0) bira jedan od
ulaza, a, b, c ili d čija se vrednost prenosi na izlaz y. Realizacija multipleksera 4-u-1 pomoću logičkih kola
prikazana je na Sl. 2-16(b). Funkcija multipleksera se može opisati u VHDL-u u vidu logičkog izraza na sledeći
način:
1 ---------------------------------------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 ---------------------------------------------
5 ENTITY mux IS
6 PORT ( a,b,c,d,s0,s1 : IN STD_LOGIC;
7 y : OUT STD_LOGIC);
8 END mux;
9 ---------------------------------------------
10 ARCHITECTURE logicka_realizacija OF mux IS
11 BEGIN
12 y <= (a AND NOT s1 AND NOT s0) OR
41
13 (b AND NOT s1 AND s0) OR
14 (c AND s1 AND NOT s0) OR
15 (d AND s1 AND s0);
16 END logicka_realizacija;
---------------------------------------------
Pored konkurentne naredbe dodele, signal <= izraz , često je u upotrebi i njena varijanta sa odloženim dodelom:
signal <= izraz after kašnjenje. Na primer:
a <= b AND c after 10 ns;
Kao i bez ubačenog kašnjenja, naredba se izvršava u trenutku kada se promeni neki od signala b ili c. Međutim,
vrednost izraza b AND c, koja se tom prilikom izračuna, ne dodeljuje se signalu a istog trenutka, već posle
(after) kašnjenja od 10 ns. Ovaj oblik naredbe dodele koristi se u simulaciji za modeliranje propagacionog
kašnjenja ili kreiranje pobudnih signala željenog talasnog oblika. Prethodni primer modelira I kolo sa
propagacionim kašnjenje od ulaza do izlaza od 10 ns. U kôdu za sintezu, nije dozvoljeno koristiti kašnjenja.
2.4.3 WHEN
Naredba WHEN, u suštini, predstavlja uopštenje konkurentne naredbe dodele. Za razliku od standardne naredba
dodele, kod koje se sa desne strane znaka <= može naći sam jedan izraz, naredba WHEN omogućava da se sa
desne strane znaka <= nađe više od jednog izraza. Svakom takvom izrazu pridružuje se uslov, a jedinstveni
signal sa leve strane znaka <= dobija vrednost onog izraza čiji uslov je ispunjen, tj. tačan. Postoje dva oblika
uslovne naredbe dodele: WHEN/ELSE (ili uslovna naredba dodele) i WITH/SELECT/WHEN (ili SELECT
naredba). Njihova sintaksa je sledeća:
WHEN/ELSE naredba:
signal <= izraz WHEN uslov ELSE
izraz WHEN uslov ELSE
...
izraz;
WITH/SELECT/WHEN naredba:
WITH selekcioni_izraz SELECT
signal <= izraz WHEN vrednost,
izraz WHEN vrednost,
...
izraz WHEN vrednost;
U prvoj varijanti (WHEN/ELSE), naredba se izvršava tako što se redom ispituju uslovi, sve dok se ne dođe do
WHEN grane sa tačnim uslovom. Onda se izračunava vrednost odgovarajućeg izraza i dodeljuje signalu sa leve
strane znaka <=. Ako ni jedan uslov nije tačan, bira se izraz iz poslednje grane. U drugoj varijanti
(WITH/SELECT/WHEN), najpre se izračuna vrednost izraza iz zaglavlja naredbe (selekcioni_izraz); zatim se
ova vrednost poredi sa vrednostima iz svih WHEN grana (istovremeno); i konačno, signalu se dodeljuje
vrednost izraz iz grane u kojoj se javilo slaganje. Ova varijanta zahteva da svaki mogući rezultat selekcionog
izraza bude pokriven tačno jednom WHEN vrednošću. Takođe, dozvoljeno je korišćenje ključne reči OTHERS
da bi se označio izraz koji će biti izvršen ako se rezultat selekcionog izraza ne poklapa ni sa jednom eksplicitno
navedenom vrednošću:
WITH selekcioni_izraz SELECT
signal <= izraz WHEN vrednost,
izraz WHEN vrednost,
...
izraz WHEN OTHERS;
˝WHEN vrednost˝ iz naredbe WITH/SELECT/WHEN može biti navedena na tri načina:
WHEN vrednost -- jedinstvena vrednost
WHEN vrednost_1 to vrednost_2 -- opseg vrednosti (samo kod
-- nabrojivih tipova)
WHEN vrednost_1 | vrednost_2 | vrednost_3 ... -- vrednost_1 ili vrednost_2
-- ili vrednost_3 ili ...
Primer:
--------- WHEN/ELSE ---------------------------
outp <= “000” WHEN (inp=΄0΄ OR reset=΄1΄) ELSE
“001” WHEN ctl=΄1΄ ELSE
“010”;
42
--------- WITH/SELECT/WHEN --------------------
WITH contol SELECT
outp <= “000” WHEN “00”
“111” WHEN “01” | “10”
“010” WHEN OTHERS;
43
11 ARCHITECTURE mux1 OF mux IS
12 BEGIN
13 y <= a WHEN sel = 0 ELSE
14 b WHEN sel = 1 ELSE
15 c WHEN sel = 2 ELSE
16 d;
17 END mux1;
18 -- Resenje 2: koristi WITH/SELECT/WHEN naredbu -----
19 ARCHITECTURE mux2 OF mux IS
20 BEGIN
21 WITH sel SELECT
22 y <= a WHEN 0,
23 b WHEN 1,
24 c WHEN 2,
25 d WHEN 3; -- 3 ili OTHERS ima isti efekat
26 END mux2;
27 ----------------------------------------------------
Napomena: Prethodni kôd sadrži dve arhitekture za isti entitet. Međutim, moguće je sintetizovati ili simulirati
samo jedno rešenje. Da bi kôd bio korektan potrebno je na neki način izabrati jednu od raspoloživih alternativa.
Jedan način je da se sve osim jedne arhitekture komentarišu. Drugi načni koristi naredbu CONFIGURATION
koja saopštava simulatoru ili alatu za sintezu koju od postojećih arhitektura da izabere.
e d1 d0 y3 y2 y1 y0
d0 y0
d1 y1 1 0 0 0 0 0 1
Dekoder 1 0 1 0 0 1 0
2-u-4 y2
1 1 0 0 1 0 0
e y3 1 1 1 1 0 0 0
0 X X 0 0 0 0
(a) (b)
Sl. 2-17 Dekoder 2-u-4: (a) grafički simbol; (b) tabela istinitosti.
Pr. 2-22 Dekoder 2-u-4
Na Sl. 2-17 su prikazani grafički simbol i tabela istinitosti binarnog dekodera 2-u-4. Kolo ima 2 ulaza za binarno
kodirani podatak, d0 i d1, i 4 izlaza, yi, i=0, …, 3, pri čemu svakom izlazu odgovara jedna kombinacija binarnih
vrednosti na ulazu. Dodatni ulaz za dozvolu rada, e, upravlja izlazom dekodera na sledeći način: ako je e=0,
tada ni jedan izlaz dekodera nije aktivan; ako je e=1, aktivan je samo izlaz yi, gde je i ceo broj jednak binarnoj
vrednosti ulaza (d1, d0).
U tabeli istinitosti dekodera 2-u-4 sa Sl. 2-17, ulazi su navedeni u redosledu: e, d1, d0. Da bi se u VHDL kodu
predstavila ova tri signala, deklarisan je trobitni signal ed. U naredbi ed<=e&d, uz pomoć operatora
konkatenacije, signali e i d su spojeni u jedinstveni signal ed, tako da važi: ed(2)=e, ed(1)= d1, ed(0)=d0. Signal
ed se koristi kao kriterijum izbora u WITH/SELECT/WHEN naredbi. Za prve četiri WHEN grane važi da je
e=1, tako da izlazi dekodera imaju iste vrednosti kao prve četiri vrste u tabeli istinitosti sa Sl. 2-17. Poslednja
WHEN grana sadrži ključnu reč OTHERS, što odgovara slučaju kada je e=0, i postavlja izlaz dekodera na
y=˝0000˝.
1 ---------------------------------------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 ---------------------------------------------
5 ENTITY dek2u4 IS
6 PORT (d : IN STD_LOGIC_VECTOR(1 DOWNTO 0);
7 e : IN STD_LOGIC;
8 y : OUT STD_LOGIC_VECTOR(0 TO 3));
9 END dek2u4;
10---------------------------------------------
11 ARCHITECTURE dekoder OF dek2u4 IS
12 SIGNAL ed : STD_LOGIC_VECTOR(2 DOWNTO 0);
13 BEGIN
14 ed <= e & d;
15 WITH ed SELECT
16 y <= "1000" WHEN "100",
17 "0100" WHEN "101",
18 "0010" WHEN "110",
19 "0001" WHEN "111",
20 "0000" WHEN OTHERS;
21 END dekoder;
44
Sl. 2-18 8-bitni trostatički bafer.
Pr. 2-23 Trostatički bafer
Trostatički bafer je digitalno kolo koje prenosi signal sa ulaza na izlaz uz mogućnost postavljanja izlaza u stanje
visoke impedanse. Na Sl. 2-18 je prikazan 8-bitni trostatički bafer, kod koga važi output=input, za ena=´0´; u
suprotnom, za ena=´1´, važi output=˝ZZZZZZZZ˝ (visoka impedansa). Sledi VHDL opis 8-bitnog trostatičkog
bafera.
1 ---------------------------------------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 ---------------------------------------------
5 ENTITY tri_state IS
6 PORT (ena : IN STD_LOGIC;
7 input : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
8 output : OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
9 END tri_state;
10 ---------------------------------------------
11 ARCHITECTURE tri_state OF tri_state IS
12 BEGIN
13 output <= input WHEN (ena = '0') ELSE
14 (OTHERS => 'Z');
15 END tri_state;
16 ---------------------------------------------
Dekoder
3 2 1 0
11 10 01 00
45
1 ---------------------------------------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 ---------------------------------------------
5 ENTITY mux IS
6 PORT ( a,b,c,d : IN STD_LOGIC;
7 sel: IN STD_LOGIC_VECTOR(1 DOWNTO 0);
8 y : OUT STD_LOGIC);
9 END mux;
10---------------------------------------------
11 ARCHITECTURE mux3 OF mux IS
12 BEGIN
13 y <= a WHEN sel = "00" ELSE 'Z';
14 y <= b WHEN sel = "01" ELSE 'Z';
15 y <= c WHEN sel = "10" ELSE 'Z';
16 y <= d WHEN sel = "11" ELSE 'Z';
17 END mux3;
---------------------------------------------
46
1 -- Resenje 2: koristi WITH/SELECT/WHEN naredbu
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 ---------------------------------------------
5 ENTITY encoder IS
6 PORT ( x : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
7 y : OUT STD_LOGIC_VECTOR(2 DOWNTO 0));
8 END encoder;
9 ---------------------------------------------
10 ARCHITECTURE encoder2 OF encoder IS
11 BEGIN
12 WITH x SELECT
13 y <= "000" WHEN "00000001",
14 "001" WHEN "00000010",
15 "010" WHEN "00000100",
16 "011" WHEN "00001000",
17 "100" WHEN "00010000",
18 "101" WHEN "00100000",
19 "110" WHEN "01000000",
20 "111" WHEN "10000000",
21 "ZZZ" WHEN OTHERS;
22 END encoder2;
23---------------------------------------------
Primetimo da WHEN naredba sadrži relativno veliki broj linija (linije 12-20 u rešenju 1, odnosno linije 13-21 u
rešenju 2). S obzirom da svaka linija definiše izlaznu vrednost za jednu konkretnu ulaznu kombinaciju, ovakav
način opisivanja kodera je nepraktičan za n veće od četiri. U takvim slučajevima kompaktniji opis se postiže
korišćenjem naredbe GENERATE (sekcija 2.4.4 ) ili LOOP (sekcija 2.5.6).
Rezultati simulacije prikazani su na Sl. 2-23. Uočimo da su vrednosti signala prikazane u heksadecimalnoj
notaciji. Signal x, čija je dužina 8 bita, predstavlja se sa dve, a signal y, dužine 3 bita, jednom heksadecimalnom
cifrom. Na primer, heksadecimalnoj vrednosti 80 odgovara binarna vrednost ˝10000000˝. Primetimo, takođe, da
je za x=˝00000000˝, izlaz u stanju visoke impedanse. To je iz razloga što sve nule na ulazu nisu dozvoljena
pobuda kodera. Rezultati simulacije su identični za obe varijante VHDL kôda kodera 8-u-3.
47
U nastavku su date dve realizacije prioritetnog kodera u VHDL-u. Prva koristi WHEN/ELSE, a druga
WITH/SELECT/WHEN naredbu.
1 -------Resenje 1 ----------------------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 ---------------------------------------------
5 ENTITY pencoder IS
6 PORT (x : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
7 y : OUT STD_LOGIC_VECTOR(2 DOWNTO 0);
8 z : OUT STD_LOGIC);
9 END pencoder;
10---------------------------------------------
11 ARCHITECTURE pencoder1 OF pencoder IS
12 BEGIN
13 y <= "111" WHEN x(7) = '1' ELSE
14 "110" WHEN x(6) = '1' ELSE
15 "101" WHEN x(5) = '1' ELSE
16 "100" WHEN x(4) = '1' ELSE
17 "011" WHEN x(3) = '1' ELSE
18 "010" WHEN x(2) = '1' ELSE
19 "001" WHEN x(1) = '1' ELSE
20 "000";
21 z <= '0' WHEN x = "00000000" ELSE '1';
22 END pencoder1;
23---------------------------------------------
Naredba WHEN/ELSE nalaže da se signalu y dodeli vrednost ˝111˝ kada je ulaz x(7)= ´1´. Ako je ovaj uslov
ispunjen, tada preostale WHEN grane nemaju uticaj na vrednost izlaznog signala y. Druga WHEN grana nalaže
da se signalu y dodeli vrednost ˝110˝ ako je x(6)=´1´. Ovo može da se desi samo ako je x(7)= ´0´. Svaka sledeća
WHEN grana može da utiče na y samo ako ni jedan od uslova iz prethodnih WHEN konstrukcija nije tačan.
Drugim rečima, najviši prioritet ima ulaz x(7), zatim x(6), sve do x(0), koji je najnižeg prioriteta. Na ovaj način,
ostvarena je funkcija prioritetnog kodera. Druga naredba WHEN/ELSE koja postoji u kôdu definiše vrednost
signala z. Ako su svi ulazi 0, tada z ima vrednost 1; inače, signalu z se dodeljuje vrednost 0. Rezultat simulacije
prikazan je na Sl. 2-25. Primetimo da je talasni oblik signala x prikazan na dva načina, najpre kao vektor
(magistrala), a potom u razvijenom obliku, svaki bit pojedinačno. Vrednost signala y, predstavljena u vidu
decimalnog broja ukazuje na indeks ulaza najvišeg prioriteta čija je vrednost jednaka 1.
Sl. 2-25 Rezultati simulacije VHDL kôda prioritetnog kodera iz Pr. 2-26
Nivoi prioriteta pridruženi WHEN granama predstavljaju ključnu razliku između naredbe WHEN/ELSE i
naredbe WITH/SELECT/WHEN, kod koje prioriteti ne postoje. Napomenimo da je prioritetni koder moguće
opisati i pomoću naredbe WITH/SELECT/WHEN, ali će u tom slučaju VHDL kôd biti opširniji i manje
razumljiv. Na primer, u nepotpunoj arhitektura datoj ispod, pokazano je kako se prioritetnog kôdera može
realizovati naredbom WITH/SELECT/WHEN. Prva WHEN grana postavlja y na ˝000˝ pod uslovom da je x(0)
jedini ulaz koji je jednak ´1´. Sledeće dve WHEN grane kazuju da y treba biti ˝001˝ kada je x(7) =x(6)= …
=x(2)= ´0´ i x(1) =´1´. Sledeće četiri WHEN grane definišu uslove pod kojima je vrednost izlaznog signala y
48
jednaka ˝010˝, tj. y=˝010˝ ako je x(7) =x(6)= … =x(3)=´ 0´ i x(2)=´ 1´, bez obzira na vrednost x(1) i x(0).
Konačno, poslednja WHEN grana kaže da u svim ostalim slučajevima, što uključuje i slučaj kada je x(7) =´1´, y
treba biti ˝111˝. Uočimo da WHEN OTHERS konstrukcija obuhvata i ulaznu kombinaciju “00000000”, što
znači da će u tom slučaju izlaz y biti postavljen na ˝111˝. Međutim, kako sve nule na ulazu postavljaju z=´0´, to
u ovom slučaju vrednost izlaza y nije bitna. Primetimo da je napisana u celosti, WITH/SELECT/WHEN naredba
bi sadržala ukupno 127 grana!
---------------------------------------------
ARCHITECTURE pencoder2 OF pencoder IS
BEGIN
WITH x SELECT
y <= "000" WHEN "00000001",
"001" WHEN "00000010",
"001" WHEN "00000011",
"010" WHEN "00000100",
"010" WHEN "00000101",
"010" WHEN "00000110",
"010" WHEN "00000111",
"011" WHEN "00001000",
. . .
"110" WHEN "01111111",
"111" WHEN OTHERS;
WITH x SELECT
z <= '0' WHEN "00000000",
'1' WHEN OTHERS;
END pencoder2;
---------------------------------------------
Pr. 2-27 ALU
Aritmetičko-logička jedinica (ili ALU prema engleskom nazivu Arithmetic and Logic Unit) je višefunkcijsko,
kombinaciono kolo koje može da obavi bilo koju od više različitih aritmetičkih i logičkih operacija nad parom
b-bitnih operanada. Na Sl. 2-26(a) je prikazan blok dijagram, a na Sl. 2-26(b) tabela istinitosti jedne jednostavne
8-bitne ALU koja podržava osam aritmetičkih i osam logičkih operacija. Izbor između aritmetičkih i logičkih
operacija vrši se bitom najveće težine 4-bitnog selekcionog signala sel. Preostala tri bita signala sel biraju jednu
od osam operacija iz svake grupe. Sledi VHDL kôd opisane ALU zasnovan na korišćenju
WITH/SELECT/WHEN naredbe.
sel Operacija Funkcija Jedinica
0000 y <= a Transfer a
0001 y <= a + 1 Inkrement a
0010 y <= a - 1 Dekrement a
0011 y <= b Transfer b
Aritmetička
0100 y <= b + 1 Inkrement b
0101 y <= b - 1 Dekrement b
0110 y <= a + b Sabiranje a i b
0111 y <= a+b + cin Sabiranje a i b sa ul. pren.
1000 y <= NOT a Komplement a
1001 y <= NOT b Komplement b
1010 y <= a AND b I
1011 y <= a OR b ILI
Logička
1100 y <= a NAND b NI
1101 y <= a NOR b NILI
1110 y <= a XOR b Iskljucivo ILI
1111 y <= a NXOR b Iskljucivo NILI
(a) (b)
Sl. 2-26 ALU: (a) Blok dijagram; (b) tabela istinitosti.
1 ---------------------------------------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 USE ieee.std_logic_unsigned.all;
5 ---------------------------------------------
6 ENTITY ALU IS
7 PORT (a,b : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
49
8 sel : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
9 cin : IN STD_LOGIC;
10 y : OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
11 END ALU;
12---------------------------------------------
13 ARCHITECTURE dataflow OF ALU IS
13 SIGNAL arith, logic : STD_LOGIC_VECTOR(7 DOWNTO 0);
15 BEGIN
16 --- Aritmeticka jedinica -----------------
17 WITH sel(2 DOWNTO 0) SELECT
18 arith <= a WHEN "000",
19 a+1 WHEN "001",
20 a-1 WHEN "010",
21 b WHEN "011",
22 b+1 WHEN "100",
23 b-1 WHEN "101",
24 a+b WHEN "110",
25 a+b+cin WHEN OTHERS;
26--- Logicka jedinica -----------------
27 WITH sel(2 DOWNTO 0) SELECT
28 logic <= NOT a WHEN "000",
29 NOT b WHEN "001",
30 a AND b WHEN "010",
31 a OR b WHEN "011",
32 a NAND b WHEN "100",
33 a NOR b WHEN "101",
34 a XOR b WHEN "110",
35 NOT (a XOR b) WHEN OTHERS;
36--- Mux ------------------------------
37 WITH sel(3) SELECT
38 y <= arith WHEN '0',
39 logic WHEN OTHERS;
40 END dataflow;
41---------------------------------------------
Organizacija VHDL kôda usklađena je sa strukturom ALU (Sl. 2-26(a)). Svakom bloku sa Sl. 2-26(a) odgovara
jedna WITH/SELECT/WHEN naredba. Kao što tri bloka u realnoj ALU (Logicka jedinica, Aritmeticka jedinica
i Mux) rade paralelno, tako se i tri WHEN naredbe u odgovarajućem VHDL kôdu izvršavaju konkurentno. Za
spregu konkurentnih sekcija kôda koriste se dva interna signala, arith i logic, koji odgovaraju vezama između
blokova Logicka jedinica i Mux, odnosno Aritmeticka jedinica i Mux u strukturi sa Sl. 2-26(a).
Takođe, treba uočiti da se u prezentovanom kôdu koristi isti tip podataka (STD_LOGIC_VECTOR) za
obavljanje aritmetičkih i logičkih operacija. Ovo je omogućeno prisustvom paketa std_logic_unsigned iz
biblioteke ieee (linija 4).
2.4.4 GENERATE
GENERATE je još jedna konkurentna naredba. Postoje dva oblika ove naredbe: FOR/GENERATE i
IF/GENERATE. FOR/GENERATE konstrukcija je ekvivalentna sekvencijalnoj naredbi LOOP (sekcija 2.5.6) u
smislu da omogućava da se deo konkurentnog kôda ponovi više puta i na taj način kreira više instanci istog
skupa naredbi dodele. IF/GENERATE (ekvivalentna sekvencijalnoj IF naredbi (sekcija 2.5.3) omogućava
uslovno kreiranje obuhvaćenog konkurentnog kôda. Sintaksa dva oblika GENERATE naredbe je sledeća:
FOR/GENERATE:
labela: FOR brojac IN opseg GENERATE
(konkurentne naredbe dodele)
END GENERATE;
IF/GENERATE:
labela: IF uslov GENERATE
(konkurentne naredbe dodele)
END GENERATE;
Svaka GENERATE naredba, u obe varijante, mora biti označena jedinstvenom labelom. Opseg kod
FOR/GENERATE kao i uslov kod IF/GENERATE moraju biti statički (konstantni) izrazi. Dozvoljeno je
50
ugnježdavanje GENERATE naredbi. Na primer, IF/GENERATE konstrukcija se može naći unutar
FOR/GENERATE konstrukcije:
labela1: FOR brojac IN opseg GENERATE
...
labela2: IF uslov GENERATE
(konkurentne naredbe dodele)
END GENERATE;
...
END GENERATE;
Takođe, dozvoljeno je unutar IF/GENERATE umetnuti FOR/GENERATE konstrukciju.
Primer:
SIGNAL x: BIT_VECTOR(7 DOWNTO 0);
SIGNAL y: BIT_VECTOR(15 DOWNTO 0);
SIGNAL z: BIT_VECTOR(7 DOWNTO 0);
. . .
G1: FOR i IN x’RANGE GENERATE
z(i) <= x(i) AND y(i+8);
END GENERATE;
FOR/GENERATE konstrukcija, iz prethodnog VHDL kôdu, za svaku vrednost brojača i iz opsega 0 do 7 kreira
jednu instancu obuhvaćene naredbe dodele. Možemo smatrati da FOR/GENERATE predstavlja koncizan zapis
sledećeg kôda:
z(0) <= x(0) AND y(0+8);
z(1) <= x(1) AND y(1+8);
z(2) <= x(2) AND y(2+8);
z(3) <= x(3) AND y(3+8);
z(4) <= x(4) AND y(4+8);
z(5) <= x(5) AND y(5+8);
z(6) <= x(6) AND y(6+8);
z(7) <= x(7) AND y(7+8);
Prilikom korišćenja FOR/GENERATE naredbe treba voditi računa da ne dođe do višestrukog pobuđivanja
signala. Na primer, kôd:
OK: FOR i IN 0 TO 7 GENERATE
output(i) <= ‘1’ WHEN (a(i) AND b(i))=’1’ ELSE ‘0’;
END GENERATE
je korektan (svaka instanca naredbe dodele dodeljuje vrednost nekom drugom bitu višebitnog signala output).
Međutim, kôd:
NotOK: FOR i IN 0 TO 7 GENERATE
output <= ˝11111111˝ WHEN (a(i) AND b(i))=’1’ ELSE ˝00000000˝;
END GENERATE
ili kôd
NotOK: FOR i IN 0 TO 7 GENERATE
accum <= accum + 1 WHEN (x(i) =’1’);
END GENERATE
su neispravni zato što se istom signalu (output, odnosno accum) dodeljuje vrednost više puta u petlji.
Pr. 2-28 Pomerač
Projektujemo kombinaciono kolo na čijem se izlazu generiše pomerena verzija ulaznog vektora. Izlazni vektor,
outp, je duplo duži od ulaznog, inp, a iznos pomeraja se zadaje preko posebnog ulaza, sel. Za primer, ako je
ulazni vektor 4-bitni, i ima vrednost ˝1111˝, tada, u zavisnosti od vrednosti selekcionog ulaza sel, izlaz može biti
jedan o sledećih 5 8-bitnih vektora (pozicije ulaznog u izlaznom vektoru su podvučene):
out = row(0) = 00001111 -- sel = 0
out = row(1) = 00011110 -- sel = 1
out = row(2) = 00111100 -- sel = 2
out = row(3) = 01111000 -- sel = 3
out = row(4) = 11110000 -- sel = 4
51
Kao što možemo videti, pozicije u izlaznom vektoru, koje nisu zauzet ulaznim vektorom jednake su ´0´. Takođe,
uočimo da se, u prikazanoj šemi, prva mogućnost (sel=1) dobija nadovezivanjem ˝0000˝ i ulaznog vektora, a da
je svaka sledeća mogućnost pomerena za jedu poziciju na levo u odnosu na prethodnu.
Odgovarajući VHDL kôd data je ispod. Princip rešenja je sledeći: deklarisana je matrica row dimenzija 5x8 čije
se vrste, row(i), i=0, .., 4, pomoću GENERATE naredbe, popunjavaju shodno gornjoj šemi, a na izlaz out se
prosleđuje vrsta matrice indeksirana ulazom sel.
1 ---------------------------------------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 ---------------------------------------------
5 ENTITY pomerac IS
6 PORT ( inp : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
7 sel : IN INTEGER RANGE 0 TO 4;
8 outp: OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
9 END pomerac;
10---------------------------------------------
11 ARCHITECTURE pomerac OF pomerac IS
12 SUBTYPE vector IS STD_LOGIC_VECTOR(7 DOWNTO 0);
13 TYPE matrix IS ARRAY(4 DOWNTO 0) OF vector;
14 SIGNAL row : matrix;
15 BEGIN
16 row(0) <= "0000" & inp;
17 G1: FOR i IN 1 TO 4 GENERATE
18 row(i) <= row(i-1)(6 DOWNTO 0) & '0';
19 END GENERATE;
20 outp <= row(sel);
21 END pomerac;
22---------------------------------------------
2.5.1 PROCESS
PROCESS predstavlja sekvencijalnu sekciju VHDL kôda. VHDL projekat može sadržati proizvoljan broj
procesa, ali svi oni moraju biti smešteni u arhitekturi u glavnom kôdu, tj. ne mogu biti deo paketa/biblioteke.
Konstrukcija PROCESS ima sledeću sintaksu (opcioni delovi sintakse obuhvaćeni su uglastim zagradama):
[labela:] PROCESS (lista senzitivnosti)
[VARIABLE ime tip [opseg] [:= inicijalna_vrednost]]
BEGIN
(sekvencijalni kôd)
END PROCESS [labela];
Konstrukcija PROCESS počinje ključnom rečju PROCESS, nakon koje sledi tzv. lista senzitivnosti. Lista
senzitivnosti sadrži spisak ulaznih signala na koje je proces senzitivan (osetljiv), tj. na koje proces reaguje.
Promena vrednosti bilo kog signala iz liste senzitivnosti aktivira proces. Nakon aktiviranja, naredbe iz dela
sekvencijalni kôd se izvršavaju jedna za drugom. Nakon što se izvrši i poslednja naredba, proces se deaktivira, i
ostaje neaktivan sve do ponovnog aktiviranja. Varijable su opcione. Ako se koriste, moraju biti deklarisane u
deklarativnom delu procesa (pre ključne reči BEGIN). Prilikom deklaracije, varijabli se može dodeliti inicijalna
vrednost. Međutim, inicijalne vrednosti varijabli su podržane samo u simulaciji, ali ne i u sintezi VHDL kôda.
Takođe opciono, proces može biti označen labelom, kojom započinje i kojom se završava PROCESS
konstrukcija.
52
Procesi se koriste za opis ponašanja kako sekvencijalnih tako i kombinacionih kola. Za kombinaciona kola, lista
senzitivnosti procesa sadrži sve ulazne signale kola. Za sekvencijalna kola, lista senzitivnosti sadrži signal takta
i asinhrone ulaze, ali ne i sinhrone ulaze kola. Sledeći primer ilustruje korišćenje konstrukcije PROCESS na
primeru D flip-flopa sa asinhronim resetovanjem.
53
najpre biti dodeljena nekom globalnom signalu. Sa druge strane, ažuriranje varijable je trenutno: kao i kod
programskih jezika, nakon izvršene naredbe dodele, varijabla trenutno dobija novu vrednost, koja se može
koristiti već u sledećoj liniji kôda. To nije slučaj sa signalima (kada se koriste u procesu). Dodela vrednosti
signalu, obavljena unutar procesa, odlaže se do trenutka završetka tekućeg izvršenja procesa. To znači da u toku
izvršenja procesa, signali zadržavaju vrednosti koje su imali u trenutku aktiviranja procesa, a novu vrednost
dobijaju tek nakon deaktiviranja procesa. Ako se unutar procesa signalu više puta dodeljuje vrednost, samo
poslednja dodela ima vidljiv efekat. Konačno, podsetimo se da za signale koristi operator dodele ˝<=˝ , a za
varijable ˝:=˝.
2.5.3 IF
Kao što je ranije pomenuto, za kreiranje sekvencijalnog kôda koriste se naredbe: IF, WAIT, CASE i LOOP.
Sintaksa IF naredbe je sledećeg oblika:
IF uslov THEN dodela;
ELSIF uslov THEN (sekvencijane naredbe);
. . .
ELSE (sekvencijane naredbe);
END IF;
IF naredba počine ključnom rečju IF, završava se rečima END IF i sadrži dve opcione klauzule, ELSIF i ELSE.
ELSIF se može ponoviti proizvoljan broj puta, a ELSE samo jedanput. IF i ELSIF grane sadrže uslove koji
predstavljaju logičke izraze (tj. izraze čiji rezultat može biti samo tačno ili netačno). Naredba radi tako što se
redom ispituju uslovi sve dok se ne naiđe na granu čiji je uslov tačan, a onda se redom izvršavaju sve
sekvencijalne naredbe obuhvaćene tom granom. Ako ni jedan uslov nije tačan, izvršiće se ELSE grana (ako
postoji); ako ni jedan uslov nije tačan i ELSE grana ne postoji, IF naredba neće imati nikakav efekat. U svakoj
grani IF naredbe može se naći proizvoljan broj sekvencijalnih naredbi, uključujući i druge IF naredbe.
Primer:
IF(x<y) THEN
v := “11111111”;
w := ‘1’;
ELSIF(x=y) THEN
v:=”11110000”;
w := ‘0’;
ELSE
v:=(OTHERS => ‘0’);
w := ‘1’;
END IF;
54
13 PROCESS(clk)
14 VARIABLE var : INTEGER RANGE 0 TO 10;
15 BEGIN
16 IF(clk'EVENT AND clk='1') THEN
17 var := var + 1;
18 IF(var=10) THEN var := 0;
19 END IF;
20 END IF;
21 count <= var;
22 END PROCESS;
23 END counter;
24---------------------------------------------
Napomenimo da, u smislu sinteze, gornji opis nije u potpunosti korektan, jer ne poseduje reset ulaz ili neki drugi
način za postavljanje početne vrednosti brojača. Po uključenju napajanja, stanje fizičkog flip-flopa je
proizvoljno (može biti 0 ili 1, ali unapred ne znamo koje). Zbog toga, može se desiti da na početku rada
sintetizovani brojač ne krene od 0, već od stanja koje može biti i jedno od nedozvoljenih (11, 12, .., 15). U
nekim primenama to ne mora biti problem, jer će se brojač posle konačnog boja taktova svakako vratiti na
početak, tj. 0. Ipak, uobičajena je praksa da sekvencijalna kola poseduju ulaz za resetovanje, koji omogućava da
se na početku rada kolo postavi u poznato početno stanje i na taj način pripremiti za normalni rad. Napomenimo
još i to da se problem nepredvidljivog početnog ponašanja ne može otkriti simulacijom kôda, s obzirom da se u
simulaciji sve INTEGER varijable inicijalno postavljaju na vrednost 0. Problemi ovog tipa se lakše uočavaju u
simulaciji ako se umesto signala tipa INTEGER koriste signali tipa STD_LOGIC, kod kojih je podrazumevana
inicijalna vrednost ´X´ (nepoznata vrednost). Operacija kao što je var := var + 1 za var=’X’ daje takođe ´X´, što
se u vremenskom dijagramu manifestuje kao neprekidna prava linija što jasno ukazuje na problem izostanka
pravilne inicijalizacije.
d q
D FF D FF D FF D FF
clk
rst
Sl. 2-29 4-bitni pomerački registar
Pr. 2-31 Pomerački registar
Na Sl. 2-29 je prikazana struktura 4-bitnog pomeračkog registra sa asinhronim resetovanjem. Informacija se
unosi u registar serijski (tj. bit-po-bit) preko ulaza d. Na svaku rastuću ivicu takta, clk, sadržaj svakog D flip-
flopa se prenosi u sledeći flip-flop. To znači da se informacija sa ulaza d pojavljuje na izlazu prvog flip-flopa
jedan taktni period kasnije, na izlazu drugog flip-flopa dva taktna perioda kasnije i td. Sledi VHDL opis
pomeračkog registra sa Sl. 2-29.
1 ---------------------------------------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 ----------------------------------------------
5 ENTITY pomreg IS
6 GENERIC (n : INTEGER := 4); -- broj razreda
7 PORT ( d,clk,rst: IN STD_LOGIC;
8 q: OUT STD_LOGIC);
9 END pomreg;
10----------------------------------------------
11 ARCHITECTURE RTL OF pomreg IS
12 SIGNAL reg : STD_LOGIC_VECTOR(n-1 DOWNTO 0);
13 BEGIN
14 PROCESS (clk, rst)
15 BEGIN
16 IF(rst='1') THEN
17 reg <= (OTHERS => '0');
18 ELSIF(clk'EVENT AND clk='1') THEN
19 reg <= d & reg(reg'LEFT DOWNTO 1);
20 END IF;
21 END PROCESS;
22 q <= reg(0);
23 END RTL;
24----------------------------------------------
55
Za memorisanje sadržaja registra koristi se signal reg. Ispravno rešenje bilo bi i ono kod koga bi se umesto
signala, za memorisanje sadržaja registra koristila varijabla deklarisana u procesu, slično kao u prethodnom
primeru. Obratimo pažnju kako je u procesu realizovana funkcija pomeranja (linija 19). Novi sadržaj registra se
formira nadovezivanjem (operacija &) vrednosti ulaza d i tekućeg sadržaja registra, počev od krajnjeg levog bita
do pretposlednjeg bita. Takođe, primetimo da se prenos stanja krajnjeg desnog flip-flopa (reg(0)) ne izlazni port
q obavlja naredbom dodele (linija 22) koja je izvan procesa. U suštini, proces (linije 14-21) i naredba dodele
(linija 22) rade konkurentno. Proces se aktivira na svaku promenu ulaznih signala clk i rst da bi odredio novi
sadržaj signala reg. Naredba dodele ˝neprekidno˝ i nezavisno od procesa, prenosi vrednost reg(0) na izlaz q.
2.5.4 WAIT
Kao što već znamo, proces koji ima listu senzitivnosti se uvek suspenduje nakon izvršenja svoje poslednje
sekvencijalne naredbe. Naredba WAIT predstavlja alternativni način za suspenziju izvršenja procesa. Postoje tri
osnovna oblika WAIT naredbe:
WAIT UNTIL uslov;
WAIT ON signal1 [, signal2, …];
WAIT FOR vreme;
Šta više, ako se u procesu koristi WAIT naredba, lista senzitivnosti mora biti izostavljena.
WAIT naredba vodi proces u suspendovano stanje. Uslov pod kojim proces nastavlja izvršenje, određen je
oblikom WAIT naredbe. Kod WAIT UNTIL varijante, proces ostaje suspendovan sve dok uslov sadržan u
naredbi ne postane tačan.
Pr. 2-32 8-bitni registar sa sinhronim resetovanjem
PROCESS
BEGIN
WAIT UNTIL(clk’EVENT AND clk=’1’);
IF(rst = ‘1’) THEN
out <= “00000000”;
ELSIF (clk’EVENT AND clk=’1’) THEN
out <= input;
END IF;
END PROCESS;
Nailaskom na naredbu WAIT UNTIL, proces se suspenduje i čeka na ispunjenje uslova, koji odgovara rastućoj
ivici signala clk.
Uslov za nastavak izvršenja WAIT ON naredbe je pojava događaja na bilo kom signalu navedenom u naredbi. U
sledećem primeru, svaka promenu signala clk ili rst aktivira proces, koji se nakon izvršenja IF naredbe vraća na
početak i ponovo suspenduje WAIT ON naredbom.
Pr. 2-33 8-bitni registar sa asinhronim resetovanjem
PROCESS
BEGIN
WAIT ON clk, rst;
IF(rst = ‘1’) THEN
out <= “00000000”;
ELSIF (clk’EVENT AND clk=’1’) THEN
out <= input;
END IF;
END PROCESS;
Komentar: jedina suštinska razlika između dva prethodna primera je u tome što kod prvog reset signal ne
aktivira, a kod drugog aktivira proces. Kod registra sa sinhronim resetovanjem, proces reaguje jedino na taktni
signal, tačnije na rastuću ivicu takta. To znači da eventualno aktiviranje signala rst, nema uticaja na rad registra
sve do pojave rastuće ivice takta. Kod registra sa asinhronim resetovanjem, proces aktivira ne samo taktni signal
već i reset signal. Na taj način, dejstvo signala rst je trenutno i nezavisno od takta.
WAIT FOR suspenduje izvršenje procesa na zadato vreme. Na primer, WAIT FOR 5ns, suspenduje izvršenje
procesa na 5ns. WAIT FOR je namenjena simulaciji (za generisanje talasnih oblika pobudnih signala) i ne može
se koristiti u kôdu za sintezu.
56
Pr. 2-34 DFF sa asinhronim resetovanjem (varijanta 2)
VHDL kôd koji sledi opisuje isti DFF iz Pr. 2-34. U odnosu na kôd iz Pr. 2-34, lista senzitivnosti zamenjena je
WAIT ON naredbom.
1 ---------------------------------------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 ---------------------------------------------
5 ENTITY dff IS
6 PORT (d,clk,rst : IN STD_LOGIC;
7 q : OUT STD_LOGIC);
8 END dff;
9 ---------------------------------------------
10 ARCHITECTURE dff OF dff IS
11 BEGIN
12 PROCESS
13 BEGIN
14 WAIT ON rst,clk;
15 IF(rst='1') THEN
16 q <= '0';
17 ELSIF(clk'EVENT AND clk='1') THEN
18 q <= d;
19 END IF;
20 END PROCESS;
21 END dff;
22---------------------------------------------
Pr. 2-35 BCD brojač (varijanta 2)
U ovom primeru realizovan je BCD brojač iz Pr. 2-30, a jedina razlika je u tome što se umesto liste senzitivnosti
i IF naredbe koristi WAIT UNTIL naredba.
1 ---------------------------------------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 ---------------------------------------------
5 ENTITY brojac IS
6 PORT (clk : IN STD_LOGIC;
7 cifra : OUT INTEGER RANGE 0 TO 9);
8 END brojac;
9 ---------------------------------------------
10 ARCHITECTURE brojac OF brojac IS
11 BEGIN
12 PROCESS -- nema liste senzitivnosti
13 VARIABLE v : INTEGER RANGE 0 TO 10;
14 BEGIN
15 WAIT UNTIL (clk'EVENT AND clk='1');
16 v := v + 1;
17 IF(v = 10) THEN v := 0; END IF;
18 cifra <= v;
19 END PROCESS;
20 END brojac;
21---------------------------------------------
2.5.5 CASE
CASE je još jedna naredba namenjena isključivo za primenu u sekvencijalnom kôdu. CASE naredbe ima
sledeću sintaksu:
CASE selekcioni_izraz IS
WHEN vrednost => sekvencijalne_naredbe;
WHEN vrednost => sekvencijalne_naredbe;
. . .
END CASE;
Primer:
CASE ctrl IS
WHEN "00" => x<=a; y<=b;
57
WHEN "01" => x<=b; y<=c;
WHEN OTHERS => x<="0000"; y<="ZZZZ";
END CASE;
Naredba CASE je slična konkurentnoj naredbi WHEN. Zavisno od vrednosti selekcionog izraza, za izvršenje se
bira jedna od WHEN grana. Kao i kod konkurentne WHEN naredbe, sve moguće vrednosti izraza moraju biti
pokrivene WHEN granama. Grana OTHERS pokriva sve vrednosti selekcionog izraza koje nisu obuhvaćene
prethodnim granama. Za razliku od konkurentne WHEN naredbe, CASE naredba dozvoljava da svaka grana, u
delu sekvencijalne_naredbe, sadrži više od jedne naredbe (slično IF naredbi). U granama gde ne postoji potreba
za bilo kakvom akcijom, dozvoljeno je koristiti ključnu reč NULL. Na raspolaganju su tri oblika selekcionog
izraza:
WHEN vrednost -- testiranje jedinstvene vrednosti
WHEN vrednost_1 to vrednost_2 -- testiranje opsega vrednosti (samo za nabrojive
-- tipove podataka)
WHEN vrednost_1 | vrednost_2 | … -- vrednost_1 ili vrednost_2 ili …
f g b
clk e c
cifra1
d
abcdefg
rst
Sl. 2-30 Sprega 2-cifarskog BCD brojača i 7-segmentnog displeja.
58
1 ---------------------------------------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 ---------------------------------------------
5 ENTITY brojac IS
6 PORT (clk,rst : IN STD_LOGIC;
7 cifra1, cifra2 : OUT STD_LOGIC_VECTOR(6 DOWNTO 0));
8 END brojac;
9 ---------------------------------------------
10 ARCHITECTURE brojac OF brojac IS
11 BEGIN
12 PROCESS(clk, rst)
13 VARIABLE v1 : INTEGER RANGE 0 TO 10;
14 VARIABLE v2 : INTEGER RANGE 0 TO 10;
15 BEGIN
16 ------- brojac --------------------------
17 IF(rst='1') THEN
18 v1 := 0;
19 v2 := 0;
20 ELSIF(clk'EVENT AND clk='1') THEN
21 v1 := v1 + 1;
22 IF(v1=10) THEN
23 v1 := 0;
24 v2 := v2 + 1;
25 IF(v2=10) THEN
26 v2 := 0;
27 END IF;
28 END IF;
29 END IF;
30 ------- BCD u SSD konverzija-------------
31 CASE v1 IS
32 WHEN 0 => cifra1 <= "1111110"; --7E
33 WHEN 1 => cifra1 <= "0110000"; --30
34 WHEN 2 => cifra1 <= "1101101"; --6D
35 WHEN 3 => cifra1 <= "1111001"; --79
36 WHEN 4 => cifra1 <= "0110011"; --33
37 WHEN 5 => cifra1 <= "1011011"; --5B
38 WHEN 6 => cifra1 <= "1011111"; --5F
39 WHEN 7 => cifra1 <= "1110000"; --70
40 WHEN 8 => cifra1 <= "1111111"; --7F
41 WHEN 9 => cifra1 <= "1111011"; --7B
42 WHEN OTHERS => NULL;
43 END CASE;
44 CASE v2 IS
45 WHEN 0 => cifra1 <= "1111110"; --7E
46 WHEN 1 => cifra1 <= "0110000"; --30
47 WHEN 2 => cifra1 <= "1101101"; --6D
48 WHEN 3 => cifra1 <= "1111001"; --79
49 WHEN 4 => cifra1 <= "0110011"; --33
50 WHEN 5 => cifra1 <= "1011011"; --5B
51 WHEN 6 => cifra1 <= "1011111"; --5F
52 WHEN 7 => cifra1 <= "1110000"; --70
53 WHEN 8 => cifra1 <= "1111111"; --7F
54 WHEN 9 => cifra1 <= "1111011"; --7B
55 WHEN OTHERS => NULL;
56 END CASE;
57 END PROCESS;
58 END brojac;
59---------------------------------------------
Komentar: Uočimo da su u gornjem kôdu CASE naredbe, praktično, ponovljene, jer se razlikuju samo u
selekcionom izrazu. U poglavlju 2.9 biće pokazano kako se često korišćeni delovi kôda mogu kompajlirati u
korisnički-definisane biblioteke i tako izbeći ponavljanje kôda.
2.5.6 LOOP
LOOP naredba se koristi za kreiranje petlji u sekvencijalnom kôdu. Postoje tri oblika LOOP naredbe:
59
1) LOOP / FOR: petlja se ponavlja zadati broj puta.
[labela: ] FOR identifikator IN opseg LOOP
(sekvencijalne naredbe)
END LOOP [labela];
Primer:
faktorijel := 1;
FOR broj IN 2 TO 10 LOOP
faktorijel := faktorijel * broj;
END LOOP;
U ovom primeru, telo petlje se izvršava 9 puta (za broj = 2, 3, ..., 10). Na kraju svake iteracije, identifikator (ili
brojač) petlje, broj, uvećava se za 1. Identifikator petlje nije potrebno deklarisati izvan petlje. U telu petlje, nije
dozvoljeno dodeljivati vrednosti identifikatoru (npr. naredba broj := 3 u telu petlje nije dozvoljena). U kôdu
namenjenom sintezi obe granice opsega FOR / LOOP naredbe moraju biti statičke (slično kao kod GENERATE
naredbe). Na primer, deklaracija tipa FOR i IN 0 TO n, gde je n varijabla, se ne može sintetizovati.
2) WHILE / LOOP: Petlja se ponavlja sve dok se ne ispuni zadati uslov.
[labela: ] WHILE uslov LOOP
(sekvencijalne naredbe)
END LOOP [labela];
Primer:
i:= 0; sum:= 10;
WHILE (i < 20) LOOP
sum:= sum * 2;
i:= i + 3;
END LOOP;
Telo petlje se ponavlja sve dok je varijabla i manja od 20.
U okviru tela petlje dozvoljeno je koristiti dve specijalne naredbe: EXIT i NEXT.
EXIT: se koristi za prevremeni izlazak iz petlje.
[labela: ] EXIT [labela] [WHEN uslov];
Na primer, sledeći kôd:
SIGNAL data : STD_LOGIC_VECTOR(7 DOWNTO 0);
. . .
count:=0;
FOR i IN data’RANGE LOOP
CASE data(i) IS
WHEN ‘0’ => count:=count+1;
WHEN OTHERS => EXIT;
END CASE;
END LOOP;
određuje koliko ˝vodećih˝ nula ima u vektoru data. EXIT ne znači završetak tekuće iteracije petlje, već
definitivno napuštanje petlje. Brojač petlje, i, kreće od i=7 i u svakoj iteraciji se smanjuje za 1. Petlja se
završava kada se u vektoru data naiđe na bit ‘0’, ili ako brojač petlje dostigne krajnju graničnu vrednost, i=0
(što će da se desi ako važi data=˝11111111˝).
NEXT: koristi se u telu petlje za ˝preskakanje˝ jedne iteracije petlje.
[labela: ] NEXT [labela] [WHEN uslov];
Za razliku od naredbe EXIT, koja završava petlju, naredba NEXT završava tekuću iteraciju. Na primer, petlja:
FOR i IN 0 TO 15
NEXT WHEN i=5;
(. . .)
END LOOP;
biće izvršena za svako i iz opsega 0 do 15, osim za i=5.
3) LOOP: ˝beskonačna˝ petlja.
[labela: ] LOOP
(sekvencijalne naredbe)
END LOOP [labela];
60
Uslov za izlazak iz petlje definisan je u telu petlju, npr. naredbom EXIT:
sum:=1;
LOOP
sum:=sum*3;
EXIT WHEN sum>100;
END LOOP;
Petlja:
LOOP
WAIT on a,b;
EXIT WHEN a=b;
END LOOP;
ima isti efekat kao naredba:
WAIT UNTIL a=b;
FA FA FA
(cout) (cin)
cin cout
s7 s1 s0
Sl. 2-31. Sabirač sa rednim prenosom.
U nastavku su izložena dva rešenja. Prvo rešenje je generičko (realizuje sabirač za proizvoljan broj bita), dok je
drugo ograničeno na 8-bitne brojeve. Uz to, prvo rešenje ilustruje upotrebu vektora i FOR/LOOP naredbe, a
drugo upotrebu INTEGER-a i IF naredbe.
1 ---Resenje 1: GENERIC i vektori--------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 ---------------------------------------------
5 ENTITY sabirac IS
6 GENERIC(duzina : INTEGER := 8);
7 PORT (a,b : IN STD_LOGIC_VECTOR(duzina-1 DOWNTO 0);
8 cin : IN STD_LOGIC;
9 s : OUT STD_LOGIC_VECTOR(duzina-1 DOWNTO 0);
10 cout : OUT STD_LOGIC);
11 END sabirac;
12---------------------------------------------
13 ARCHITECTURE sabirac1 OF sabirac IS
14 BEGIN
15 PROCESS(a,b,cin)
16 VARIABLE c : STD_LOGIC_VECTOR(duzina DOWNTO 0);
17 BEGIN
18 c(0):=cin;
19 FOR i IN 0 TO duzina-1 LOOP
20 s(i) <= a(i) XOR b(i) XOR c(i);
21 c(i+1):=(a(i) AND b(i)) OR (a(i) AND c(i)) OR (b(i) AND c(i));
22 END LOOP;
23 cout <= c(duzina);
24 END PROCESS;
25 END sabirac1;
26---------------------------------------------
61
1 ---Resenje 2: ne-genericko i INTEGER-i ------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 ---------------------------------------------
5 ENTITY sabirac IS
6 PORT (a,b : IN INTEGER RANGE 0 TO 255; --odgovara opsegu 8-bitnih brojeva
7 cin : IN STD_LOGIC;
8 s : OUT INTEGER RANGE 0 TO 255;
9 cout : OUT STD_LOGIC);
10 END sabirac;
11---------------------------------------------
12 ARCHITECTURE sabirac2 OF sabirac IS
13 BEGIN
14 PROCESS(a,b,cin)
15 VARIABLE sum : INTEGER RANGE 0 TO 511; --odgovara opsegu 9-bitnih brojeva
16 BEGIN
17 IF(cin='1') THEN sum := 1;
18 ELSE sum := 0;
19 END IF;
20 sum := a + b + sum;
21 IF(sum > 255) THEN
22 cout <= '1';
23 sum:=sum-256;
24 ELSE cout<='0';
25 END IF;
26 s <= sum;
27 END PROCESS;
28 END sabirac2;
29---------------------------------------------
Prvo rešenje usklađeno je sa strukturom sabirača (Sl. 2-31). Unutar procesa uvedena je varijabla c za čuvanje
izlaznih prenosa. Dužina vektora c je za jedan veća od dužine sabiraka (zbog izlaznog prenosa iz sabirača, cout).
Pre ulaska u petlju, bitu najmanje težine vektor c dodeljuje se vrednost ulaznog prenosa, c(0):=cin. U petlji, za
svaku bitsku poziciju izračunavaju se: bit sume s(i) i bit prenosa c(i+1). Nakon izlaska iz petlje, bit najveće
težine vektora c prenosi se na izlazni port cout. Drugo rešenje realizuje funkciju sabiranja na višem nivou
apstrakcije. Celobrojna varijabla, sum, opsega 0 do 511 se koristi za prihvatanje rezultata sabiranja ulaznih
operanada, a, b i ulaznog prenosa, cin. Na osnovu dobijenog zbira, određuje se vrednost izlaznog prenosa. Ako
zbir prevazilazi opseg 8-bitnih brojeva (> 255), izlazni prenos dobija vrednost cout=´1´, a suma se koriguje
oduzimanjem vrednosti 28. Konačno, vrednost sum se prosleđuje na izlazni port s. Obe varijante se mogu
sintetizovati. U prvom slučaju, alat za sintezu, razlaže VHDL kôd na logičke jednačine koje potom realizuje
pomoću logičkih kola. U drugom slučaju, alat za sintezu detektuje prisustvo operatora ˝+˝ u VHDL kôdu i
direktno ga zamenjuje sabiračem koji je raspoloživ u pratećoj biblioteci unapred sintetizovanih modula. Treba
napomenuti da je struktura sa Sl. 2-31 samo jedna od mogući realizacija binarnog sabirača. Tipično, projektant
može da bira koji će od raspoloživih tipova sabirača biti iskorišćen od strane alata za sintezu.
Pr. 2-39 Jednostavni barrel pomerač
Barrel pomerač je kombinaciona mreža koja realizuje funkciju pomeranja ili rotiranja ulazne informacije za
zadati broj bitskih pozicija. Na Sl. 2-32 je prikazana struktura jednog jednostavnog 8-bitnog barrel pomerača. Za
shift=0, ulazni 8-bitni podatak se prenosi na izlaz bez ikakve promene (outp(0)=inp(0), …, outp(7)=inp(7)). Za
shift=1, na izlazu se javlja ulazni podatak pomeren za jednu bitsku poziciju ulevo (oupt(0)=0, oupt(1)=inp(0)
…, oupt(7)=inp(6)). Primetimo da se prilikom pomeranja ulazni bit inp(7) gubi, a da se na izlaznu poziciju
outp(0), koja ostaje upražnjena, postavlja ´0´.
inp(7) inp(6) inp(5) inp(4) inp(3) inp(2) inp(1) inp(0) ‘0’
62
1 ---------------------------------------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 ---------------------------------------------
5 ENTITY barrel IS
6 GENERIC(n : INTEGER := 8);
7 PORT (inp : IN STD_LOGIC_VECTOR(n-1 DOWNTO 0);
8 shift : IN INTEGER RANGE 0 TO 1;
9 outp : OUT STD_LOGIC_VECTOR(n-1 DOWNTO 0);
10 cout : OUT STD_LOGIC);
11 END barrel;
12 ---------------------------------------------
13 ARCHITECTURE RTL OF barrel IS
14 BEGIN
15 PROCESS(inp,shift)
16 BEGIN
17 IF(shift=0) THEN
18 outp <= inp;
19 ELSE
20 outp(0)<='0';
21 FOR i IN 1 TO inp'HIGH LOOP
22 outp(i)<=inp(i-1);
23 END LOOP;
24 END IF;
25 END PROCESS;
26 END RTL;
27 ---------------------------------------------
Pr. 2-40 Brojanje vodećih nula
VHDL kôd iz ovog primera određuje broj vodećih nula u binarnom vektoru (počev od krajnje leve bitske
pozicije). Na primer za ulaz ˝00010101˝, kolo na izlazu generiše 3. Kôd ilustruje upotrebu LOOP / EXIT
naredbe. FOR petlja se napušta kada se u ulaznom vektoru data naiđe na prvu 1-cu. Za brojanje nula koristi se
interna varijabla count, čija se konačna vrednost prenosi na izlazni port zeros (linija 22).
1 ---------------------------------------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 ----------------------------------------------
5 ENTITY VodeceNule IS
6 PORT (data : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
7 zeros : OUT INTEGER RANGE 0 TO 8);
8 END VodeceNule;
9 ----------------------------------------------
10 ARCHITECTURE behavior OF VodeceNule IS
11 BEGIN
12 PROCESS(data)
13 VARIABLE count : INTEGER RANGE 0 TO 8;
14 BEGIN
15 count := 0;
16 FOR i IN data'RANGE LOOP
17 CASE data(i) IS
18 WHEN '0' => count := count + 1;
19 WHEN OTHERS => EXIT;
20 END CASE;
21 END LOOP;
22 zeros <= count;
23 END PROCESS;
24 END behavior;
25---------------------------------------------
63
- Svi ulazni signali koji se koriste (˝čitaju˝) u procesu moraju biti navedeni u listi senzitivnosti.
- U kôdu su sadržane sve kombinacije ulaznih/izlaznih signala, tako da kompajler analizom kôda može
da rekonstruiše potpunu tabelu istinitosti.
Prvi uslov nije obavezan za sintezu. Tipično, ako je lista senzitivnosti nepotpuna, kompajler će izdati
odgovarajuće upozorenje, ali će sintetizovano kolo biti korektno. Problem će se javiti u simulaciji takvog kôda,
jer proces neće reagovati na ulazne signale kojih nema u listi senzitivnosti. Drugi uslov čini suštinsku razliku
između kombinacionih i sekvencijalnih kola i mora biti ispunjen da se generisalo korektno rešenje. Nedefinisan
odziv procesa na neku ulaznu kombinaciju znači da proces pri takvoj pobudi zadržava (memoriše) prethodni
izlaz. Da bi se omogućilo memorisanje, u sintetizovano kolo biće uključena leč kola.
Pr. 2-41 Primer pogrešnog kombinacionog opisa
Razmotrimo kolo sa Sl. 2-33(a) čija je funkcija definisana na sledeći način: izlaz x se ponaša kao multiplekser sa
dvobitnim selekcionim ulazom sel i četiri jednobitna ulaza za podatke: a, b, c i d. Sa druge strane, izlaz y jednak
je ´0´ za sel=˝00˝, odnosno ´1´ za sel=˝01˝ (tabela istinitosti sa Sl. 2-33(b)). Primetimo da se radi o
kombinacionom kolu. Međutim, specifikacija kola je nekompletna, jer ne definiše y za sel=˝10˝ i sel=˝11˝.
a sel x y sel x y sel(1) sel x y
x 00 a 0 00 a 0 sel(0) 00 a 0
b
01 b 1 01 b 1 y
01 b 1
c 10 c 10 c y 10 c X
y 11 d 11 d y 11 d X
d
sel(1:0)
(a) (b) (c) (d) (e)
Sl. 2-33 Kolo iz Pr. 2-41: (a) blok dijagram; (b) polazna specifikacija; (c) tabela istinitosti realizovanog kola; (d)
logička mreža realizovanog kola; (d) ispravan pristup.
Oslanjajući se na nekompletnu specifikaciju (Sl. 2-33(b)), možemo kreirati sledeći VHDL kôd:
1 ---------------------------------------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 ---------------------------------------------
5 ENTITY primer IS
6 PORT (a,b,c,d : IN STD_LOGIC;
7 sel : IN INTEGER RANGE 0 TO 3;
8 x,y : OUT STD_LOGIC);
9 END primer;
10 ---------------------------------------------
11 ARCHITECTURE primer OF primer IS
12 BEGIN
13 PROCESS(a,b,c,d,sel)
14 BEGIN
15 IF(sel=0) THEN
16 x<=a;
17 y<='0';
18 ELSIF(sel=1) THEN
19 x<=b;
20 y<='1';
21 ELSIF(sel=2) THEN
22 x<=c;
23 ELSE
24 x<=d;
25 END IF;
26 END PROCESS;
27 END primer;
28 ---------------------------------------------
Izveštaj koji bi se dobio nakon kompajliranja kôda, pokazao bi da flip-flopovi nisu uključeni u sintetizovano
kolo. Međutim, ako pogledamo rezultate simulacije (Sl. 2-34) uočićemo ˝čudno˝ ponašanje izlaza y. Na primer,
za neke vrednosti ulaza sel (konkretno sel=˝11˝, decimalno 3) dobijaju se dva različite vrednosti izlaza. Ako
vrednosti ulaza sel=˝11˝, prethodni sel=˝00˝, vrednost izlaza biće y=´0´; međutim ako istoj vrednosti ulaza sel
prethodi sel=˝01˝, izlaz će biti y=´1´. Ovakvo ponašanje ukazuje na postojanje memorije u sintetizovanom kolu.
Kompajler prevodi IF naredbu u sledeću logičku jednačinu: y = (sel(0) AND sel(1)) OR (sel(0) AND y) OR
64
(sel(1) AND y), kojoj odgovara kolo sa Sl. 2-33(d), odnosno tabela istinitosti sa Sl. 2-33(c). S obzirom da u mreži
postoje povratne veze, tj. da izlaz y zavisi ne samo od ulaza sel već i od svoje tekuće vrednosti, reč je
sekvencijalnom kolu.
65
1 ----D flip-flop ------------------------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 ---------------------------------------------
5 ENTITY dff IS
6 PORT (d,clk : IN STD_LOGIC;
7 q : OUT STD_LOGIC);
8 END dff;
9 ---------------------------------------------
10 ARCHITECTURE flip_flop OF dff IS
11 BEGIN
12 PROCESS(clk)
13 BEGIN
14 IF(clk'EVENT AND clk='1') THEN
15 q <= d;
16 END IF;
17 END PROCESS;
18 END flip_flop;
19 ---------------------------------------------
2.6.1 CONSTANT
Sintaksa konstrukcije CONSTANT definiše ime, tip i vrednost konstante:
CONSTANT ime : tip := vrednost;
Konstanta može da ima samo jednu vrednost datog tipa, koja joj se dodeljuje prilikom deklaracije i ne može se
menjati u ostalom delu kôda. Dugim rečima, nije dozvoljeno dodeljivati novu vrednost konstanti.
Primeri:
CONSTANT b : BIT :=´1´; -- jednobitna konstanta vrednosti ´1´
CONSTANT mem : memory := ((´0´,´0´,´0´,´0´), -- matrica konstantnih vrednosti
(´0´,´0´,´0´,´1´),
(´0´,´0´,´1´,´1´));
66
Konstanta može biti deklarisana u paketu, entitetu ili arhitekturi. Kada je deklarisana u paketu, konstanta je
globalna za sve entitete koji koriste paket. Deklarisana u entitetu, konstanta je globalna za sve arhitekture tog
entiteta. Konačno, konstanta deklarisana u arhitekturi vidljiva je jedino u kôdu te arhitekture. Konstante se
najčešće deklarišu u arhitekturi ili paketu.
2.6.2 SIGNAL
Signali se koriste za prenos vrednosti u ili iz kola, kao i između različitih internih jedinica kola. Drugim rečima,
signal predstavlja vezu (žicu) u kolu. Na primer, portovi entiteta su signali. Signal se deklariše shodno sledećoj
sintaksi:
SIGNAL ime : tip [opseg] [: inicijalna_vrednost];
Primeri:
SIGNAL ctrl : BIT := ‘0’;
SIGNAL count : INTEGER RANGE 0 TO 100;
SIGNAL y : STD_LOGIC_VECTOR(7 DOWNTO 0);
Signali mogu biti deklarisani na istim mestima u kôdu gde i konstante. Slično konstantama, signalima se
prilikom deklaracije može dodeliti inicijalna vrednost. Inicijalna vrednost signala ima efekta samo u simulaciji,
dok se prilikom sinteze ne uzima u obzir. Za razliku od konstanti, signalima mogu da se dodeljuju nove
vrednosti (slično promenljivama u programskim jezicima). Operacija dodele nove vrednosti signalu označava se
(kao što već znamo) simbolom “<=” (npr. x<=5) Međutim, kada se koristi u sekvencijalnom kôdu, vrednost
signala se ne menja u trenutku izvršenja naredbe dodele, već u trenutku završetka odgovarajućeg procesa,
funkcije ili procedure. Kažemo da za signale važi odložena dodela. Istom signalu nova vrednost može biti
dodeljivana više puta u okviru istog procesa. Međutim, efekat će imati samo poslednja naredba dodele.
Pr. 2-42 Brojač jedinica (pogrešno rešenje)
Naš zadatak je da projektujemo kolo koje određuje broj 1-ca u binarnom vektoru. Razmotrimo priloženo
rešenje. Za brojanje jedinica u procesu se koristi signal brojac tipa INTEGER, koji se na početku procesa
postavlja na vrednost 0, a zatim u FOR/LOOP petlji uvećava za 1 za svaku jedinicu iz ulaznog vektora d. Kôd,
iako naizgled korektan (jer ispravno prati logiku algoritma brojanja jedinica), predstavlja pogrešno rešenje.
Problem je u višestrukoj dodeli vrednosti istom signalu (u liniji 15, jedanput i liniji 18, osam puta). Sve dodele
vrednosti signalu učinjene u procesu odlažu se do trenutka završetka procesa. To znači da početna vrednost
signala brojac u liniji 18 nije 0, već vrednost koju je taj signal imao u trenutku aktiviranja procesa. U ovakvim i
sličnim situacijama treba umesto signala koristiti varijable.
1 ---------------------------------------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 ---------------------------------------------
5 ENTITY brojac_jedinica IS
6 PORT (din : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
7 br_jedinica : OUT INTEGER RANGE 0 TO 8);
8 END brojac_jedinica;
9 ---------------------------------------------
10 ARCHITECTURE neispravna OF brojac_jedinica IS
11 SIGNAL brojac : INTEGER RANGE 0 TO 8;
12 BEGIN
13 PROCESS(din)
14 BEGIN
15 brojac <= 0;
16 FOR i IN 0 TO 7 LOOP
17 IF(din(i)='1') THEN
18 brojac <= brojac + 1;
19 END IF;
20 END LOOP;
21 br_jedinica <= brojac;
22 END PROCESS;
23 END neispravna;
24---------------------------------------------
Takođe, čini se da je datom VHDL kôdu interni signal brojac (linija 11) nepotreban, jer bi za izračunavanje u
procesu mogao direktno da se koristi signal (port) br_jedinica. Međutim, br_jedinica, iako signal, deklarisan je
kao izlazni (OUT) port. Zbog toga je zabranjeno čitati njegovu vrednost, što bi dovelo do greške u liniji 18.
Korišćenje pomoćnih signala (kao što je brojac) za izračunavanje konačne vrednosti koja se prenosi na izlazni
port predstavlja uobičajenu praksu.
67
2.6.3 VARIABLE
Za razliku od signala i konstanti, varijable se mogu koristiti samo u okviru sekvencijalnih delova kôda (procesi,
procedure i funkcije). Takođe, za razliku od signala, naredba dodele trenutno deluje na varijablu, a njena nova
vrednost se može koristiti već u sledećoj naredbi. Za deklaraciju varijable koristi se sintaksa:
VARIABLE ime : tip [opseg] [:= inicijalna_vrednost];
Primeri:
VARIABLE ctrl : BIT := ‘0’; -- jednobitna varijabla inicijalizovana na vrednost 0
VARIABLE count : INTEGER RANGE 0 TO 100; -- integer varijabla
VARIABLE y : STD_LOGIC_VECTOR(7 DOWNTO 0) := “11001010”; -- vektor sa inicijalizac.
Pošto se može koristiti samo u sekvencijalnom kôdu, deklaracija varijable se može naći isključivo u
deklarativnim sekcijama procesa, procedura i funkcija. Operator dodele za varijable je ˝:=˝ (npr. x:=5;).
Takođe, slično kao u slučaju signala, inicijalna vrednost varijable ima efekta samo u simulaciji, dok se tokom
sinteze ignoriše.
Pr. 2-43. Brojač jedinica (ispravno rešenje)
Razmotrimo još jednom problem iz Pr. 2-42. U novom rešenju, promenljiva brojac više nije signal već varijabla
definisana u procesu. S obzirom da je promena vrednosti varijable trenutna, problem višestruke dodele,
karakterističan za signale, više ne postoji.
1 ---------------------------------------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 ---------------------------------------------
5 ENTITY brojac_jedinica IS
6 PORT (din : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
7 br_jedinica : OUT INTEGER RANGE 0 TO 8);
8 END brojac_jedinica;
9 ---------------------------------------------
10 ARCHITECTURE ispravna OF brojac_jedinica IS
11 BEGIN
12 PROCESS(din)
13 VARIABLE brojac : INTEGER RANGE 0 TO 8;
14 BEGIN
15 brojac := 0;
16 FOR i IN 0 TO 7 LOOP
17 IF(din(i)='1') THEN
18 brojac := brojac + 1;
19 END IF;
20 END LOOP;
21 br_jedinica <= brojac;
22 END PROCESS;
23 END ispravna;
24 ---------------------------------------------
68
Pr. 2-44 D flip-flop sa komplementarnim izlazima
Razmotrimo D flip-flop sa Sl. 2-36, koji za razliku od ranije razmatranih flip-flopova poseduje dodatni izlaz
not_q, na koji se javlja komplement tekućeg stanja flip-flopa. U nastavku su data dva rešenja, od kojih je prvo
neispravno, a drugo ispravno.
d q
D FF
clk not_q
Dva rešenja se razlikuju po mestu gde se u kôdu nalazi naredba dodele not_q <= NOT q. U prvom rešenju,
ova naredba je u procesu i izvršava se neposredno posle naredbe q <= d (linije 16 i 17). Međutim, s obzirom na
odloženu dodelu, vrednost signala q koja se u liniji 17 komplementira i dodeljuje signalu not_q, nije ona koja je
dodeljena ovom signalu u naredbi 16, već stara, tj. ona koju je signal q imao u trenutku aktiviranja procesa. Na
taj način, izlaz not_q dobija pogrešnu vrednost koja u odnosu na ispravnu kasni za jedan taktni ciklus, kao što se
može uočiti na vremenskom dijagramu sa Sl. 2-37. Takođe, primetimo da talasni oblici signala q i not_q počinju
isprekidanim linijama. Na ovaj način je označena nepoznata vrednost (˝X˝). To je iz razloga što ovi signali nisu
inicijalizovani prilikom deklaracije, a definisanu vrednost dobijaju upisom koji je sinhronizovan sa rastućom
ivicom signala clk.
69
Sl. 2-37 Rezultati simulacije neispravnog rešenja iz Pr. 2-44.
U drugom rešenju, naredba not_q <= NOT q se nalazi u liniji 19 izvan procesa. S obzirom da naredba dodele
signalu not_q i proces rade konkurentno, svaka promena vrednosti signala q učinjena u procesu se trenutno
manifestuje na promenu signala not_q. Rezultati simulacije (Sl. 2-38) pokazuju očekivano, ispravno ponašanje
flip-flopa. Uočimo još jednu pojedinost: port q deklarisan je kao BUFFER, ne kao OUT. Deklaracija BUFFER
označava bidirekcioni (dvosmerni) port, tj. port na koji može da se upisuje i koji može da se čita. Da je port q
deklarisan kao OUT, naredba not_q <= NOT q ne bi bila moguća, s obzirom da čita vrednost porta q.
70
Oba navedena uslova su ispunjena: dodela vrednosti varijabli v je sinhronizovana sa rastućom ivicom signala clk
i njena vrednost se dodeljuje signalu x.
Drugi slučaj kada se varijabla sintetiše u flip-flop odgovara situaciji kada se varijabla koristi u kôdu pre nego što
joj je dodeljena vrednost (vidi Pr. 2-47).
Pr. 2-45 D flip-flop sa komplementarnim izlazima (rešenje 2)
Razmotrimo još jedanput D flip-flop sa Sl. 2-36. Iako su oba rešenja, data u ovom primeru, funkcionalno
ispravna, kola dobijena njihovom sintezom se razlikuju, i to po broju flip-flopova. Rešenje 1 sadrži dve sinhrone
naredbe dodele (linije 16 i 17) i zbog toga generiše dva flip-flopa ( Sl. 2-40(a)). U rešenju 2, naredba dodele
signalu not_q (linija 19) više nije sinhronizovana sa taktnim signalom clk i zato se ne sintetiše u flip-flop (Sl.
2-40(b)). Napomenimo da ovaj primer ilustruje bitnu situaciju kada zbog propusta u organizaciji VHDL kôda
dolazi do sinteze dodatnog hardvera.
d q
D FF
not_q d q
D FF D FF not_q
clk clk
(a) (b)
Sl. 2-40 Kola sintetizovana na osnovu VHDL kôda iz Pr. 2-45.
1 ----Resenje 1: dva flip-flopa ---------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 ---------------------------------------------
5 ENTITY dff IS
6 PORT (d,clk : IN STD_LOGIC;
7 q : BUFFER STD_LOGIC;
8 not_q : OUT STD_LOGIC);
9 END dff;
10---------------------------------------------
11 ARCHITECTURE dva_FF OF dff IS
12 BEGIN
13 PROCESS(clk)
14 BEGIN
15 IF(clk'EVENT AND clk='1') THEN
16 q <= d; -- generise flip-flop
17 not_q <= NOT d; -- generise flip-flop
18 END IF;
19 END PROCESS;
20 END dva_FF;
21---------------------------------------------
71
Pr. 2-46 Brojač
Razmotrimo 3-bitni binarni brojač sa Sl. 2-41. Stanja brojača su: 0, 1, ..., 7. Sa svakim taktnim impulsom, brojač
prelazi u sledeće stanje, a nakon stanja 7 vraća se u stanje 0. Signal rst služi za asinhrono resetovanje brojača.
72
Sl. 2-42 Pomerački registar iz Pr. 2-47
1 ------- Resenje 1 ----------------------------
2 ENTITY pomreg IS
3 PORT (din,clk : IN BIT;
4 dout: OUT BIT);
5 END pomreg;
6 ----------------------------------------------
7 ARCHITECTURE pomreg OF pomreg IS
8 BEGIN
9 PROCESS (clk)
10 VARIABLE a,b,c : BIT;
11 BEGIN
12 IF(clk'EVENT AND clk='1') THEN
13 dout <= c;
14 c := b;
15 b := a;
16 a := din;
17 END IF;
18 END PROCESS;
19 END pomreg;
20 ---------------------------------------------
1 ------- Resenje 2 ----------------------------
2 ENTITY pomreg IS
3 PORT (din,clk : IN BIT;
4 dout: OUT BIT);
5 END pomreg;
6 ----------------------------------------------
7 ARCHITECTURE pomreg OF pomreg IS
8 SIGNAL a,b,c : BIT;
9 BEGIN
10 PROCESS (clk)
11 BEGIN
12 IF(clk'EVENT AND clk='1') THEN
13 a <= din;
14 b <= a;
15 c <= b;
16 dout <= c;
17 END IF;
18 END PROCESS;
19 END pomreg;
20---------------------------------------------
1 ------- Resenje 3 ----------------------------
2 ENTITY pomreg IS
3 PORT (din,clk : IN BIT;
4 dout: OUT BIT);
5 END pomreg;
6 ----------------------------------------------
7 ARCHITECTURE pomreg OF pomreg IS
8 BEGIN
9 PROCESS (clk)
10 VARIABLE a,b,c : BIT;
11 BEGIN
12 IF(clk'EVENT AND clk='1') THEN
13 a := din;
14 b := a;
15 c := b;
16 dout <= c;
17 END IF;
18 END PROCESS;
19 END pomreg;
20---------------------------------------------
73
VHDL kôd iz rešenja 1 sadrži tri varijable (a, b i c, linija 10). Međutim, u procesu, varijable se koriste pre nego
što su im dodeljene vrednosti (tj. u obrnutom redosledu, počev dout, linija 13, do din, linija 16). Na primer, u
liniji 13 na izlaz dout prosleđuje se vrednost varijable c. Međutim, to nije vrednost koja će ovoj varijabli biti
dodeljena u narednoj liniji, već vrednost koja joj je bila dodeljena prilikom prethodnog izvršenja procesa. Zbog
toga se u sintetizovano kolo uključuju flip-flopovi koji pamte vrednosti varijabli kako bi one mogle biti
korišćene prilikom narednog izvršenja procesa.
U rešenju 2 varijable su zamenjene signalima (linija 8), a dodela vrednosti signalima obavlja se u normalnom
redosledu (do din do dout). Pošto je dodela vrednosti signalima sinhronizovana sa tranzicijom nekog drugog
signala (konkretno clk), svaki od njih se sintetiše u flip-flop. S obzirom da za signale važi odložena dodela, u
linijama 14, 15 i 16 se koriste njihove stare vrednosti (one koje su im bile dodeljene prilikom prethodnog
izvršenja procesa). Još jedna posledica odložene dodele je i ta da redosled naredbi dodele u linijama 13, 14, 15 i
16, nije od značaja i da bi bilo koji drugi redosled, uključujući i onaj iz rešenja 1, bio korektan.
Konačno, u rešenju 3 ponovo se koriste varijable, kao u rešenju 1, ali je redosled naredbi dodele normalan, kao u
rešenju 2. S obzirom da za varijable važi trenutna dodela, naredbe dodele iz linija 13, 14 i 15 mogu da se sažmu
u jednu liniju ekvivalentnu naredbi c:=din. U sledećoj liniji (linija 16) vrednost varijable c napušta proces, jer
se dodeljuje signalu dout. Pošto se ova dodela obavlja sinhronizovano sa tranzicijom signala clk, uslovi za
sintezu flip-flopa su ispunjeni, ali samo jednog, a ne četiri koliko je potrebno da bi se dobilo ispravno rešenje.
1 ---------------------------------------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
74
4 ----------------------------------------------
5 ENTITY pomreg IS
6 PORT ( d,clk,rst: IN STD_LOGIC;
7 q: OUT STD_LOGIC);
8 END pomreg;
9 ----------------------------------------------
10 ARCHITECTURE RTL OF pomreg IS
11 BEGIN
12 PROCESS (clk, rst)
13 VARIABLE reg : STD_LOGIC_VECTOR(3 DOWNTO 0);
14 BEGIN
15 IF(rst='1') THEN
16 reg := (OTHERS => '0');
17 ELSIF(clk'EVENT AND clk='1') THEN
18 reg := d & reg(3 DOWNTO 1);
19 END IF;
20 q <= reg(0);
21 END PROCESS;
22 END RTL;
23 ---------------------------------------------
75
2.7.1 Kôdni šablon #1
Za projektovanje konačnih automata u VHDL-u razvijeno više standardnih pristupa ili kôdnih šablona. U ovom
odeljku opisaćemo jedan od njih, koji se odlikuje jednostavnom strukturom. Kod opisnog kôdnog šablona,
sekvencijalni i kombinacioni deo automata su u potpunosti razdvojeni i predstavljaju se zasebnim procesima, a
stanja se eksplicitno deklarišu korišćenjem nabrojivog tipa podataka.
Sekvencijalni deo
Sekvencijalni deo konačnog automata u suštini predstavlja prihvatni registar sa ulazom nx_state i izlazom
pr_state i kao takav može se opisati u vidu sledećeg procesa:
PROCESS(rst,clk)
BEGIN
IF(rst=´1´)THEN
pr_state <= state_0;
ELSIF(clk’EVENT AND clk=’1’)THEN
pr_state <= nx_state;
END IF;
END PROCESS;
Kôd je veoma jednostavan. Sastoji se od asinhronog resetovanja, koje postavlja automat u početno stanje
(state_0), i sinhrone naredbe dodele koja se sintetiše u n flip-flopova za čuvanje kôda tekućeg stanja, pr_state.
Broj sintetizovanih flip-flopova određen je dužinom signala pr_state, tj. brojem bitova potrebnih za kôdiranje
svih stanja automata. Za automat sa N stanja, broj flip-flopova iznosi n = log 2 N .
Kombinacioni deo
Kombinacioni deo konačnog automata predstavlja kombinacionu mrežu sa ulazima input i pr_state i izlazima
output i nx_state i može se opisati u vidu sledećeg procesa:
PROCESS(ulaz, pr_state)
BEGIN
CASE pr_state IS
WHEN state_0 =>
IF(ulaz = ...) THEN
izlaz <= <vrednost>
nx_state <= state_1;
ELSE ...
END IF;
WHEN state_1 =>
IF(ulaz = ...) THEN
izlaz <= <vrednost>
nx_state <= state_2;
ELSE ...
END IF;
WHEN state_2 =>
IF(ulaz = ...) THEN
izlaz <= <vrednost>
nx_state <= state_3;
ELSE ...
END IF;
. . .
END CASE;
END PROCESS;
Proces ima dve funkcije: (a) generiše izlazne vrednosti i (b) generiše kôd sledećeg stanja automata. Centralno
mesto kôda predstavlja CASE naredba u kojoj svaka WHEN grana odgovara jednom stanju automata (tekuće
stanje - pr_state). Za svako stanje, ispituje se vrednost ulaza, ulaz, i postavlja odgovarajuća vrednost izlaza, izlaz
i sledećeg stanja, nx_state. U suštini, CASE naredba predstavlja formalni opis dijagrama stanja: svakom stanju
(krugu) dijagrama stanja odgovara jedna WHEN grana, a svakoj strelici koja izvire iz datog stanja jedna IF
grana u odgovarajućoj WHEN grani. Proces se sintetiše u kombinacionu logiku, s obzirom da zadovoljava
uslove 1 i 2 iz odeljka: svi ulazni signali su navedeni u listi senzitivnosti i sve ulazno-izlazne kombinacije su
pokrivene kôdom.
Sledi kompletan kôdni šablon za opis konačnog automata. Pored dva procesa, šablon takođe sadrži korisnički
definisani tip podataka (state) koji sadrži simbolička imena svih stanja konačnog automata.
76
---------------------------------------------
LIBRARY ieee;
USE ieee.std_logic_1164.all;
---------------------------------------------
ENTITY <ime_entiteta> IS
PORT (ulaz : IN <tip_podataka>;
rst,clk : IN STD_LOGIC;
izlaz : OUT <tip_podataka>);
END <ime_entiteta>;
---------------------------------------------
ARCHITECTURE <ime_arhitekture> OF <ime_entiteta> IS
TYPE state IS (state_0,state_1,state_2 ...);
SIGNAL pr_state,nx_state : state;
BEGIN
---------- Sekvencijalni deo -------------
PROCESS(rst,clk)
BEGIN
IF(rst='1') THEN
pr_state <= state_0;
ELSIF(clk'EVENT AND clk='1') THEN
pr_state <= nx_state;
END IF;
END PROCESS;
---------- Kombinacioni deo -------------
PROCESS(ulaz, pr_state)
BEGIN
CASE pr_state IS
WHEN state_0 =>
IF(ulaz = ...) THEN
izlaz <= <vrednost>
nx_state <= state_1;
ELSE ...
END IF;
WHEN state_1 =>
IF(ulaz = ...) THEN
izlaz <= <vrednost>
nx_state <= state_2;
ELSE ...
END IF;
WHEN state_2 =>
IF(ulaz = ...) THEN
izlaz <= <vrednost>
nx_state <= state_3;
ELSE ...
END IF;
. . .
END CASE;
END PROCESS;
END <ime_arhitekture>;
77
d=1. Ako je d=0, FSM ostaje u tekućem stanju. U stanju stateA na izlaz se prenosi vrednost ulaza a (x=a), a u
stanju stateB vrednost ulaza b (x=b). Početno stanje konačnog automata je stanje stateA. Sledi VHDL opis
FSM-a sa Sl. 2-45 napisan u skladu sa kôdnim šablonom #1.
1 ----------------------------------------------
2 ENTITY fsm_1 IS
3 PORT (a,b,c,d,clk,rst : IN BIT;
4 x: OUT BIT);
5 END fsm_1;
6 ----------------------------------------------
7 ARCHITECTURE fsm_1 OF fsm_1 IS
8 TYPE state IS (stateA, stateB);
9 SIGNAL pr_state, nx_state : state;
10 BEGIN
11 ---- sekvencijalni deo --------------------
12 PROCESS (clk,rst)
13 BEGIN
14 IF(rst='1')THEN
15 pr_state <=stateA;
16 ELSIF(clk'EVENT AND clk='1') THEN
17 pr_state <= nx_state;
18 END IF;
19 END PROCESS;
20 ---- kombinacioni deo --------------------
21 PROCESS(a,b,d,pr_state)
22 BEGIN
23 CASE pr_state IS
24 WHEN stateA =>
25 x<=a;
26 IF(d='1')THEN
27 nx_state <= stateB;
28 ELSE
29 nx_state <= stateA;
30 END IF;
31 WHEN stateB =>
32 x<=b;
33 IF(d='1')THEN
34 nx_state <= stateA;
35 ELSE
36 nx_state <= stateB;
37 END IF;
38 END CASE;
39 END PROCESS;
40 END fsm_1;
41 ---------------------------------------------
Izveštaj koji se dobija nakon sinteze VHDL opisa FSM-a sa Sl. 2-45, pokazuje da kolo sadrži samo jedan flip-
flop. To je očekivan podatak, s obzirom da FSM ima dva stanja, za čije kôdiranje je dovoljan samo jedan bit.
Pr. 2-50 BCD brojač
Ponašanje bilo kog sekvencijalog kola može se opisati u vidu konačnog automata. Međutim, konačni automat ne
mora uvek biti i najbolji (najjednostavniji) način za modeliranje sekvencijalnih kola. To je obično slučaj sa
jednostavnim registarskim komponentama, kao što su brojači. U ovom primeru biće data dva VHDL opisa BCD
brojača. Prvo rešenje na brojač gleda kao na konačni automat Murovog tipa, dok drugo koristi osobinu brojača
da je sledeće stanje uvek za 1 veće od prethodnog.
78
Na Sl. 2-46 je prikazan dijagram stanja BCD brojača. Konačni automat poseduje 10 stanja povezanih u cikličnu
sekvencu. Svakom stanju je pridružena vrednost izlaza (Murov tip) koja odgovara jednoj BCD cifri. Početno
stanje brojača je stanje nula. VHDL kôd napisan u skladu sa kôdnim šablonom dat je ispod. Deklaracija
nabrojivog tipa podataka state nalazi se u linijama 11 i 12. Sekvencijalni deo konačnog automata opisan je
prvim procesom (linije 16-23), a kombinacioni drugim procesom (linije 25-59). Obimnost procesa za
kombinacioni deo potiče od zahteva da se svako stanje eksplicitno navede u CASE naredbi. Očigledno, ovakav
način opisa brojača biće složeniji što je broj stanja brojača veći.
1 ---------------------------------------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 ----------------------------------------------
5 ENTITY BCD IS
6 PORT (clk,rst : IN STD_LOGIC;
7 count : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));
8 END BCD;
9 ----------------------------------------------
10 ARCHITECTURE FSM OF BCD IS
11 TYPE state IS (nula, jedan, dva, tri, cetiri,
12 pet, sest, sedam, osam, devet);
13 SIGNAL pr_state, nx_state : state;
14 BEGIN
15 ---- sekvencijalni deo --------------------
16 PROCESS (clk,rst)
17 BEGIN
18 IF(rst='1')THEN
19 pr_state <=nula;
20 ELSIF(clk'EVENT AND clk='1') THEN
21 pr_state <= nx_state;
22 END IF;
23 END PROCESS;
24 ---- kombinacioni deo --------------------
25 PROCESS(pr_state)
26 BEGIN
27 CASE pr_state IS
28 WHEN nula =>
29 count <= "0000";
30 nx_state <= jedan;
31 WHEN jedan =>
32 count <= "0001";
33 nx_state <= dva;
34 WHEN dva =>
35 count <= "0010";
36 nx_state <= tri;
37 WHEN tri =>
38 count <= "0011";
39 nx_state <= cetiri;
40 WHEN cetiri =>
41 count <= "0100";
42 nx_state <= pet;
43 WHEN pet =>
44 count <= "0101";
45 nx_state <= sest;
46 WHEN sest =>
47 count <= "0110";
48 nx_state <= sedam;
49 WHEN sedam =>
50 count <= "0111";
51 nx_state <= osam;
52 WHEN osam =>
53 count <= "1000";
54 nx_state <= devet;
55 WHEN devet =>
56 count <= "1001";
57 nx_state <= nula;
58 END CASE;
59 END PROCESS;
60 END FSM;
79
Jednostavniji, i prirodniji, opisa brojača u VHDL-u je ilustrovan kôdom koji sledi. Kôd je sličan onome iz
primera koji opisuje 4-bitni binarni brojač jer za opis funkcije brojanja koristi naredbu aritmetičkog sabiranja.
Dodatno, u procesu je izdvojen slučaj kada je brojač u stanju 9 (reg=˝1001˝), da bi se brojanje vratilo na
početak. S obzirom da se koriste signali tipa STD_LOGIC, uključen je paket std_logic_unsigned, koji
omogućava izvođenje aritmetičkih operacija nad ovim tipom.
1 ---------------------------------------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 USE ieee.std_logic_unsigned.all;
5 ----------------------------------------------
6 ENTITY BCD IS
7 PORT (clk,rst : IN STD_LOGIC;
8 count : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));
9 END BCD;
10----------------------------------------------
11 ARCHITECTURE counter OF BCD IS
12 SIGNAL reg : STD_LOGIC_VECTOR(3 downto 0);
13 BEGIN
14 PROCESS(clk,rst)
15 BEGIN
16 IF(rst='1') THEN
17 reg <= (OTHERS => '0');
18 ELSIF(clk'EVENT AND clk='1') THEN
19 IF(reg = "1001") THEN
20 reg <= "0000";
21 ELSE
22 reg <= reg + 1;
23 END IF;
24 END IF;
25 END PROCESS;
26 count <= reg;
27 END counter;
28 --------------------------------------------
Pr. 2-51 Detektor bit-oblika
Detektor bit-oblika je sekvencijalno kolo koje u ulaznoj binarnoj sekvenci prepoznaje neku konkretnu
podsekvencu (tj. bit-oblik). Neka je naš zadatak da projektujemo detektor bit-oblika ˝111˝, tj. kolo koje će na
svom izlazu generisati 1 uvek kada na ulazu dobije tri uzastopne jedinice. Preklapanje bit-oblika treba uzeti u
obzir; na primer, ako se na ulazu javi sekvenca ˝…0111110…˝ na izlazu detektora treba biti postavljena 1-ca u
tri uzastopna taktna ciklusa.
80
podrazumevane vrednosti ´0´ za q i nula za nx_state. U CASE naredbi signala q i nx_state se dodeljuje vrednost
samo ako se nova vrednost razlikuje od podrazumevane. Kao podrazumevane vrednosti izabrane su one koje se
najčešće dodeljuju signalima q i nx_state.
1 -----Resenje 1 -------------------------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 ----------------------------------------------
5 ENTITY detektor_bit_oblika IS
6 PORT (d,clk,rst : IN STD_LOGIC;
7 q: OUT STD_LOGIC);
8 END detektor_bit_oblika;
9 ----------------------------------------------
10 ARCHITECTURE FSM OF detektor_bit_oblika IS
11 TYPE state IS (nula, jedan, dva, tri);
12 SIGNAL pr_state, nx_state : state;
13 BEGIN
14 ---- sekvencijalni deo --------------------
15 PROCESS (clk,rst)
16 BEGIN
17 IF(rst='1')THEN
18 pr_state <=nula;
19 ELSIF(clk'EVENT AND clk='1') THEN
20 pr_state <= nx_state;
21 END IF;
22 END PROCESS;
23 ---- kombinacioni deo --------------------
24 PROCESS(d,pr_state)
25 BEGIN
26 CASE pr_state IS
27 WHEN nula =>
28 q<='0';
29 IF(d='1')THEN nx_state <= jedan;
30 ELSE nx_state <= nula;
31 END IF;
32 WHEN jedan =>
33 q<='0';
34 IF(d='1')THEN nx_state <= dva;
35 ELSE nx_state <= nula;
36 END IF;
37 WHEN dva =>
38 q<='0';
39 IF(d='1')THEN nx_state <= tri;
40 ELSE nx_state <= nula;
41 END IF;
42 WHEN tri =>
43 q<='1';
44 IF(d='0')THEN nx_state <= nula;
45 ELSE nx_state <= tri;
46 END IF;
47 END CASE;
48 END PROCESS;
49 END FSM;
50----------------------------------------------
1 -----Resenje 2 -------------------------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 ----------------------------------------------
5 ENTITY detektor_bit_oblika IS
6 PORT (d,clk,rst : IN STD_LOGIC;
7 q: OUT STD_LOGIC);
8 END detektor_bit_oblika;
9 ----------------------------------------------
10 ARCHITECTURE FSM OF detektor_bit_oblika IS
11 TYPE state IS (nula, jedan, dva, tri);
12 SIGNAL pr_state, nx_state : state;
13 BEGIN
81
14 ---- sekvencijalni deo --------------------
15 PROCESS (clk,rst)
16 BEGIN
17 IF(rst='1')THEN
18 pr_state <=nula;
19 ELSIF(clk'EVENT AND clk='1') THEN
20 pr_state <= nx_state;
21 END IF;
22 END PROCESS;
23 ---- kombinacioni deo --------------------
24 PROCESS(d,pr_state)
25 BEGIN
26 q<='0'; -- podrazumevane
27 nx_state <= nula; -- vrednosti
28 CASE pr_state IS
29 WHEN nula =>
30 IF(d='1')THEN nx_state <= jedan;
31 END IF;
32 WHEN jedan =>
33 IF(d='1')THEN nx_state <= dva;
34 END IF;
35 WHEN dva =>
36 IF(d='1')THEN nx_state <= tri;
37 END IF;
38 WHEN tri =>
39 q<='1';
40 IF(d='0')THEN nx_state <= nula;
41 END IF;
42 END CASE;
43 END PROCESS;
44 END FSM;
45----------------------------------------------
S0
,V
D
=0
10
=1
/K
/K
=0
D5 K
=1
=1
,V
D
10
/K
,V
=0
D
/K
FSM
5
=0
/K
D
=0
D10 V
5
,V
D
=0
D5 / K=0, V=0 S5
S10
clk rst
82
Dijagram stanja konačnog automata prikazan je na Sl. 2-48(b). Svako stanje odgovara ukupnom iznosu ubačenog
novca: S0 je početno stanje, koje važi sve do ubacivanja prve kovanice (ubačeno 0 din.); S5 - ubačeno je 5 din. i
S10 - ubačeno je ukupno 10 din. Automat ostaje u zatečenom stanju sve dok su oba ulaza, D5 i D10, jednaki 0.
Ovaj uslov je označen logičkim izrazom D5D10 na petljama koje postoje u svakom stanju. Iz stanja S0 automat
prelazi u stanje S5 (S10), ako je kao prva ubačena kovanica od 5 din. (10 din.). Iz stanja S5, automat prelazi u
stanje S10, ako je kao druga ubačena kovanica od 5 din (uslov D5). Međutim, ako je u stanju S5 ubačena
kovanica od 10 din. (D10), ukupan iznos ubačenog novca postaje jednak ceni karte, automat se vraća u početno
stanje i aktivira signal K. Pošto nema potrebe za vraćanjem kusura, signal V ostaje neaktivan. U stanju S10
takođe su moguća dva ishoda, pri čemu oba rezultuju u izdavanju karte (K=1). Pri tome, ako je ubačena
kovanica od 5 din., kusur se ne vraća (V=0), a ako je ubačeno 10 din. kusur se vraća (V=1) jer je vrednost
ubačenog novca (20 din.) veća od cene karte (15 din.). Uočimo da se radi o konačnom automatu Milijevog tipa,
jer izlazi, K i V, zavise ne samo od tekućeg stanja, već i od trenutne vrednosti ulaza. U nastavku je dat
odgovarajući VHDL opis.
1 ---------------------------------------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 ----------------------------------------------
5 ENTITY controller IS
6 PORT (D5,D10,clk,rst : IN STD_LOGIC;
7 K,V: OUT STD_LOGIC);
8 END controller;
9 ----------------------------------------------
10 ARCHITECTURE FSM OF controller IS
11 TYPE state IS (S0, S5, S10);
12 SIGNAL pr_state, nx_state : state;
13 BEGIN
14 ---- sekvencijalni deo --------------------
15 PROCESS (clk,rst)
16 BEGIN
17 IF(rst='1')THEN
18 pr_state <=S0;
19 ELSIF(clk'EVENT AND clk='1') THEN
20 pr_state <= nx_state;
21 END IF;
22 END PROCESS;
23 ---- kombinacioni deo --------------------
24 PROCESS(D5,D10,pr_state)
25 BEGIN
26 CASE pr_state IS
27 WHEN S0 =>
28 K<='0';V<='0';
29 IF(D5='1')THEN
30 nx_state <= S5;
31 ELSIF(D10='1') THEN
32 nx_state <= S10;
33 ELSE
34 nx_state<=S0;
35 END IF;
36 WHEN S5 =>
37 IF(D5='1')THEN
38 K<='0';V<='0';
39 nx_state <= S10;
40 ELSIF(D10='1') THEN
41 K<='1';V<='0';
42 nx_state <= S0;
43 ELSE
44 K<='0';V<='0';
45 nx_state<=S5;
46 END IF;
47 WHEN S10 =>
48 IF(D5='1')THEN
49 K<='1';V<='0';
50 nx_state <= S0;
51 ELSIF(D10='1') THEN
52 K<='1';V<='1';
53 nx_state <= S0;
83
54 ELSE
55 K<='0';V<='0';
56 nx_state <= S10;
57 END IF;
58 END CASE;
59 END PROCESS;
60 END FSM;
61----------------------------------------------
84
2.7.4 Kôdni šablon #2
Kod konačnih automata Murovog tipa, izlazi zavise isključivo od tekućeg stanja i formiraju se na osnovu
sadržaju flip-flopova. Zato se za izlaze ovog tipa kaže da su registarski ili sinhroni jer se mogu menjati samo u
trenucima promene sadržaja flip-flopova, tj. sinhronizovano sa aktivnom ivicom taktnog signala. Sa druge
strane, kod konačnih automata Milijevog tipa, izlazi zavise i od ulaza. To znači da se promene vrednosti ulaza
mogu direktno preneti na izlaz. Za izlaze ovog tipa kaže se da su asinhroni, jer se mogu promeniti u bilo kom
trenutku, nezavisno od taktnog signala. Međutim, često se nameće potreba da izlazni signali pojedinih modula u
nekom složenijem sistemu budu sinhroni, tj. da se mogu menjati isključivo u trenucima delovanja aktivne ivice
taktnog signala. Da bi se ovaj zahtev ispunio kod Milijeve FSM, potrebno je i na izlaze ugraditi flip-flopove ( Sl.
2-50).
85
END CASE;
END PROCESS;
END <ime_arhitekture>;
Modifikacija se sastoji u uvođenju dodatnog signala (temp). U kombinacionom procesu signal temp se koristi za
izračunavanje vrednosti izlaza, dok se u registarskom procesu prenosi na izlaz. Naredba koja obavlja prenos
vrednosti signala temp na izlazni port je sinhronizovana sa taktnim signalom i zbog toga se sintetiše u registar.
Pr. 2-53 Automat za prodaju karata (varijanta 2)
U ovom primeru realizovana je sinhrona varijanta kontrolera automata za prodaju karata iz Pr. 2-52. Uvedena su
dva pomoćna signala temp_K i temp_V koji se u kombinacionom procesu koriste za izračunavanje vrednosti
izlaza. Na Sl. 2-51 su prikazani rezultati simulacije obavljene pod istim uslovima kao u Pr. 2-52. Uočimo da
zbog postojanja izlaznog registra, postavljanje izlaza kasni za jedan taktni ciklus u odnosu na prvobitnu,
asihinhronu varijantu kontrolera. U konkretnoj primeni, ovo kašnjenje nije od značaja, jer ne remeti funkciju
uređaja (za taktnu frekvenciju od 1MHz, unosi dodatno kašnjenje u izdavanju karte od 1us). Sa druge strane,
sinhroni kontroler je otporniji na eventualne sporadične, lažne impulse na ulazima D5 i D10, koji zbog izlaznog
registra, sada ne mogu direktno da se prenesu na izlaz.
1 ---------------------------------------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 ----------------------------------------------
5 ENTITY controller IS
6 PORT (D5,D10,clk,rst : IN STD_LOGIC;
7 K,V: OUT STD_LOGIC);
8 END controller;
9 ----------------------------------------------
10 ARCHITECTURE FSM OF controller IS
11 TYPE state IS (S0, S5, S10);
12 SIGNAL pr_state, nx_state : state;
13 SIGNAL temp_K, temp_V : STD_LOGIC;
14 BEGIN
15 ---- sekvencijalni deo --------------------
16 PROCESS (clk,rst)
17 BEGIN
18 IF(rst='1')THEN
19 pr_state <=S0;
20 ELSIF(clk'EVENT AND clk='1') THEN
21 pr_state <= nx_state;
22 K <= temp_K; V <= temp_V;
23 END IF;
24 END PROCESS;
25 ---- kombinacioni deo --------------------
26 PROCESS(D5,D10,pr_state)
27 BEGIN
28 nx_state <= pr_state;
29 temp_K<='0';temp_V<='0';
30 CASE pr_state IS
31 WHEN S0 =>
32 IF(D5='1')THEN
33 nx_state <= S5;
34 ELSIF(D10='1') THEN
35 nx_state <= S10;
36 END IF;
37 WHEN S5 =>
38 IF(D5='1')THEN
39 nx_state <= S10;
40 ELSIF(D10='1') THEN
41 temp_K<='1';
42 nx_state <= S0;
43 END IF;
44 WHEN S10 =>
45 IF(D5='1')THEN
46 temp_K<='1';
47 nx_state <= S0;
48 ELSIF(D10='1') THEN
49 temp_K<='1';temp_V<='1';
86
50 nx_state <= S0;
51 END IF;
52 END CASE;
53 END PROCESS;
54 END FSM;
55 ----------------------------------------------
Različita kodiranja nisu ravnopravna, jer promenom kodiranja dolazi i do promene funkcije kombinacione
logike, koja za jedno kodiranje može biti složenija, a za neko drugo jednostavnija. Nalaženje optimalnog koda,
pri kome je složenost kombinacione logike najmanja, predstavlja veoma težak problem.
Kodiranje stanja konačnog automata može se razložiti na dva potproblema. Prvi je izbor broja bita, n, koji će biti
korišćeni za kodiranje, a drugi pridruživanje n-bitnih kombinacija stanjima. Binarne šeme kodiranja koriste
minimalni broja bita za kodiranje, koji za konačni automat sa N stanja iznosi n = log 2 N . (Na primer, za 4 stanja
potrebna su najmanje 2, a za 5 stanja 3 bita). Ovaj pristup garantuje da će broj flip-flopova biti najmanji mogući,
ali je zato kombinaciona logika nešto složenija. Druga strategija je onehot kodiranje gde je broj bita za kodiranje
jednak broju stanja (n=N). Svakom stanju se dodeljuje jedan bit iz N bitne binarne kombinacije koji kada je 1
ukazuje da je konačni automat u tom stanju. Onehot kodiranje zahteva veliki broj flip-flopova i zbog toga nije
praktično kod konačnih automata sa velikim brojem stanja, ali je zato, sa druge strane, kombinaciona logika
obično značajno jednostavnija i brža nego kod binarnog kodiranja. Onehot kodiranje se preporučuje u
slučajevima kada je broj stanja relativno mali, a za implementaciju se koristi tehnologija koja je ˝bogata˝ flip-
flopovima, kao što je FPGA. Naravno, moguća su i rešenja gde je broj bita između ova dve krajnje vrednosti.
Nakon što je izabran broj bita za kodiranje, potrebno je svakom stanju pridružiti jedinstvenu n-bitnu
kombinacije. Umesto eksplicitnog ispitivanja velikog broja alternativnih pridruživanja, obično se koriste neka
od standardnih strategija ili heuristika kodiranja, koje ne garantuju dobijanje optimalnog rešenja, ali u najvećem
broju slučajeva daju rešenje koje je blisko optimalnom. Na primer, heuristika minimalne promene bitova
dodeljuje binarne kombinacije stanjima na takav način da je broj bita koji se menja prilikom promene stanja
minimalan. Na primer, ako u dijagramu stanja postoji prelaz iz stanja S0 u S1, tada je kodiranja koje stanju S0
dodeljuje kombinaciju 000, a stanju S1 001, bolje od onoga koje stanju S0 dodeljuje 000, a stanju S1 111. U
prvom slučaju zadatak kombinacione logike je jednostavniji jer treba da promeni samo jedan, a ne sva tri bita
kao u drugom slučaju. Uočimo da je kod onehot kodiranja, uslov minimalne promene bita uvek ispunjen.
87
Napomenimo da CAD sistemi za sintezu, po pravilu, poseduju mogućnost automatskog kodiranja stanja
konačnog automata. Sa takvim alatom na raspolaganju, projektant ima mogućnost da isključi ovu opciju i
kodiranje obavi ručno, ili da zadatak kodiranja stanja prepusti alatu, pri čemu bira jednu od raspoloživih
heuristika kodiranja.
U svim prethodnim primerima VHDL opisa konačnih automata, stanja su kodirana na simbolički način pomoću
nabrojivog tipa podataka koji definiše imena stanja, ali ne i njihove kodove. Ovakav stil kodiranja se oslanja na
podršku alata za sintezu koji će prilikom kompajliranja VHDL kôda, simbolička imena stanja zameniti binarnim
kombinacijama u skladu sa izabranom heuristikom kodiranja. Način na koji se u VHDL-u specificira heuristika
kodiranja zavisi od CAD alata koji se koristi za sintezu. Na primer u CAD sistemu ISE koji se koristi za
projektovanje za Xilinx FPGA, heuristika kodiranja stanja se specificira pomoću atributa koji se pridružuje
nabrojivom tipu podataka za stanja, a čija vrednost definiše heuristiku kodiranja. Atribut se definiše u
deklarativnom delu arhitekture nakon deklaracije nabrojivog tipa:
. . .
ARCHITECTURE <ime_arhitekture> OF <ime_entiteta> IS
TYPE state IS (state_0,state_1,state_2 ...);
attribute fsm_encoding : string;
attribute fsm_encoding of state is “gray”
SIGNAL pr_state,nx_state : state;
BEGIN
. . .
Prva od dve linije kôda posvećenih specifikaciji heuristike kodiranja stanja deklariše atribut imena
fsm_enciding, a druga pridružuje atribut tipu podataka state i dodeljuje mu vrednost ˝gray˝, koja odgovara
huristici minimalne promene bitova. Ako se heuristika eksplicitno ne navede u VHDL kôdu, alat će koristi
podrazumevanu opciju (kod Xilinx ISE to je ˝one-hot˝). Za neki drugi CAD sistem, način specifikacije
heuristike kodiranja može biti drugačiji.
Ako projektant želi da samostalno kodira stanja konačnog automata, tada pridruživanje binarnih kombinacija
stanjima vršiti, takođe, pomoću atributa koji vezuje za nabrojivi tip podataka state, na sledeći način:
. . .
ARCHITECTURE FSM OF detektor_bit_oblika IS
TYPE state IS (S0, S1, S2, S3);
attribute enum_encoding of state: type is "00 10 11 01";
SIGNAL pr_state, nx_state : state;
BEGIN
. . .
String dodeljen atributu enum_encoding sadrži niz od četiri binarne kombinacije koje se redom dodeljuju
stanjima S0, S1, S2 i S3 definisana tipom state. Napomenimo da ovakav način ručnog kodiranja važi za Xilinx
ISE sistem.
88
se u bloku navode samo imena signala koji su aktivni u konkretnom stanju. Za preostale signale se podrazumeva
da su neaktivni. Na primer, da bi se naglasilo da u datom stanju izlaz z ima vrednost 1, dovoljno je napisati z
umesto z=1. Pored signala, u bloku stanja se mogu naći i tzv. naredbe registarskog prenosa koje specificiraju
akciju koju treba preduzeti nad nekom promenljivom (tj. registarskom komponentom). Za naredbe registarskog
prenosa se koristi simbol ←. Na primer, count ←count + 1 znači da sadržaj promenljive count treba uvećati za
1. Efekat ove naredbe je da će u datom stanju upravljačkih signala brojača biti postavljeni na način koji će
omogućiti inkrementiranje njegovog sadržaj, ali samo inkrementiranje desiće se u trenutku naredne aktivne ivice
taktnog signala.
Blok grananja se crta kao romb koji sadrži uslov koji određuje koja će od dve izlazne grane biti izabrana. Uslov
kombinuje jedan ili više ulaza konačnog automata u logički izraz čija vrednost može biti tačno (1) ili netačno
(0). Na primer, w napisano u bloku grananja znači da je odluka zasnovana na vrednosti signala w (ako je w=0,
nastavljamo putem tačno, a ako je w=1, putem netačno). Slično, uslov w1w2 znači da će biti grana tačno biti
izabrana ako su oba signala jednaka 1, tj. w1=w2=1, a da će u svim ostalim slučajevima automat slediti granu
netačno.
Blok uslovnog izlaza se crta u vidu zaobljenog pravougaonika i sadrži izlaze Milijevog tipa, odnosno izlaze koji
zavise kako od tekućeg stanja tako i od trenutnog ulaza automata. Blok uslovnog izlaza uvek sledi nakon jednog
ili više bloka grananja, a nikada direktno nakon bloka stanja.
Na Sl. 2-53(a) je prikazan ASM dijagram koji reprezentuje konačni automat iz Pr. 2-51 (detektor bit-oblika).
Prelazi između blokova stanja zavise od uslova koji testira ulazni signal d. U svim slučajevima kada je d=0,
izlazna grana vodi u stanje nula. Ako je w=1, desiće se prelaz iz nula u jedan, iz jedan u dva ili iz dva u tri.
Međutim, ako je w=1 u stanju tri, konačni automat će ostati u istom stanju. Jedini izlaz automata, q, je Murovog
tipa i aktiva je samo u stanju tri. U ostalim stanjima važi q=0 što predstavlja i razlog zbog koga su blokovi ovih
stanja prazni.
ASM dijagram automata za prodaju karata (Pr. 2-52) prikazan je na Sl. 2-53(b). Pošto se radi o konačnom
automatu Milijevog tipa, u ASM dijagramu uočavamo blokove uslovnog izlaza koji sadrže izlazne signale
automata, K i V. Na primer, izlaz K (signal za izdavanje karte) biće aktivan ako je automat u stanju S5 i ubačena
je kovanica od 10 din., ili ako je u stanju S10, pod uslovom da je ubačena bilo koja kovanica. Slično, izlaz V
(povraćaj kusura) je aktivan u stanju S10 pod uslovom da je ubačena kovanica od 10 din. Kao što primećujemo,
za aktiviranje uslovnog izlaza (tj. izlaza Milijevog) nije dovoljno da automat bude u nekom konkretnom stanju,
već je potreban i neki dodatni uslov, određen blokovima grananja koji iz bloka stanja vode do odgovarajućeg
bloka uslovnog izlaza.
(a) (b)
Sl. 2-53 ASM dijagrami: (a) odgovara dijagramu stanja iz Pr. 2-51; (b) odgovara dijagramu stanja iz Pr. 2-52.
89
Pr. 2-54 Brojač jedinica (sekvecijalna varijanta)
Brojač jedinica (BJ) je kolo koje određuje broj 1-ca u ulaznom binarnom vektoru. U Pr. 2-43 realizovali smo
kombinacionu varijantu ovog kola. U ovom primeru, realizovaćemo sekvencijalni brojač jedinica (BJ) čiji je
blok dijagram prikazan na Sl. 2-54(a). Ulazni podatak dovodi se na ulaz a, a rad BJ-a se startuje aktiviranjem
signala start u trajanju jednog taktnog perioda. Nakon završenog izračunavanja, BJ postavlja rezultat na izlaz b i
aktivira izlazni signal kraj (u trajanju od jednog taktnog perioda).
Za brojanje jedinica možemo koristiti sledeći postupak (algoritam) opisan u vidu pseudo koda:
B = 0;
while(A≠0) do
if(A0 = 1) then
B = B + 1;
end if;
A = A >> 1;
end while;
U algoritmu se koriste dve promenljive: A (sadrži podatak koje se obrađuje) i B (koristi se za brojanje 1-ca).
Algoritam radi tako što pomera sadržaj promenljive A udesno, i broji koliko puta je na poziciji najmanje težine
(A0) bila prisutna 1-ca. Algoritam se završava kada u promenljivoj A više nema 1-ca.
S0
regB <- 0
regA <- a
0
start
S1 S2
regA <- regA >> 1 Kraj
da
regA=0
ne
a b 0
regA(0)
start
BJ 1
rst kraj regB <- regB + 1
clk
(a) (b)
Sl. 2-54 Brojač jedinica: (a) blok dijagram; (b) ASM dijagram
Na Sl. 2-54(b) je prikazan ASM dijagram BJ-a zasnovan na opisanom algoritmu. Promenljivama u hardveru
odgovaraju registri. Zato su imena promenljivih A i B iz algoritma u ASM dijagramu promenjena na regA i
regB. Osenčeni deo ASM dijagram ogovara opisanom algoritmu, dok preostali deo predstavlja proširenje koje
reguliše rad interfejsa kola (signali start i kraj). S0 je inicijalno stanje u koje ASM ostaje sve dok se ulaz start
ne postavi na start=1. Blok stanja S0 sadrži dve naredbe registarskog prenosa koje inicijalizuju registre regA i
regB (u regA se upisuje vrednost sa ulaza a, a regB se postavlja na 0). Kada start postane aktivan, ASM prelazi
u stanje S1 koje predstavlja radno stanje BJ-a. Lako uočavamo sličnost ovog dela ASM dijagrama sa prethodno
opisnim algoritmom. U stanju S1, sadržaj promenljive regA se bezuslovno pomera udesno (zato se operacija
nalazi u bloku stanja), dok je uvećanje promenljive B za 1 uslovljeno vrednošću bita regA(0) (zato je ova
operacija navedena u bloku uslovnog izlaza). U ciklusu kada regA postane jednako nuli, brojanje jedinica je
završeno i ASM prelazi u stanje S2. U ovom stanju se aktivira signal kraj što za korisnika ovog kola znači da je
izračunavanje završeno i rezultat prisutan na izlazu b.
Pre nego što pređemo na opis ASM dijagrama u VHDL-u, važno je istaći izvesne pojedinosti vezane za način
rada i interpretacije ASM dijagrama. Mada, ASM dijagram nalikuje konvencionalnom, softverskom dijagramu
toka, oblasti primene ova dva tipa dijagrama se razlikuju. Oba služe za opis algoritama. Softverske dijagrame
toka koriste programeri, kao početni korak u procesu razvoja programa čija je namena da omogući izvršenje
90
datog algoritam na računarskoj mašini. ASM dijagrame koriste projektanti digitalnog hardvera, kao početni
korak u procesu realizacije datog algoritma direktno u hardveru. U pogledu interpretacije, razlika između
softverskog dijagrama toka i ASM dijagrama ogleda se pre svega u odnosu na to kako protok vremena utiče na
rad algoritma. Računarska mašina izvršava algoritam instrukciju-po-instrukciju; svaka instrukcija se obavlja u
toku jednog instrukcijskog ciklusa, a instrukcijski ciklusi mogu imati različito trajanje. Iz tog razloga, softverski
dijagram ne navodi tačan iznos vremena koji je potreban da bi se izvršio jedan algoritamski korak, već samo
jednoznačno određuje tok (sekvencu) algoritamskih koraka. Programer je svestan činjenice da izvršenje
algoritma na računskoj mašini zahteva neko konačno vreme, koje zavisi od broja i složenosti operacija koje
treba izvršiti, ali sam tok algoritma i konačni rezultat ne zavise od vremena izvršenja pojedinačnih operacija. Sa
druge strane, rad digitalnog sistema je iniciran taktnim signalom, a u toku jednog taktnog perioda digitalni
sistem može da obavi jednu ili više operacija. Naime, u radu digitalnog sistema ispoljava se paralelizam. S
toga, osnovna pretpostavka kod ASM dijagram se sastoji u sledećem: svaki algoritamski korak traje isto, fiksno
vreme (jednako taktnom periodu), a sve operacije obuhvaćene jednim algoritamskim korakom se izvršavaju
istovremeno (u paraleli). Paralelni alogritamski korak čini jedan blok stanja i svi blokovi grananja i uslovnog
izlaza pridruženi tom bloku. Na primer, sve operacije sadržane u osenčenom delu ASM dijagrama sa izvršavaju
se u paraleli, tj u okviru istog taktnog perioda, u kome je ASM u stanju S1. Slično, blok stanja S0 i grananje u
odnosu na signal start zajedno čine jedan paralelni algoritamski korak.
Druga napomena se odnosi na naredbe registarskog prenosa. Registri su memorijske komponente koje
zadržavaju upisani sadržaj sve do novog upisa. To znači da ako u bloku stanja ne postoji naredba registarskog
prenosa koja dodeljuje novu vrednost nekom registru, sadržaj tog registra će ostati nepromenjen. Takođe,
naredba registarskog prenosa ne definiše vrednost koju registar, naveden sa leve strane znak ← ima u datom
stanju, već vrednost koja će biti upisana u registar sledećom aktivnom ivicom taktnog signala, tj. u trenutku
napuštanja tekućeg stanja. Na primer, razmotrimo stanje S1 iz ASM dijagrama sa Sl. 2-54(b). Da se radi o
konvencionalnom dijagramu toka, po ulasku u stanje S1, promenljiva regA bi najpre bila pomerena udesno, a
zatim bi se u blokovima grananja koji slede ispitivala njena nova vrednost. Pošto ASM dijagram opisuje
sekvencijalno kolo, do promene promenljivih regA i regB, koje predstavljaju izlaze flip-flopova, dolazi tek
nakon sledeće aktivne ivice takta. To znači da se u testiranjima koja slede nakon bloka stanja S1 koristi stara
vrednost regA (pre pomeranja). Ako je regA=0, sledeća aktivna ivica takta iniciraće prelaz ASM-a u stanje S2 i,
u isto vreme, pomeranje regA udesno. Ako je regA≠0, ASM ne menja stanje, već ostaje u S1. Bez obzira na to,
regA se pomera udesno, a regB uvećava za 1, pod uslovom ako je regA(0)=1. Iako je operacija pomeranja u
ASM dijagramu na početku, a u pseudo kodu na kraju petlje, efekat je isti, s obzirom da se u oba slučaju
pomeranje obavlja na kraju tekuće iteracije.
U nastavku je dat VHDL kôd BJ-a koji odgovara ASM dijagramu sa Sl. 2-54(b). Struktura kôda je slična
kodnom šablonu #1, s tom razlikom što se sada sekvencijalni proces ne bavi samo registrom stanja, pr_state,
već opisuje i registarske promenljive iz ASM dijagrama, regA i regB. U CASE naredbi, za svako stanje
navedene su naredbe registarskog prenosa pridružene tom stanju, kako one Murovog tipa (napisane u
odgovarajućem bloku stanja) tako i one Milijevog tipa (navedene u blokovima uslovnog izlaza koji su
pridruženi tom stanju). Na primer, u stanju S0, obavljaju se dve bezuslovne (Murove) naredbe registarsko
prenosa; u stanju S1 postoji jedna Murova naredba i jedna Milijeva, zajedno sa odgovarajućim uslovom; u
stanju S2 ne postoje naredbe registarskog prenosa (zato je u odgovarajućoj WHEN grani navedeno NULL).
Kombinacioni proces, slično kao kod konačnih automata, opisuje funkciju kombinacione logike koja definiše
sledeće stanje i vrednosti Murovih i Milijevih izlaza u zavisnosti od tekućeg stanja, trenutnog ulaza i trenutne
vrednosti registarskih promenljivih.
Rezultati simulacije VHDL kôda, za slučaj kada je ulazni podatak a=˝00010111˝ dati su na Sl. 2-55.
1 -----------------------------------------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 USE ieee.std_logic_unsigned.all;
5 -----------------------------------------------
6 ENTITY ones_counter IS
7 PORT (a : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
8 clk, rst, start : IN STD_LOGIC;
9 b : OUT STD_LOGIC_VECTOR(2 DOWNTO 0);
10 kraj : OUT STD_LOGIC);
11 END ones_counter;
12 -----------------------------------------------
13 ARCHITECTURE ASM OF ones_counter IS
14 SIGNAL regA : STD_LOGIC_VECTOR(7 DOWNTO 0);
15 SIGNAL regB : STD_LOGIC_VECTOR(2 DOWNTO 0);
16 TYPE state IS (S0, S1, S2);
17 SIGNAL pr_state, nx_state : state;
91
18 BEGIN
19 -- sekvencijalni process --------------------
20 PROCESS (clk,rst)
21 BEGIN
22 IF(rst='1')THEN
23 pr_state <=S0;
24 regA <= "00000000";
25 regB <= "000";
26 ELSIF(clk'EVENT AND clk='1') THEN
27 pr_state <= nx_state;
28 CASE pr_state IS
29 WHEN S0 =>
30 regA <= a;
31 regB <= "000";
32 WHEN S1 =>
33 regA <= '0' & regA(7 DOWNTO 1);
34 IF(regA /= "00000000" AND regA(0) = '1') THEN
35 regB <= regB + 1;
36 END IF;
37 WHEN S2 => NULL;
38 END CASE;
39 END IF;
40 END PROCESS;
41 -- kombinacioni process --------------------
42 PROCESS(regA, start, pr_state)
23 BEGIN
44 nx_state <= pr_state;
45 kraj <= '0';
46 CASE pr_state IS
47 WHEN S0 =>
48 if(start = '1') then
49 nx_state <= S1;
50 end if;
51 WHEN S1 =>
52 if(regA = "00000000") THEN
53 nx_state <= S2;
54 end if;
55 WHEN S2 =>
56 kraj <= '1';
57 nx_state <= S0;
58 END CASE;
59 END PROCESS;
60 b <= regB;
61 END ASM;
62 -----------------------------------------------
92
2.8 Memorijske komponente
U ovom poglavlju razmatra se projektovanje memorijskih komponenti u VHDL-u.
ROM
ROM (Read-Only Memory) je memorija sa fiksnim sadržajem, tj. memorijska komponenta koja može samo da
se čita. Sadržaj ROM-a se definiše u toku projektovanja i ne može se menjati u toku njegove eksploatacije. Blok
dijagram ROM-a prikazan je na Sl. 2-56. ROM čini m memorijskih lokacija, ili reči, od po n bita. Na ulazni port
addr postavlja se adresa lokacije koja se čita, dok se sa izlaznog porta data preuzima sadržaj adresirane reči.
Sledi generički opis ROM-a.
93
Sl. 2-57 RAM sa razdvojenim ulazim i izlazim portovima za podatke.
Ispod je dat VHDL kôd koji realizuje RAM sa Sl. 2-57. Izabran je kapacitet 16x8, tj. words=16 i bits=8. Kôd je
u potpunosti generički. Kao i kod ROM-a, uveden je tip podataka mem_array koji predstavlja dvodimenzionalo
polje dimenzija 16x8 (linije 15 i 16), ali za razliku od ROM-a, zbog potrebe upisa, ˝memorijski medijum˝
memory nije konstanta već signal (linija 17). Arhitektura sadrži proces (linije 19-26), koji reguliše upis, i
konkurentnu naredbu dodele (linija 27), koja je zadužena za čitanje memorije. Proces sadrži dve ugnježdene IF
naredbe: prva dozvoljava upis ako je wr_ena jednak 1 (linija 21), a druga sinhroniše upis sa rastućom ivicom
taktnog signala clk. S obzirom da linija 23 predstavlja sinhronu narednu dodele, signal mamory se sintetiše u
polje od 16x8=128 flip-flopova. Konkurentno sa procesom, naredba dodele iz linije 27, prenosi sadržaj
adresirane reči na izlazni port data_out.
1 ----------------------------------------------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 ----------------------------------------------------
5 ENTITY RAM IS
6 GENERIC (bits: INTEGER := 8; -- broj bita po reci
7 words: INTEGER := 16); -- broj reci u memoriji
8 PORT (wr_ena, clk : IN STD_LOGIC;
9 addr : IN INTEGER RANGE 0 TO words-1;
10 data_in : IN STD_LOGIC_VECTOR(bits-1 DOWNTO 0);
11 data_out : OUT STD_LOGIC_VECTOR(bits-1 DOWNTO 0));
12 END RAM;
13----------------------------------------------------
14 ARCHITECTURE ram OF RAM IS
15 TYPE mem_array IS ARRAY (0 TO words-1) OF
16 STD_LOGIC_VECTOR(bits-1 DOWNTO 0);
17 SIGNAL memory : mem_array;
18 BEGIN
19 PROCESS(clk, wr_ena)
20 BEGIN
21 IF(wr_ena = '1') THEN
22 IF(clk'EVENT AND clk='1') THEN
23 memory(addr) <= data_in;
24 END IF;
25 END IF;
26 END PROCESS;
27 data_out <= memory(addr);
28 END ram;
29----------------------------------------------------
RAM sa bidirekcionim ulazno-izlaznim portom za podatke
Organizacija RAM-a sa bidirekcionim ulazno-izlaznim portom prikazana je na Sl. 2-58. Struktura je slična onoj
sa Sl. 2-57 osim što se sada upis i čitanje podataka vrši preko istog porta, bidir. Kada je wr_ena=1, podatak
spolja postavljen na port bidir, pod dejstvom taktnog signala, upisuje se u reč adresiranu vrednošću prisutnom
na adresnom portu, addr. Kada je wr_ena=0, podatak iz adresirane reči prenosi se na port bidir. Na taj način,
signal wr_ena reguliše smer bidirekcionog porta bidir: za wr_ena=1, bidir se ponaša kao ulazni, a za wr_ena=0
kao izlazni port.
94
Sl. 2-58 RAM sa bidirekcionim portom za podatke
1 ----------------------------------------------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 ----------------------------------------------------
5 ENTITY RAM IS
6 GENERIC (bits: INTEGER := 8; -- broj bita po reci
7 words: INTEGER := 16); -- broj reci u memoriji
8 PORT (wr_ena, clk : IN STD_LOGIC;
9 addr : IN INTEGER RANGE 0 TO words-1;
10 bidir : INOUT STD_LOGIC_VECTOR(bits-1 DOWNTO 0));
11 END RAM;
12----------------------------------------------------
13 ARCHITECTURE ram OF RAM IS
14 TYPE mem_array IS ARRAY (0 TO words-1) OF
15 STD_LOGIC_VECTOR(bits-1 DOWNTO 0);
16 SIGNAL memory : mem_array;
17 BEGIN
18 PROCESS(clk, wr_ena)
19 BEGIN
20 IF(wr_ena = '0') THEN
21 bidir <= memory(addr);
22 ELSE
23 bidir <= (OTHERS => 'Z');
24 IF(clk'EVENT AND clk='1') THEN
25 memory(addr) <= bidir;
26 END IF;
27 END IF;
28 END PROCESS;
29 END ram;
----------------------------------------------------
U gornjem VHDL kôdu, koji odgovara RAM-u sa Sl. 2-58, uočimo liniju 11 u kojoj se deklariše port bidir. Smer
porta je postavljen na INOUT što ukazuje da se radi o bidirekcionom portu. Za opis funkcije RAM-a koristi se
proces (linije 19-29). Operacija čitanja (wr_ena=1) realizuje se na identičan način kao kod RAM-a sa dva porta:
podatak iz adresirane reči se prenosi na port bidir (linija 22). Međutim, operacija upisa (wr_ena=1) dodatno
zahteva da se port bidir postavi u stanje visoke impedanse (linija 24). Pod tim uslovom, podatak koji se prihvata
sa porta bidir i pamti u niz memory (linija 26) određen je vrednošću koja se spolja postavlja na ovaj port.
Fizički, bidirekcioni portovi se realizuju pomoću trostatičkih bafera (na šta ukazuje linija 24 u kojoj se na port
postavlja vrednost ´Z´). Princip je ilustrovan na Sl. 2-59. Unutar kola i dalje egzistiraju razdvojeni jednosmerni
putevi za podatke (magistrale), data_in i data_out, koji se spajaju u zajedničku tačku koja odgovara eksternom
bidirekcionom portu. Pri tome se magistrala data_out može prekinuti trostatičkim baferom. Za wr_ena=1,
vrednost sa magistrale data_out prolazi kroz trostatički bafer i pojavljuje se na portu bidir. Za wr_ena=0, veza
magistrale data_out i porta je prekinuta zakočenim trostatičkim baferom, tako da na port bidir slobodno može
da se postavi podatak koji će magistralom data_in stići do svog odredišta.
95
2.9 Paketi i komponente
U dosadašnjem izučavanju VHDL-a ovladali smo osnovama jezika i tehnikama kôdiranja, što obuhvata sledeće:
• Struktura kôda: biblioteka, entitet, arhitektura
• Tipovi podataka
• Operatori i atributi
• Konkurentne naredbe i konkurentni kôd
• Sekvencijalne naredbe i sekvencijalni kôd
• Signali, varijable i konstante
• Projektovanje konačnih automata
• Projektovanje memorijskih komponenti
Drugim rečima, u ovom trenutku smo u stanju da realizujemo VHDL kôd čija struktura odgovara levom delu Sl.
2-60. Dobro razumevanje ove materije od velikog je značaja kako za projektovanje kola male složenosti tako i za
projektovanje velikih i složenih sistema.
2.9.1 PACKAGE
Kao što je već rečeno, često korišćeni delovi VHDL kôda pišu se u obliku komponenti, funkcija i procedura.
Takav kôd se smešta u paket i kompajlira i na taj način generiše biblioteke. Značaj ove tehnike je u sledećem:
omogućava podelu kôda na manje jedinice, olakšava razmenu kôda sa drugim projektantima i pruža mogućnost
ponovnog korišćenje kôda u novim projektima.
Osim komponenti, funkcija i procedura, paket može sadržati i deklaracije drugih jezičkih celina, kao što su
tipovi podataka, konstante i globalno vidljivi signali. Paket ima sledeću sintaksu:
96
PACKAGE ime_paketa IS
(deklaracije)
END ime_paketa
[PACKAGE BODY ime_paketa IS
(funkcije i procedure )
END ime_paketa]
Sintaksu paketa čine dve celine: deklaracija paketa (PACKAGE) i telo paketa (PACKAGE BODY). Prva celina
je obavezna i sadrži sve deklaracije. Telo paketa je opciono i neophodno samo ako u deklaracija paketa postoji
jedna ili više deklaracija potprograma (funkcija ili procedura) u kom slučaju sadrži opise (tela) svih
potprograma. PACKAGE i PACKAGE BODY moraju imati isto ime.
Pr. 2-55 Primer jednostavnog paketa
VHDL kôd iz ovog primera definiše paketa imena nas_paket. S obzirom da paketa sadrži samo deklaracije tipa
TYPE i CONSTANT (dva tipa podataka i jednu konstantu), telo paketa nije neophodno.
1 ----------------------------------------------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 ----------------------------------------------------
5 PACKAGE nas_paket IS
6 TYPE state IS (st1,st2,st3,st4);
7 TYPE boja IS (crvena, bela, plava);
8 CONSTANT niz: STD_LOGIC_VECTOR(7 DOWNTO 0) := "11111111";
9 END nas_paket;
10----------------------------------------------------
Pr. 2-56 Paket sa funkcijama
Paket iz ovog primera, pored deklaracije dva tipa podataka i jedne konstante, sadrži i jednu funkciju. Iz tog
razloga telo paketa je neophodno. Deklaracija funkcije je smeštena u deklaraciji paketa, a telo funkcije u telu
paketa.
1 ----------------------------------------------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 ----------------------------------------------------
5 PACKAGE nas_paket IS
6 TYPE state IS (st1,st2,st3,st4);
7 TYPE boja IS (crvena, bela, plava);
8 CONSTANT niz: STD_LOGIC_VECTOR(7 DOWNTO 0) := "11111111";
9 FUNCTION rastuca_ivica(SIGNAL s : STD_LOGIC) RETURN BOOLEAN;
10 END nas_paket;
11----------------------------------------------------
12 PACKAGE BODY nas_paket IS
13 FUNCTION rastuca_ivica(SIGNAL s : STD_LOGIC) RETURN BOOLEAN IS
14 BEGIN
15 RETURN (s'EVENT AND s='1');
16 END rastuca_ivica;
17 END nas_paket;
18----------------------------------------------------
Oba paketa iz prethodnih primera se mogu kompajlirati i tako postati deo radne biblioteke work (ili bilo koje
druge). Paket se uključuje u VHDL kôd naredbom USE koja se piše na početku glavnog kôda:
--------------------------------
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE work.nas_paket.all;
--------------------------------
ENTITY . . .
. . .
ARCHITECTURE . . .
. . .
97
2.9.2 COMPONENT
Pojam komponenta odnosi se celoviti deo VHDL kôda (entitet plus arhitektura) koji opisuje neko kolo. Takva
jedna celina se može deklarisati kao COMPONENT i na taj način postati dostupna za korišćenje u drugim
delovima VHDL kôda za konstrukciju složenijih kola ili u novim projektima, bez potrebe ponovnog pisanje
istog kôda.
COMPONENT konstrukcija VHDL jezika predstavlja osnovu strukturnog i hijerarhijskog projektovanja.
Strukturno projektovanje znači da se složenija kola realizuju povezivanjem jednostavnijih komponenti.
Hijerarhijsko projektovanje odnosi se na mogućnost da strukturno opisano kolo može takođe biti deklarisano
kao komponenta i zatim korišćeno u realizaciji još složenijih kola. Na primer, često korišćena kola, kao što su
flip-flopovi i logička kola, mogu se jednom opisati VHDL kôdom, deklarisati kao komponente, a zatim
proizvoljan broj puta koristiti (instancirati) za realizaciju složenijih struktura, kao što su registri, sabirači i td.
98
Instanciranje komponente:
labela: ime_komponente PORT MAP(lista_portova);
Deklaracija komponente slična je deklaraciji entiteta: navode se imena portova zajedno sa njihovim mode-ovima
(IN, OUT, BUFER ili INOUT) i tipom (STD_LOGIC, BIT, INTEGER i sl.). U naredbi za instanciranje
komponente navodi se labela, posle koje sledi ime komponente i deklaracija PORT MAP. Lista portova
sadržana u PORT MAP deklaraciji povezuje portove i signale kola koje se projektuje sa portovima ranije
projektovane komponente koja se instancira.
Deklaracija komponente AND2 iz primera (linije 7-9) tumači se ovako: komponenta ima dva ulazna porta, x i y i
jedan izlazni port z, svi tipa BIT. U telu arhitekture, kola koje se projektuje, ova komponenta je jedanput
instancirana (linija 19). Labela A1 definiše ime ove instance u arhitekturi. Lista portova, PORT
MAP(s2,din,ctrl), povezuje signal s2 sa portom x komponente AND2, kao i portove din i ctrl entiteta gating
sa portovima y i z komponente AND2. Uočimo da redosled navođenja signala u listi portova odgovara redosledu
u kome su portovi navedeni u deklaraciji komponente. Ovakav način uspostavljanja korespondencije zove se
poziciono povezivanje.
Princip rada sa komponentama ilustrovan je na Sl. 2-62. Pre korišćenja, komponenta mora biti projektovana,
kompajlirana i smeštena u biblioteku. Postoje dva osnovna načina za uključivanje komponenti u glavni kôd.
Pristup koga smo koristili u prethodnom primeru, podrazumeva da se komponente deklarišu u glavnom kôdu, tj.
u deklarativnom delu arhitekture (Sl. 2-62(a)). Drugi način je da se deklaracije svih komponenti prvo smeste u
paket koji se potom uključuje u glavni kôd (Sl. 2-62(b)). Na taj način eliminiše se potreba da se komponenta
eksplicitno deklariše u svakoj arhitekturi gde se koristi. Primeri oba pristupa izloženi su u nastavku.
(a) (b)
Sl. 2-62 Načini za deklaraciju komponenti: (a) deklaracija u glavnom kôdu; (b) deklaracija u paketu.
a
x
b
c y
d
99
9 ARCHITECTURE inv OF inv IS
10 BEGIN
11 b <= NOT a;
12 END inv;
13 --------------------------------------------
1 ------ Fajl nand2.vhd -------------------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 ---------------------------------------------
5 ENTITY nand2 IS
6 PORT ( a,b: IN STD_LOGIC; c : OUT STD_LOGIC);
7 END nand2;
8 ---------------------------------------------
9 ARCHITECTURE nand2 OF nand2 IS
10 BEGIN
11 c <= a NAND b;
12 END nand2;
13 ---------------------------------------------
1 ------ Fajl nand3.vhd -------------------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 ---------------------------------------------
5 ENTITY nand3 IS
6 PORT ( a,b,c: IN STD_LOGIC; d : OUT STD_LOGIC);
7 END nand3;
8 ---------------------------------------------
9 ARCHITECTURE nand3 OF nand3 IS
10 BEGIN
11 d <= NOT(a AND b AND c);
12 END nand3;
13 ---------------------------------------------
1 ------ Fajl projekat.vhd -------------------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 ---------------------------------------------
5 ENTITY projekat IS
6 PORT ( a,b,c,d: IN STD_LOGIC;
7 x,y : OUT STD_LOGIC);
8 END projekat;
9 ---------------------------------------------
10 ARCHITECTURE struktura OF projekat IS
11 ----------------
12 COMPONENT inv IS
13 PORT(a: IN STD_LOGIC; b: OUT STD_LOGIC);
14 END COMPONENT;
15 ----------------
16 COMPONENT nand2 IS
17 PORT(a,b: IN STD_LOGIC; c: OUT STD_LOGIC);
18 END COMPONENT;
19 ----------------
20 COMPONENT nand3 IS
21 PORT(a,b,c: IN STD_LOGIC; d: OUT STD_LOGIC);
22 END COMPONENT;
23 ----------------
24 SIGNAL w: STD_LOGIC;
25 BEGIN
26 K1: inv PORT MAP(b,w);
27 K2: nand2 PORT MAP(a,b,x);
28 K3: nand3 PORT MAP(w,c,d,y);
29 END struktura;
30 ---------------------------------------------
Pr. 2-59 Deklaracija komponenti u paketu.
Ponovo ćemo realizovati projekat iz prethodnog primera ( Sl. 2-63), ali sada na način kao na Sl. 2-62(b) koji
podrazumeva kreiranje paketa sa deklaracijama svih korišćenih komponenti (inv, nand2 i nand3). Biće nam
100
potrebno pet fajlova: tri za VHDL kôd komponenata i po jedan za paket i projekat. Iako u odnosu na pristup iz
primera, sada postoji jedan dodatni fajl (PACKAGE), paket se kreira samo jedanput, a koristi proizvoljan broj
puta u različitim projektnim fajlovima. Na taj način se izbegava ponavljanje deklaracija komponenti u svakom
projektnom fajlu u kome se one koriste. Sledi VHDL kôd kompletnog projekta. Fajl nase_komponente.vhd
sadrži istoimeni paket u sa navedenim deklaracijama komponenti. Paket se uključuje u glavni kôd (fajl
projekat.vhd) u liniji 3 (USE work.nase_komponente.all;).
1 ------ Fajl inv.vhd -------------------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 ---------------------------------------------
5 ENTITY inv IS
6 PORT ( a: IN STD_LOGIC; b : OUT STD_LOGIC);
7 END inv;
8 ---------------------------------------------
9 ARCHITECTURE inv OF inv IS
10 BEGIN
11 b <= NOT a;
12 END inv;
13 --------------------------------------------
1 ------ Fajl nand2.vhd -------------------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 ---------------------------------------------
5 ENTITY nand2 IS
6 PORT ( a,b: IN STD_LOGIC; c : OUT STD_LOGIC);
7 END nand2;
8 ---------------------------------------------
9 ARCHITECTURE nand2 OF nand2 IS
10 BEGIN
11 c <= a NAND b;
12 END nand2;
13 ---------------------------------------------
1 ------ Fajl nand3.vhd -------------------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 ---------------------------------------------
5 ENTITY nand3 IS
6 PORT ( a,b,c: IN STD_LOGIC; d : OUT STD_LOGIC);
7 END nand3;
8 ---------------------------------------------
9 ARCHITECTURE nand3 OF nand3 IS
10 BEGIN
11 d <= NOT(a AND b AND c);
12 END nand3;
13 ---------------------------------------------
1 ------ Fajl nase_komponente.vhd ----------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 ---------------------------------------------
5 PACKAGE nase_komponente IS
6 -- invertor -----------
7 COMPONENT inv IS
8 PORT(a: IN STD_LOGIC; b: OUT STD_LOGIC);
9 END COMPONENT;
10 -- dvoulazno NI kolo --
11 COMPONENT nand2 IS
12 PORT(a,b: IN STD_LOGIC; c: OUT STD_LOGIC);
13 END COMPONENT;
14 -- troulazno NI kolo --
15 COMPONENT nand3 IS
16 PORT(a,b,c: IN STD_LOGIC; d: OUT STD_LOGIC);
17 END COMPONENT;
18 ----------------
19 END nase_komponente;
---------------------------------------------
101
1 ------ Fajl projekat.vhd -------------------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 USE work.nase_komponente.all;
5 ---------------------------------------------
6 ENTITY projekat IS
7 PORT ( a,b,c,d: IN STD_LOGIC;
8 x,y : OUT STD_LOGIC);
9 END projekat;
10 ---------------------------------------------
11 ARCHITECTURE struktura OF projekat IS
12 SIGNAL w: STD_LOGIC;
13 BEGIN
14 K1: inv PORT MAP(b,w);
15 K2: nand2 PORT MAP(a,b,x);
16 K3: nand3 PORT MAP(w,c,d,y);
17 END struktura;
18 ---------------------------------------------
Zapis x=>a znači da se signal x povezuje na port a, a y=>b da se y povezuje na port b. Povezivanje je
eksplicitno, jer se za svaki spoljašnji signal navodi porto na koji se povezuje. Kod nominalnog povezivanja,
redosled povezivanja nije bitan. Sledeća naredba instanciranja komponente ima identičan efekat kao i
prethodna:
K1: inv PORT MAP(y=>b,x=>a);
Poziciono povezivanje je lakše za pisanje, ali je zato nominalno preglednije. Portovi komponente mogu ostati i
nepovezani, što se postiže upotrebom ključne reči open:
K2: nase_kolo PORT MAP(x=>a, y=>b, w=>open, z=>d);
102
Pr. 2-60 Instancirane generičke komponente
Razmotrimo generički generator parnosti iz Pr. 2-19 ( Sl. 2-64), koji ulazni vektor (input) proširuje jednim bitom.
Ovaj bit ima vrednost ´0´ ako je broj 1-ca u ulaznom vektoru paran, odnosno vrednost ´1´ ako je broj 1-ca u
ulaznom vektoru neparan. Na ovaj način, izlazni vektor (output) uvek sadrži paran broj 1-ca.
Ispod je dat generički VHDL kôd generatora parnosti (tj. važi za svako pozitivno n). Prikazana su dva fajla:
parity_gen.vhd koji sadrži opis komponente generator_parnosti i pgen2.vhd koji sadrži glavni kôd u kome
se ova komponenta instancira.
Uočimo da će podrazumevana vrednost generičkog parametra (n=8) (fajl parity_gen.vhd, linija 3) biti prepisana
vrednošću n=2 koja se prenosi instanciranoj komponenti putem GENERIC MAP konstrukcije u fajlu pgen2.vhd
linija 16. Na ovaj način, glavni kôd realizuje 2-bitni generator parnosti. Napomenimo da je GENERIC
deklaracija u naredbi deklaracije komponente u glavnom kôdu (linije 9-13) neophodna, s obzirom da je deo
entiteta ove komponente (fajl parity_gen.vhd, linije 2-6). Međutim, u deklaraciji komponente nije neophodno
ponovo navoditi podrazumevane vrednosti generičkih parametra.
1 ----- fajl parity_gen.vhd ---------------------
2 ENTITY generator_parnosti IS
3 GENERIC (n : INTEGER := 8); -- podrazumevana vrednost je 7
4 PORT (input: IN BIT_VECTOR (n-1 DOWNTO 0);
5 output: OUT BIT_VECTOR (n DOWNTO 0));
6 END generator_parnosti;
7 ----------------------------------------------
8 ARCHITECTURE parnost OF generator_parnosti IS
9 BEGIN
10 PROCESS (input)
11 VARIABLE temp1: BIT;
12 VARIABLE temp2: BIT_VECTOR (output'RANGE);
13 BEGIN
14 temp1 := '0';
15 FOR i IN input'RANGE LOOP
16 temp1 := temp1 XOR input(i);
17 temp2(i) := input(i);
18 END LOOP;
19 temp2(output'HIGH) := temp1;
20 output <= temp2;
21 END PROCESS;
22 END parnost;
23 ----------------------------------------------
103
Osim glavnog kôda (fajl alu.vhd) ispod su dati i fajlovi sa kôdom korišćenih komponenti (arith.vhd, logic.vhd i
mux.vhd). Kao što se može videti, komponente su deklarisane u glavnom kôdu.
sel Operacija Funkcija Jedinica
0000 y <= a Transfer a
0001 y <= a + 1 Inkrement a
0010 y <= a - 1 Dekrement a
0011 y <= b Transfer b
Aritmetička
0100 y <= b + 1 Inkrement b
0101 y <= b - 1 Dekrement b
0110 y <= a + b Sabiranje a i b
0111 y <= a+b + cin Sabiranje a i b sa ul. pren.
1000 y <= NOT a Komplement a
1001 y <= NOT b Komplement b
1010 y <= a AND b I
1011 y <= a OR b ILI
Logicka
1100 y <= a NAND b NI
1101 y <= a NOR b NILI
1110 y <= a XOR b Iskljucivo ILI
1111 y <= a NXOR b Iskljucivo NILI
(a) (b)
Sl. 2-65 ALU: (a) Blok dijagram; (b) tabela istinitosti. (ponovljena Sl. 2-26)
1 ----- fajl arith_unit.vhd --------------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 USE ieee.std_logic_unsigned.all;
5 ---------------------------------------------
6 ENTITY arith_unit IS
7 PORT (a,b : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
8 cin : IN STD_LOGIC;
9 sel : IN STD_LOGIC_VECTOR(2 DOWNTO 0);
10 x : OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
11 END arith_unit;
12 ---------------------------------------------
13 ARCHITECTURE arith_unit OF arith_unit IS
14 SIGNAL arith, logic : STD_LOGIC_VECTOR(7 DOWNTO 0);
15 BEGIN
16 WITH sel(2 DOWNTO 0) SELECT
17 arith <= a WHEN "000",
18 a+1 WHEN "001",
19 a-1 WHEN "010",
20 b WHEN "011",
21 b+1 WHEN "100",
22 b-1 WHEN "101",
23 a+b WHEN "110",
24 a+b+cin WHEN OTHERS;
25 END arith_unit;
26 ---------------------------------------------
1 ----- fajl logic_unit.vhd --------------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 ---------------------------------------------
5 ENTITY logic_unit IS
6 PORT (a,b : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
7 sel : IN STD_LOGIC_VECTOR(2 DOWNTO 0);
8 x : OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
9 END logic_unit;
10---------------------------------------------
11 ARCHITECTURE logic_unit OF logic_unit IS
12 BEGIN
13 WITH sel(2 DOWNTO 0) SELECT
14 x <= NOT a WHEN "000",
15 NOT b WHEN "001",
104
16 a AND b WHEN "010",
17 a OR b WHEN "011",
18 a NAND b WHEN "100",
19 a NOR b WHEN "101",
20 a XOR b WHEN "110",
21 NOT (a XOR b) WHEN OTHERS;
22 END logic_unit;
23 ---------------------------------------------
105
2.9.5 GENERATE naredba u strukturnom opisu
GENERATE naredba je razmatrana u sekciji 2.4.4, u poglavlju posvećenom konkurentnom kôdu. Primeri koji
su tom prilikom analizirali ukazali su kako se ova naredba može koristiti za kreiranje konciznog konkurentnog
kôda. Ipak, moć GENERATE naredbe do punog izražaja dolazi tek u kombinaciji sa naredbama instanciranja
komponenti prilikom kreiranja generičkih regularnih struktura sačinjenih od većeg broja instanci jednostavnijih
komponenti.
106
flop uzima sa izlaza prethodnog. S obzirom da se T flip-flopovi okidaju opadajućom ivicom takta (naznačeno
kružićem na ulazu za takt), i-ti flip-flop menja svoje stanje kada se stanja svih prethodnih flip-flopova promene
sa 1 na 0 (što odgovara binarnoj sekvenci brojanja).
VHDL opis se sastoji iz dva fajla: tff.vhd, koji sadrži kôd T flip-flopa (TFF) i asyn_counter.vhd, koji sadrži
generički opis n-bitnog asinhronog brojača, a u kome se TFF koristi kao komponenta. U arhitekturi T flip-flopa,
za čuvanje tekućeg stanja, koristi se pomoćni signal ff koji se postavlja na ´0´ ako je reset signal aktivan (linija
16), odnosno komplementira (linija 18), ako je detektovana opadajuća ivica taktnog signala, clk (linija 16).
Stanje flip-flopa se prenosi na izlaz q u liniji 21.
Strukturni VHDL kôd asinhronog brojača koristi FOR GENERATE naredbu za instanciranje n T flip-flopova.
Za prenos takta između flip-flopova uveden je (n+1)-bitni vektor c, koji se koristi na način kao na Sl. 2-67.
Signal c(0) prihvata ulazni takt (linija 20). i-ti flip-flop se taktuje signalom c(i), a njegov izlaz q pobuđuje signal
c(i+1) (linija 22). Bitovi 1, ..., n vektora c su ujedno i izlazi brojača (linija 24). Vremenski dijagram dobijen
simulacijom datog VHDL kôda, za n=4, prikazan je na Sl. 2-68.
1 ------ tff.vhd --------------------------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 -----------------------------------------------
5 ENTITY tff IS
6 PORT (clk, rst: IN STD_LOGIC;
7 q: OUT STD_LOGIC);
8 END tff;
9 -----------------------------------------------
10 ARCHITECTURE behavior OF tff IS
11 SIGNAL ff : STD_LOGIC;
12 BEGIN
13 PROCESS (clk, rst)
14 BEGIN
15 IF(rst='1') THEN
16 ff <= '0';
17 ELSIF (clk'EVENT AND clk='0') THEN
18 ff <= not ff;
19 END IF;
20 END PROCESS;
21 q <= ff;
22 END behavior;
23-----------------------------------------------
1 ----- asyn_counter.vhd ------------------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 -----------------------------------------------
5 ENTITY asyn_count IS
6 GENERIC(n : INTEGER := 4);
7 PORT (clk, rst: IN STD_LOGIC;
8 q: OUT STD_LOGIC_VECTOR(n-1 DOWNTO 0));
9 END asyn_count;
10-----------------------------------------------
11 ARCHITECTURE structural OF asyn_count IS
12 ---------------------------------
13 COMPONENT tff IS
14 PORT (clk, rst: IN STD_LOGIC;
15 q: OUT STD_LOGIC);
16 END COMPONENT;
17 ---------------------------------
18 SIGNAL c : STD_LOGIC_VECTOR(n DOWNTO 0);
19 BEGIN
20 c(0) <= clk;
21 G1:FOR i IN 0 TO n-1 GENERATE
22 tffx : tff PORT MAP (clk=>c(i),rst=>rst,q=>c(i+1));
23 END GENERATE;
24 q <= c(n DOWNTO 1);
25 END structural;
26-----------------------------------------------
107
Sl. 2-68 Rezultati simulacije za VHDL kôd iz Pr. 2-63
2.10.1 Funkcije
Između ostalog, funkcije se koriste da bi se realizovale neke tipične složenije logičke operacije i aritmetička
izračunavanja, obavila konverzija iz jednog u neki drugi tip podataka, ili kreirali novi operatori i atributi.
Jednom napisana, funkcija se može koristiti (pozivati) u glavnom kôdu proizvoljan broj puta. Na taj način,
glavni kôd postaje kompaktniji i razumljiviji.
Kao što je već rečeno, funkcija, ako i proces, može sadržati samo sekvencijalne naredbe (IF, CASE i LOOP).
Izuzetak je WAIT naredba koja nije dozvoljena u funkciji ako se ona koristi u kôdu namenjenom sintezi.
Takođe, u funkciji nije dozvoljeno deklarisati signale i instancirati komponente.
Za kreiranje i korišćenje funkcije, neophodna su dva dela: telo funkcije i poziv funkcije. Njihova sintaksa je
sledeća:
Telo funkcije:
FUNCTION ime_funkcije [<lista_parametara>] RETURN tip_podataka IS
[deklaracije]
BEGIN
(sekvencijalne naredbe)
END ime_funkcije;
U gornjoj sintaksi, <lista_parametara> definiše ulazne parametre funkcije. Broj parametara je proizvoljan
(uključujući i nulu). Parametri mogu biti konstante ili signali (varijable nisu dozvoljene), tj.:
<parametar> = [CONSTANT] ime_konstante : tip_konsatne;
<parametar> = SIGNAL ime_signala : tip_signala;
Tip parametra može biti bilo koji tip podatak koji se može sintetizovati (BOOLEAN, STD_LOGIC, INTEGER i
td.). Međutim, opseg ne treba navoditi (npr. RANGE za INTEGER ili TO/DOWNTO za
STD_LOGIC_VECTOR). Sa druge strane, funkcija može da vrati samo jednu vrednost čiji tip je naveden iza
ključne reči RETURN.
Na primer, razmotrimo funkciju:
FUNCTION f1 (a,b : INTEGER; SIGNAL c : STD_LOGIC_VECTOR) RETURN BOOLEAN IS
[deklaracije]
BEGIN
(sekvencijalne naredbe)
END f1;
108
Ime funkcije je f1. Funkcija ima tri parametra (a, b i c). Parametri a i b su konstante (uočimo da se ključna reč
CONSTANT može izostaviti), dok je parametar c signal. Parametri a i b su tipa INTEGER, a c tipa
STD_LOGIC_VECTOR. Uočimo da uz STD_LOGIC_VECTOR nije naveden opseg (TO ili DOWNTO). Tip
izlaznog parametra funkcije i BOOLEAN.
Poziv funkcije:
Poziv funkcije se uvek nalazi u nekom izrazu. Na primer:
x <= conv_integer(a); -- konvertuje a u INTEGER
y <= maximum(a,b); -- vraca vece od a i b
IF(x > maximum(a,b)) THEN ... -- poredi x sa vecim od a i b
109
FUNCTION conv_integer(CONSTANT vector: STD_LOGIC_VECTOR) RETURN INTEGER IS
ili
FUNCTION conv_integer(vector: STD_LOGIC_VECTOR) RETURN INTEGER IS
Napomenimo da ne postoji oblik funkcije conv_integer() koji bi omogućio konverziju varijable tipa
STD_LOGIC_VECTOR u INTEGER (zato što varijabla ne može biti ulazni parametar funkcije).
110
1 ---- glavni kod ------------------------------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 USE work.nas_paket.all;
5 ----------------------------------------------------
6 ENTITY dff IS
7 PORT (d,clk,rst : IN STD_LOGIC;
8 q : OUT STD_LOGIC);
9 END dff;
10----------------------------------------------------
11 ARCHITECTURE d_flip_flop OF dff IS
12 BEGIN
13 PROCESS(clk,rst)
14 BEGIN
15 IF(rst='1') THEN q <= '0';
16 ELSIF positive_edge(clk) THEN q <= d;
17 END IF;
18 END PROCESS;
19 END d_flip_flop;
20----------------------------------------------------
Pr. 2-68 Primena funkcije conv_integer()
U ovom primeru ponovo ćemo razmotriti realizaciju RAM-a sa razdvojenim portovima za upis i čitanje
podataka iz 2.8, ali sa promenjenim zahtevom da tip adresnog porta, kao i portova za podatke bude
STD_LOGIC_VECTOR. Kod RAM-a iz poglavlja 2.8, adresni port je tipa INTEGER jer se vrednost sa ovog
ulaznog porta koristi kao indeks polja memory koje pamti sadržaja RAM-a. Promena tipa na
STD_LOGIC_VECTOR zahteva da se vrednost sa adresnog porta konvertuje u INTEGER prilikom pristupa
polju memory, za šta se u kôdu koji sledi koristi funkcija conv_integer() (linije 24 i 28 u fajlu ram.vhd). Kao
generički parametri sada se koriste M - broj bita u reči i N - broj adresnih bita (a ne broj reči u memoriji, kao
ranije). Sa N adresnih bita moguće je adresirati 2N memorijskih reči, što, zajedno sa brojem bita u reči, određuje
dimenzije polja mem_array (linije 16 i 17 u fajlu ram.vhd). Takođe, za detekciju rastuće ivice takta iskorišćena
je funkcija postive_edge() (linija 23 u fajlu ram.vhd). Obe korišćene funkcije smeštene su u paketu, nas_paket,
koji je uključen u glavni kôd (fajl ram.vhd).
1 ----- paket: ---------------------------------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 ----------------------------------------------------
5 PACKAGE nas_paket IS
6 FUNCTION positive_edge (SIGNAL s : STD_LOGIC) RETURN BOOLEAN;
7 FUNCTION conv_integer(SIGNAL vector: STD_LOGIC_VECTOR) RETURN INTEGER;
8 END nas_paket;
9 ----------------------------------------------------
10 PACKAGE BODY nas_paket IS
11 --- funkcija positive_edge() --------------------
12 FUNCTION positive_edge (SIGNAL s : STD_LOGIC) RETURN BOOLEAN IS
13 BEGIN
14 RETURN (s'EVENT AND s='1');
15 END positive_edge;
16 --- funkcija conv_integer() --------------------
17 FUNCTION conv_integer(SIGNAL vector: STD_LOGIC_VECTOR) RETURN INTEGER IS
18 VARIABLE b: INTEGER RANGE 0 TO 2**vector'LENGTH-1;
19 BEGIN
20 IF(vector(vector'HIGH)='1') THEN b:=1; ELSE b:=0; END IF;
21 FOR i IN(vector'HIGH-1) DOWNTO (vector'LOW) LOOP
22 b:=b*2;
23 IF(vector(i)='1')THEN b:=b+1; END IF;
24 END LOOP;
25 RETURN b;
26 END conv_integer;
27 END nas_paket;
28 ----------------------------------------------------
1 -------ram.vhd -------------------------------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 USE work.nas_paket.all;
111
5 ----------------------------------------------------
6 ENTITY RAM IS
7 GENERIC (M: INTEGER := 8; -- broj bita po reci
8 N: INTEGER := 4); -- broj adresnih bitova
9 PORT (wr_ena, clk : IN STD_LOGIC;
10 addr : IN STD_LOGIC_VECTOR(2**N-1 DOWNTO 0);
11 data_in : IN STD_LOGIC_VECTOR(M-1 DOWNTO 0);
12 data_out : OUT STD_LOGIC_VECTOR(M-1 DOWNTO 0));
13 END RAM;
14 ----------------------------------------------------
15 ARCHITECTURE ram OF RAM IS
16 TYPE mem_array IS ARRAY (0 TO 2**N-1) OF
17 STD_LOGIC_VECTOR(M-1 DOWNTO 0);
18 SIGNAL memory : mem_array;
19 BEGIN
20 PROCESS(clk, wr_ena)
21 BEGIN
22 IF(wr_ena = '1') THEN
23 IF(positive_edge(clk)) THEN
24 memory(conv_integer(addr)) <= data_in;
25 END IF;
26 END IF;
27 END PROCESS;
28 data_out <= memory(conv_integer(addr));
29 END ram;
30----------------------------------------------------
Pr. 2-69 Preklapanje operatora ˝+˝
Funkcija iz ovog primera, nazvana ˝+˝, preklapa predefinisani operator sabiranja (˝+˝) (vidi 2.3.4). Predefinisano
˝+˝ može se primeniti samo nad sabircima tipa INTEGER, SIGNED ili UNSIGNED. Nova funkcija omogućiće
sabiranje vrednosti tipa STD_LOGIC_VECTOR. Funkcija je smeštena u paketu nas_paket. Primer korišćenja
funkcije dat je u kôdu koji sledi nakon paketa. Funkcija ima dva ulazna parametra, koji su kao i izlazna vrednost
tipa STD_LOGIC_VECTOR. Pretpostavićemo da su dužine oba ulazna i izlaznog vektora iste. Funkcija obavlja
sabiranje binarnih vektora bit-po-bit, počev od bitna najmanje težine. Za svaku bitsku poziciju, određuje se
odgovarajući bit sume, sum(i), i prenos, carry, koji se dodaje sledećoj poziciji.
1 ----- paket: ---------------------------------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 ----------------------------------------------------
5 PACKAGE nas_paket IS
6 FUNCTION "+" (a,b: STD_LOGIC_VECTOR) RETURN STD_LOGIC_VECTOR;
7 END nas_paket;
8 ----------------------------------------------------
9 PACKAGE BODY nas_paket IS
10 --- funkcija „+“ --------------------
11 FUNCTION "+" (a,b: STD_LOGIC_VECTOR) RETURN STD_LOGIC_VECTOR IS
12 VARIABLE sum: STD_LOGIC_VECTOR(a'RANGE);
13 VARIABLE carry: STD_LOGIC;
14 BEGIN
15 carry := '0';
16 FOR i IN a'REVERSE_RANGE LOOP
17 sum(i) := a(i) XOR b(i) XOR carry;
18 carry := (a(i) AND b(i)) OR (a(i) AND carry) OR (b(i) AND carry);
19 END LOOP;
20 RETURN sum;
21 END "+";
22 END nas_paket;
23 ----------------------------------------------------
1 -------adder.vhd -------------------------------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 USE work.nas_paket.all;
5 ----------------------------------------------------
6 ENTITY adder IS
7 PORT ( a : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
8 y : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));
112
9 END adder;
10 ----------------------------------------------------
11 ARCHITECTURE adder OF adder IS
12 CONSTANT b : STD_LOGIC_VECTOR(3 DOWNTO 0) := "0110";
13 BEGIN
14 y <= a + b;
15 END adder;
16 ----------------------------------------------------
Napomenimo da postojanje funkcije za preklapanje operatora ˝+˝ ne znači zamenu predefinisanog operatora ˝+˝
novim, već proširenje njegove primene na novi tip podataka. To znači da i dalje možemo koristiti ˝+˝ za
sabiranje brojeva tipa INTEGER, SIGNED ili UNSIGNED. Koja od dve funkcije će biti primenjena,
predefinisana ili preklopljena, zavisi od tipa operanada na koje se ˝+˝ primenjuje.
Pr. 2-70 Funkcija aritmetičkog pomeranja
Funkcija iz ovog primera obavlja aritmetičko pomeranje udesno vrednosti tipa STD_LOGIC_VECTOR. Ulazni
parametri funkcije su: arg1, vektor koji se pomera, i arg2, iznos pomeraja. Funkcija je generička u smislu da
podržava ulazne vektore bilo koje dužine i poredak bitova (TO/DOWNTO). Za razliku od nekoliko prethodnih
primera, funkcija je locirana u glavnom kôdu.
1 ---------------------------------------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 ---------------------------------------------
5 ENTITY shift_left IS
6 GENERIC (size: INTEGER := 4);
7 PORT (a : IN STD_LOGIC_VECTOR(size-1 DOWNTO 0);
8 x,y,z : OUT STD_LOGIC_VECTOR(size-1 DOWNTO 0));
9 END shift_left;
10---------------------------------------------
11 ARCHITECTURE behavior OF shift_left IS
12 FUNCTION srar (SIGNAL arg1 : STD_LOGIC_VECTOR; arg2: NATURAL)
13 RETURN STD_LOGIC_VECTOR IS
14 VARIABLE input: STD_LOGIC_VECTOR(size-1 DOWNTO 0) := arg1;
15 CONSTANT size : INTEGER := arg1'LENGTH;
16 VARIABLE copy : STD_LOGIC_VECTOR(size-1 DOWNTO 0)
17 := (OTHERS => arg1(arg1'RIGHT));
18 VARIABLE result: STD_LOGIC_VECTOR(size-1 DOWNTO 0);
19 BEGIN
20 IF(arg2 >= size-1) THEN result := copy;
21 ELSE result := copy(arg2 DOWNTO 0) & input(size-2 DOWNTO arg2);
22 END IF;
23 RETURN result;
24 END srar;
25 BEGIN
26 x <= srar(a,0);
27 y <= srar(a,1);
28 z <= srar(a,2);
29 END behavior;
30 ---------------------------------------------
Funkcija srar koristi dve pomoćne varijable: input koja se prilikom deklaracija inicijalizuje na vrednost ulaznog
vektora, i size čija je inicijalna vrednost jednaka dužini ulaznog vektora (Ovo dve varijable su neophodne zato
što unutar funkcije nije dozvoljeno menjati ulazne parametre). Konstanta copy je vektor čiji su svi bitovi jednaki
krajnjem levom bitu ulaznog vektora. Kod aritmetičkog pomeranja na desno za arg2 pozicija, pozicije sa leve
strane (njih arg2) koje ostaju upražnjene popunjavaju se vrednošću krajnjeg levog bita ulaznog vektora (Sl.
2-69). Ako je zadati pomeraj jednak ili veći od size-1, rezultat je vektor ispunjen krajnjim levim bitom ulaznog
vektora.
113
Pr. 2-71 Množač
U ovom primeru realizovana je funkcija mult() koja množi dve UNSIGNED vrednosti i vraća njihov
UNSIGNED proizvod. Parametri koji se prosleđuju funkciji ne moraju imati istu dužinu, a poredak njihovih
bitova može biti proizvoljan (TO/DOWNTO). Funkcija je smeštena u paketu pck. Osim paketa, u VHDL kôdu
koji sledi, dat je i jedan primer korišćenja funkcije mult().
1 ----- paket: ---------------------------------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 USE ieee.std_logic_arith.all;
5 ----------------------------------------------------
6 PACKAGE pack IS
7 FUNCTION mult (a,b: UNSIGNED) RETURN UNSIGNED;
8 END pack;
9 ----------------------------------------------------
10 PACKAGE BODY pack IS
11 FUNCTION mult (a,b: UNSIGNED) RETURN UNSIGNED IS
12 CONSTANT max : INTEGER := a'LENGTH + b'LENGTH - 1;
13 VARIABLE aa: UNSIGNED(max DOWNTO 0) :=
14 (max DOWNTO a'LENGTH => '0') & a(a'LENGTH-1 DOWNTO 0);
15 VARIABLE prod: UNSIGNED(max DOWNTO 0) := (OTHERS => '0');
16 BEGIN
17 FOR i IN 0 TO a'LENGTH-1 LOOP
18 IF(b(i)='1') THEN prod := prod + aa;
19 END IF;
20 aa := aa(max-1 DOWNTO 0) & '0';
21 END LOOP;
22 RETURN prod;
23 END mult;
24 END pack;
25 ----------------------------------------------------
1 ------- glavni kod ---------------------------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 USE ieee.std_logic_arith.all;
5 USE work.pack.all;
6 ----------------------------------------------------
7 ENTITY multiplier IS
8 GENERIC (size: INTEGER := 4);
9 PORT ( a,b : IN UNSIGNED(size-1 DOWNTO 0);
10 y : OUT UNSIGNED(2*size-1 DOWNTO 0));
11 END multiplier;
12 ----------------------------------------------------
13 ARCHITECTURE behavior OF multiplier IS
14 BEGIN
15 y <= mult(a,b);
16 END behavior;
17----------------------------------------------------
2.10.3 Procedure
Procedura je slična funkciji i u osnovi ima istu namenu. Međutim, za razliku od funkcije, procedura može vratiti
više od jedne vrednosti.
Kao i kod funkcija, dva dela su potrebna za konstrukciju i poziv procedure: telo i poziv procedure.
Telo procedure:
PROCEDURE ime_procedure [<lista_parametara>] IS
[deklaracije]
BEGIN
(sekvencijalne naredbe)
END ime_procedure;
U gornjoj sintaksi, <lista_parametara> sadrži ulazne i izlazne parametre procedure:
<parametar> = [CONSTANT] ime_konstante : mode tip_konstante;
<parametar> = SIGNAL ime_signala : mode tip_signala;
<parametar> = VARIABLE ime_signala : mode tip_varijable;
114
Procedura može imati proizvoljan broj IN, OUT i INOUT parametara, koji mogu biti signali, varijable ili
konstante. Za ulazne parametre (mode=IN), podrazumeva se CONSTANT, dok se za izlazne (mode=OUT ili
INOUT) podrazumeva VARIABLE.
Kod funkcija, deklaracije WAIT, SIGNAL i COMPONENT nisu dozvoljene ako se funkcija koristi u kôdu za
sintezu. Isto važi i za procedure, sa izuzetkom da signali mogu biti deklarisani u proceduri, ali samo pod
uslovom da je takva procedura deklarisana u procesu. Uz to, pored WAIT, i bilo koji drugi način za detekciju
ivice takođe ne može biti sintetizovan ako je deo procedure (npr. konstrukcija tipa s'EVENT AND s='1' nije
dozvoljena u proceduri).
Procedura, čije je zaglavlje prikazano ispod ima tri ulazna parametra, a, b i c (mode=IN). Parametar a je
konstanta tipa BIT, dok su b i c signali istog tipa. Uočimo da za ulazne parametre ključna reč CONSTANT nije
neophodna. Procedura vraća dva signala, x (mode=OUT i tip=BIT_VECTOR) i y (mode=INOUT,
tip=INTEGER).
PROCEDURE nasa_procedura(a: IN BIT; SIGNAL b,c: IN BIT;
SIGNAL x: OUT BIT_VECTOR(7 DOWNTO 0);
SIGNAL y: INOUT INTEGER RANGE 0 TO 99) IS
BEGIN
. . .
END nasa_procedura;
Poziv procedure:
Za razliku od funkcije, čiji je poziv je uvek deo nekog izraza, procedure se mogu tretirati kao nezavisne naredbe,
koje se mogu pozivati samostalno ili biti pridružene nekoj drugoj naredbi.
Primeri poziva procedure:
min_max(in1, in2, in3, out1, out2); -- samostalan poziv procedure
deljenje(deljenik, delilac, kolicnik, ostatak); -- samostalan poziv procedure
IF(a>b) THEN min_max(in1,in2,in3,out1,out2); --procedura pridružena drugoj naredbi
115
11 ---------------------------------------------
12 ARCHITECTURE nasa_arhitektura OF min_max IS
13 ---------------------------------------
14 PROCEDURE sort(SIGNAL in1,in2 : IN INTEGER RANGE 0 to limit;
15 SIGNAL min, max: OUT INTEGER RANGE 0 to limit) IS
16 BEGIN
17 IF(in1 > in2) THEN
18 max <= in1;
19 min <= in2;
20 ELSE
21 max <= in2;
22 min <= in1;
23 END IF;
24 END sort;
25 ---------------------------------------
26 BEGIN
27 PROCESS(ena)
27 BEGIN
29 IF(ena='1') THEN sort(inp1,inp2,min_out,max_out);
30 END IF;
31 END PROCESS;
32 END nasa_arhitektura;
33 ---------------------------------------------
Pr. 2-73 Procedura u paketu
Ovaj primer sličan je prethodnom, s jedinom razlikom što je sada procedura sort smeštena u paketu. Na taj
način, procedura se može koristiti u različitim projektima. VHDL kôd je podeljen u dva fajla, koji se nezavisno
kompajliraju: jedan za paket, a drugi za glavni kôd.
1 ----- paket: ---------------------------------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 ----------------------------------------------------
5 PACKAGE nas_paket IS
6 CONSTANT limit: INTEGER := 255;
7 PROCEDURE sort(SIGNAL in1,in2 : IN INTEGER RANGE 0 to limit;
8 SIGNAL min, max: OUT INTEGER RANGE 0 to limit);
9 END nas_paket;
10 ----------------------------------------------------
11 PACKAGE BODY nas_paket IS
12 PROCEDURE sort(SIGNAL in1,in2 : IN INTEGER RANGE 0 to limit;
13 SIGNAL min, max: OUT INTEGER RANGE 0 to limit) IS
14 BEGIN
15 IF(in1 > in2) THEN
16 max <= in1;
17 min <= in2;
18 ELSE
19 max <= in2;
20 min <= in1;
21 END IF;
22 END sort;
23 END nas_paket;
24 ----------------------------------------------------
116
15 PROCESS(ena)
16 BEGIN
17 IF(ena='1') THEN sort(inp1,inp2,min_out,max_out);
18 END IF;
19 END PROCESS;
20 END nasa_arhitektura;
21 ---------------------------------------------
2.10.6 ASSERT
ASSERT je naredba koja se ne sintetizuje, a čija je funkcija da ispisuje poruke (na primer, na ekranu) kada se u
toku simulacije javi neki problem. Zavisno od ˝ozbiljnosti˝ problema, ASSERT naredba može da zaustavi
simulaciju. Njena sintaksa je:
ASSERT uslov
[REPORT “poruka”]
[SEVERITY nivo_kritičnosti]
Nivo kritičnosti može biti: Note (obaveštenje), Warning (upozorenje), Error (greška) ili Failure (otkaz). Poruka
se ispisuje kada je uslov netačan.
Pretpostavimo da smo napisali funkciju koja sabira dva binarna broja, gde je usvojeno da ulazni parametri
moraju imati isti broj bita. Da bi smo proverili da li je ovaj zahtev ispunjen, u telo funkcije možemo umetnuti
ASSER naredbu:
ASSERT a’LENGTH = b’LENGTH
REPORT “Error: vektori nemaju istu duzinu”
SEVERITY failure;
Kategorija note je korisna kao obaveštenje projektantu šta se trenutno dešava u kôdu koji se simulira. Kategorija
warning se može koristiti za situacije koje iako nisu katastrofalne, mogu eventualno kasnije da dovedu do
greške. Nivo error se može koristiti da upozori projektanta na pojavu situacije koja može imati katastrofalne
efekte. (Na primer, ako se pretpostavlja da neko izračunavanje treba uvek da vrati pozitivnu vrednost, a desi se
da vrati negativnu, zavisno od okolnosti to se može smatrati greškom.) Kategorija failure označava uslove koji
neizostavno uzrokuju katastrofalne posledice, na primer, deljenje nulom, ili indeks polja izvan granica.
Napomenimo još jedanput da ASSER naredba ne generiše hardver. Alati za sintezu jednostavno ignorišu ovu
naredbu.
117
3 RTL projektovanje
3.1 Projektovanje odozgo-naniže
Postoje dva osnovna pristupa rešavanju problema: ¨odozdo-naviše¨ (bottom-up) i ¨odozgo-naniže¨ (top-down).
Kod pristupa ¨odozdo-naviše¨, projektant započinje rad rešavanjem nekog izdvojenog detalja celokupnog
problema. Nakon toga, projektant prelazi na neki drugi detalj, koji nije u vezi sa prvim. Konačno, projektant
dolazi u situaciju da spaja nezavisno rešene delove problema u konačno rešenje. Kod problema većeg obima,
pojedinačno rešavani delovi se obično ne uklapaju idealno jedni s drugim. To je posledica samog pristupa koji
fokusiranjem na izdvojene detalje odvlači pažnju projektanta sa slike o celovitosti rešenja. Konačni rezultat je
takav da se najveći deo ukupnog projektantskog vremena troši na uklapanje nezavisnih detalja, što često
uključuje i prepravku već rešenih delova opšteg problema.
Kod pristupa ¨odozgo-naniže¨, projektant započinje rad na problemu razradom globalnog plana što
podrazumeva sveobuhvatno sagledavanje problema, razradu strategije rešavanja problema, dekompoziciju
problema na potprobleme manjeg obima, i definisanje odnosa između pojedinih potproblema. Drugim rečima,
projektant se trudi da polazni problem, koji je obično isuviše obiman da bi se rešio ¨u jednom dahu¨, razloži na
veći broj jasno definisanih problema manjeg obima. Pri tome, projektant ne rešava odmah uočene potprobleme,
već ih tretira kao apstraktne sklopove (crne kutije) koje međusobno uklapa i povezuje. U drugoj fazi
projektovanja, projektant nastavlja sa razradom i rešavanjem uočenih potproblema. Pri tome, projektant može
slobodno da se usredsredi na svaki pojedinačni, prethodno definisani potproblem, bez brige oko njihovog
uklapanja, koje je razradio u prvoj fazi projekta i time ih ugradio u definiciju svakog pojedinačnog potproblema.
Projektanti-početnici obično ne doživljavaju projektovanje ¨odozgo-naniže¨ kao prirodni pristup. Prirodno je da
neko ko nema iskustva u projektovanju hardvera bude zabrinut detaljima koji se odnose na realizaciju (kao
razvesti napajanje, koja digitalna kola koristiti i kako ih povezati, i td.). Pristup ¨odozgo-naniže¨ zasnovan je na
iskustvu i samopouzdanju projektanta: neko ko je ranije rešavao detalje slične onima koji se javljaju u tekućem
problemu, može ignorisati te detalje u toku razrade globalnog plana, siguran da će onda kada pređe na
realizaciju svog plana, moći da reši svaki od izdvojenih potproblema.
Generalno, projektovanje ¨odozgo-naniže¨ ostvaruje se u sledeće tri faze:
• Opis ponašanja
• Razrada
• Realizacija
3.2.1 Interfejs
Pored algoritma koji definiše osnovnu funkciju sistema, opis ponašanja sadrži i specifikaciju interfejsa. Kao
pojam, interfejs označava mesto na kome se dva nezavisna sistema susreću ili spajaju (ili sredstvo koje koriste)
118
radi zajedničkog dejstva ili međusobne komunikacije. Digitalni sistem u toku rad ineraguje sa svojim
okruženjem. Okruženje mogu činiti drugi digitalni sistemi, ne-digitalni uređaji, kao što su prekidači ili senzori,
pa čak i čovek koji posredstvom odgovarajućih ulazno-izlaznih uređaja komunicira sa sistemom. Rećićemo da
se okruženje digitalnog sistema sastoji od nezavisnih aktora, koji koordinirano, ali u paraleli, rade i interaguju
kako sa digitalnim sistemom tako i između sebe. Sa tačke gledišta projektanta digitalnog sistema, detalji koji se
odnose na rad i implementaciju aktora nisu od značaja. Za projektanta je bitno je da poznaje informacije koje se
razmenjuju između sistema i aktora kao i način na koji aktori komuniciraju sa sistemom, kako bi mogao da ih
ugradi u specifikaciju interfejsa. Za razliku od projektanta digitalnog hardvera, programeri imaju na
raspolaganju standardne, sofisticirane korisničke interfejse (tastatura, miš, monitor), koji olakšavaju korisnicima
da interaguju sa softverom. Korisnički interfejsi ovog tipa rešavaju dva bazična problema koji se uvek javljaju
kada dva aktora pokušavaju da komuniciraju: (a) koji podaci se razmenjuju u toj komunikaciji i (b) kada i kako
obaviti prenos informacije. Kod projektovanja hardvera, javljaju se isti problemi, ali, sada je odgovornost na
projektantu digitalnog sistema da ih reši.
statusni/ statusni/
.. .. upravljacki
upravljacki . .
ulazi izlazi
.. DIGITALNI .. izlazi
ulazi
podataka . SISTEM . podataka
rst
clk
0 1
start
(a) (b)
Sl. 3-2 Sekvencijalni delitelj: (a) blok dijagram; (b) ASM opis ponašanja interfejsa.
119
Pr. 3-1 Interfejs sekvencijanog delitelja
Na Sl. 3-2(a) je prikazan blok dijagram sekvencijalnog delitelja. Kolo obavlja operaciju q=x/y, gde su x i y
neoznačeni celi brojevi. Upravljački ulaz start se koristi za startovanje rada delitelja, a po završenom deljenju
sistem postavlja rezultat na izlaz podataka q i aktivira statusni izlaz rdy. Osim ulaza i izlaza, interfejs može
definisati i neka dodatna ograničenja koja se odnose na interakciju sistema i korisnika. Na primer, mogu se
postaviti sledeći zahtevi:
1) Pre aktiviranja upravljačkog ulaza start (start=1) korisnik, treba da postavlja deljenik i delilac na ulazima
podatak x i y. Korisnik ne sme da menja x i y za vreme dok traje izračunavanje (dok je rdy=0).
2) Trajanje signala start mora biti tačno jedan taktni period.
3) Korisnik je u obavezi da pre sledećeg aktiviranja signala start čeka barem dva taktna ciklusa nakon što je
sistem završio prethodno izračunavanje.
Kao što se može zaključiti, specifikacija interfejsa uključuje specifikaciju ulaza i izlaza, proširenu pravilima za
korišćenje sistema od strane korisnika. U suštini, interfejs predstavlja neku vrstu ugovora između dva aktora,
koga se moraju pridržavati obe strane kako bi krajnji rezultat njihove interakcije bio korektan. ¨Prijateljski¨
korisnik je onaj koji se u radu sa sistemom pridržava svih navedenih ograničenja.
Globalni oblik ASM dijagrama, koji opisuje ponašanje korisničkog interfejsa sekvencijalnog delitelja prikazan
je na Sl. 3-2(b). Za sada ASM dijagram ima samo jedno stanje, PASIVNO, u kome čeka na aktiviranje signala
start i pri tome drži na izlazu rdy vrednost 1. U nastavku projektovanja, ¨oblak¨ u ASM dijagramu biće
zamenjen blokovima stanja, grananja i uslovnih izlaza, uz pomoć kojih će biti opisan rad algoritma za deljenje.
Međutim, ni u jednom od blokova stanja ili uslovnog izlaza sadržanih u ¨oblaku¨ neće postojati naredba koja će
postavljati signal rdy. To znači da u prvom narednom taktnom periodu nakon što korisnik aktivira signal start,
signal rdy postaje 0 i zadržava ovu vrednost za sve vreme izračunavanja količnika. Nakon što količnik bude
izračunat i ASM se vrati u stanje PASIVNO, signal rdy će ponovo uzeti vrednost 1.
Pr. 3-2 Handshake interfejs
Za prenos podataka između digitalnih sistema često se koristi tzv. handshake interfejs. Handshake se odnosi na
način koordinacije koji se ostvaruje putem dva signala, req (request - zahtev) i ack (acknowladge - potvrda) (Sl.
3-3(a)). Jedan sistem je predajnik, a drugi prijemnik. Aktivnosti predajnika i prijemnika tokom jednog ciklusa
prenosa podatka prikazani su vremenskim dijagramom sa Sl. 3-3(b). Predajnik postavlja na magistralu data
podatak koji želi da preda prijemniku i aktivira signal req (1). Sa druge strane, prijemnik čeka na zahtev i po
njegovom prijemu (req=1), prihvata podatak sa magistrale data, i preko signala ack potvrđuje prijem (ack=1,
(2)). Nakon prijema potvrde, predajnik deaktivira signal req (3), kako bi se pripremio za sledeći prenos (1).
req=0 je znak prijemniku da treba da deaktivira signal potvrde, (ack=0, (4)) i nastavi da čeka na novi zahtev.
Delimični ASM dijagrami predajnika i prijemnika, koji se opisuju ponašanje handshake interfejsa prikazani su
na Sl. 3-3(c) i (d).
(a) (b)
120
. . .
. . .
. . .
. . .
(c) (d)
Sl. 3-3 Handshake interfejs: (a) blok dijagram; (b) vremenski dijagram; (c) ASM dijagram predajnika; (d) ASM
dijagram prijemnika.
121
Pr. 3-3 ASM dijagram sekvencijalnog delitelja
U cilju ilustracije konverzije softverskog algoritma u ASM dijagrama razmotrićemo hardversku realizaciju
sekvencijalnog delitelja neoznačenih celih brojeva. Blok dijagram i interfejs delitelja specificirani su u Pr. 3-1.
Mada, za ovu namenu postoji veći broj efikasnih i brzih algoritama, u ovom primeru biće korišćen trivijalni
algoritam deljenja, koji se zasniva na uzastopnom oduzimanju delioca od deljenika. Rad algoritma prikazan je u
vidu sledećeg pseudo koda:
r1 = x;
r2 = 0;
while (r1 >= y)
{ r1 = r1 – y;
r2 = r2 + 1; }
Lako se uočava da nakon izlaska iz petlje, promenljiva r2 ima vrednost x/y. Očigledno, radi se o sporom
algoritmu, s obzirom da se petlja mora izvršiti x/y puta. Uočimo da će algoritam biti korektan i u slučaju da se
zameni redosled naredbi unutar while petlje:
r1 = x;
r2 = 0;
while (r1 >= y)
{ r2 = r2 + 1;
r1 = r1 – y; }
Primenom pravila 1 i 2, dve gornje varijante softverskog algoritma deljenje lako se prevode u ASM dijagrame
koji su prikazani na Sl. 3-4.
(a) (b)
Sl. 3-4 ASM dijagrami sekvencijalnog delitelja dobijeni konverzijom pseudo koda: (a) varijanta 1, (b) varijanta 2.
Jedina razlika između ASM dijagrama prikazanih Sl. 3-4 je u redosledu stanja C1 i C2 u petlji koja oduzima
delilac od deljenika i računa količnik. Sa stanovišta algoritma deljenja, redosled ove dve operacije je nebitan,
tako da su oba ASM dijagrama korektna.
Pregledom dva ASM dijagrama može se zapaziti da iza stanja PASIVNO sledi blok grananja koji ispituje
upravljački ulaz start, što, na prvi pogled, nije u skladu sa prvim pravilom prevođenja softverskog algoritma u
ASM dijagram. Međutim, testiranje signal start u stanju PASIVNO deo je specifikacije interfejsa i ne potiče iz
softverskog algoritma, i time ne narušava softverske zavisnosti između naredbi registarskog prenosa.
Razmotrimo, sada, sa više detalja rad ASM dijagrama sa Sl. 3-4(a). Ulazni podatak x se upisuje u registar r1 u
stanju PASIVNO. Ako je start=1, ASM prelazi u stanje INIT, gde će u registar r2 biti upisana inicijalna
vrednost količnika, tj. 0. U suprotnom, ako je start=0, stanje PASIVNO se ponavlja. Kako se u stanju
PASIVNO registar r2 ne menja, a pri tome, r2 sadrži rezultat poslednjeg deljenja, ovako koncipiran interfejs,
pruža korisniku onoliko vremena koliko mu je potrebno da očita rezultat. Uočimo, da interfejs, a ne algoritam
deljenja, zahteva da nakon startovanja sistema r2 bude inicijalizovan u posebnom stanju, INIT. Naime, sa
stanovišta algoritma deljenja, inicijalizacija registra r2 u stanju PASIVNO bila bi korektna, a pri tome bi i
ukupan broj stanja u ASM dijagramu bio za jedan manji. Međutim, kod takvog rešenja, rezultat deljenja bi bio
dostupan za očitavanje sa izlaza registra r2 samo u trajanju od jednog taktnog ciklusa.
122
Deo ASM dijagrama koji izračunava količnik je petlja koju čine stanja TEST, C1 i C2. U stanju TEST (tj. u
bloku grananja koji je pridružen ovom stanju) ispituje se da li je r1 veće od y, a to je isto ono ispitivanje koje
postoji u while naredbi softverskog algoritma. Stanja C1 i C2, u uzastopnim taktnim ciklusima, realizuju, u
vidu naredbi registarskog prenosa, naredbe dodele koje čine telo while petlje. Obe varijante ASM dijagrama,
ispravno rade i u slučajevima kada je x < y. Za x < y uslov iz bloka grananja u stanju TEST je netačan i ASM se
vraća u stanje PASIVNO sa nulom u registru r2 (tj. q=0).
Pažljivom analizom ASM dijagrama sa Sl. 3-4(b), može se uočiti razlog neophodnosti stanja TEST. Stanje
TEST, osim ispitivanja relacije r1≥y, koja mu je pridružena, ne sadrži nikakvu dodatnu aktivnost. U stanju C1,
koje u ovoj varijanti ASM dijagrama, prethodi stanju TEST, sadržana je naredba registarskog prenosa r1←r1–y.
Upis nove vrednosti u registar r1 obaviće se pri ulasku u stanje TEST, gde će, zatim, nova vrednost registra r1,
biti iskorišćena u relaciji r1≥y. Izostavljanjem stanja TEST, rad algoritma bio bi poremećen, jer bi ispitivanje
r1≥y bilo, praktično, pridruženo stanju C1 i koristilo bi staru vrednost registra r1.
Razmatrani primer pokazuje da je softverski algoritam uvek moguće prevesti u korektan ASM dijagram,
primenom jednostavnih pravila. Međutim, često, za isti polazni algoritam postoji više varijanti ASM dijagrama,
pri čemu ona koja se dobija direktnim prevođenjem softverskog algoritma ne mora biti uvek i najbolja. Naime,
ASM dijagrami, dobijeni direktnim prevođenjem softverskih algoritama, mada garantovano ispravni, ne moraju
biti i najefikasniji mogući, u pogledu broja stanja i broja registara. Glavni uzrok neefikasnosti se krije u činjenici
da su u ovako dobijene ASM dijagrame prenesene sve zavisnosti iz softverskog programa, koje forsirajući
strogo sekvencijalan redosled izvršenja naredbi registarskog prenosa, onemogućavaju ispoljavanje paralelizma u
radu različitih delova digitalnog sistema. Zato, ovako dobijene ASM treba koristiti kao polaznu osnovu za
detaljniju analizu koja bi imala za cilj pronalaženje optimalne varijante ASM dijagrama, što će biti tema
narednog primera.
Pr. 3-4 Optimizacija sekvencijalnog delitelja
Eliminacija stanja TEST
Stanje TEST uvedeno je samo iz razloga mehaničkog (direktnog) prevođenja softverskog algoritma u ASM. U
mnogim slučajevima, ispitivanje, kao što je ono koje je pridruženu stanju TEST može biti spojeno sa nekim
drugim stanjem, a da to ne nariši korektnost algoritma. Na taj način, eliminiše se jedno stanje, što ubrzava rad
sistema. Podsetimo se da blok grananja koji sledi nakon bloka stanja koji nije prazan, znači da se ispitivanje u
bloku grananja i izračunavanja u bloku stanja izvršavaju u paraleli. Iz tog razloga, nije korektno spojiti grananje
sa stanjem u kome se obavlja izračunavanje čiji se rezultat koristi u uslovu grananja. Razmotrimo modifikovanu
verziju ASM dijagrama sa Sl. 3-4, kod kojih je stanje TEST, prosto, obrisano.
(a) (b)
Sl. 3-5 ASM dijagrami sekvencijalnog delitelja sa izbačenim stanjem TEST: (a) neispravno rešenje; (b) ispravno
rešenje.
Mada, ASM dijagram sa Sl. 3-5(a) ispravno radi za x<y (ne ulazi u petlju), greška u izračunavanju količnika se
javlja pri x≥y. Kao ilustraciju pogrešnog rada, razmotrimo rad ovog ASM dijagrama za x=14 i y=7, pod
pretpostavkom da je registar r1 12-bitni:
123
Tekuće stanje
PASIVNO r1= ? r2= ? start=0 rdy=1
PASIVNO r1= 14 r2= ? start=1 rdy=1
INIT r1= 14 r2= ? start=0 rdy=0
C2 r1= 14 r2= 0 start=0 rdy=0
C1 r1= 14 r2= 1 start=0 rdy=0
C2 r1= 7 r2= 1 start=0 rdy=0
C1 r1= 7 r2= 2 start=0 rdy=0
C2 r1= 0 r2= 2 start=0 rdy=0
C1 r1= 0 r2= 3 start=0 rdy=0
PASIVNO r1= 4089 r2= 3 start=0 rdy=1
PASIVNO r1= ? r2= 3 start=0 rdy=1
Uočimo da se relacija r1≥y javlja u dva različita stanja: PASIVNO i C1. Izračunavanje obuhvaćeno stanjem
PASIVNO uključuje jedino registar r2, što nema uticaja na ispitivanje r1≥y (tj. 14 ≥ 7). Problem postoji u stanju
C1, jer izračunavanje obuhvaćeno ovim stanjem uključuje registar r1, a odlučivanje koje sledi zasnovano je
upravo na vrednosti registra r1. Prilikom drugog prolaska kroz stanje C1 (vrsta u tabeli prikazana masnim
slovima), r1 još uvek sadrži vrednost 7. Naredba registarskog prenosa r1←r1 – y nalaže promenu vrednosti u r1
na 0, ali to će se desiti tek prilikom ulaska u sledeće stanje. S obzirom da ispitivanje r1≥y koristi tekuću
vrednost registra r1 (tj. 7), petlja će se ponoviti još jedanput, što daje pogrešan rezultat (r2=3). Vrednost 4089,
koju dobija registar r1 prilikom trećeg prolaska kroz petlju, posledica je podkoračenja prilikom izvođenja
operacije r1 – y (4089+7 = 212).
Mada je eliminacijom stanja TEST iz ASM dijagrama sa Sl. 3-4(b) dobijamo pogrešno rešenje, postavlja se
pitanje šta će se desiti ako isto stanje odstranimo iz ASM dijagrama sa Sl. 3-4(a), gde je stanje C1 na početku
petlje (Sl. 3-5(b)). U ASM dijagramu sa Sl. 3-5(b), ispitivanje r1≥y se javlja u dva različita stanja PASIVNO i
C2. Razlika u odnosu na prethodno analizirani ASM je u tome što sada izračunavanje obuhvaćeno stanjem C2,
r2 ← r2 + 1, koje prethodi ispitivanju uslova r1≥y, ne utiče na rezultat ispitivanje. Iz tog razloga, ASM dijagram
sa Sl. 3-5(b) je ispravan. S obzirom da petlja sada obuhvata dva, a ne tri stanja kao što je to bio slučaj kod ASM
dijagrama iz Pr. 3-3, ukupno vreme izračunavanja količnika je smanjeno i iznosi: 3+2*količnik taktnih
ciklusa. U suštini, ubrzanje koje smo dobili, posledica je preklapanja izvršenja dve nezavisne operacije, naredbe
registarskog prenosa r2 ← r2 + 1 i ispitivanja uslova r1≥y.
Eliminacija stanja INIT
Stanje INIT se koristi za inicijalni upis vrednosti 0 u registar r2. Razmotrićemo mogućnost eliminacije ovog
stanja, pripajanjem operacije r2←0 stanju PASIVNO. Prosto prebacivanje naredbe registarskog prenosa iz
stanja INIT u stanje PASIVNO daje ASM dijagram sa Sl. 3-6.
Sl. 3-6 ASM dijagram sekvencijalnog delitelja sa izbačenim stanjem INIT (pogrešno rešenje).
Broj naredbi registarskog prenosa koje se, obuhvaćene istim stanjem, izvršavaju u paraleli, može biti
proizvoljan, sve dok su registri sa leve strane ovih naredbi jedinstveni u okviru tog stanja. U konkretnom
primeru, stanje PASIVNO sadrži dve naredbe registarskog prenosa, koje iniciraju upise u registre r1 i r2; sam
upis biće obavljen na početku sledećeg taktnog perioda, tj. pri ulasku u stanje C1. S obzirom na pretpostavku da
pri rdy=1, korisnik čeka barem dva taktna ciklusa pre nego što aktivira signal start (vidi specifikaciju interfejsa
u Pr. 3-1), r1 i r2 će biti ispravno inicijalizovani pre ulaska u petlju. ASM će korektno izračunati količnik i
napustiti petlju posle odgovarajućeg broja prolazaka.
Međutim, kod ove ASM javlja se novi problem, koji nije postojao kod prethodnih varijanti: količnik se zadržava
u registru r2 samo za vreme jednog taktnog ciklusa. Razlog za ovakvo ponašanje je taj što se ASM odmah
124
nakon završenog izračunavanja vraća u stanje PASIVNO, gde se u r2 upisuje 0. Sa matematičke tačke gledišta,
ASM je ispravna, ali sa tačke gledišta korisničkog interfejsa, ovakvo ponašanje je neprihvatljivo.
Problem u radu interfejsa koji se javlja u ASM sa Sl. 3-6 može se prevazići uvođenjem još jednog registra, r3,
koji će se koristi za pamćenje količnika (Sl. 3-7(a)). ASM sa Sl. 3-7(a) radi korektno za x≥y (s napomenom da je
sada konačni rezultat smešten u r3, a ne u r2). Nažalost, u ovom ASM dijagramu postoji jedna suptilna greška: u
slučajevima kada rezultat treba da bude nula (x<y), r3 ostaje nepromenjen, umesto da bude obrisan. To se
događa zato što se upis u r3 obavlja samo unutar petlje. Međutim, u slučajevima kada je x<y, u petlju se ne
ulazi, a r3 zadržava zatečenu vrednost. Problem se može rešiti ako se uvede još jedno grananje, neposredno pre
ulaska u petlju, koje će ispitati uslov x<y (odnosno, uslov r1≥y), kao što je prikazano na Sl. 3-7(a). Uvođenje
dodatnog stanja, C3, ima za posledicu produženje vremena izračunavanja, koje sada iznosi: 2+3*količnik.
(Ponekada, projektant mora da razmotri sporije rešenje, da bi nakon toga, eventualno, stigao do bržeg).
(a) (b)
Sl. 3-7 ASM dijagram sekvencijalnog delitelja sa dodatnim registrom za pamćenje količnika: (a) pogrešno rešenje;
(b) ispravno rešenje.
Parelelizacija petlje
U ovom odeljku, polazeći od ASM dijagrama sa Sl. 3-7(b) isprobaćemo različite varijante realizacije petlje, u
smislu promene redosleda operacija i uvođenja paralelizma u izvršenju operacija. Konačni cilj je naći rešenje
koje će biti brže od polaznog.
PASIVNO
r1 <- x
r2 <- 0 PASIVNO
rdy r1 <- x
r2 <- 0
rdy
0 1
start
0 1
start
0 1
r1 >= y
0 1
N3 r1 >= y
1
r3 <- 0 r1 >= y
C1 N3
1
0 r1 <- r1 - y r3 <- 0 r1 >= y
C1
C3 0 r1 <- r1 - y
r3 <- r2
C23
C2
r2 <- r2 + 1
r2 <- r2 + 1 r3 <- r2
(a) (b)
Sl. 3-8 Varijacije u petlji ASM dijagrama sekvencijalnog delitelja (pogrešna rešenja).
Zamena redosleda stanja C2 i C3, daje pogrešno rešenje (Sl. 3-8(a)). Očigledno, upis u r3 se obavlja prerano i
konačni rezultat je za jedan manji od ispravnog. Još jedna varijanta izvođenja petlje, koja je, nažalost, iz sličnih
125
razloga kao i prethodna, takođe, pogrešna, dobija se spajanjem stanja C2 i C3 u jedinstveno stanje C23 ( Sl.
3-8(b)). Mada je unutar bloka stanja C23, operacija upisa u registar r2 navedena ispred operacije upisa u registar
r3, obe ove operacije izvršavaju se u paraleli (istovremeno). S obzirom da između operacija r2 ← r2 + 1 i r3 ←
r2 postoji zavisnost, ASM sa Sl. 3-8(b) nije ekvivalentan korektnom ASM dijagramu sa Sl. 3-7(b), kod koga su
ove dve operacije razdvojene u posebna stanja. Nasuprot tome, ponašanje ASM sa Sl. 3-8(b), ekvivalentno je
ponašanju pogrešnog ASM dijagrama sa Sl. 3-8(a).
Varijanta petlje, koja daje ne samo korektno, već i brže rešenje je ona kod koje su sve tri operacije, koje čine
telo petlje, spojene u jedinstveno stanje C123 ( Sl. 3-9). Ispitivanje uslova r1≥y pripada stanju C123 (kao što
pripada i stanju PASIVNO). Uočimo da se r1 menja u ovim stanjima. Takođe, između operacija obuhvaćenih
stanjem C123 postoji, ranije pomenuta, međuzavisnost. Međutim, i pored svega toga, ASM sa Sl. 3-9 predstavlja
ispravno rešenje, a razlog za to je upravo činjenica da se sve pomenute operacije izvršavaju u paraleli. U tom
smislu, rešenje sa predstavlja suprotnost u odnosu na koncept softverske sekvencijalnosti, od koga smo pošli u
traženju rešenja koje bi bilo optimalno u kontekstu hardverske realizacije sekvenicjalnog delitelja.
126
Sl. 3-10 ASM dijagram sekvencijalnog delitelja sa eliminisanim stanjem N3.
Aktiviranje signala start, koji traje tačno jedan taktni ciklus ima kao jedinu posledicu inicijalni ulazak u petlju.
Svako naredno eventualno ponavljanje petlje isključivo zavisi od sadržaja registra r1. S obzirom da se za x≥y
petlja izvršava najmanje dva puta, pridruživanje signala start uslovu r1≥y nema efekta na rad ASM-a za x≥y.
Efekat pridruživanja signala start uslovu r1≥y ispoljava se kada je x<y. Drugim rečima, umesto da se stanje
C123 ne izvrši ni jedanput, start=1 forsira da se ovo stanje izvrši. U ovom slučaju, stanje C123 se izvršava tačno
jednom zato što x (tj. r1) nije ≥y.
Činjenica da se nakon izvršenja stanja C123 sadržaji registara r1 i r2 razlikuju od onih koje su oni imali nakon
izvršenja stanja N3 u prethodnoj varijanti ASM-a nije od značaja, s obzirom da korisnik očekuje konačni
rezultat u registru r3.
ASM sa Sl. 3-10 prikazan je u obliku strukturnog dijagrama, u smislu da programska realizacija ovog ASM
dijagrama ne zahteva upotrebu goto naredbe. U suštini, konkretni ASM dijagram sadrži while petlju
(testiranje uslova r1≥y | start) ugneždenu unutar if naredbe (testiranje signala start). Takođe, uočimo da se u
ASM dijagramu sa Sl. 3-10, ulazni signal start ispituje dva puta u toku istog taktnog ciklusa (stanje PASIVNO).
Ova redundantnost u dijagramu je direktna posledica težnje za strukturnom formom ASM dijagram. Dvostruko
ispitivanje signala start možemo lako eliminisati, ali to rezultuje u ASM dijagramu koji nije više strukturnog
oblika (Sl. 3-11)
127
operacije koje se ponekad (ali ne i uvek) izvršavaju kada je ASM u određenom stanju. Blokovi uslovnog izlaza
nisu sami po sebi stanja, već se mogu smatrati ¨decom¨ nekog roditeljskog stanja. S obzirom da blokovi
uslovnog izlaza predstavljaju uslovne operacije, oni se uvek nalaze ispod jednog ili više blokova grananja. Kada
se u ASM dijagramu Milijevog tipa prate strelice, onda se polazeći od bloka stanja uvek prođe kroz jedan ili
više blokova grananja dok se ne stigne do bloka uslovnog izlaza. Strelica koja izvire iz bloka uslovnog izlaza,
utiče ili u blok grananja ili u blok stanja.
Sve naredbe registarskog prenosa i relacije navedene u bloku stanja i svim blokovima uslovnog izlaza i grananja
koji su međusobno povezani (bez blokova stanja između njih) obavljaju se u istom taktnom ciklusu. U suštini,
kombinacija blokova grananja i blokova uslovnog izlaza omogućava projektantu da realizuje ugneždenu if
then else konstrukciju koja se izvršava u jednom taktnom ciklusu. U takvoj ASM, veliki broj uslova se
može ispitivati u paraleli, što može bitno ubrzati rad algoritma.
ZELENO
BRZINA=3
ZUTO
STOP
BRZINA=1 OSTANI
BROJAC<-BROJAC+1
1
BROJAC /= 0
NAPUSTI
CRVENO
STOP
BROJAC<-BROJAC+2
128
uslovni signal je aktivan u toku celog taktnog ciklusa, baš kao i bezuslovni signal STOP. Signal OSTANI, koji
se nalazi na drugoj putanji, ostaje neaktivan u toku ovog taktnog ciklusa.
Između 2.0 s i 2.5 s, ASM je ponovo u stanju ŽUTO, ali kako je sada vrednost registra BROJAČ različita od
nule, ASM nastavlja putanjom koja je vraća u isto stanje. Ova putanja prolazi kroz blok uslovnog izlaza koji
postavlja signal OSTANI. Signal NAPUSTI se ne aktivira u ovom taktnom ciklusu.
S obzirom da je BROJAČ trobitna promenljiva, BROJAČ ponovo postaje nula u vremenu 4.5-5.0s. To je zadnji
taktni ciklus u kome je ASM u stanju ŽUTO. Znači, u toku ovog taktnog ciklusa, signal NAPUSTI je aktivan, a
signal OSTANI nije.
Pr. 3-6 Milijeva verzija sekvencijalnog delitelja
Eliminacija stanja INIT (po drugi put)
U Pr. 3-4 na Sl. 3-5(b) prikazana je jedna korektna varijanta ASM dijagrama sekvencijalnog delitelja sa četiri
stanja koja sadrži samo dva registra (r1 i r2). Na Sl. 3-6 je prikazan jedan neuspešan pokušaj eliminacije stanja
INIT iz ove ASM. U ASM sa Sl. 3-7(b) uveden je registar r3 kako bi se ispravila greška u korisničkom interfejsu
koja je postojala u ASM sa Sl. 3-6.
Problem koji postoji u ASM sa Sl. 3-6 posledica je činjenice da se u stanju PASIVNO vrši bezuslovni upis u r2.
Korišćenjem bloka uslovnog izlaza, moguće je eliminisati stanje INIT, a da se pri tome ne naruši sadržaj registra
r2 za vreme dok mašina u stanju PASIVNO čeka da signal start bude aktiviran. Drugim rečima, u r2 se upisuje
nula u trenutku kada ASM prelazi iz stanja PASIVNO u stanje C1 ( Sl. 3-13).
129
Sl. 3-14 Milijev ASM dijagram sekvencijalnog delitelja sa paralelizovanom petljom (neispravno rešenje)
U trenutku kada se, nakon obavljenog izračunavanja, ASM vrati u stanje PASIVNO, registar r2 je inkrementiran
jedanput više nego što bi to bio slučaj pri ispravnom radu sistema. U Pr. 3-4, ovaj problem bio je rešen
uvođenjem registra r3 koji je služio za čuvanje ispravnog količnika. Međutim, bolje rešenje bilo bi ono kod
koga bi se izbeglo korišćenje dodatnog registra. U tom cilju, neophodno je u stanju C12 vršiti upis u r2 samo
ako ASM ostaje u petlji, a zadržati zatečenu vrednost ako ASM napušta petlju da bi se vratila u stanje
PASIVNO. Ovakav rad ASM-a zahteva uvođenje bloka uslovnog izlaza (Sl. 3-15).
Sl. 3-15 Milijev ASM dijagram sekvencijalnog delitelja sa paralelizovanom petljom (ispravno rešenje)
ASM sa Sl. 3-15 izračunava korektan količnik za 3+količnik taktnih ciklusa i to korišćenjem samo dva
umesto tri registra. Znači, ovaj ASM je jednako brz kao i najbrži Murov ASM i pri tome koristi manji broj
registara.
Ranije postavljanje signala rdy
Razlog zbog koga Milijev ASM sa paralelizovanom unutrašnjom petljom sa Sl. 3-15 nije brži od Murovog ASM
iz sa Sl. 3-10 jeste u zahtevu da je korisnik u obavezi da čeka barem dva taktna ciklusa nakon što sistem postavi
signal rdy pre nego što ponovo inicira deljenje. Kod Murovih ASM dijagrama situacija rdy =1 je isto što i biti u
stanju PASIVNO. Međutim, kod Milijevih ASM dijagrama postoji mogućnost da se signal rdy postavi jedan
taktni ciklus ranije. Postoje dva razloga koji opravdavaju ranije postavljanje signala rdy. Prvo, u toku poslednjeg
taktnog ciklusa u kome je ASM u stanju C (Sl. 3-15), registar r2 već sadrži ispravan količnik, te se zbog toga ne
inicira operacija inkrementiranja registra r2 (grana ¨0¨ uslovnog koraka r1≥y iz bloka grananja koji sledi odmah
nakon bloka stanja C). Drugo, korisnik nije svestan tekućeg stanja sistema, već se on oslanja na signal rdy koji
ukazuje na trenutak kada signal start može ponovo biti aktiviran.
ASM sa Sl. 3-16 postavlja signal rdy u stanju PASIVNO, ali takođe i u poslednjem taktnom ciklusu stanja C.
Dok je ASM u stanju C, test r1≥y sa dna petlje se obavlja u isto vreme kada i test r1≥y sa vrha petlje. U taktnim
ciklusima kada ASM treba da ostane u petlji, r2 se inkrementira. U taktnom ciklusu kada ASM treba da napusti
petlju, postavlja se signal rdy.
130
Sl. 3-16 Konačni oblik Milijevog ASM dijagrama sekvencijalnog delitelja.
Uslovno postavljanje signala rdy nakon izlaska iz petlje (grana ¨0¨ romba sa vrha petlje) ne bi bila legalna
operacija, jer postavljanje signala rdy već postoji u okviru stanja PASIVNO, kome, takođe, pripada i dotični
blok grananja. Postavljanje signala rdy, na način kako je to pokazano na Sl. 3-16, predstavlja legalnu operaciju,
jer se ona dešava samo u stanju C, tj. blok grananja sa dna petlje pripada samo stanju C, a ne i stanju PASIVNO.
Naredna tabela ilustruje rad ASM sa slike za x=14 i y=7:
Tekuće stanje
PASIVNO r1= ? r2= ? start = 0 rdy = 1
PASIVNO r1= 14 r2= ? start = 1 rdy = 1
C r1= 14 r2= 0 start = 0 rdy = 0
C r1= 7 r2= 1 start = 0 rdy = 0
C r1= 0 r2= 2 start =0 rdy = 1
PASIVNO r1= 4089 r2= 2 start = 0 rdy = 1
U poslednjem taktnom ciklusu stanja C, r2 već sadrži korektan količnik i signal rdy je postavljen. Umesto da
čeka još jedan taktni ciklus, korisnik može od ovog momenta otpočeti sa odbrojavanjem ciklusa.
ASM sa Sl. 3-16 izračunava korektan količnik za 2+količnik taktnih ciklusa korišćenjem samo dva registra.
Znači, sekvencijalni delitelj realizovan na osnovu Milijevog ASM dijagrama sa Sl. 3-16 je jeftiniji i brži od bilo
kog rešenja zasnovanog na nekom od Murovih ASM dijagrama iz Pr. 3-4.
3.3 Razrada
ASM dijagram nije ništa više od grafičkog prikaza algoritma, sa preciznom informacijom o tajmingu i
indikacijom o tome koje operacije se obavljaju u paraleli, a koje sekvencijalno. ASM dijagram ništa ne govori o
hardverskim komponentama koje su potrebne da bi se opisano izračunavanje realizovalo. Krajnji cilj
projektovanja je realizacija fizičkog sistema, tj. precizna specifikacija strukture sistema (na primer, u vidu
logičke šeme). ASM dijagram govori o tome šta projektant želi da mašina radi, a ne govori ništa o tome kako
povezati fizičke komponente da bi se ostvarilo željeno ponašanje sistema. Sa programerske tačke gledišta,
postavlja se pitanje zašto nastaviti dalje, zar problem nije rešen samim tim što smo našli algoritam. Slično,
projektant hardvera, može se zapitati zašto trošiti vreme na ASM dijagram, kada to ionako nije oblik rešenja koji
nam je potreban. Odgovor na oba ova pitanja je da kreiranje ASM dijagrama povećava šansu da će projektant
realizovati korektno rešenje. Sledeća faza projektovanja, razrada, upravo uključuje jedan deo ukupne
transformacije algoritma u hardversku strukturu.
131
Faza razrade ima za cilj da polazni problem, prethodno precizno opisan ASM dijagramom, podeli na dva
razdvojena ali povezana aktora: upravljačku jedinicu i staza podataka (Sl. 3-17). Staza podataka sadrži: (a)
hardverske registre neophodne za čuvanje vrednosti promenljivih koje se javljaju u naredbama registarskog
prenosa; i (b) kombinacionu logiku neophodnu za obavljanje izračunavanja specificiranih naredbama
registarskog prenosa. Na primer, ako u ASM dijagramu postoji naredba A <- B + C, tada u stazi podatak postoje
tri registra za smeštanje vrednosti promenljivih A, B i C i sabirač. Iako sadrži sve što je neophodno da bi se
izvršila izračunavanja i memorisali među-rezultati, staza podataka nije u stanju da samostalno sprovodi
sekvencu izračunavanja na način koji je predviđen algoritmom. To je razlog postojanja upravljačke jedinice, čiji
je zadatak da u svakom taktnom ciklusu ¨naloži¨ stazi podataka šta da uradi. Drugim rečima, u upravljačkoj
jedinici ugrađeno je ponašanje sistema, dok se resursi neophodni za obavljanje svih potrebnih izračunavanja i
memorisanje podataka nalaze u stazi podataka. Upravljačka jedinica umesto naredbi registarskog prenosa izdaje
komande stazi podataka (tj. postavlja interne upravljačke signale). Staza podataka prima komande, obavlja
aktivnosti koje su naložene komandom i kao odgovor generiše interne statusne signale. Upravljačka jedinica
ispituje statusne signale koje dobija od staze podataka i na bazi njihove vrednosti i vrednosti upravljačkih i
statusnih ulaza, donosi odluke koje određuju dalji tok rada sistema.
Uobičajeno je da se i u ovoj fazi projektovanja koristi ASM dijagram, ali samo za opis ponašanja upravljačke
jedinice, dok se staza podataka predstavlja u vidi hardverskog strukturnog opisa. ASM dijagram pridružen
upravljačkoj jedinici ne sadrži naredbe registarskog prenosa i relacije (jer su registri prebačeni u stazu
podataka), ali zato sadrži detaljan opis aktivnosti upravljačke jedinice, u vidu postavljanja upravljačkih signala i
ispitivanja statusa, koje su neophodne da bi se u stazi podatak obavila izračunavanja i registarski prenosi i to u
redosledu i na način koji je predviđen polaznim ASM dijagramom. Mada je nakon obavljene razrade, struktura
sistema složenija, a opis ponašanja sadrži više detalja, ponašanje celokupnog sistema, gledano sa strane
spoljnjeg sveta ostaje identično polaznoj specifikaciji.
Pr. 3-7 Razrada sekvencijalnog delitelja (rešenje 1)
Proces projektovanja na način ¨odozgo-naniže¨ uključuje tri glavne faze, kao što je to opisano u sekciji 3.1. U
Pr. 3-3, Pr. 3-4 i Pr. 3-6 iz sekcije 3.2, kao primer prve faze, razmatrane su različite varijante opisa ponašanja
sekvencijalnog delitelja. U ovom primeru biće razmatrana druga faza projektovanja (razrada) ovog kola. Za
ilustraciju razrade opisa ponašanja sekvencijalnog delitelja u strukturu sačinjenu od upravljačke jedinice i staze
podataka možemo uzeti bilo koji korektan ASM dijagram iz sekcije 3.2. Na primer, usredsredimo se na ASM sa
Sl. 3-10 iz Pr. 3-4, koji je ujedno predstavlja i najjednostavniji Murov ASM za deljenje. Za početak,
ignorisaćemo signale start i rdy, s obzirom da se radi o upravljačkom ulazu i statusnim izlazu sistema, koji
ionako ostaju nepromenjeni u fazi razrade. Cilj faze razrade jeste eliminacija naredbi registarskog prenosa i
relacionih izraza.
Uočimo naredbe registarskog prenosa u ASM dijagramu sa Sl. 3-10. U stanju PASIVNO, inicira se upis
vrednosti x u registar r1 i, u paraleli, brisanje registra r2. U stanju C123, inicira se upis u sva tri registra.
Naravno, sve inicirane promene registara desiće se na početku sledećeg taktnog ciklusa.
Postoji veliki broj različitih hardverskih struktura koje bi mogle realizovati naredbe registarskog prenosa iz
ASM sa Sl. 3-10. Na projektantu je da se odluči koje će hardverske komponente koristiti za ovu namenu.
Kriterijumi mogu biti različiti: brzina rada, cena, raspoloživost komponenti, i td. Jedini zahtev je da način na
koji su izabrane komponente povezane može obezbediti izvođenje svih naredbi registarskog prenosa uz striktno
poštovanje tajminga koje je specificiran polaznim ASM dijagramom. Najlakši (mada ne obavezno uvek i
najbolji) način da se ovo postigne jeste izabrati takve registarske komponente koje osim osnovne funkcije
memorisanja podataka, omogućavaju i neku dodatnu obradu koja se može iskoristiti za realizaciju celokupne (ili
barem jednog dela) naredbe registarskog prenosa. Na primer, u konkretnom slučaju, za realizaciju registra r2
možemo iskoristiti brojač. Brojač, kao digitalna registarska komponenta, osim memorisanja podatka,
omogućava brisanje (resetovanje) i inkrementiranje sadržaja, upravo one funkcije koje su potrebne za izvođenje
naredbi r2←0 i r2←r2+1, koje se javljaju u stanjima PASIVNO i C123, a uključuju registar r2. Realizacijom
registra r2 uz pomoć brojača bili bi smo u mogućnosti da eliminišemo obe ove naredbe registarskog prenosa i
zamenimo ih upravljačkim signalima za resetovanje i inkrementiranje brojača.
Ukoliko projektant za realizaciju registra r2, umesto brojača, odluči da koristi prihvatni registar, on će morati da
obezbedi dodatnu kombinacionu logiku kako bi nadomestio nedostatak funkcija resetovanja i inkrementiranja,
ugrađenih u brojaču. Izbor prihvatnog registra za realizaciju r2 nije pogrešno rešenje, već samo zahteva veće
angažovanje projektanta. Da bi smo zadržali jednostavnost primera, usvojićemo da se r2 realizuje uz pomoć
brojača.
Sa druge strane, registri r1 i r3, za razliku od brojača, uvek se pune vrednostima koje ne zavise direktno od
tekućeg sadržaja tih registara. Iz tog razloga, za realizaciju r1 i r3, razumno je koristiti najjednostavnije
registarske komponente, kao što je prihvatni registar, koji osim bazičnih registarskih funkcija upisa i
132
memorisanja podataka, poseduje još jedino funkciju dozvole upisa. Naravno, biće neophodan dodatni hardver
kako bi se obezbedili podaci za upis u ove registre.
Nakon što smo odlučili koje tipove registara ćemo koristiti u stazi podataka, neophodno je razmotriti na koji
način će registri biti povezani. Za trenutak, usredsredimo se samo na naredbe registarskog prenosa u stanju
C123. U ovom stanju, r1 se puni razlikom r1-y, r2 se inkrementira, a r3 se puni starom vrednošću registra r2.
Sve tri operacije izvršavaju se u paraleli. Za izračunavanje razlike r1-y koristićemo oduzimač. Ovo kolo će uvek
računati razliku između r1 i y (nezavisno od toga što se razlika upisuje u r1 samo kada je mašina u stanju C123).
Punjenje registra r3 starom vrednošću registra r2 lako se ostvaruje, tako što se izlazi brojačkog registra koji
realizuje r2 direktno povezuju sa ulazima prihvatnog registra koji realizuje r3. Kada bi se r1, r2 i r3 javljali
samo u stanju C123, staza podataka bi izgledala kao na Sl. 3-18.
12 ldr1 clrr2 incr2 ldr3
12 12
x/y
12
12 (-)
y
r1 r2 r3
Sl. 3-18 Staza podataka sa oduzimačem. Napomena: ldr – signal dozvole upisa u registar; clr – signal dozvole
resetovanja brojača; inc – signal dozvole inkrementiranja brojača; trougao označava taktni ulaz registra.
Uočimo da u stazi podataka sa Sl. 3-18 nije moguće realizovati operacije registarskog prenosa koje se javljaju u
stanju PASIVNO, r2←0 i r1←x. Naime, ne postoji mogućnost da se u r1 upiše x.
Pristup koji se često koristi kada staza podataka u različitim stanjima treba da obavi različite operacije sastoji se
u ugradnji aritmetičko-logičke jedinice (ALU). Za razliku od kombinacionih kola fiksne funkcije (kao što je
oduzimač), ALU predstavlja kombinaciono kolo koje može da obavi veći broj različitih aritmetičkih ili logičkih
operacija nad dva višebitna operanda. Takođe, prilikom korišćenja ALU obično je potrebno ugraditi jedan ili
više multipleksera za izbor podataka koji će kao operandi biti prosleđena do ulaza ALU. U konkretnom primeru,
u r1, u različitim stanjima, upisuju se sledeće informacije: (1) razlika r1-y, ili (2) vrednost deljenika x. Ako
usvojimo da se informacija za upis u r1 generiše od strane ALU jedinice, takva ALU mora biti sposobna da
obavi barem dve različite operacije: izračunavanje razlike i propuštanje, bez ikakve promene, jednog od ulaznih
operanada na izlaz. U ovom primeru koristićemo ALU jedinicu iz Pr. 2-27 koja ispunjava postavljene zahteve.
Izbor operacije koju će ALU obaviti vrši postavljanjem odgovarajuće binarne kombinacije na upravljačkom, 4-
bitnom ulazu aluctrl ALU jedinice. 4-bitne binarne kombinacije kojima se biraju dve operacije koje su nam
potrebne u konkretnom primeru simbolički ćemo imenovati kao: 'ODUZIMANJE i 'PROPUŠTANJE. (Simbol '
označava da dotično ime ukazuje na binarnu kombinaciju). Znači, u jednom slučaju ALU oduzima y od r1, a u
drugom propušta ulaznu vrednost x. Da bi se to ostvarilo neophodan je multiplekser tipa ¨2-u-1¨. Izlaz
multipleksera se vezuje na drugi ulaz ALU kola; ulaz 0 multipleksera je povezan sa ulazom podataka x, a ulaz 1
sa ulazom y. Kada je upravljački ulaz multipleksera muxctrl postavljen na 0, multiplekser propušta x, a kada je
postavljen na 1, propušta y. Korišćenjem ALU i multipleksera, staza podataka dobija oblik kao na Sl. 3-19.
muxctrl
133
zamenjeni testiranjem ovog internog statusnog signala. U konkretnom primeru, za obavljanje poređenja r1≥y
koristićemo komparator čiji su ulazi r1 i y.
Komparator, kao namensko kombinaciono kolo, poseduje tri izlaza: strogo manje (<); jednako (==) i strogo
veće (>). Izlaz tipa ¨≥¨ ne postoji, ali se može lako oformiti, s obzirom da predstavlja negaciju izlaza ¨strogo
manje¨. Znači, da bi smo realizovali željeno poređenje, iskoristićemo izlaz ¨strogo manje¨ komparatora i
invertor. Izlaz invertora biće interni statusni signal r1gey, koji kada je 1 ukazuje da je r1 veće ili jednako y
(r1gey – r1 is Grater or Equal then Y).
Konačno, došli smo do strukture staze podataka koja može korektno da realizuje sve naredbe registarskog
prenosa i relacione izraze navedene u polaznom ASM dijagramu. Sada, kad su svi detalji staze podataka poznati,
prevođenje polaznog ASM dijagrama sa Sl. 3-10 u razrađeni ASM dijagram upravljačke jedinice, predstavlja, u
suštini, mehanički postupak. Svrha ovog prevođenja je da se umesto naredbi registarskog prenosa koriste
upravljački signali (kao što je incr2 ili aluctrl), a umesto relacionih izraza interni statusni signali (kao što je
r1gey). Svaka naredba ← se prevodi u jedan ili više upravljačkih signala (kao što su ldr1, clrr2, incr2 ili ldr3).
Na primer, da bi se u stazi podataka sa Sl. 3-19 obavila naredba r2←r2+1 potrebno je aktivirati upravljački
signal incr2. Znači, u ASM dijagramu naredbu r2←r2+1 treba zameniti signalom incr2. Slično, naredbu
r1←r1-y treba zameniti naredbama postavljanja internih upravljačkih signala muxctrl, aluctrl='ODUZIMANJE
i ldr1, i td.
Prelaz sa ASM dijagrama koji opisuje ponašanje celokupnog sistema na razrađeni ASM koji opisuje ponašanje
upravljačke jedinice, uvek ima u vidu strukturu staze podataka. Mada, obično, postoji veći broj staza podataka,
različite strukture, koje mogu realizovati naredbe registarskog prenosa i relacione izraze sadržane u polaznim
ASM dijagramom, svaka od varijanti zahtevaće različiti razrađeni ASM, prilagođen strukturi konkretne staze
podataka.
Slike Sl. 3-20, Sl. 3-21 i Sl. 3-22 prikazuju redom: stazu podataka, koju smo projektovali u ovom primeru,
razrađeni ASM dijagram dobijen na osnovu polaznog ASM dijagrama i projektovane staze podataka, i blok
dijagram koji pokazuje spregu upravljačke jedinice i staze podataka.
Sl. 3-21 Razrađen ASM dijagram koja odgovara polaznom ASM dijagramu sa Sl. 3-10 i stazi podataka sa Sl. 3-20
134
Sl. 3-22 Razrađeni blok dijagram sekvencijalnog delitelja.
0 1
start
INIT
clrr2
TEST
1
r1gey
C1
0
ldr1
aluctrl = 'ODUZIMANJE
muxctrl = 1
C2
incr2
135
ulaza kako bi se do ulaza u ALU prosledili svi potrebni operandi. U konkretnom primeru, potreban je
multiplekser sa tri ulaza (što znači da je ulaz multipleksera za selekciju muxctrl dvo-bitni). Ovo će omogućiti
da se izabere jedna od vrednosti x, r1 i r2 i prosledi do ulaza u ALU.
Kod opisanog rešenja više nije neophodno da r2 bude realizovan kao brojački registar, s obzirom da operaciju
r2←r2+1 može da obavi ALU. Takođe, izlaz ALU jedinice mora biti dostupan na centralnoj magistrali, sa koje
će se vršiti upis u registre r1 i r2.
ALU jedinica standardno poseduje signal izlaznog prenosa (cout) koji se može iskoristiti za određivanje
rezultata testa r1≥y. Ovo je dozvoljeno jer ASM Sl. 3-20 poseduje stanje TEST sa praznim blokom stanja. U
razrađenoj ASM, ovaj pravougaonik neće biti prazan, mada i dalje neće sadržati bilo kakav upis u registre r1 ili
r2. Postavljanjem odgovarajućih internih upravljačkih signala (aluctrl i muxctrl) u prazan blok stanja TEST,
staza podataka se može tako konfigurisati da ALU izračunava razliku r1 i y, ali bez upisa rezultata u bilo koji
registar. Izlazni prenos postavljen prilikom izračunavanja ove razlike, tačnije njegova komplementarna
vrednost, ~cout, ukazuje na ishod poređenja r1≥y. Struktura staze podataka za treći primer prikazana je na Sl.
3-24(a), a razrađeni ASM koji opisuje ponašanje upravljačke jedinice na Sl. 3-24(b).
(a) (b)
Sl. 3-24 Sekvencijalni delitelj sa centralizovanom ALU: (a) staza podataka i (b) razređeni ASM dijagram.
Primeri razrade opisa ponašanja u strukturu ¨upravljačka jedinica – staza podataka¨, opisani u prethodnim
primerima, ukazuju da se u fazi razrade projektant sreće sa širokim spektarom mogućnih rešenja. Staza podataka
zasnovana na centralizovanoj ALU (ilustrovana u Pr. 3-9) koja obavlja sva neophodna izračunavanja,
predstavlja jedan kraj ovog spektra. Druga krajnost je metodička staza podataka, ilustrovana u Pr. 3-7 i Pr. 3-8,
kod koje se sva izračunavanja predviđena algoritmom obavljaju zasebnim hardverskim jedinicama. Pristup
zasnovan na centralizovanoj ALU, tipično, zahteva manje hardvera, ali zato, može da realizuje samo određene
vrste ASM-ova. Na primer, ASM dijagrami koji predviđaju više od jednog izračunavanja po taktnom ciklusu ne
mogu se ostvariti u stazi podataka zasnovanoj na centralizovanoj ALU, zato što ALU može da obavi samo jednu
operaciju u jednom taktnom ciklusu.
Kod metodičke staze podataka iz Pr. 3-7, izlaz ALU jedinice je povezan samo sa ulazom u registra r1; kod staze
podataka sa centralizovanom ALU iz Pr. 3-9, izlaz ALU jedinice je povezan sa oba registra r1 i r2. Kod ASM
koja je realizovana uz pomoć metodičke staze podataka, u jednom taktnom ciklusu izvršava se više naredbi
registarskog prenosa. Pristup koji koristi centralizovanu ALU je sporiji jer polazi od sekvencijalnog ASM
dijagrama.
3.4 Realizacija
Završna faza projektovanja bavi se realizacijom hardvera digitalnog sistema. Razrađena struktura sistema
opisuje se u jeziku za opis hardvera, kao što je VHDL, a zatim sintetiše u hardver pomoću alata za sintezu. Pri
tome, ASM dijagram upravljačke jedinice se opisuje kao konačni automat, dok se staza podataka opisuje
strukturnim VHDL kôdom. Za realizaciju staze podataka projektanti se obično oslanjaju na pretprojektovane
136
bibliotečke komponente (registri, ALU, multiplekseri). Konačni VHDL opis digitalnog sistema se dobija
povezivanjem upravljačke jedinice i staze podataka.
Prilikom korišćenja VHDL-a u kombinaciji sa alatom za sintezu, kreativni deo posla projektanta obično se
završava okončanjem faze razrade. Ponekada, projektanti preskaču čak i fazu razrade i prepuštaju alatu za
sintezu da na osnovu opisa ponašanja automatski izvrši sintezu hardvera. Međutim, ovakav pristup je moguć
samo kod projektovanja relativno jednostavnih sistema, koji u ograničenom obimu koriste aritmetičke operacije.
U svakom slučaju, važno je da projektant dobro razume mogućnosti i ograničenja alata za sintezu kako bi bio u
stanju da kreira efikasan i korektan VHDL kôd.
Rezultat druge faze projektovanja je opis sistema u vidu strukture koju čine upravljačka jedinica i staza
podataka, zajedno sa ASM dijagramom upravljačke jedinice. Međutim, čak i na ovom nivou, može se desiti da
pojedina kola koja su deo staze podataka nisu raspoloživa kao bibliotečke komponente. Takva kola moraju biti
namenski projektovana i opisana u VHDL-u. Ukoliko se radi o složenim kolima, koja se ne mogu sintetizovati
na osnovu bihejvioralnog opisa, proces njihovog projektovanja može zahtevati dodatu razradu. Međutim, s
obzirom da je interfejs takvih kola već definisan u fazi razrade staze podataka globalnog sistema, projektant
može slobodno da se usredsredi na projektovanje konkretnog kola siguran da će se ono bez problema uklopiti u
strukturu staze podataka. U svakom slučaju, konačni rezultat projektovanja koji sledi koncept ˝odozgo-naniže˝
je hijerarhijski VHDL opis koji se može razložiti na bibliotečke komponente i entitete koji sadrže bihejvioralni
opis koji se može sintetizovati.
Pr. 3-10 Sekvencijalni brojač jedinica
Funkcionalni ASM dijagram sekvencijalnog brojača jedinica razvijen je Pr. 2-54. U ovom primeru, obavićemo
njegovu razradu i opisaćemo kompletno kolo u VHDL-u. Funkcionalni ASM dijagram sadrži dve promenljive,
regA i regB (Sl. 2-54(b)) kojima će u stazi podataka odgovarati dve registarske komponente . Za manipulaciju
promenljivom regA može se koristiti pomerački registar sa pomeranjem udesno (zbog operacije regA←regA>>1
u stanju S1). Zbog operacije regA←a iz stanja S0, ovaj registar mora imati i mogućnost paralelnog upisa. Sa
druge strane, za regB potreban je brojač (zbog regB←regB+1 iz bloka uslovnog izlaza stanja S1). Dodatno,
brojač treba da ima mogućnost sinhronog resetovanja (zbog regB←0 u stanju S0). Takođe, obe registarske
komponente moraju imati ulaz za dozvolu rada, kako bi njihov rad mogao da se onemogući u stanjima u kojima
se ne obavljaju njihove operacije. Blok dijagram sekvencijalnog brojača jedinica dobijen razradom
funkcionalnog ASM dijagram prikazan je na Sl. 3-25(a). Strukturu čine upravljačka jedinica (blok control) i
staze podataka (datapath) koja sadrži dve opisane registarske komponente.
(a) (b)
Sl. 3-25 Razrada sekvencijalnog brojača jedinica: (a) strukturni blok dijagram; (b) ASM dijagram upravljačke
jedinice.
Upravljački ulaz pomeračkog registra (komponenta shift) su: ld - dozvola paralelnog upisa i ena dozvola rada.
Na paralelne ulaze pomeračkog registra doveden je ulaz podataka a, a na serijski ulaz fiksno je postavljena ´0´.
Za ld=1 i ena=1, obavlja paralelni upis, a za ld=0 i ena=1, pomeranje udesno pri čemu se na krajnju levu
poziciju upisuje 0. Brojač (komponenta counter) poseduje istoimene upravljačke ulaze. Za ld=1 i ena=1, u
brojač se upisuju ˝sve nule˝, postavljene na njegovom paralelnom ulazu, din. Na taj način, realizovana je
funkcija sinhronog resetovanja. Za ld=0 i ena=1, sadržaj brojača se uvećava za 1. Izlaz brojača je ujedno i izlaz
137
podataka b sekvencijalnog brojača jedinica. Za testiranje uslova regA=0, koristi se NILI kolo. Izlaz NILI kola, z,
biće z=1 ako pomerački registar sadrži sve nule. Takođe, za spregu sa upravljačkom jedinom, osim z, izdvojen
je i krajnji desni bit pomeračkog registra a0. Radi jednostavnosti izostavljeni su signali takta, clk, i asinhonog
resetovanja, rst, koji pobuđuju upravljačku jedinicu i obe registarske komponente.
Nakon što smo precizno opisali stazu podataka, u mogućnosti smo da kreiramo razrađeni ASM dijagram (Sl.
3-25(b)). Ovaj dijagram ima identičnu strukturu kao i polazni, funkcionalni ASM dijagram, s tom razlikom što
su naredbe registarskog prenosa i relacije zamenjene naredbama postavljanja upravljačkih signala i ispitivanjima
statusnih signala staze podataka. Na primer, blok stanja S1 sadrži ime signala ea. To znači da će u ovom stanju
važiti ea=1 i la=eb=lb=0. Pod ovim uslovima, u pomeračkom registru će se obaviti pomeranje udesno, dok će
sadržaj brojača ostati nepromenjen, što ima isti efekat kao i naredba registarskog prenosa regA←regA>>1
sadržana u istoimenom stanju funkcionalnog ASM dijagrama. Blok grananja koji sledi odmah ispod bloka stanja
S1 u funkcionalnom ASM dijagramu sadrži ispitivanje regA=0. U razrađenom ASM dijagramu, ova relacija je
zamenjena testiranjem statusnog signala staze podataka, z.
U nastavku je izložen kompletna VHDL kôd projekta sekvencijalnog brojača jedinica, pod pretpostavkom da je
ulaz podataka a 8-bitni, a izlaz podataka b 3-bitni. Najpre su realizovani bihejvioralni opisi pomeračkog registra
(fajl shift.vhd) i brojača (fajl counter.vhd), koji su potom iskorišćeni kao komponente u strukturnom opisu staze
podataka (fajl datapath.vhd). Primetimo da VHDL kôd staze podataka nije u potpunosti strukturni, jer se za
realizaciju NILI kola koristi konkurentna WHEN/ELSE naredba, a ne komponenta. Sledeći deo VHDL kôda
(fajl control.vhd) opisuje upravljačku jedinicu na osnovu razrađenog ASM dijagrama sa Sl. 3-25(b). Ovaj kôd je
usklađen sa kodnim šablonom za konačne automate. Konačno, komponente datapath i control objedinjene su u
vršni modul ones_counter.vhd.
Lako se primećuje da je VHDL kôd kreiran na osnovu razrađene strukture značajno obimniji od VHDL kôda
koji je u Pr. 2-54 kreiran na osnovu funkcionalnog ASM dijagrama. Kôd iz Pr. 2-54 je manje obiman zato što su
u njemu naredbe registarskog prenosa realizovane direktno u kôdu, a ne pomoću komponenti, kao što je to
urađeno u ovom promeru. Napomenimo da se i kôd iz Pr. 2-54 može sintetizovati. Međutim, zbog višeg nivoa
opisa, sinteza takvog kôda predstavljaće teži zadatak za alat za sintezu, pa će i sintetizovano kolo biti hardverski
složenije od onoga koje se dobija na osnovu VHDL kôda razrađene strukture. Iako nepogodan za sintezu,
funkcionalni VHDL kôd je koristan zato što može poslužiti za simulaciju kako bi se verifikovala ispravnost
funkcionalnog ASM dijagrama.
1 ----- shift.vhd ------------------------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 -----------------------------------------------
5 ENTITY shift IS
6 PORT (si,ld,ena,rst,clk : IN STD_LOGIC;
7 din : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
8 q : OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
9 END shift;
10-----------------------------------------------
11 ARCHITECTURE Behavioral OF shift IS
12 SIGNAL reg : STD_LOGIC_VECTOR(7 DOWNTO 0);
13 BEGIN
16 PROCESS (clk,rst)
17 BEGIN
18 IF(rst='1')THEN
19 reg <="00000000";
20 ELSIF(clk'EVENT AND clk='1') THEN
21 IF(ld='1') THEN
22 reg <= din;
23 ELSIF(ena = '1') THEN
24 reg <= si & reg(7 DOWNTO 1);
25 END IF;
26 END IF;
27 END PROCESS;
28 q <= reg;
29 END Behavioral;
30 -----------------------------------------------
1 ------ counter.vhd -----------------------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 USE ieee.std_logic_unsigned.all;
138
5 -----------------------------------------------
6 ENTITY counter IS
7 PORT (ld,ena,rst,clk : IN STD_LOGIC;
8 din : IN STD_LOGIC_VECTOR(2 DOWNTO 0);
9 q : OUT STD_LOGIC_VECTOR(2 DOWNTO 0));
10 END counter;
11-----------------------------------------------
12 ARCHITECTURE Behavioral OF counter IS
13 SIGNAL count : STD_LOGIC_VECTOR(2 DOWNTO 0);
14 BEGIN
15 PROCESS (clk,rst)
16 BEGIN
17 IF(rst='1')THEN
18 count <="000";
19 ELSIF(clk'EVENT AND clk='1') THEN
20 IF(ld='1') THEN
21 count <= din;
22 ELSIF(ena = '1') THEN
23 count <= count + 1;
24 END IF;
25 END IF;
26 END PROCESS;
27 q <= count;
28 END Behavioral;
29-----------------------------------------------
1 --------datapath.vhd ----------------------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 -----------------------------------------------
5 ENTITY datapath IS
6 PORT (la,ea,lb,eb,rst,clk : IN STD_LOGIC;
7 z,a0 : OUT STD_LOGIC;
8 a : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
9 b : OUT STD_LOGIC_VECTOR(2 DOWNTO 0));
10 END datapath;
11-----------------------------------------------
12 ARCHITECTURE Stuctural OF datapath IS
13 COMPONENT shift IS
14 PORT (si,ld,ena,rst,clk : IN STD_LOGIC;
15 din : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
16 q : OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
17 END COMPONENT;
18 ---------------------
19 COMPONENT counter IS
20 PORT (ld,ena,rst,clk : IN STD_LOGIC;
21 din : IN STD_LOGIC_VECTOR(2 DOWNTO 0);
22 q : OUT STD_LOGIC_VECTOR(2 DOWNTO 0));
23 END COMPONENT;
24 SIGNAL sa : STD_LOGIC_VECTOR(7 DOWNTO 0);
25 BEGIN
26 SH: shift PORT MAP(si=>'0',ld=>la,ena=>ea,rst=>rst,clk=>clk,din=>a,q=>sa);
27 CT: counter PORT MAP(ld=>lb,ena=>eb,rst=>rst,clk=>clk,din=>"000",q=>b);
28 z <= '1' WHEN sa = "00000000" ELSE
29 '0';
30 a0 <= sa(0);
31 END Stuctural;
31-----------------------------------------------
1 ----- control.vhd -----------------------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 -----------------------------------------------
5 ENTITY control IS
6 PORT (clk,rst,start,z,a0 : IN STD_LOGIC;
7 kraj,la,ea,lb,eb : OUT STD_LOGIC);
8 END control;
9 -----------------------------------------------
10 ARCHITECTURE ASM OF control IS
139
11 TYPE state IS (S0, S1, S2);
12 SIGNAL pr_state, nx_state : state;
13 BEGIN
14 -- sekvencijalni process --------------------
15 PROCESS (clk,rst)
16 BEGIN
17 IF(rst='1')THEN
18 pr_state <=S0;
19 ELSIF(clk'EVENT AND clk='1') THEN
20 pr_state <= nx_state;
21 END IF;
22 END PROCESS;
23 -- kombinacioni process --------------------
24 PROCESS(start,z,a0,pr_state)
25 BEGIN
26 nx_state <= pr_state;
27 kraj <= '0';
28 la <= '0';
29 ea <= '0';
30 lb <= '0';
31 eb <= '0';
32 CASE pr_state IS
33 WHEN S0 =>
34 la <= '1';
35 lb <= '1';
36 IF(start = '1') THEN
37 nx_state <= S1;
38 END IF;
39 WHEN S1 =>
40 ea <= '1';
41 IF(z = '1') THEN
42 nx_state <= S2;
43 ELSE
44 nx_state <= S1;
45 IF(a0 = '1') THEN
46 eb <= '1';
47 END IF;
48 END IF;
49 WHEN S2 =>
50 kraj <= '1';
51 nx_state <= S0;
52 END CASE;
53 END PROCESS;
54 END ASM;
55-----------------------------------------------
1 ------ones_counter.vhd --------------------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 -----------------------------------------------
5 ENTITY ones_counter IS
6 PORT (a : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
7 clk, rst, start : IN STD_LOGIC;
8 b : OUT STD_LOGIC_VECTOR(2 DOWNTO 0);
9 kraj : OUT STD_LOGIC);
10 END ones_counter;
11-----------------------------------------------
12 ARCHITECTURE Structural OF ones_counter IS
13 COMPONENT control IS
14 PORT (clk,rst,start,z,a0 : IN STD_LOGIC;
15 kraj,la,ea,lb,eb : OUT STD_LOGIC);
16 END COMPONENT;
17 -------------------
18 COMPONENT datapath IS
19 PORT (la,ea,lb,eb,rst,clk : IN STD_LOGIC;
20 z,a0 : OUT STD_LOGIC;
21 a : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
22 b : OUT STD_LOGIC_VECTOR(2 DOWNTO 0));
140
23 END COMPONENT;
24 ------------------
25 SIGNAL z,a0,la,ea,lb,eb : STD_LOGIC;
26 BEGIN
27 CTRL: control PORT MAP(clk=>clk,rst=>rst,start=>start,z=>z,a0=>a0,
28 kraj=>kraj,la=>la,ea=>ea,lb=>lb,eb=>eb);
29 DPTH: datapath PORT MAP(la=>la,ea=>ea,lb=>lb,eb=>eb,rst=>rst,
30 clk=>clk,z=>z,a0=>a0,a=>a,b=>b);
31 END Structural;
32-----------------------------------------------
Pr. 3-11 Sekvencijalni delitelj (ubrzani algoritam)
U ovom primeru ponovo realizujemo sekvencijalni delitelj, ali sada umesto algoritma deljenja koji je zasnovan
na oduzimanju delioca od deljenika, koristimo brži algoritam, zasnovan na tradicionalnom, ručnom postupku
deljenja.
Algoritam
Sl. 3-26(a) prikazuje primer ručnog deljenja decimalnih brojeva 140 i 9. Prvi korak je pokušaj deljenja cifre
najveće težine deljenika (1) deliocem (9). Pošto se 9 ne sadrži u 1, uzimamo sledeću cifru deljenika (4) i
proveravamo da li se 9 sadrži u 14. Sada je deljenje moguće, što daje prvu cifru količnika 1 (=14/9) i ostatak 5
(=14 - 9*1). Postupak nastavljamo tako što uz ostatak sa desne strane dopisujemo sledeću (i poslednju) cifru
deljenika (0), i delimo 50 sa 9. To daje drugu cifru količnika 5 (=50/9) i ostatak 5 (=50-5*9). Time je deljenje
završeno. Rezultat je Q=15 (količnik) i R=5 (ostatak). Postupak je identičan i ako se umesto decimalnih dele
binarni brojevi, sa pojednostavljenjem da svaki bit količnika može biti samo 0 ili 1 ( Sl. 3-26 (b)).
R A Q
A B Q 5) 00010001 00000000
10001100 : 1001 = 1111 -00001001 <- B
-1001 --------
----- 00001000 00000000 00000011
10001
-1001 6) 00010000 00000000
A B Q ----- -00001001 <- B
140 : 9 = 15 10000 --------
9 -1001 00000111 00000000 00000111
---- -----
50 01110 7) 00001110 00000000
- 9 -1001 -00001001 <- B
---- ------ --------
5 <- R 0101 <- R 00000101 00000000 00001111
141
Naš zadatak je da korišćenjem opisanog postupka deljenja realizujemo kolo koje na ulazu dobija dva
neoznačena n-bitna cela broja, a i b, i generiše dva n-bitna cela broja, q i r, gde je q količnik, a/b, a r ostatak.
Procedura ilustrovana u primeru sa Sl. 3-26(b), može se sprovesti i na način kao na Sl. 3-26(c), koji je pogodniji
za hardversku realizaciju. Umesto spuštanja cifara deljenika, sada se deljenik najpre proširi ciframa ostatka, koje
su na početku sve nule. Zatim se ostatak i deljenik zajedno pomere za jednu bitsku poziciju ulevo i ispita da li se
delilac sadrži u ostatku. Ako deljenje nije moguće odgovarajući bit količnika je 0. Ako je deljenje moguće bit
količnika je 1, a ostatak se koriguje oduzimanjem delioca. Ovaj postupak se ponavlja N puta, gde je N broj bita
operanada, sve dok celokupni sadržaj deljenika ne napusti promenljivu a. Algoritam opisanog postupka dat je u
obliku pseudo koda na Sl. 3-26(d). (R,A) označava 2n-bitnu promenljivu dobijenu konkatenacijom n-bitnih
promenljivih R i A. Petlja se izvršava n puta, a u svakom prolasku kroz petlju generiše se sledeći bit količnika,
QC, počev od C=0, do C=N-1. Bukvalna interpretacija algoritma, značila bi da je u svakoj iteraciji petlje
potrebno odgovarajući bit količnika, Q, postaviti na 0 ili 1. Za hardversku realizaciju, pogodnije je umesto
direktnog postavljanja bitova koristiti pomeranje količnika Q ulevo sa serijskim upisom vrednosti QC. Pseudo
kod sa ovom modifikacijom prikazan je na Sl. 3-26(e). Notacija Q← (Q<<1)1 označava pomeranje ulevo sa
serijskim upisom 1-ce na krajnju desnu poziciju. Slično, Q← (Q<<1)0, pomera Q udesno za jednu poziciju i
serijski upisuje 0.
Da bi smo olakšali konverziju pseudo koda u ASM dijagram, učinećemo još jednu modifikaciju: for petlju
zamenićemo ekvivalentnom do-while petljom. Kod do-while petlje ispitivanje uslova za kraj petlje je na kraju, a
ne na početku petlje kao kod for varijante. To znači da telo do-while petlje mora da se izvrši barem jedanput, za
razliku od for petlje koja može da se izvrši 0 ili više puta. Međutim, ova nedoslednost u konkretnom slučaju nije
od značaja zato što postoji prirodno ograničenje da N mora biti veće ili jednako 1. Takođe, uočimo da se brojač
petlje C koristi samo za odbrojavanje iteracija, ali ne i kao argument u nekoj drugoj naredbi. Cilj je obezbediti
da se petlja izvrši tačno N puta, a pri tome nije bitno da li se brojač kreće od 0 do N-1 ili, kao što je to u do-while
varijanti, od N-1 do 0.
142
Funkcionalni ASM dijagram
Direktnom konverzijom pseudo koda sa Sl. 3-26(d), primenom pravila iz sekcije 3.2.2, dobijamo ASM dijagram
sa Sl. 3-27(a). Uočimo da ASM dijagram dodatno sadrži signale start i rdy koji su deo interfejsa sekvencijalnog
delitelja, kao je identičan kao u Pr. 3-1. Petlja se izvršava za 6 ili 5 taktnih ciklusa, u zavisnosti da li je u tekućoj
iteraciji R veće ili jednako od B ili ne. Međutim, ovo je tek polazni oblik ASM dijagrama, i treba očekivati da su
moguća značajna poboljšanja.
Prazni blokovi stanja TEST1 i TEST2 uvedeni su zbog grananja koje u uslovu koristi promenljive koje se
menjaju neposredno pre grananja. Da bi grananje koristilo aktuelnu vrednost registra, neophodno je da se upis u
registar i grananje ne vrše u istom stanju. Pri tome, nije neophodno da blok stanja koji deli ove dve operacije
bude prazan, već da ne sadrži registar koji se koristi u uslovu grananja. Oba prazna stanja iz ASM dijagrama sa
Sl. 3-27(a) se mogu eliminisati ako se promeni redosled naredbi registarskog prenosa, tako da naredba
dekrementiranja brojača petlje pređe sa kraj na početak petlje. Razmak između stanja upisa u registar R (stanje
SHRA) i grananja R≤B je očuvan, kao i između stanja INCR gde si dekrementira brojač C i ispitivanja C≥0. Na
ovaj način broj taktnih ciklusa potrebnih za jednu iteraciju petlje je smanjen na 3, odnosno 4 ( Sl. 3-27(b)).
Sledeća optimizacija se tiče stanja SHQ1, SHQ0 i SUBB. Najpre uočimo da se stanja SHQ1 i SUBB mogu
spojiti u jedno stanje (SHQ1SUBB), u kome će se u paraleli obaviti obe naredbe registarskog prenosa,
Q←(Q<<1)1 i R←R-B. To je dozvoljeno zato što su ove dve naredbe međusobno nezavisne, jer ni jedna od njih
ne koristi kao operand rezultat one druge. Na ovaj način broj taktnih ciklusa po jednoj iteraciji bio bi 3, bez
obzira na ishod testiranja R≤B.
Ubrzanje za još jedan taktni ciklus po iteraciji, mogli bi smo da ostvarimo ako bi smo izračunavanja iz stanja
SHQ1SUBB i SHQ0 pripojili stanju INCR. Drugim rečima ako bi smo blokove stanja SHQ1SUBB i SHQ0
zamenili blokovima uslovnog izlaza. Međutim, s takvom modifikacijom, stanju INTR pripalo bi i ispitivanje
C≥0 sa kraja petlje, što bi narušilo neophodan vremenski razmak između ovog ispitivanja i naredbe koja
dekrementira brojač C. Kao posledicu, petlja bi imala jedan prolazak više, jer bi se izvršila na samo za C=n-1,
..., 0, već i za C=-1. Međutim, ovaj nedostatak se može lako otkloniti ako se uslov za izlazak iz petlje promeni
na C>0. Na taj način dolazimo do ASM dijagrama sa Sl. 3-27(c) koji zahteva 2 taktna ciklusa po iteraciji. S
obzirom da je broj iteracija n deljenje n-bitnih brojeva trajaće .
Postavlja se pitanje da li je moguće sva izračunavanja koja se obavljaju u petlji obaviti u samo jednom stanju.
Međutim, pre nego što damo odgovor na to pitanje, usvojimo da je ASM dijagram sa Sl. 3-27(c) konačna verzija
funkcionalnog ASM dijagrama, i obavimo njegovu razradu.
Razrada
ASM dijagram sadrži pet promenljivih: A, B, Q, R i C. Promenljive A, B i Q učestvuju u operacijama pomeranja.
Zato je normalno za njihovu realizaciju koristiti pomeračke registre sa pomeranjem ulevo. Zajedničko
pomeranje kroz registre R i A, ostvariće se povezivanjem krajnjeg levog izlaznog bita registra A na serijski ulaz
registra R. Osim u naredbi registarskog prenosa iz SHRA koja pomera R i A, promenljiva A se javlja kao
odredište u još jednoj naredbi, A←a iz stanja PASIVNO. Ova dodatna operacija zahteva da pomerački registar
A poseduje mogućnost paralelnog upisa. Funkciju paralelnog upisa treba da poseduje i pomerački registar R. U
stanju PASIVNO R se resetuje, a u stanju INCR u R se upisuje razlika R-B. Izbor podataka koji će biti paralelno
upisan u registar R, 0 ili R-B, može se ostvariti pomoću multipleksera. Promenljiva B se koristi za memorisanje
delioca i ne menja se u toku izračunavanja. Iz tog razloga, za promenljivu B možemo koristiti prihvatni registar.
Promenljiva B, zajedno sa promenljivom R, se koristi u naredbi R-B iz stanja INCR. Za oduzimanje R-B
možemo koristiti n-bitni binarni sabirač, pri čemu će promenljiva B biti komplementirana, a na ulazni prenos
sabirača postavljena 1-ca. Za realizaciju relacije R≥B u stazi podataka nije potrebno neko dodatno kolo, pošto
informaciju o tome da li je R veće ili jednako od B imamo na izlazu za izlazni prenos sabirača koji se koristi za
oduzimanje B od R. Ako je R≥B, izlazni prenos će imati vrednost 0, a ako je R<B, izlazni prenos će biti 1. Šta
više, komplement izlaznog prenosa je upravo ona vrednost koju treba serijski upisati u pomerački registar Q, što
omogućava da se izlazni prenos sabirača preko invertora direktno poveže na serijski ulaz pomeračkog registra
Q. Konačno promenljiva C koja se koristi kao brojač petlje može se realizovati pomoću brojača naniže sa
mogućnošću paralelnog upisa. Početna vrednost N-1 se kao konstanta postavlja na paralelne ulaze brojača.
Struktura sekvencijalnog delitelja nakon izvršene razrade, prikazana je na Sl. 3-28.
Realizacija
Nakon izvršene razrade sledi opis razrađene strukture u VHDL-u. VHDL kôd staze podataka (datapath) i
upravljačke jedinice (control) dat je u nastavku. Nedostaju delovi kôda koji opisuju korišćene komponente (shift
- pomerački registar ulevo sa paralelnim upisom, counter - brojač naniže sa paralelnim upisom i adder - binarni
sabirač) kao i vršni modul koji objedinjuje upravljačku jedinicu i stazu podataka. VHDL kôd staze podataka nije
143
u potpunosti strukturnog tipa. Primetimo da se u arhitektura staze podataka za opis prihvatnog registra (B)
koristi proces; pomerački registri, brojač i sabirač se kreiraju instanciranjem odgovarajući komponenti, dok se
multiplekser i invertori realizuju konkurentnim kôdom.
PASIVNO
rdy
eb; la; ea; lc; ec
0
start
lr; er
SHRA
er; ea
INCR
ec
1 0
cout
0 1
z
144
1 ----- datapath.vhd ----------------------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 -----------------------------------------------
5 ENTITY datapath IS
6 PORT (a,b : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
7 rsel,lr,er,la,ea,eb,eq,lc,ec,rst,clk : IN STD_LOGIC;
8 cout,z : OUT STD_LOGIC;
9 q,r : OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
10 END datapath;
11 -----------------------------------------------
12 ARCHITECTURE structure OF datapath IS
13 -----------------------
14 COMPONENT shift IS
15 GENERIC (N : INTEGER);
16 PORT (si,ld,ena,rst,clk : IN STD_LOGIC;
17 din : IN STD_LOGIC_VECTOR(N-1 DOWNTO 0);
18 q : OUT STD_LOGIC_VECTOR(N-1 DOWNTO 0));
19 END COMPONENT;
20 ----------------------
21 COMPONENT counter IS
22 GENERIC (N : INTEGER);
23 PORT (ld,ena,rst,clk : IN STD_LOGIC;
24 din : IN STD_LOGIC_VECTOR(N-1 DOWNTO 0);
25 q : OUT STD_LOGIC_VECTOR(N-1 DOWNTO 0));
26 END COMPONENT;
27 ----------------------
28 COMPONENT adder IS
29 GENERIC (N : INTEGER);
30 PORT (cin : IN STD_LOGIC;
31 x,y : IN STD_LOGIC_VECTOR(N-1 DOWNTO 0);
32 s : OUT STD_LOGIC_VECTOR(N-1 DOWNTO 0);
33 cout: OUT STD_LOGIC);
34 END COMPONENT;
35 ----------------------
36 SIGNAL regB : STD_LOGIC_VECTOR(7 DOWNTO 0); -- registar B
37 SIGNAL regB_not : STD_LOGIC_VECTOR(7 DOWNTO 0); -- komplementirano B
38 SIGNAL qa,dr,qr,sum : STD_LOGIC_VECTOR(7 DOWNTO 0); -- interne magistrale
39 SIGNAL qc : STD_LOGIC_VECTOR(2 DOWNTO 0); -- izlaz brojaca C
40 SIGNAL co, co_not : STD_LOGIC; -- izlazni prenos sabiraca i njegov komplement
41 BEGIN
42 -- prihvatni registar B
43 REG_B: PROCESS (clk,rst)
44 BEGIN
45 IF(rst='1')THEN
46 regB <=(OTHERS => '0');
47 ELSIF(clk'EVENT AND clk='1') THEN
48 IF(eb ='1') THEN
49 regB <= b;
50 END IF;
51 END IF;
52 END PROCESS;
53 REG_A: shift GENERIC MAP(N=>8)
54 PORT MAP(si=>'0',ld=>la,ena=>ea,rst=>rst,clk=>clk,din=>a,q=>qa);
55 REG_R: shift GENERIC MAP(N=>8)
56 PORT MAP(si=>qa(7),ld=>lr,ena=>er,rst=>rst,clk=>clk,
57 din=>dr,q=>qr);
58 REG_Q: shift GENERIC MAP(N=>8)
59 PORT MAP(si=>co_not,ld=>'0',ena=>eq,rst=>rst,clk=>clk,
60 din=>(OTHERS=>'0'),q=>q);
61 ADD : adder GENERIC MAP(N=>8)
62 PORT MAP(cin=>'1',x=>qr,y=>regB_not,s=>sum,cout=>co);
63 CNT : counter GENERIC MAP(N=>3)
64 PORT MAP(ld=>lc,ena=>ec,rst=>rst,clk=>clk,din=>"111",q=>qc);
64 regB_not <= not regB;
66 dr <= sum WHEN rsel = '1' ELSE (OTHERS => '0');
145
67 z <= '1' WHEN qc = "000" ELSE '0'; -- multiplekser za reg R
68 co_not <= not co; -- invertor na izlazu sabiraca
69 cout <= co_not;
70 r<=qr;
71 END structure;
72-----------------------------------------------
1 ------control.vhd -----------------------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 -----------------------------------------------
5 ENTITY control IS
6 PORT (clk,rst,start,cout,z : IN STD_LOGIC;
7 rdy,rsel,la,ea,eb,lc,ec,lr,er,eq : OUT STD_LOGIC);
8 END control;
9 -----------------------------------------------
10 ARCHITECTURE ASM OF control IS
11 TYPE state IS (PASIVNO, SHRA, INCR);
12 SIGNAL pr_state, nx_state : state;
13 BEGIN
14 -- sekvencijalni process --------------------
15 PROCESS (clk,rst)
16 BEGIN
17 IF(rst='1')THEN
18 pr_state <=PASIVNO;
19 ELSIF(clk'EVENT AND clk='1') THEN
20 pr_state <= nx_state;
21 END IF;
22 END PROCESS;
23 -- kombinacioni process --------------------
24 PROCESS(start,z,cout,pr_state)
25 BEGIN
26 nx_state <= pr_state;
27 rdy<='0';la<='0';ea<='0';eb<='0';lc<='0';
28 ec<='0';lr<='0';er<='0';eq<='0';rsel<='0';
29 CASE pr_state IS
30 WHEN PASIVNO =>
31 rdy<='1';eb<='1';la<='1';ea<='1';lc<='1';ec<='1';
32 IF(start = '1') THEN
33 lr<='1'; er<='1';
34 nx_state <= SHRA;
35 END IF;
36 WHEN SHRA =>
37 er<='1';ea <='1';
38 nx_state <= INCR;
39 WHEN INCR =>
40 ec<='1';
41 IF(cout = '1') THEN
42 eq<='1';rsel<='1';lr<='1';er<='1';
43 ELSE
44 eq<='1';
45 END IF;
46 IF(z = '1') THEN
47 nx_state <= PASIVNO;
48 ELSE
49 nx_state <= SHRA;
50 END IF;
51 END CASE;
52 END PROCESS;
53 END ASM;
54-----------------------------------------------
146
Pr. 3-12 Sekvencijalni delitelj (dodatna optimizacija)
Sekvencijalni delitelj iz Pr. 3-11 obavlja deljenje dva n bitna broja za 2n taktnih ciklusa. Razlog za to su dva
stanja u unutrašnjoj petlji ASM dijagrama (SHRA i INCR) (vidi Sl. 3-27(c)). Ukoliko bi smo uspeli da ova dva
stanja sažmemo u jedno, broj potrebnih taktnih ciklusa bio bi smanjen na n. U stanju INCR, pod uslovom da je
R≥B, u R se upisuje razlika R-B, a novo stanje je SHRA. U stanju SHRA, R i A, zajedno, se pomeraju za jednu
poziciju ulevo. Da bi smo stanja SHRA i INCR objedinili u jedno stanja (neka se zove AKTIVNO), potrebo je
da postoji mogućnost da u jednom koraku (taktu) na pozicije veće težine registra R upišemo razliku i u isto
vreme na poziciju najmanje težine registra R prenesemo vrednost bita najveće težine registra A. To se može
postići uvođenjem dodatnog flip-flopa, r0, za poziciju najmanje težine R (Sl. 3-30(a)). Za izračunavanje razlike
koriste se n-1 nižih bita registra R zajedno sa flip-flopom r0. Pošto r0 sadrži bit najveće težine A iz prethodnom
ciklusa, efekat je isti kao da je pre oduzimanja obavljeno (R,A) ← (R,A) << 1. Z slučaj kada je R < B, u R se ne
upisuje razlika već se R pomera ulevo sa serijskim upisom vrednosti iz r0. Ostatak deljenja (r) je razlika koja je
u poslednjem ciklusu upisana u registar R (zbog toga je neophodno da R ima svih n bita). Funkcionalni ASM
dijagram sekvencijalnog delitelja sa jednim ceklusom po iteraciji prikazan je na Sl. 3-30(b).
Sl. 3-30 Dodatno ubrzanje sekvencijalnog delitelja iz Pr. 3-11: (a) princip; (b) funkcionalni ASM dijagram (prva
varijanta); (c) funkcionalni ASM dijagram (druga varijanta, sa objedinjenim registrima A i Q).
Dodatna optimizacija, u smislu uštede hardvera, može se postići ukoliko za promenljve A i Q koristimo jedan
zajednički registar. Promenljiva A iz ASM dijagrama sa Sl. 3-30(b), na početku rada, u stanju PASIVNO, dobija
vrednost deljenika (a), a zatim se, u stanju AKTIVNO, pomera ulevo sa upisom 0 na poziciju najmanje težine
(operacija A ← A << 1). Na kraju deljenja, posle n taktnih ciklusa, sadržaj registra A biće sve nule. Sa druge
strane, u registar Q se u svakom ciklusu deljenja serijski upisuje jedan bit količnika, tako da na kraju deljenja Q
sadrži kompletan količnik. Na Sl. 3-30(c) je prikazan funkcionalni ASM dijagram sekvencijalnog delitelja koji za
obe promenljive, A i Q, koristi isti registar Q. Na početku, u Q se upisuje deljenik, a. Kako deljenje odmiče,
tako se iz Q istiskuje a, a upisuje količnik.
Strukturni blok dijagram sekvencijalnog delitelja koji odgovara ASM dijagramu sa Sl. 3-30(c), prikazan je na Sl.
3-31. Za realizaciju registra Q koristi se pomerački registar sa mogućnošću paralelnog upisa. Za r0 koristi se D
flip-flop sa dodatnim multiplekserom putem kojega se reguliše resetovanje flip-flopa (u stanju PASIVNO),
odnosno upis bita najveće težine registra Q (u stanju AKTIVNO). Razrađeni ASM dijagram, kreiran na osnovu
funkcionalnog ASM dijagrama sa Sl. 3-30(c) i strukture sa Sl. 3-31, prikazan je na Sl. 3-32(a). Napomenimo da su
moguća izvesta pojednostavljenja razrađenog ASM dijagrama. Uočimo da su upravljački signali eq i ec aktivni
u oba stanja PASIVNO i AKTIVNO, i da zbog toga mogu biti postaljeni fiksno na eq=ec=1, umesto da se
generišu iz upravljačke jedinice. Takođe, signal er je aktivan u obe grane uslovnog koraka u stanju AKTIVNO i
zbog toga može biti prebačen u blok stanja AKTIVNO. Na Sl. 3-32(b) je prikazan razrađeni ASM dijagram
nakon izrvršenih modifikacija.
Čitaocu se prepušta da samostalno kreira odgovarajući VHDL kôd.
147
Sl. 3-31 Razrađena struktura sekvencijalnog delitelja iz Pr. 3-12.
PASIVNO PASIVNO
0 0
start start
1 1
AKTIVNO AKTIVNO
ec; ec;
r0sel r0sel;
er;
1 0 1 0
cout cout
eq; eq;
rsel;lr;
er; rsel;lr; er;
0 1 0 1
z z
(a) (b)
Sl. 3-32 Razrađeni ASM dijagram sekvencijalnog delitelja iz Pr. 3-12: (a) početna varijanta; (b) pojednostavljena
varijanta.
148
4 Komponente digitalnih sistema
Složeni digitalni sistemi projektuju se tako što se najpre ukupna funkcija sistema razloži na više pod-funkcija.
Zatim se pod-funkcije realizuju u vidu jednostavnijih digitalnih modula, čijim se povezivanjem konstruiše
željeni sistem. Iako je u nekim slučajevima neophodno projektovati module za neke specifične funkcije, ipak,
najčešće, u praksi, složeniji digitalni sistemi se mogu realizovati korišćenjem standardnih modula ili
komponenti. Standardne komponente obavljaju funkcije za koje je uočeno da su korisne za veliki broj različitih
primena, a dostupne su u vidu integrisanih kola ili bibliotečkih komponenti i kao takve spremne za direktnu
ugradnju u sistem koji se projektuje.
Većina digitalnih sistema, uključujući i računare, projektovana je da obrađuje ili transformiše podatke. Ove
transformacije mogu biti različitih tipova, uključujući aritmetičke i logičke operacije, kodiranje i dekodiranje
podataka i reorganizaciju podataka. U opštem slučaju, navedene transformacije podataka se obavljaju pomoću
kombinacionih komponenti. Osnovna osobina kombinacionih kola jeste činjenica da se njihove izlazne
vrednosti izračunavaju isključivo na osnovu tekućih ulaznih vrednosti. Nakon svake promene ulaznih vrednosti,
na izlazu se javljaju nove izlazne vrednosti sa kašnjenjem koje je neophodno da bi se izračunao novi rezultat.
Kombinaciono kolo nije u stanju da ¨zapamti¨ prethodne rezultate, i da onda tu informaciju, zajedno sa tekućim
ulazom, koristi za određivanje novog izlaza.
Za razliku od kombinacionih, sekvencijalne komponente sadrže memorijske elemente, kao što su leč kola i
flip-flopovi. Kao posledica toga, izlazne vrednosti sekvencijalnih komponenti zavise ne samo od tekućih već i
od prethodnih ulaznih vrednosti. Spektar sekvencijalne komponenti se proteže od bazičnih memorijskih
elemenata, kao što su leč kola i flip-flopovi, preko registarskih komponenti, kao što su prihvatni, pomerački i
brojački registri, i složenijih memorijskih struktura, kao što su RAM, FIFO, stek, do upravljačkih jedinica koje
su u mogućnosti da izvršavaju složene algoritme.
4.1.1 Dekoderi
Dekoderi su digitalna kola koja se koriste za dekodiranje kodiranih informacija. Binarni dekoder, predstavljen
na Sl. 4-1, je digitalno kolo sa n ulaza za binarno kodirani podatak i 2n binarnih izlaza, pri čemu svakom izlazu
odgovara jedna kombinacija n logičkih vrednosti na ulazu. Dodatni ulaz za dozvolu rada, E, upravlja izlazom
dekodera na sledeći način: ako je E=0, tada ni jedan izlaz dekodera nije aktivan; ako je E=1, aktivan je samo
izlaz yi, gde je i ceo broj jednak binarnoj vrednosti ulaza wn-1, ..., w1, w0. (Ime ulaza E potiče od engleske reči
Enable koja znači dozvola). Ovo kolo se zove binarni dekoder n-u-2 n ili n-to ulazni binarni dekoder.
149
(a) (b) (c)
Sl. 4-2 Dekoder 1-u-2: (a) grafički simbol; (b) tabela istinitosti; (c) logička mreža.
Dekoder 2-u-4 je predstavljen na Sl. 4-3(a). Uočimo da dekoder 2-u-4 ima dva ulaza za podatak, w1 i w0, ulaz za
dozvolu rada, E, i četiri izlaza, y0, ..., y3. Kao što je već objašnjeno, funkcija ovog dekodera je da dekodira
binarni broj postavljen na ulazima w1 i w0 i postavi 1 na izlaz čiji je indeks jednak tom broju. Funkcija dekodera
2-u-4 definisana je sledećim sistemom logičkih jednačina:
y0 = E·w1`w0`
y1 = E· w1`w0
y2 = E· w1w0`
y3 = E· w1w0
150
Na primer, razmotrimo funkciju f zadatu skupom decimalnih indeksa ∑ (0,2,3,5) . Karnoova mapa funkcije f
prikazana je na Sl. 4-5(a), a realizacija ove funkcije u obliku minimalne sume-proizvoda na Sl. 4-5(b). Ista
funkcija se može realizovati pomoću dekodera 3-u-8, koji generiše sve moguće minterme od tri promenljive, i
jednog OR kola, koje sumira minterme funkcije f, kao što je prikazano na Sl. 4-5(c). Na ovaj način, korišćenjem
dekodera odgovarajuće veličine, moguće je realizovati proizvoljnu prekidačku funkciju.
151
Sl. 4-6 8-ulazni koincidentni dekoder.
152
Sl. 4-8 4-ulazni hijerarhijski dekoder.
U opštem slučaju, n-to ulazni dekoder se može realizovati u vidu dvo-nivolske dekoderske mreže sa jednim
(n/2)-ulaznim dekoderom u prvom i 2n/2 (n/2)-ulaznih dekodera u drugom nivou.
Hijerarhijska dekoderska mreža može imati više od dva nivoa. Na primer, ako za projektovanje koristimo
dekodere 1-u-2, dekoder n-u-2n, imaće 2n-1 dekodera 2-u-1, raspoređenih u n nivoa tako da se na svakom nivo
dekodira jedan ulazni bit. Drugim rečima, ulaz najveće težine dekodira se jednim dekoderom 1-u-2, sledeći ulaz
manje težine dekodira se sa dva dekodera 1-u-2, i tako dalje, sve do ulaza najmanje težine koji se dekodira sa
n/2 dekodera 1-u-2. Izlazi dekodera sa određenog nivoa se koriste kao signali dozvole jednog od dekodera sa
sledećeg nivoa. Znači, na svakom sledećem nivou, broj dekodera će biti dva puta veći u odnosu na prethodni
nivo. Kao primer opisanog postupka konstrukcije dekodera n-u-2n, na Sl. 4-9 je prikazan dekoder 3-u-8
realizovan na bazi dekodera 1-u-2.
153
4.1.2 Multiplekseri
Multiplekser, često u oznaci MUX, je digitalni preklopnik – tj. kolo koje omogućava da se jedan od n izvora
podataka logički poveže na zajedničko odredište. Multiplekser ima veći broj ulaza za podatke, jedan ili više
selekcionih ulaza i jedan izlaz. Vrednost selekcionih ulaza određuje (tj. bira) jedan od ulaza za podatke čija se
vrednost, u datom trenutku, prenosi na izlaz. Na Sl. 4-10(a) je prikazan grafički simbol multipleksera 2-u-1. Ako
je s=0, izlaz multipleksera biće f=w0; ako je s=1, izlaz multipleksera je f=w1. Multiplekser 2-u-1 je po funkciji
analogan elektro-mehaničkom dvo-položajnom prekidaču sa Sl. 4-10(b), kod koga signal s upravlja položajem
preklopnika. Ponašanje multipleksera 2-u-1 opisano je tabelom istinitosti sa Sl. 4-10(c), na osnovu koje lako
možemo izvesti logički izraz oblika suma-proizvoda: f=s`w0 + sw1. Ovom izrazu odgovara logička mreža sa Sl.
4-10(d). Na Sl. 4-10(e) je prikazano kako se multiplekser 2-u-1 može realizovati pomoću transmisionih gejtova.
w0
s
s
w0 f w1 f
w1
(d) (e)
Sl. 4-10 Multiplekser 2-u-1: (a) grafički simbol; (b) analogija sa elektromehaničkim preklopnikom; (c) tabela
istinitosti; (d) logička mreža; (e) realizacija pomoću transmisionih gejtova.
Na Sl. 4-11(a) je prikazan jedan veći multiplekser, sa četiri ulaza za podatke, w0, …, w3 i dva selekciona ulaza s1
i s0. Kao što se može videti iz tabele istinitosti sa Sl. 4-11(b), kombinacija selekcionih ulaza (s1, s0), interpretirana
kao binarna celobrojna vrednost i, za prosleđivanje na izlaz f bira ulaz wi. Multiplekseru 4-u-1 odgovara sledeći
logički izraz oblika suma-proizvoda:
f = s1`s0`w0 + s1`s0w1 + s1s0`w2 + s1s0w3
Ovom izrazu odgovara logička mreža sa Sl. 4-11(c)
154
Sl. 4-12 Multiplekser 8-u-1: (a) tabela istinitosti: (b) struktura.
Na Sl. 4-13(a) prikazan je grafički simbol multipleksera 2xm-u-m. Ovaj simbol na kompaktan način predstavlja
strukturu od m paralelno povezanih multipleksera sa Sl. 4-13(b). Pomoću multipleksera 2xm-u-m omogućen je
izbor jednog od dva m-bitna operanda. U opštem slučaju, multiplekser kxm-u-m sastoji se iz m multipleksera k-
u-1 sa zajedničkim selekcionim ulazima.
2xm-u-m
mux
155
(a) (b)
Sl. 4-14 Realizacija multipleksera pomoću dekodera: (a) tabela istinitosti multipleksera 8-u-1; (b) realizacija na bazi
dekodera.
Na Sl. 4-15 je prikazana još jedna realizacija multipleksera pomoću dekodera kod koje se umesto dvo-nivovske
I-ILI mreže koristi niz trostatičkih bafera sa kratkospojenim izlazima. Dekoder obezbeđuje da će uvek biti
aktivan samo jedan trostatički bafer, koji prosleđuje vrednost sa svog ulaza na zajednički izlaz. Izlazi
trostatičkih bafera ne moraju fizički biti spojeni u jednu tačku, već mogu biti povezani vezom (magistralom)
koja kontaktira svaki izlaz, što je pogodno u slučajevima kada su izvori podatak (moduli koji generišu signale
D0-D3) prostorno razuđeni.
156
(a) (b)
Sl. 4-16 Krozbar prekidač: (a) korzbar 2x2; (b) realizacija pomoću multipleksera
4.1.3 Demultiplekseri
Kao što je rečeno u odeljku 4.1.2, multiplekser je digitalno kolo sa jednim izlazom, n ulaza za podatke i log 2 n
selekcionih ulaza. Namena multipleksera je da multipleksira n ulaza za podatke preko jedinstvenog izlaza za
podatak, pod kontrolom selekcionih ulaza. Kolo koje obavlja suprotnu funkciju – vrednost sa jedinstvenog ulaza
za podatak prosleđuje na jedan od više izlaza za podatke, zove se demultiplekser.
Na Sl. 4-17(a) je prikazan grafički simbol demultipleksera 4-u-1. Kao što se vidi iz tabele istinitosti sa Sl.
4-17(b), binarna kombinacija vrednosti selekcionih ulaza s1 i s2 bira jedan od četiri izlaza, y0, ..., y3, na koji se
prenosi vrednost jedinstvenog ulaza za podatak, d. Demultiplekser 1-u-4 se može realizovati pomoću dekodera
2-u-4, kao što je prikazano na Sl. 4-17(c). U ovom slučaju, ulaz E dekodera se koristi kao ulaz za podatak
demultipleksera, dok su izlazi dekodera izlazi za podatke demultipleksera. Binarna kombinacija w1w0 određuje
izlaz koji će biti postavljen na vrednost E. Ako je E=0, tada će svi izlazi dekodera biti 0, uključujući i izlaz koji
je izabran kombinacijom w1w0; ako je E=1, tada kombinacija w1w0 postavlja 1 na odgovarajući izlaz. Dakle,
uvek važi y(w1w0) = E.
157
4.1.4 Koderi
Binarni koder 2n-u-n (Sl. 4-19) kodira (transformiše) informaciju od 2 n bita u n-bitnu kodnu reč. Sa ograničenjem
da u bilo kom trenutku samo jedan od 2n ulaza može imati vrednost 1, na izlazu binarnog kodera generiše se n-
bitni binarni broj koji ukazuje na indeks ulaza čija je vrednost 1. Na Sl. 4-20(a) je prikazana tabela istinitosti
kodera 4-u-2. Tabela istinitosti je nepotpuna, jer sadrži samo one slogove koji su dozvoljeni na ulazu binarnog
kodera. Za sve ostale slogove, odziv kodera je nedefinisan. Uočimo da izlaz y0 ima vrednost 1 ako je w1=1 ili
w3=1. Slično, izlaz y1 ima vrednost 1, ako je w2=1 ili w3=1. Na osnovu ovog zapažanja možemo konstruisati
logičku mrežu binarnog kodera 4-u-2 prikazanu na Sl. 4-20(b). U opštem slučaju, binarni koder 2n-u-n može se
realizovati pomoću n (2n-1)-to ulaznih OR kola. Svako OR kolo postavlja jedan izlaz. Ulaz wi je povezan sa j-
tim OR kolom ako j-ti bit u binarnoj reprezentaciji indeksa i ima vrednost 1.
(a) (b)
Sl. 4-20 Binarni koder 4-u-2: (a) tabela istinitosti; (b) kolo.
Pr. 4-4 Jedna primena binarnog kodera
Na Sl. 4-21 je prikazan osmo-položajni mehanički preklopnik. Preklopnik ima 8 izlaza koji u kodu 1-od-8
kodiraju položaj klizača. U ovoj primeni, binarni koder 8-u-3 se koristi za kodiranje položaj kliza ča u oblik
trobitnog celog broja.
158
Sl. 4-22 Tabela istinitosti prioritetnog kodera 4-u-2.
Rad prioritetnog kodera se najlakše može razumeti ako najpre razmotrimo poslednju vrstu u tabeli istinitosti.
Ova vrsta kazuje da ako je w3=1, izlaz se postavlja na y1y0=11. Pošto ulaz w3 ima najviši prioritet, vrednosti
ulaza w2, w1 i w0 nisu od značaja. Da bi se ukazalo na činjenicu da su njihove vrednosti irelevantne, promenljive
w2, w1 i w0 su označene simbolom X. Pretposlednja vrsta u tabeli istinitosti kazuje da se za w2=1 izlazi
postavljaju na y1y0=10, ali samo ako je pri tome w3=0. Slično, ulaz w1 uslovljava da izlaz bude postavljen na
y1y0=01, ali samo pod uslovom da važi w3=w2=0. Konačno, ulaz w0 se kodira na izlazu binarnom kombinacijom
y1y0=00, ali samo pod uslovom da je w0 jedini aktivan ulaz.
Prethodni izraz kaže da aktivan ulaz xi zadržava vrednost 1 samo ako su svi ulazi višeg prioriteta jednaki 0.
(a) (b)
Sl. 4-24 Modul za razrešavanje prioriteta: (a) paralelna realizacija; (b) iterativna realizacija.
Modul za razrešavanje prioriteta se može realizovati u obliku logičke mreže sa Sl. 4-24(a). Kod ove realizacije,
izlaz i se generiše pomoću AND kola sa 2n-i ulaza. Ovakvo rešenje je adekvatno za module sa malim brojem
ulaza, ali je nepraktično za veće module, s obzirom da zahteva AND kola sa velikim brojem ulaza. Na Sl. 4-24(b)
je prikazana iterativna realizacija istog kola, koja je pogodna za veći broj ulaza, mada ispoljava veće kašnjenje.
Ovo rešenje je zasnovano na umnožavanju ćelija definisanih logičkim jednačinama:
ci-1 = ci + xi
zi = ci`xi
Prosto, xi=1 postavlja ci-1 na 1, što isključuje sve ulaze nižeg prioriteta.
159
Hijerarhijska realizacija prioritetnog kodera
Na Sl. 4-25(a) je prikazana realizacija prioritetnog kodera 4-u-2 pomoću prioritetnih kodera 2-u-1. Ulazi su
podeljeni u dve dvobitne grupe i nezavisno kodirani prioritetnim koderima H i L. Drugi nivo strukture sa Sl.
4-25(a), koji se sastoji iz dodatnog prioritetnog kodera 2-u-1, G, i multipleksera 2-u-1, formiran je shodno tabeli
istinitosti prioritetnog kodera 4-u-2 sa Sl. 4-22 iz koje sledi da izlaz y1 ukazuje na grupu, H ili L, koja sadrži
aktivan ulaz najvišeg prioriteta, a izlaz y0 na poziciju aktivnog ulaza najvišeg prioriteta u okviru grupe na koju
ukazuje y1. Na osnovu sličnog rezonovanja, na Sl. 4-25(b) je nacrtana struktura prioritetnog kodera 8-u-3. U
opštem slučaju, prioritetni koder 2n-u-n u prvom nivou sadržaće dva prioritetna kodera 2n-1-u-(n-1), a u drugom
jedan prioritetni koder 2-u-1, za generisanje izlaza z i yn-1 i multiplekser 2x(n-1)-u-(n-1) za prosleđivanje kodnih
izlaza jednog od kodera H ili L na izlaze yn-2, .., y0 (Sl. 4-25(c)).
Koliko je prioritetnih kodera 2-u-1 i multipleksera 2-u-1 potrebno za realizaciju prioritetnog kodera 2 n-u-n ?
160
manje od Y. Pri tome, ako je xk=0 i yk=1, važi X<Y; ako je xk=1 i yk=0, važi X<Y. Dakle, izlaz G definisan je
sledećim logičkim izrazom:
G = x3y3` + i3x2y2` + i3i2x1y1` + i3i2i1x0y0`
Izlaz L se može odrediti na osnovu druga dva izlaza. Naime, X je manje od Y ako X i Y nisu ni jednaki niti je X
veća od Y, tj.
L = (E + G)´
Logička mreža koja realizuje četvorobitni univerzalni komparator prikazana je na Sl. 4-27. Opisana procedura se
može primeniti za konstrukcije univerzalnog komparatora za proizvoljno n.
161
Uslov X≥Y se može razložiti na dva uslova X>Y i X=Y ako se dodatno detektuje kada je rezultat 0. Za detekciju
uslova “sve nule” može se iskoristiti 4-ulazno NOR kolo, kao što je prikazano na Sl. 4-29. Dakle, ako je razlika
0, brojevi su jednaki; ako je c4=0, tada je X manje od Y, a ako razlika nije jednaka nuli i c4=1, tada je X veće od
Y.
x3 x2 x1 x0 y3 y2 y1 y0
c4 n-bitni sabirač c0 1
E (X=Y)
L (X<Y)
G (X>Y)
162
Opisani postupak se može primeniti za konstrukciju iterativnog komparatora sa proizvoljno velikim brojem
bitova. Međutim, kao i kod sabirača sa rednim prenosom, sa povećanjem broj spregnutih bazičnih modula
propagaciono kašnjenje komparatorske mreže linearno raste.
Hijerarhijske komparatorske mreže
Brža struktura za poređenje većih brojeva se može realizovati ako se umesto iterativne koristi hijerarhijska
mreža komparatora. Razmotrimo ponovo konstrukciju 16-bitnog komparatora na osnovu 4-bitnih
komparatorskih modula, ali sada tako da komparatorski moduli budu povezani u hijerarhijsku strukturu, kao što
je ona sa Sl. 4-32. Svaki od četiri modula sa prvog nivoa, K0 do K3 poredi dva bit-vektora od četiri bita. Izlazi iz
prvog nivoa se koriste kao ulazi u jedinstveni komparatorski modul sa drugog nivoa, K4, na sledeći način: Svi
izlazi G iz komparatorskih modula sa prvog nivoa čine bit-vektor g koji je povezan na grupu ulaza x
komparatora K4. Slično, bit-vektor l, koga čine svi izlazi L iz prvog nivoa, povezan je na grupu ulaza y
komparatora K4.
Da mreža sa Sl. 4-32 zaista realizuje funkciju 16-bitnog komparatora, može se pokazati sledećom analizom. Na
osnovu definicije komparatorskog modula, izlazi hijerarhijske mreže komparatora su:
1 ako je g > l
G=
0 inace
1 ako je g = l
E=
0 inace
1 ako je g < l
L=
0 inace
K3 K2 K1 K0
G E L G E L G E L G E L
g3 l3 g2 l2 g1 l1 g0 l0
4 4
x y
K4
G E L
Sl. 4-32 16-bitni hijerarhijski komparator.
163
bitnog univerzalnog pomerača/rotatora, koji može da obavlja logičko pomeranje ili rotiranje za jednu bitsku
poziciju na levo ili na desno. Kolo ima 8-bitni ulaz za podatak D=d7...d0, 8-bitni izlaz za podatak Y=y7...y0, i tri
selekcione linije, S2, S1 i S0, preko kojih se vrši izbor željene operacije. Ulaz dl definišu bitsku vrednost koja se
prilikom pomeranja na desno postavlja na krajni levi izlaz, y7, dok ulaz dl definiše vrednost koja se postavlja na
krajnji desni izlaz, y0, prilikom pomeranja na levo. Shodno funkcionalnoj tabeli sa Sl. 4-33(b), kada je S2=0,
ulazni podatak se, bez ikakve promene, prenosi na izlaz. Ako je S2=1, nad ulaznim podatkom se obavlja
operacija pomeranja ili rotiranja. Smer pomeranja, odnosno rotiranja, zavisi od vrednosti S1: za S1=0 bitski
sadržaj podatka se pokreće na levo, a za S0=1 na desno. Konačno, S0 služi za izbor između pomeranja i
rotiranja, tako da pri S0=0 pomerač/rotator radi kao pomerač, a pri S0=1 kao rotator. Na Sl. 4-33(c) su ilustrovani
različiti režimi rada univerzalnog pomerača/rotatora.
(a) (b)
(c)
Sl. 4-33 Univerzalni pomerač/rotator: (a) grafički simbol; (b) funkcionalna tabela; (c) režimi rada.
Na Sl. 4-34 je prikazana realizacija 8-bitnog univerzalnog pomerača/rotatora. Kao što se može videti,
pomerač/rotator je realizovan tako što je za svaku bitsku poziciju iskorišćen jedan multipleksera 4-u-1. Ulazi
multipleksera su tako raspoređeni da multiplekser koji zauzima poziciju i, može da bira između ulazih bita i-1, i
i i+1. Dodatno, pomerač/rotator ima dva multipleksera 2-u-1, koji služe za izbor krajnjeg levog ili krajnjeg
desnog bita.
Sl. 4-34 Realizacija 8-bitnog univerzalnog pomerača/rotatora sa Sl. 4-33 pomoću multipleksera.
164
Barel pomerač
Prethodno opisani pomerač/rotator ima mogućnost pomeranja ili rotiranja za jednu bitsku poziciju ulevo ili
udesno. To znači da ako je potrebno obaviti pomeranje ili rotiranje za više od jedne bitske pozicije, podatak bi
morao biti propušten kroz pomerač/rotator veći broj puta. Drugim rečima, na ovakvom tipu pomerača, operacija
pomeranja za proizvoljan broj pozicija se izvršava sporo. Da bi se izbeglo ovo veliko kašnjenje, kod sistema gde
se zahtevaju visoke performanse, koristi se barel pomerač, koji je tako projektovan da može obaviti pomeranje
za proizvoljan broj pozicija. n-bitni pomerač ovog tipa, gde je n=2m, sadrži m=log2n nivoa multipleksera
raspoređenih tako da i-ti nivo multipleksera (0≤i≤m-1) obavlja pomeranje za 2i pozicija, ako je selekciona linija
ovog nivoa Si=1. Ako je Si=0, podatak prolazi kroz i-ti nivo nepromenjen. Drugim rečima, ako želimo da
pomerimo podatak za B pozicija, gde je B binarni broj bm-1...b0, tada je potrebno postaviti Si=bi, za 0≤i≤m-1.
Na Sl. 4-35 je prikazano jedno moguće rešenje barel pomerača, kod koga je, u cilju pojednostavljenja, broj
funkcija sveden samo na jednu, rotiranje na desno. Kao što se može videti, ovaj 8-bitni barel rotator realizovan
je sa tri nivoa multipleksera 2-u-1, koji se kontrolišu sa tri selekcione linije, S0, S1 i S0, na sledeći način: kada je
S0=1, prvi nivo obavlja rotiranje za jednu bitsku poziciju; kada je S1=1 drugi nivo obavlja rotiranje za dve, a
kada je S2=1 treći nivo obavlja rotiranje za četiri bitske pozicije.
Za konstrukciju složenijih pomerača/rotatora, koji mogu obavljati veći broj različitih operacija, koristi se u
suštini isti postupak, s tim da je neophodan veći broj multipleksera sa većim brojem ulaza za podatke.
(a)
(b)
Sl. 4-35 8-bitni barel rotator na desno: (a) tabela istinitosti; (b) struktura.
165
4.2 Aritmetička kola
Ovo poglavlje je posvećeno digitalnim kolima koja obavljaju aritmetičke operacije. Biće razmatrana digitalna
kola za sabiranje, oduzimanje i množenje.
Prenos Suma
x y cx21 sx20
0 0 0 0
0 1 0 1
1 0 0 1
1 1 1 0
(a) (b) (c) (d)
Sl. 4-36 Polu-sabirač: (a) sabiranje dva bita; (b) tabela istinitosti; (c) kolo; (d) grafički simbol.
Polu-sabirač, razmatran kao izolovano kolo, nema neki veći praktični značaj. Od mnogo većeg interesa su kola
koja obavljaju sabiranje više-bitnih brojeva. Prilikom sabiranja više-bitnih brojeva, kao i kod sabiranja više-
cifarskih decimalnih brojeva, potrebno je sabrati svaki par bitova (cifara), ali za svaku bitsku poziciju i dodatno
je potrebno uračunati i prenos koji potiče iz prethodne pozicije, i-1. Na Sl. 4-37 je dat primer sabiranja dva 5-
bitna broja X=(01111)2=(15)10 i Y=(01010) 2=(10)10. Sa pet bita moguće je predstaviti cele brojeve iz opsega 0 do
31. Pošto u konkretnom slučaju važi S=X+Y=(25)10, pet bita biće dovoljna i za predstavljanje zbira. Uočimo da
su na Sl. 4-37, sabirci simbolički označeni sa X=x4x3x2x1x0 i Y=y4y3y2y1y0. Na ovoj slici su takođe prikazani
prenosi koji se generišu u toku sabiranja. Na primer, prilikom sabiranja bitova x0=1 i y0=0 dobija se suma s0=1 i
prenos c0=0; prilikom sabiranja bitova x1=1 i y1=1 dobija se suma s1=0 i prenos c1=1 i tako dalje. Za ci kažemo
da predstavlja izlazni prenos (carry-out) iz pozicije i, odnosno ulazni prenos (carry-in) na poziciju i+1.
166
jednak je 1 ako je zbir bitova xi, yi i ci veći od 1. Karnoove mape za funkcije si i ci+1 prikazane su na Sl. 4-38(a).
Na osnovu Karnoovih mapa u mogućnosti smo da izvedemo optimalne izraze oblika zbir-proizvoda za funkcije
ci+1 i si:
ci+1 = xiyi + xici + yici
si = xi’yici’+xiyi’ci’+xi’yi’ci+xiyici
Efikasnija realizacija funkcija si i ci+1 može se postići korišćenjem XOR kola. XOR funkcija dve promenljive
definisana je izrazom x1 ⊕ x2 = x1x2’ + x1’x2. Primenom algebarskih manipulacija, izraz za bit sume može se
svesti na formu koja sadrži samo XOR kola, na sledeći način:
si = (xi’yi+xiyi’)ci’+( xi’yi’+xiyi)ci
= (xi’yi+xiyi’)ci’+( xi’yi+xiyi’)’ci
= (xi ⊕ yi)ci’+(xi ⊕ yi)’ci
= (xi ⊕ yi) ⊕ ci
U suštini, si predstavlja XOR funkcija tri promenljive. Napomenimo, da je za XOR funkciju karakterističan
naizmeničan raspored jedinica u Karnoovoj mapi, koji je takav da onemogućava sažimanje minterma (Sl.
4-38(b)).
Izraz za funkciju ci+1, takođe, možemo preurediti na način da koristi XOR funkciju. Pri tome, treba poći od
izraza oblika zbir-minterma:
ci+1 = cixi’yi + cixiyi + cixiyi’ + ci’xiyi
= (ci +ci’)xiyi + ci(xi’yi + cixiyi’)
= xiyi + ci(xi ⊕ yi)
Uočimo da se član (xi ⊕ yi) javlja u izrazima za obe funkcije si i ci+1. Ova činjenica omogućava da se prilikom
realizacije funkcija si i ci+1 za izračunavanje člana (xi ⊕ yi) koristi jedinstveno XOR kolo. Kombinaciona mreža
koja realizuje funkcije si i ci+1 prikazana je na Sl. 4-38(c). Ovo kolo se zove potpuni-sabirač (full-adder - FA).
Grafički simbol potpunog sabirača prikazan je na Sl. 4-38(d).
167
(a) (b)
Sl. 4-39 Realizacija potpunog sabirača na bazi polu-sabirača: (a) identifikacija polu-sabirača; (b) blok dijagram
Sabirač sa rednim prenosom
Kao što dobro znamo, ručno sabiranje se obavlja tako što se krene od cifre najmanje težine i redom sabiraju
parovi cifara, sve do cifre najveće težine. Ako se na poziciji i javi prenos, tada se on dodaje ciframa na poziciji
i+1. Identičan postupak se može primeniti i za konstrukciju digitalnog kola koje će obavljati sabiranje binarnih
brojeva. Binarni sabirač se formira rednim povezivanjem potpunih sabirača, tako što izlazni prenos svakog
potpunog sabirača služi kao ulazni prenos za potpuni sabirač koji zauzima prvu narednu bitsku poziciju veće
težine. Ovakva vrsta sabirača se zove sabirač sa rednim prenosom ili RCA, prema engleskom nazivu Ripple-
Carry Adder. Struktura n-to bitnog sabirača sa rednim prenosom prikazana je na Sl. 4-40(a). Ova struktura se
predstavlja grafičkim simbolom sa Sl. 4-40(b).
U opštem slučaju, zbir dva neoznačena n-to bitna broja ima n+1 bita. Kod binarnog sabirača, ovaj dodatni
(n+1)-vi bit je predstavljen bitom izlaznog prenosa iz pozicije najveće težine, cn, tako da važi:
(cnsn-1…s1s0) = (xn-1…x1x0) + (yn-1…y1y0) + c0.
(a) (b)
Sl. 4-40 n-bitni sabirač sa rednim prenosom: (a) unutrašnja struktura; (b) grafički simbol.
U strukturi sa Sl. 4-40(a), proces izračunavanja počinje onog trenutka kada se na ulaze sabirača postavi novi par
operanada X i Y. Međutim, s obzirom da svako logičko kolo u svakom potpunom sabiraču unosi izvesno
kašnjenje, korektna vrednost izlazne sume S se ne generiše istog tog trenutka, već tek nakon nekog vremena. Da
bi se u stepenu n-1 odredio bit sume sn-1 neophodna je informacija o prenosu iz stepena n-2, tj. cn-1; da bi se u
stepenu n-2 odredio izlazni prenos cn-1 potrebno je imati informaciju o vrednosti cn-2, i td. Neka kašnjenje
potpunog sabirača iznosi ∆t – vreme od postavljanja ulaza xi, yi, ci do generisanja korektnih izlaza ci+1 i si.
Izlazni prenos iz prvog stepena, c1, stiže do drugog stepena posle vremena ∆t nakon što su postavljeni x0 i y0.
Izlazni prenos iz drugog stepena, c2, stiže do ulaza trećeg sa kašnjenjem od 2∆t, i td. Signal cn-1 je važeći posle
kašnjenja od (n-1)∆t, a celokupna izlaza suma posle kašnjenja od n∆t.
Napomenimo da vreme sabiranja zavisi i od vrednosti operanada. Kašnjenje od n∆t odgovara slučaju kada je
jedan operand 11...11, a drugi 00...01. U ovom slučaju, prenos koji se javlja na poziciji 0, prenosi se kroz sve
potpune sabirače postavljajući bitove sume na 0. Za bilo koji drugi par vrednosti operanada, kašnjenje će biti
kraće. Na primer, sabiranje brojeva 00...00 i 00...01 traje samo ∆t. U opštem slučaju, vreme sabiranja određeno
je najvećim brojem uzastopnih pozicija na kojima oba operanda imaju vrednost 1. Međutim, kao se sabirači
koriste za sabiranje operanada proizvoljnih vrednosti, u radu sa sabiračem moramo računati sa maksimalnim
kašnjenjem, n∆t, kako bi smo bili sigurni da ćemo sa izlaza sabirača uvek očitati ispravan rezultat.
168
Znači, brzina rada sabirača sa rednim prenosom određena je vremenom prostiranja signala prenosa kroz potpune
sabirače. Što je broj bita koji se sabira veći, to je brzina rada manja. Ako se radi sa brojevima velike dužine, 32
ili 64 bita, vreme sabiranja može biti neprihvatljivo dugo. Napomenimo da je sabirač sa rednim prenosom samo
jednu od većeg broja različitih konstrukcija sabiračkih kola, koje se razlikuju po složenosti (ukupan broj
gejtova) i brzini rada. Sabirač sa rednim prenosom je najjednostavnija, ali ujedno i najsporija varijanta.
Konstrukcija brzih sabiračkih kola biće tema odeljka X.
Binarni sabirači sa rednim prenosom se lako sprežu kako bi se formirale sabiračke mreže za veći broj bitova. Na
Sl. 4-41 je pokazano kako se sa dva n-bitna sabirača formira 2n-bitni sabirač.
169
bit ukazuje na znak broja, dok se preostalih n-1 bita predstavlja maginitudu ili apsolutnu vrednost broja, kao što
je prikazano na Sl. 4-43. Važno je zapaziti poziciju bita najveće težine (MSB). Kod neoznačenih brojeva svih n
bita predstavljaju magnitudu broja – kaže se da su svi bitvi značajni, a MSB se nalazi poziciji n-1. Kod
označenih brojeva, značajni su n-1 bita, MSB bit se nalazi na poziciji n-2, dok bit na poziciji n-1 ukazuje na
znak broja.
(a) (b)
Sl. 4-43 Formati predstavljana celih brojeva: (a) neoznačeni broj; (b) označeni broj.
Za razliku od pozitivnih brojeva koji se predstavljaju uvek na isti način, korišćenjem pozicionog brojnog
sistema, za predstavljanje negativnih brojeva u upotrebi su tri reprezentacije: znak-magnituda, jedinični
komplement i dvojični komplement.
Znak magnituda
Kod decimalnog brojnog sistema, magnituda pozitivnih i negativnih brojeva predstavlja se na isti način, a znak
je taj koji ukazuje da li se radi o pozitivnom ili negativnom broju. Ovakav način predstavljanja označenih
brojeva zove se znak-magnituda, ili znak-apsolutna vrednost. Ista reprezentacija se može primeniti i na binarne
brojeve, a razlika je samo u načinu kodiranja znaka: umesto + i – koristimo 0 i 1, respektivno. Na primer, +5 =
0101, a -5=1101.
Brojni sistem koji koristi reprezentaciju znak-magnituda sadrži isti broj pozitivnih i negativnih brojeva, a nula
ima dvojnu reprezentaciju. Najveći pozitivni broj koji se u ovom sistemu može iskazati sa n bita je +(2n-1) =
011…11; najmanji negativni broj je –(2 n-1) = 111…11, dok se nula predstavlja sa 000…00 ili 100…00.
Jedinični komplement
U formatu jediničnog komplementa, n-bitna reprezentacija negativnog broja K se dobija oduzimanjem njemu
odgovarajućeg pozitivnog broja P od 2n-1, tj. K=(2n-1)-P. Na primer, ako je n=4, tada je K = (24-1)-P = (15)10-P
= (1111)2-P. Ako +5 konvertujemo u negativan broj, dobićemo -5 = 1111 – 0101 = 1010. Slično, +3=0011, a -3
= 1111 – 0011 = 1100. Jasno se uočava da se jedinični komplement datog binarnog broja dobija
komplementiranjem svakog pojedinačnog bita, uključujući i bit znaka.
Najveći pozitivni broj koji se može predstaviti u jediničnom komplementu sa n bita je 011…11 = 2 n-1, najmanji
negativni broj je 100…00 = -(011…11) 2 = -(2n-1), dok nula ima dvojnu reprezentaciju: 000…00 ili 111…11.
Jedinični komplement se lako izvodi, ali ispoljava izvesne nedostatke kada se koristi u aritmetičkim
operacijama.
Dvojični komplement
U formatu dvojičnog komplementa, n-bitna reprezentacija negativnog broja K se dobija oduzimanjem njemu
odgovarajućeg pozitivnog broja P od 2n, tj. K = 2n - P. Na primer, ako je n = 4, tada je K = 24 - P = (16)10 - P =
(10000)2 - P. Da bi smo odredili dvojični komplement broja 5, treba obaviti oduzimanje 10000 – 0101, što daje -
5 = 1011. Ili -3 = 10000 – 0011 = 1101. Nalaženje dvoji čnog komplementa na ovaj način je naporno jer zahteva
da se obavi operacija oduzimanja. Međutim, ako je K1 jedinični, a K2 dvojični komplement broja P tada važi:
K1 = (2n-1) – P
K2 = 2n – P
Odakle sledi K2 = K1 + 1. Dakle, jednostavniji način za nalaženje dvojičnog komplementa sastoji se u tome da se
na jedinični komplement doda jedinica. Ovo je upravo način na koji se u digitalnoj tehnici dobija dvojični
komplement.
Za ručno izvođenje postoji još jedan lakši način za nalaženje dvojičnog komplementa. Neka je dat broj B=bn-1bn-
2 ... b1b0. Dvojični komplement broja B, K=kn-1kn-2 ... k1k0, može se odrediti na sledeći način: krećemo od bita
najmanje težine ulevo i prepisujemo bitove broja B sve dok ne naiđemo na prvu jedinicu, zatim prepisujemo i
ovu jedinicu, a preostale bitove komplementiramo. Na primer, ako je B=0110, tada prepisujemo k0=b0=0 i
k1=b1=1, i komplementiramo preostale bitove, k2=b2`=0 i k3=b3`=1. Znači, K=1010. Ili, na složenijem primeru,
ako je B=101101000, tada je K= 010011000.
170
U brojnom sistemu koji koristi dvojični komplement, nula se tretira kao pozitivan broj, i predstavlja na
jedinstveni način: 000...00. Iz tog razloga broj pozitivnih brojeva je za jedan manji od broja negativnih. Naime,
najveći pozitivni broj koji se može predstaviti sa n bita u formatu dvojičnog komplementa je 011...11 = 2 n-1,
dok je najmanji negativan broj 10000000 = -(011...11 + 1) 2 = -(100...00)2 = -2n.
Sabiranje i oduzimanje označenih brojeva (*)
U prethodnom odeljku opisana su tri standardna načina za binarnu reprezentaciju brojeva. Međutim, nisu svi ovi
načini podjednako pogodni za primenu u digitalnim sistemima. Osnovni kriterijum za izbor reprezentacije
brojeva je lakoća sa kojom se nad brojevima u konkretnoj reprezentaciji obavljaju osnovne računske operacije,
kao što su sabiranje i oduzimanje. U ovom odeljku, na konkretnim primerima, ukazaćemo na dobre i loše strane
svake od tri reprezentacije.
Sabiranje pozitivnih brojeva se obavlja na isti način u sve tri reprezentacije, tj. na isti način kao sabiranje
neoznačenih brojeva. Međutim, kada se u računicu uvedu i negativni brojevi, između različitih reprezentacija
ispoljavaju se značajne razlike.
Sabiranje brojeva u formatu znak-magnituda
Ako oba sabirka imaju isti znak, sabiranje brojeva u formatu znak-magnituda je jednostavno. Magnitude se
saberu, a zbiru se dodeli znak sabiraka. Međutim, ako su sabirci različitog znaka, sabiranje postaje složenije. U
tom slučaju, operacija sabiranja se svodi na oduzimanje manjeg broja od većeg. To znači da je za obavljanje
operacije sabiranja neophodno digitalno kolo koje će ispitati znake sabiraka, uporediti njihove magnitude i biti u
mogućnosti da u zavisnosti od ishoda poređenja obavi sabiranje ili oduzimanje. Složenost takvog kola je
značajno veća od odgovarajućih kola koja barataju brojevima u komplementarnim reprezentacijama. Iz tog
razloga reprezentacija znak-magnituda se ne koristi kod digitalnih sistema.
Sabiranje brojeva u jediničnom komplementu
Očigledna prednost jediničnog u odnosu na dvojični komplement je u tome što se negativni broj lako određuje
prostim komplementiranjem svih bitova odgovarajućeg pozitivnog broja. Na Sl. 4-44 je prikazano šta se dešava
prilikom sabiranja dva broja predstavljena u jediničnom komplementu. Navedena su četiri slučaja, pri čemu
svaki slučaj odgovara jednoj konkretnoj kombinaciji znakova sabiraka. Kao što se može videti na gornjoj
polovini slike, izračunavanja 5 + 2 = 7 i (-5) + 2 = (-3) su trivijalna; prostim binarnim sabiranjem operanada,
uključujući pri tome i bit znaka, dobija se ispravan rezultat. Međutim, to nije slučaj kod preostala dva primera.
Izračunavanje 5 + (-2) = 3 daje bit vektor 10010. Prvo, rezultat ima pet, a ne četiri bita. Dodatni peti bit je
posledica izlaznog prenosa iz pozicije znaka. Drugo, preostala četiri bita predstavljaju broj 2, a ne 3, što je
očigledno pogrešan rezultat. Međutim, ako uzmemo izlazni prenos sa pozicije znaka i dodamo ga rezultatu na
poziciji najmanje težine, novi rezultat biće ispravna suma, tj. 3. Slična situacija se javlja kod sabiranja (-5) + (-2)
= (-7). Nakon inicijalnog sabiranja, rezultat je pogrešan, zato što su četiri bita sume 0111, što predstavlja +7, a
ne -7. Ali, ponovo, tu je izlazni prenos iz pozicije bita znaka koji može biti iskorišćen za korekciju rezultata, na
način kako je prikazano na Sl. 4-44.
171
Sl. 4-45 Primeri sabiranja u dvojičnom komplementu.
Prethodni primeri pokazuju da je sabiranje brojeva u dvojičnom komplementu veoma jednostavno. Brojevi se
sabiranju zajedno sa bitom znaka, a rezultat je uvek ispravan. Eventualni izlazni prenos iz pozicije bita znaka se
jednostavno ignoriše. Znači, procedura sabiranja je uvek ista, nezavisno od znaka operanada, i može se obaviti
binarnim sabiračem, kao što je onaj sa Sl. 4-40. Zbog svega toga, reprezentacija brojeva u dvojičnom
komplementu je veoma pogodna za primenu u digitalnim sistemima.
Oduzimanje u dvojičnom komplementu
Najlakši način da se obavi oduzimanje je da se najpre umanjiocu promeni znak, a da se onda dobijena vrednost
sabere sa umanjenikom. Promeni znaka umanjioca odgovara nalaženje njegovog dvojičnog komplementa. Na Sl.
4-46 je na nekoliko karakterističnih primera ilustrovan ovaj postupak. Operacija 5 – (+2) = 3 uključuje nalaženje
dvojičnog komplementa broja +2, što daje 1110. Kada se ovaj broj sabere sa 0101 = (+5), dobija se rezultat
0011 = (+3) uz generisanje prenosa iz pozicije bita znaka. Ako ignorišemo prenos, rezultat je tačan. Slična
situacija postoji za (-5) + (+2) = (-7). U preostala dva slučaja, izlazni prenos ne postoji i rezultat je tačan.
172
da ova grafička interpretacija potvrđuje naše ranije tvrđenje da se oduzimanje brojeva u dvojičnom
komplementu može obaviti sabiranjem umanjenika i dvojičnog komplementa umanjioca.
Sabirač/oduzimač
Jedina razlika između sabiranja i oduzimanja je u tome što je kod oduzimanja potrebno koristiti dvojični
komplement jednog od operanada. Neka su X i Y dva broja, koja treba sabrati ili oduzeti i neka je Y broj koji
prilikom oduzimanja služi kao umanjilac, tj. neka je S=X±Y. Kao što znamo, dvojični komplement operanda Y
se može dobiti dodavanjem jedinice na njegov jedinični komplement. Dodavanje jedinice na poziciju najmanje
težine može se postići postavljanjem bita ulaznog prenosa c0 na 1. Jedinični komplement datog broja se dobija
komplementiranjem svih njegovih bitova. Komplementiranje broja se može obaviti pomoću NOT gejtova.
Međutim, za ovu namenu biće nam potrebno fleksibilnije kolo, kako bi smo mogli da u zavisnosti od željene
operacije koristimo pravu ili komplementiranu vrednost operanda Y. Takvo kolo je XOR gejt. Interesantna
osobina XOR kola je da jedan od njegovih ulaza možemo koristiti kao upravljačku promenljivu pomoću koje
ćemo birati da li će se na izlazu kola generisati prava ili komplementarna vrednost drugog ulaza. Ovo je jasno na
osnovu definicije XOR operacije:
z=x ⊗ y = x’y + xy’
Neka je x upravljački ulaz. Za x=0, izlaz će biti identičan ulazu y, tj. z= 0’·y + 0·y’=1·y+0· y’= y. Ali, ako je x=1,
izlaz će biti jednak komplementu ulaza y, tj. z= 1’·y + 1·y’=0·y+1· y’= y’. Drugim rečima, za x=1 XOR gejt
funkcioniše kao invertor, dok za x=0, jednostavno prenosi vrednost sa ulaza y na izlaz.
Kolo za sabiranje/oduzimanje možemo konstruisati na sledeći način. Pretpostavimo da postoji upravljački signal
koji određuje da li treba obaviti sabiranje ili oduzimanje. Neka se ovaj signal zove Add / Sub (prema engleskim
nazivima za sabiranje i oduzimanje: addition i subtraction). Takođe, neka vrednost 0 ovog signala bira
sabiranje, a 1 oduzimanje. Crta iznad Add upravo ukazuje na ovu činjenicu. Napomenimo da je ovo često
korišćena konvencija, tj. da crta iznad imena upravljačkog signala ukazuje da se akcija specificirana tim imenom
obavlja kada signal ima vrednost 0. Neka je svaki bit operanda Y povezan na jedan ulaz jednog od XOR gejtova,
a da su drugi ulazi svih XOR gejtova povezani na signal Add / Sub . Izlazi XOR gejtova predstavljaju Y, ako je
Add / Sub =0, odnosno Y’, ako je Add / Sub =1. Tako dolazimo do kola sa Sl. 4-48. Glavni deo ovog kola je n-to
bitni sabirač, koji može biti realizovan korišćenjem strukture sabirača sa rednim prenosom sa Sl. 4-40(a).
Uočimo da je upravljački ulaz Add / Sub povezan i na ulaz c0 sabirača. Na ovaj način, biće c0=1 kada se obavlja
oduzimanje, što dodaje jedinicu koja je neophodna da bi se formirao dvojični komplement operanda Y. Kada se
obavlja operacija sabiranja, c0 će biti 0 i neće uticati na rezultat.
173
se desiti da rezultat bude veći od 2n-1-1, ako su oba sabirka pozitivna, odnosno, manji od -2 n-1, ako su sabirci
negativni. Da bi se osigurao ispravan rad aritmetičkog kola, neophodno je biti u mogućnosti detektovati pojavu
aritmetičkog prekoračenja.
174
yn-1 yn-2 y1 y0
Add/Sub
xn-1 xn-2 x1 x0
cn-1 cn-2 c2 c1
Prekoračenje cn
FA FA
... FA FA
c0
sn-1 sn-2 s1 s0
Pozicija MSB LSB
znaka pozicija pozicija
(a)
(b)
Sl. 4-50 Dva načina za detekciju aritmetičkog prekoračenja: (a) na osnovu izlaznih prenosa; (b) na osnovu znaka
sabiraka i rezultata.
Napomenimo da su dva pravila za detekciju aritmetičkog prekoračenja, u suštini, ekvivalentna. Potpuni sabirač
na poziciji bita znaka obavlja sledeće izračunavanje: (cn, sn-1) = (xn-1 + yn-1 + cn-1). Ako su oba sabirka pozitivna,
xn-1=yn-1=0, izlazni prenos iz pozicije znaka biće cn=0, bez obzira na vrednost cn-1. Za cn-1=0, bit znaka rezultata
biće sn-1=0, što ukazuje da je rezultat pozitivan i da zbog toga prekoračenja nema. Međutim, ako je cn-1=1, bit
znaka dobija vrednost sn-1=1, što ukazuje na negativan rezultat, tj. na pojavu prekoračenja. Slično, ako su oba
sabirka negativna, xn-1=yn-1=1, izlazni prenos iz pozicije znaka biće cn=1, bez obzira na vrednost cn-1. Međutim,
za cn-1=0, bit znaka dobija vrednost sn-1=0, što ukazuje na pozitivan rezultat, odnosno na prekoračenje. Dakle, u
oba slučaja važi da prekoračenje postoji ako je cn≠cn-1.
Performanse sabirača sa rednim prenosom
Sabiranje i oduzimanje brojeva su bazične operacije koje se često obavljaju u računarskim sistemima. Brzina
izvršenja ovih operacija ima veliki uticaj na ukupne performanse računara. Iz tog razloga, razmotrimo brzinu
rada kola za sabiranje i oduzimanje. Brzina rada ovog kola određena je kašnjenjem od trenutka kada se na ulaze
kola postave operandi X i Y do trenutka kada se na izlazu kola generišu korektne vrednosti svih bitova sume S i
izlaznog prenosa cn. Najveći deo ovog kašnjenja potiče od n-bitnog sabirača. Pretpostavimo da je sabirač
realizovan korišćenjem strukture sa rednim prenosom (Sl. 4-40), kod koje su potpuni sabirači realizovani kao na
Sl. 4-38. Kao što se lako može zaključiti sa Sl. 4-38, kod ove realizacije potpunog sabirača, kašnjenje izlaznog
prenosa, ∆t, jednako je kašnjenju kroz dva gejta, tj. ∆t=2tg, gde je tg kašnjenje kroz jedan gejt. Ukupno kašnjenje
sabirača sa rednim prenosom iznosi n∆t, što je ekvivalentno kašnjenju kroz 2n gejta. Pored kašnjenja koje je
posledica prostiranja signala prenosa kroz sabirač, na ukupno kašnjenje kola za sabiranje i oduzimanje dodatno
utiču i ulazna XOR kola. Ako pretpostavimo da je kašnjenje kroz XOR kolo jednako tg, dolazimo do zaključka
da kolo za sabiranje i oduzimanje unosi kašnjenje ekvivalentno kašnjenju kroz 2n+1 gejt. Za veće n, npr. n=32
ili n=64, iznos kašnjenja može biti toliko veliki da značajno degradira performanse celog sistema. Zato je bitno
ispitati mogućnost alternativne realizacije binarnog sabirača, koja će se odlikovati većom brzinom rada.
Brzina rada bilo kog digitalnog kola ograničena je najvećim kašnjenje duž neke od putanja kroz kolo. U slučaju
kola sa Sl. 4-48, najduže kašnjenje se javlja duž putanje koja kreće od ulaza yi, prolazi kroz XOR gejt, a zatim
kroz kola za generisanje prenosa svih potpunih sabirača. Najduže kašnjenje se zove kašnjenje kritičnog puta, a
putanja koja uslovljava ovo kašnjenje kritična putanja.
175
4.2.2 Brzi sabirači
Sabirač sa ubrzanim prenosom
Kašnjenje uzrokovano propagacijom signala prenosa kroz sabirač sa rednim prenosom može se smanjiti ako
promenimo strukturu sabirača na način da svaki stepen i, umesto da čeka da od stepena i-1 dobije ulazni prenos
ci, pre nego što generiše svoj bit sume si, samostalno pokuša da odredi da li će vrednost ulaznog prenosa biti 0 ili
1. Da bi ukupne performanse sabirača bile poboljšanje, potrebo je da korektna procena vrednosti ulaznog
prenosa bude obavljena za što je moguće kraće vreme.
Pođimo od izraza za funkciju izlaznog prenosa i-tog stepena sabirača:
ci+1 = xiyi + xici + yici
Ako ovaj izraz rastavimo na sledeći način:
ci+1 = xiyi + (xi + yi)ci
funkciju ci+1 možemo napisati u obliku:
ci+1 = gi + pici (4.1)
gde je:
gi = xiyi
p i = xi + yi
Jednačinu (4.1) možemo protumačiti na sledeći način. Kada je gi=1, tj. xi=yi=1, stepen i generiše izlazni prenos,
ci+1=1, bez obzira na vrednost ulaznog prenosa ci. Zato se g zove funkcija generisanog prenosa. Funkcija pi
jednaka je 1 ako je barem jedan od ulaza xi i yi jednak 1. U ovom slučaju, ci=1 uslovljava generisanje izlaznog
prenosa ci+1, tj. efekat je kao da se ulazni prenos preneo na izlaz. Zbog toga se funkcija p zove funkcija
propagiranog prenosa. Dakle, stepen i generiše prenos ako su oba njegova sabirka jednaka 1, a propagira prenos
ako je jedan od sabiraka jednak 1.
Jednačina (5.3) nam omogućava da rekurzivnom zamenom člana ci eliminišemo propagaciju prenosa kroz
sabirač. Naime, kao što je ci+1 = gi + pici, tako je i ci = gi-1 + pi-1ci-1. Dakle,
ci+1 = gi + pi(gi-1 + pi-1ci-1)
= gi + pigi-1 + pipi-1ci-1
Nastavljajući sa smenama, sve do c0, dolazimo do izraza za ci+1 sledećeg oblika:
ci+1 = gi + pigi-1 + pipi-1gi-2 + ... + pipi-1... p2p1g0 + pipi-1...p1p0c0 (4.2)
Dobijeni izraz se može realizovati u vidu tronivovske AND-OR mreže. U prvom nivou računaju se funkcije
generisanog i propagiranog prenosa, gi i pi. U drugom nivou, izračunavaju se produktni članovi, koji se, potom,
sumiraju u trećem nivou. S obzirom na mali broj nivoa, ci+1 se izračunava veoma brzo. Šta više, kašnjenje u
izračunavanju izlaznih prenosa ci+1 je fiksno i ne zavisi od i, što znači da ni ukupno kašnjenje sabirača ne zavisi
od obima operanada, tj. n. Binarni sabirač zasnovan na izrazu (4.2) zove se sabirač sa ubrzanim prenosom ili
CLA sabirač, prema engleskom nazivu Carry-Lookahead Adder.
Da bi smo bolje razumeli fizičko značenje izraza (4.2) uporedićemo konstrukcije sabirača sa ubrzanim i sabirača
sa rednim prenosom. U tom cilju, analizaćemo detaljnu strukturu dva stepena najmanje težine oba sabirača.
Sl. 4-51 prikazuje prva dva stepena sabirača sa rednim prenosom kod koga su funkcije izlaznog prenosa
realizovane shodno izrazu (4.1). Mala brzina rada sabirača sa rednim prenosom posledica je dugačke putanje
duž koje se prostire signal prenosa. Kao što je posebno naznačeno na Sl. 4-51, kritični put polazi od ulaza x0 i y0 i
proteže se do izlaza c2, prolazeći kroz 5 gejta: 3 gejta u stepenu 0 i 2 u stepenu 1. Za sabirač sa n stepena,
kritični put se nastavlja dalje sve do izlaza cn, prolazeći kroz svaki sledeći stepen na isti način kao kroz stepen 1.
Dakle, kašnjenje kritičnog puta sabirača sa rednim prenosom iznosi 2n+1.
176
Sl. 4-51 Detaljna struktura sabirača sa rednim prenosom.
Na Sl. 4-52 je prikazana detaljna struktura prva dva stepena sabirača sa ubrzanim prenosom. Sada su funkcije
izlaznog prenosa realizovane shodno izrazu (4.2), tj.:
c1 = g0 + p0c0
c2 = g1 + p1g0 + p1p0c0
Kao što se može uočiti sa Sl. 4-52, u svakom stepenu sabirača sa rednim prenosom generišu se funkcije
generisanog i propagiranog prenosa. Lokalno, ove funkcije se koriste, zajedno sa funkcijama g i p svih
prethodnih stepena, za generisanje izlaznog prenosa tog stepene, ali i prosleđuju dalje ka svim narednim
stepenima gde se koriste za određivanje njihovih izlaznih prenosa. Kritični put za određivanje izlaznog prenosa
c2 naznačen je na Sl. 4-52. U ovom kolu, c2 se određuje jednako brzo kao i c1, tj. nakon vremena koje je jednako
kašnjenju kroz tri gejta, tj. 3tg. Čak iako ovu strukturu proširimo na n bita, konačni izlazni prenos cn generisaće
se sa kašnjenjem od 3tg. Naravno, što je i veće, tj. kako se krećemo ka pozicijama veće težine, to izrazi za
funkcije ci+1 postaju sve složeniji, što zahteva sve veći broj gejetova za njihovu realizaciju. Međutim, bez obzira
na složenost, broj nivoa logike za izračunavanje ci+1 ostaje isti, tj. tri.
Ukupno kašnjenje n-to bitnog sabirača sa ubrzanim prenosom isnosi 4tg. Vrednosti svih funkcija gi i pi određuju
se nakon vremena tg. Dodatno kašnjenje od 2tg potrebno je za određivanje svih signala prenosa. Konačno, treba
sačekati još dodatno vreme tg da bi se na izlazima svih XOR kola generisali bitovi sume.
177
Izraz (4.2) se može realizovati pomoću brze, tri-nivolske AND-OR mreže. Međutim, za veliko i broj ulaza u
pojedine gejtove, koji su potrebni za realizaciju ove funkcije, postaje isuviše veliki. Kao što je poznato iz
poglavlja X, kod većine implementacionih tehnologija broj ulaza u gejtove, tj. fan-in faktor, ograničen je na
relativno mali broj. Zato je neophodno prilikom projektovanja sabirača sa ubrzanim prenosom uzeti u obzir i
ovu činjenicu. Da bi smo bliže ukazali na ovaj problem, razmotrimo izraze za prvih osam izlaznih prenosa:
c1 = g0 + p0c0
c2 = g1 + p1g0 + p1p0c0
...
c8 = g7 + p7g6 + p7p6g5 + p7p6p5g4 + p7p6p5p4g3 + p7p6p5p4p3g2 + p7p6p5p4p3p2g1
+ p7p6p5p4p3p2p1g0 + p7p6p5p4p3p2p1p0c0
Pretpostavimo da je fan-in raspoloživih gejtova ograničen na četiri ulaza. Očigledno, pomoću takvih gejtova nije
moguće realizovati sve prethodne izraze u obliku tri-nivolske AND-OR mreže. Nejveći problem je c8, gde se
čak zahteva jedno AND kolo sa 9 ulaza. Takođi, i za sumiranje produktnih članova potrebno je OR kolo sa 9
ulaza. Potreba za logičkim kolima sa velikim brojem ulaza potiče od produktnih i zbirnih članova sa velikim
brojem literala. Međutim, pravilnom faktorizacijom, moguće je smanjiti maksimalnu veličinu članova u
logičkom izrazu. Jedno moguće rešenje je sledeće:
c8 = (g7 + p7g6 + p7p6g5 + p7p6p5g4)+ [(p7p6p5p4)(g3 + p3g2 + p3p2g1 +p3p2p1g0)]
+ (p7p6p5p4)(p3p2p1p0)c0
Za realizaciju ovog izraza potrebna su 11 AND i tri OR gejta. Međutim, sada propagaciono kašnjenje iznosi ne
više 3tg već 5tg: jedno tg za određivanje gi i pi; 2tg za sumiranje produktnih članova u zagradama; jedno tg za
produktni član u velikim zagradama i još jedno tg za konačno sumiranje. Dakle, ograničenje u pogledu
maksimalnog broja ulaza u gejtove manifestuje se u povećanju broja nivoa AND-OR mreže, što neminovno
povećava propagaciono kašnjenje. Ovaj zaključak nije ograničen samo na konkretno kolo, već veži generalno za
bilo koju logičku mrežu.
Hijerarhijski sabirač sa ubrzanim prenosom
Projektovanje digitalnih sistema po pravilu zahteva nalaženje optimalnog kompromisa između brzine rada
sistema i njegove cene (složenosti). Težnja da se što više poveća brzina rada, obično ima za posledicu povećanje
cene sistema. Isto tako, složenost sistema obično nije moguće smanjiti, a da to nema za posledicu smanjenje
brzine rada. U kontekstu binarnog sabirača, struktura sa rednim prenosom predstavlja najjednostavnije, ali u isto
vreme i najsporije rešenje. Sa druge strane, sabirač sa ubrzanim prenosom predstavlja najbrže rešenje, ali zato za
neke primene, njegova složenost može biti isuviše velika. Međutim, mogu postojati primene kada ni jedna od
ove dve varijante sabirača ne zadovoljava postavljene zahteve – sabirač sa rednim prenosom može biti previše
spor, a sabirač sa ubrzanim prenosom previše složen. Zato je bitno raspolagati nekom fleksibilnom sabiračkom
strukturom koja će omogućiti lako nalaženje kompromisa između složenosti i brzine rada. Jedna takva struktura
je hijerarhijski sabirač sa ubrzanim prenosom.
Pretpostavimo da želimo da projektujemo 32-sabirač. Sabirač možemo podeliti na četiri 8-bitna bloka, tako da
bitovi b0-7 pripadaju bloku 0, bitovi b8-15 bloku 1, bitovi b16-23 bloku 2 i bitovi b24-32 bloku 3. Svaki blok možemo
realizovati kao 8-bitni sabirač sa ubrzanim prenosom. Signali izlaznog prenosa iz ovih blokova su c8, c16, c24 i
c32. Postoje dva načina kako 8-bitne blokove možemo povezati u jedinstveni 32-bitni sabirač. Jedno rešenje je da
blokove povežemo na isti način kao što bi smo povezali četiri stepena sabirača sa rednim prenosom (Sl. 4-53).
Znači, kod ovog rešenja unutar blokova koristimo tehniku ubrzanog prenosa, dok se između blokva prenos
prenosi redno.
178
propagiranog prenosa, gi i pi. Međutim, umesto da svaki blok generiše signal izlaznog prenosa iz svoje pozicije
naveće težine, kao u rešenju sa Sl. 4-53, sada svaki blok generiše signale generisanog i propagiranog prenosa za
celokupan blok. Neka su ovi signali označeni sa Gj i Pj. Signali Gj i Pj se koriste kao ulazi u kola za ubrzanje
prenosa drugog nivoa, prikazana u doljem delu Sl. 4-66, koja određuju prenose između blokova. Izraze za
funkcije Gj i Pj možemo odrediti na osnovu poznatog izraza za c8:
c8 = g7 + p7g6 + p7p6g5 + p7p6p5g4 + p7p6p5p4g3 + p7p6p5p4p3g2 + p7p6p5p4p3p2g1
+ p7p6p5p4p3p2p1g0 + p7p6p5p4p3p2p1p0c0
Poslednji član u ovom izrazu kazuje da ako su sve interne funkcije propagiranog prenosa, pi, i=1,..,7, jednake 1,
tada se signal ulaznog prenosa, c0, prenosi kroz celokupan blok. Dakle,
P0 = p7p6p5p4p3p2p1p0
Preostali članovi u izrazu za c8 ukazuju na sve ostale slučajeve kada blok generiše izlazni prenos. Dakle,
G0 = g7 + p7g6 + p7p6g5 + ... + p7p6p5p4p3p2g1 + p7p6p5p4p3p2p1g0
Konačno, izraz za c8 hijerarhijskog sabirača oblika je:
c8 = G0 + P0c0
Za blok 1, izrazi za G1 i P1 imaju istu formu, osim što indeks i treba zameniti indeksom i+8. Izrazi za G2, P2, G3
i P3, određuju se na isti način. Ako znamo funkcije generisanog i propagiranog prenosa na nivou blokova, tada
možemo odrediti i izraze za ulazne prenose u svaki pojedinačni blok:
c16 = G1 + P1c8
= G1 + P1G0 +P1P0 c0
Slično, izrazi za c24 i c32 su oblika:
c24 = G2 + P2G1 +P2P1G0 + P2P1P0c0
c32 = G3 + P3G2 +P3P2G1 + P3P2P1G0 + P3P2P1P0c0
Izračunavanje signala prenosa c8, c16, c24 i c32 na osnovu poznatih vrednosti Gj i Pj unosi dva dodatna nivoa
logike. Znači, pod pretpostavkom da je fan-in ograničen na 4 ulaza, vreme potrebno da se obavi sabiranje dva
32-bitna broja iznosi: 5tg za određivanje Gj i Pj (na osnovu prethodno sprovedene analize za c8), plus 3tg za
ubrzanje prenosa na drugom nivou (zato što dva gejta u izrazu za c32 zahtevaju 5 ulaza i zbog toga moraju biti
faktorizovani), plus jedno tg (XOR) za određivanje bitova sume, što u zbiru daje 9tg. Tačnije, konačna suma se
generiše posle 8tg zato što c32 ne utiče na bitove sume. Međutim, c32 se koristi za detekciju aritmetičkog
prekoračenja (Prekoračenje = c32 ⊗ c31). Dakle, trajanje operacije sabiranja, uključujući detekciju prekoračenja,
ekvivalentno je kašnjenju kroz 9 gejtova.
179
Sabirači sa izborom prenosa
Na Sl. 4-55(a) je prikazan n-bitni sabirač formiran serijskim povezivanjem dva manja sabirača. Sabirač SL
obavlja sabiranje na nižim pozicijama (k-1, ..., 0), a SH na višim pozicijama (n-1, ..., k). Ukupno kašnjenje n-
bitnog sabirača iznosi tp=tL + tH, gde je tL kašnjenje kroz sabirač SL, a tH kašnjenje kroz sabirač SH. Iako se
sabirci istovremeno dovode na oba manja sabirača, sabirač SH nije u mogućnosti da odredi korektan zbir sve
dok od sabirača SL ne dobije informaciju od vrednosti prenosa ck. Međutim, uočimo da iako nepoznate
vrednosti, ck može biti samo 0 ili 1. Odnosno, zbir koji daje SH može biti
Xn-1, ..., k + Yn-1, ..., k (za ck=0) ili
Xn-1, ..., k + Yn-1, ..., k + 1 (za ck=1).
Ovo zapažanje nas dovodi do osnovne ideje sabirača sa izabranim prenosom (ili CSA – Carry Select Adder). (Sl.
4-55(b)). Umesto jednog koriste se dva sabirača za više pozicije, SH0 i SH1, koji rade paralelno nad istim
operandima, s tim da SH0 kao ulazni prenos ima konstantu 0, a SH1 konstantu 1. Na taj način, SH0 generiše Xn-1,
..., k + Yn-1, ..., k, a SH1 Xn-1, ..., k + Yn-1, ..., k + 1. Onog momenta kada tačna vrednost ulaznog prenosa ck postane
poznata, kroz multiplekser se na izlaz propušta jedan od dva alternativna rezultata.
Xn-1...k Yn-1...k Xn-1...k Yn-1...k Xk-1...0 Yk-1...0
SH1 1 SH0 0 SL
Xn-1...k Yn-1...k Xk-1...0 Yk-1...0
ck
ck 1 0
SH SL MUX S
(a) (b)
Sl. 4-55 (a) redna sprega sabirača (b) sabirač sa izborom prenosa.
Zanemarujući kašnjenje kroz multiplekser, kašnjenje n-bitnog sabirača je smanjeno na tp=max{tL,tH}. Veća
brzina rada postignuta je zahvaljujući obimnijem hardveru.
180
segmenata, koji konkurentno obavljaju istu funkciju nad parovima odgovarajućih bitova dva n-bitna operanda.
Na Sl. 4-56(d) prikazan je primer 8-bitne logičke jedinice.
Sl. 4-56 Logička jedinica: (a) funkcije od dve promenljive; (b) realizacije logičke jedinice; (c) grafički simbol; (d) 8-
bitna logička jedinica.
181
a3 b3 a2 b2 a1 b1 a0 b0
LE AE LE AE LE AE LE AE
x3 y3 x2 y2 x1 y1 x0 y0
c3 c2 c1
c4 FA FA FA FA c0
f3 f2 f1 f0
Sl. 4-57 4-bitni sabirač u spoju sa aritmetičkim (AE) i logičkim (LE) ekspanderima.
Najpre, neophodan je ulaz za izbor režima rada, M, koji će birati aritmetičke ili logičke operacije, tako da pri
M=1, ALU obavlja aritmetičke, a pri M=0 logičke operacije. Takođe, potrebne su dve promenljive za izbor
operacije, S1 i S0, koje će, u zavisnosti od vrednosti ulaza M, birati jednu od četiri aritmetičkih ili četiri logičkih
operacija, na način kako je to definisano funcijskom tabelom sa Sl. 4-58(a), za aritmetičke, i tabelom sa Sl.
4-59(a), za logičke operacije.
M S1 S0 bi yi
1 0 0 0 1
1 0 0 1 1
1 0 1 0 0
1 0 1 1 1
M S1 S0 Ime funkcije F X Y c0 1 1 0 0 1
1 0 0 Dekrement A-1 A sve jedinice 0 1 1 0 1 0
1 0 1 Sabiranje A+B A B 0 1 1 1 0 0
1 1 0 Oduzimanje A+B'+1 A B' 1 1 1 1 1 0
1 1 1 Inkrement A+1 A sve nule 1 0 X X X 0
(a) (b)
(c) (d)
Sl. 4-58 Aritmetički ekspander: (a) funkcionalna tabela; (b) tabela istinitosti; (c) Karnoova mapa; (d) struktura.
U funkcionalnnoj tabeli sa Sl. 4-58(a), za svaku aritmetičku operaciju, navedene su vrednost izlaza ALU
jedinice, F, kao i vrednosti ulaza sabirača, X i Y, i ulaznog prenosa c0 koje su neophodne da bi se dobila
odgovarajuća vrednost F. Shodno ovoj tabeli, na ulaz X sabirača uvek se dovodi operand A, dok su na ulazu Y u
zavisnosti od izabrane operacije prisutne: sve jedinice, operand B, komplement operanda B, ili sve nule.
Vrednosti ulaza Y se generišu uz pomoć AE ekspandera, čija je tabela istinitosti prikazan na Sl. 4-58(b). Ova
tabela je dobijena na osnovu funkcionalne tabele sa Sl. 4-58(a) tako što je kolona Y zamenjena kolonama bi i yi.
Na Sl. 4-58(c) prikazana je Karnoova mapa AE ekspandera, na osnovu koje sledi izlaz: yi=MS1’bi+MS0’bi'.
Konačno, struktura AE ekspandera prikazana je na Sl. 4-58(a).
Projektovanje logičkog ekspandera, takođe, započinje funkcionalnom tabelom koja definiše logičke operacije, a
koja je prikazana na Sl. 4-59(a). Kao što se može zaključiti analizom ove tabele, za bilo koju logičku operaciju,
ulazi Y i c0 sabirača su uvek postavljeni na vrednost 0, dok se na ulaz X postavlja rezultat logičke jednačine koja
182
odgovara izabranoj logičkoj operaciji. Na osnovu funkcionalne tabele sa Sl. 4-59(a), u mogućnosti smo da
formiramo tabelu istinitosti logičkog ekspandera, koja je prikazana na Sl. 4-59(b). Na osnovu odgovarajuće
Karnoove mape Sl. 4-59(c), sledi logički izraz za jednu bitsku poziciju logičkog ekspandera:
xi=M’S1’S0’ai` +M’S1S0bi+S0aibi+S1ai+Mai
Kombinaciona mreža logičkog ekspandera koja sledi na osnovu dobijenog izraza prikazana je na Sl. 4-59(d).
M S1 S0 Ime funkcije F X Y c0 M S1 S0 xi
0 0 0 Komplement A' A' 0 0 0 0 0 a i'
0 0 1 AND A AND B A AND B 0 0 0 0 1 a ibi
0 1 0 Identitet A A 0 0 0 1 0 ai
0 1 1 OR A OR B A OR B 0 0 0 1 1 a i+bi
1 X X ai
(a) (b)
(c) (d)
Sl. 4-59 Logički ekspander: (a) funkcionalna tabela; (b) tabela istinitosti; (c) Karnoova mapa; (d) struktura.
Nakon obavljenog projektovanja aritmetičkog i logičkog ekspandera, ALU jedinica formira se povezivanjem
AE i LE ekspandera sa binarnim sabiračem, na način kao što je prikazano na Sl. 4-60(a). Uočimo da se kod ALU
jedinice, logičke operacije obavljaju u logičkim ekspanderima, a da potpuni sabirači (FA) propuštaju na izlaz F
rezultat LE ekspandera bez ikakve promene. Drugim rečima, prilikom obavljanja logičkih operacija potpuni
sabirači se koriste kao veze sa fiksnim propagacionim kašnjenjem.
Uočimo, takođe, da prlikom izvršenja aritmetičkih operacija nad neoznečenim brojnim vrednostima, signal
izlaznog prenosa iz pozicije najveće težine ukazuje na prekoračenje. Za slučaj aritmetičkih operacija nad
označenim brojevima (predstavljenim u obliku dvojičnog komplementa), uslov prekoračenja je drugačiji i
formira se kao XOR operacija izlaznih prenosa iz dve bitske pozicije najveće težine. Ako je neophodno, 4-bitna
ALU jedinica sa slikaa se može proširiti na n-bitnu ALU jedinicu, korišćenjem n-bitnog sabirača u spoju sa n
aritmetičkih i n logičkih ekspandera. Grafički simbol ovakve ALU jedinice prikazan je na Sl. 4-60(b). Većina
ALU jedinica, koje se koriste u praksi, konstruišu se na opisani način, osim što se razlikuju po tipu i broju
aritmetičkih i logičkih operacija koje podržavaju.
183
(a)
(b)
Sl. 4-60 ALU modul: (a) 4-bitna ALU; (b) grafički simbol.
Prevođenje razlomljenog binarnog broja u decimalni ekvivalent je trivijalno i obavlja se primenom prethodne
jednačine, pri čemu se sve operacije obavljaju u decimalnom brojnom sistemu. Na primer, decimalni ekvivalent
broja (1101.101)2 iznosi:
(1101.101)2 = (1 × 23 + 1 × 22 + 0 × 21 + 1 × 20 + 1 × 2-1 + 0 × 2-2 + 1 × 2-3)10
= (8 + 4 + 1 + 1/2 + 1/8) 10
= (13 + 0.5 + 0.125) 10
= (13.562)10
184
Prevođenje decimilanog broja sa tačkom u binarni broj obuhvata nezavnisno prevođenje celog i razlomljenog
dela. Celi deo se prevodi na poznati način, tj. uzastopnim deljenjem sa 2 i izdvajanjem ostatka. Slično,
razlomljeni deo se prevodi u binarni ekvivalent uzastopnim množenjem sa 2 i izdvajanjem celobrojnog dela iz
dobijenog proizvoda. Neka razlomljeni decimalni broj D=0.d-1d-2 ... d-m, vrednosti V, treba konvertovati u
binarni broj B=0.b-1b-2 ... b-k. Znači, treba odrediti bitove b-1, b-2, ..., b-k, tako da važi:
V = b-1 × 2-1 + b-2 × 2-2 + ... + b-k × 2-k
Ako V pomnožimo sa 2, dobićemo:
2 × V= b-1 × 20 + b-2 × 2-1 ... + b-k × 2-(k-1)
Celobrojni deo ovog množenja je b-1, a razlomljeni b-2 × 21 ... + b-k × 2-(k-1), tj. 0.b-2b-3...b-k. Znači, ako
množenjem polaznog decimalnog broja dobijemo kao celobrojni deo 0, važi b-1=0, a ako dobijemo 1, važi b-1=1.
Množenjem dobijenog razlomljenog broja sa 2, kao celobrojni deo dobićemo b-2, a novi razlomljeni broj biće je:
0.b-3b-4...b-k. Ako nastavimo da množimo novi razlomljeni broj sa 2 i određujemo po jedan bit u svakom koraku,
dobićemo sve bitove binarnog broja. Ovaj postupak se nastavlja sve dok razlomljeni broj ne postane jednak 0.
Pr. 4-8 Odrediti binarni ekvivalent decimalnog broja 14.703125.
Celobrojni deo zadatog decimalnog broja je (14) 10, a razlomljeni (0.703125) 10. Na poznati način nalazimo
binarni ekvivalent celog dela:
(14)10 = (1110)2
Da bi smo našli binarni broj koji odgovara razlomljenom delu, primenjujemo prethodno opisanu proceduru
konverzije:
0.703125 × 2 = 1.40625 ⇒ b-1=1
0.40625 × 2 = 0.8125 ⇒ b-2=0
0.8125 × 2 = 1.625 ⇒ b-3=1
0.625 × 2 = 1.25 ⇒ b-4=1
0.25 × 2 = 0.5 ⇒ b-5=0
0.5 × 2 = 1.0 ⇒ b-6=1
Dakle, (14.703125) 10 = (1110.101101) 2
Kao što znamo iz elementrane matematike, racionalan broj je onaj koji iza tačke ima konačan broj cifara. Broj
sa beskonačnim brojem cifara iza tačke je iracionalan. Prevođenjem racionalnog binarnog broja u decimalni
brojni sistem uvek se dobija racionalni decimalni broj. Međutim, prilikom obrunute konverzije, neki brojevi koji
su u decimalnom sistemu racionalni u binarnom sistemu postaju iracionalni.
Pr. 4-9 Odrediti binarni ekvivalent decimalnog broja 0.55.
0.55 × 2 = 1.1 ⇒ b-1=1
0.1 × 2 = 0.2 ⇒ b-2=0
0.2 × 2 = 0.4 ⇒ b-3=0
0.4 × 2 = 0.8 ⇒ b-4=0
0.8 × 2 = 1.6 ⇒ b-5=1
0.6 × 2 = 1.2 ⇒ b-6=1
0.2 × 2 = 0.4 ⇒ b-7=0
0.4 × 2 = 0.8 ⇒ b-8=0
...
Proces konverzije možemo nastaviti u nedgled, ali uslov kraja (razlomljeni deo jednak nuli), nikada neće biti
ispunjen. Pažljivim analizom procesa konverzije možemo uočiti da će se u nastavku konverzije neprekidno
ponavljati sekvenca razlomnjenih brojeva 0.2, 0.4, 0.8, 0.6. Dakle, (0.55) 10 = (0.10<0011>)2, gde uglaste
zagrade obuhvataju binarnu sekvencu koja se neprekidno ponavlja, do u beskonačnost.
Pošto digitalni sistemi mogu baratati samo brojevima ograničene dužine, konverzija mora biti prekinuta kada se
prekorači raspoloživi broj bitova, što naravno unosi grešku. Na primer, ako je u primeru Pr. 4-9 broj bitova za
predstavljanje razlomljenog dela ograničen na osam, decimalni broj 0.55 u digitalnom sistemu koji radi sa
brojevima u fiksnom zarezu, će biti predstavljen sa: (0.10001100) 2, što ustvari odgovara decimalnom broju
(0.546875)10.
Digitalna kola koja barataju brojevima u fiksnom zarezu su u suštini ista kao i ona koja se koriste za celobrojne
binarne brojeve, pa ih iz tog razloga nećem posebno razmatrati.
185
Brojevi u pokretnom zarezu
Opseg brojeva u fiksnom zarezu ograničen je brojem značajnih cifara koje se koriste za predstavljanje broja. Na
primer, ako za predstavljanje celih decimalnih brojeva koristimo 8 cifara i znak, opseg vrednosti koje se mogu
predstaviti je 0 do ±999999999. Ako osam cifara koristimo za predstavljanje razlomljenog dela, tada je opseg,
obuhvaćen ovakvom reprezentacijom, od 0.0000001 do ±0.99999999. Me đutim, kod mnogih tehničkih i
naučnih primena, često je neophodno baratati brojevima koji su ili veoma veliki ili veoma mali. Umesto da
koristimo reprezentaciju u fiksnom zarezu sa velikim brojem značajnih cifara, bolje rešenje je koristiti
reprezentaciju u pokretnom zarezu. Broj u pokretnom zarezu je predstavljen manitsom (M), koja sadrži značajne
cifre, i eksponentom (M) osnove R. Format ovog zapisa je sledeći:
M × RE (5.6)
Brojevi se obično normalizuju, tako da je tačka u mantisi uvek postavljena desno od prve nenulte cifre, kao na
primer, 5.341 × 1042 ili 3.982 × 10-31. Dakle, broj u formatu pokretnog zareza se predstavlja parom (matnisa,
eksponent), a pri tome se vrednost broja izračunava shodno izrazu (5.6).
Binarna reprezentacija brojeva u formatu pokretnog zareza standardizovana je od strane organizacije IEEE. Ovaj
standard definiše dva formata: obična (ili jednostruka) preciznost i dvostruka preciznost. Na Sl. 4-61 su
prikazani oblici oba formata.
(a) (b)
Sl. 4-61 IEEE formati brojeva u pokretnom zarezu: (a) jednostruka preciznost; (b) dvostruka preciznost.
Jednostruka preciznost
Format jednostruke preciznosti prikazan je na Sl. 4-61(a). Krajnji levi bit je bit znaka; 0 ukazuje na pozitivan, a 1
na negativan broj. 8-bitno polje E sadrži vrednost eksponenta, a 23-bitno polje M vrednost mantise. Osnova je
R=2. Uočimo da se osnova ne zapisuje, već se podrazumeva. Eksponent može biti kako pozitivan tako i
negativan. Umesto da se eksponent kodira kao 8-bitni označeni broj, što bi omogućilo predstavljanje vrednosti
eksponenta u opsegu -127 do +127, za kodiranje eksponenta, kod IEEE standarda se koristi format “višak-127”.
U ovom formatu, sadržaj polja E predstavlja zbir vrednosti stvarnog eksponenta i broja 127, tj. važi:
eksponent = E – 127.
Vrednost 127 se naziva uvećanjem, a E polarizovanim eksponentom. Kodiranje eksponenta u formatu “višak-
127” omogućava da se eksponenti mogu lako porediti. S obzirom da je E uvek pozitivan broj, poređenje dva
eksponenta se svodi na poređenje dva 8-bitni neoznačena cela brojeva. Dakle, opseg vrednosti polarizovanog
eksponenta je 0≤E≤255. Pri tome, krajne vrednosti 0 i 255 imaju posebno značenje. E=0 ukazuju na broj čija je
vrednost 0 (“čista nula”); dok E=255 ukazuje na beskonačno veliku vrednost. Izuzimajući ova dva specijalna
sučaja, normalni opseg eksponenta brojeva u jednostrukoj preciznosti je -126 do +127, što odgovara opsegu
vrednosti u polju E od 1 do 254.
Mantisa se predstavlja sa 23 bita. IEEE standard podrazumera normalizovanu mantisu, što znači da je bit
najveće težine mantise uvek jednak 1. Zbog toga, ovaj bit može biti izostavljen iz zapisa mantise. Na taj način se
efektivni broj bitava mantise povećava za jedan. Naime, ako je M binarna sekvenca u polju mantise, tada je
stvarna vrednost mantise |M| = 1.M, što odgovara 24-bitnoj mantisi. Shodno tome, u formatu sa Sl. 4-61(a)
moguće je predstaviti brojeve:
Vrednost = ±1.M × 2E-127
Dužina polja mantise od 23 bita omogućava predstavljanje brojeva sa preciznošću koja odgovara preciznosti od
oko 7 decimalnih cifara. Opseg eksponenta, 2 -126 do 2127, približno odgovara opsegu 10 ±38.
Dvostruka preciznost
Format za predstavljanje brojeva u pokretnom zarezu dvostruke preciznosti prikazan je na Sl. 4-61(b). Kao što se
može videti, format dvostuke preciznosti koristi 64 bita, a u odnosu na jednostruku tačnost prošireni su i
eksponent i mantisa. Time je pokriven daleko veći opseg i ostvarena veća preciznost brojeva. Polje za eksponent
ima 11 bita i sadrži vrednost eksponenta izraženu u formatu “višak-1023”, tako da važi:
eksponent = E – 1023
186
Opseg polarizovanog eksponent je 0≤E≤2047, pri čemu se, slično kao i kod jednostruke tačnosti, E=0 i E=2047
koriste za predstavljanje vrednosti nula i beskonačno, respektivno. Time je opseg eksponenta ograničen na od 1-
1023 = -1022 do 2046 – 1023 = 1023.
Mantisa ima 52 bita. Pošto se podrazumeva normalizovana mantisa, sadržaj ovog polja ukazuje na mantisu
oblika 1.M. Dakle, vrednost broja u pokretnom zarezu koje je predstavljen u formatu dvostruke tačnosti iznosi:
Vrednost = ±1.M × 2E-1023
Format dvostruke preciznosti omogućava predstavljanje brojeva koji imaju preciznost od oko 16 decimalnih
cifara i opseg od oko 10 ±308.
Sabiranje/oduzimanje brojeva u pokretnom zarezu
Mogu se sabirati/oduzimati samo brojevi u pokretnom zarezu koji imaju isti eksponent. Ako se eksponenti
razlikuju, njihova razlika se kompenzuje pomeranjem mantisa. Na primer, neka je potrebno sabrati brojeve
9.95 × 101 i 5 × 10-1. Najpre je potrebno izjednačiti eksponente. To se može uraditi tako što će se manji od dva
broja, 5 × 10-1, napisati u obliku 0.05 × 101, odnosno tako što će se mantisa ovog broja pomeriti za dve pozicije
udesno, a eksponent sabrati sa 2. Nakon sabiranja mantisa dobijamo rezultat 10 × 101. Konačno, rezultat se
normalizuje na oblik 1 × 102.
U opštem slučaju važi sledeće. Neka su X1=(M1, E1) i X2=(M2, E2) dva broja u pokertnom zarezu, gde su
Mi=Si|Mi| vrednosti mantisa, a Xi=(-1)Si |Mi|REi-uvećanje vrednosti brojeva Xi, i=1,2 i neka je: X=X1±X2 = (M, E).
Tada:
E = max{E1, E2},
187
Sl. 4-62 Sabiranje/oduzimanje brojeva u pokretnom zarezu.
Množenje brojeva u pokretnom zarezu
Množenje brojeva predstavljenih u pokretnom zarezu se obavlja tako što se njihove mantise pomnože, a
eksponenti saberu. U opštem slučaju važi sledeće. Neka su X1=(M1, E1) i X2=(M2, E2) dva broja u pokertnom
zarezu, gde su Mi=Si|Mi| vrednosti mantisa, a Xi=(-1)Si |Mi|REi-uvećanje vrednosti brojeva Xi, i=1,2 i neka je:
X=X1 × X2 = (M, E). Tada:
M = M1 × M2
E =E1 + E2 - uvecanje
Oduzimanje uvećanja (127 kod IEEE formata) od zbira eksponenta je neophodno zato što su E1 i E2
polarizovani eksponenti, jednaki zbiru vrednosti pravog eksponenta (ei) i uvećanja, pa njihov zbir daje E1 + E2
= e1 + e2 + 2 × uvecanje.
Dakle, osnovni koraci postupka za množenje u pokretnom zarezu su:
1. Saberu se eksponenti i od dobijenog zbira oduzme uvećanje.
2. Pomnože se mantise brojeva (po pravilu za množenje celih brojeva u formatu znak i apsolutna
vrednost).
3. Dobijeni rezultat se normalizuje sličnim postupkom kao kod sabiranja.
4. Broj (binarnih) cifara proizvodu je dvostruko veći od broja cifara vrednost koje su množene; cifre koje
su višak se odbacuju u procesu zaokruživanja.
Pr. 4-11 Množenje brojeva u pokretnom zarezu
Neka je R=2 i X1=(M1, E1) = (1010, 01), X2=(M2, E2) = (1010, 10). Odrediti X = X1 × X2.
S obzirom da se eksponent predstavlja sa 2 bita, vrednost uve ćanja je 22-1-1 = 1.
X = (1010 × 1010, (01 + 10 - 1))
= (01100110, 10)
= (1100, 01) -- zaokruživanje + normalizacija
Opisani postupak sabiranja/oduzimanja brojeva u pokretnom zarezu može se predstaviti dijagramom sa Sl. 4-63,
koji ukazuje na hardversku strukturu odgovarajućeg digitalnog kola.
188
Sl. 4-63 Množenje u pokretnom zarezu.
Deljenje brojeva u pokretnom zarezu
Deljenje brojeva predstavljenih u pokretnom zarezu se obavlja tako što se njihove mantise podele, a eksponenti
oduzmu. Neka su X1=(M1, E1) i X2=(M2, E2) dva broja u pokertnom zarezu, gde su Mi=Si|Mi| vrednosti mantisa, a
Xi=(-1)Si |Mi|REi-uvećanje vrednosti brojeva Xi, i=1,2 i neka je: X=X1 × X2 = (M, E). Tada:
M = M1 / M2
E =E1 - E2 + uvecanje
Dodavanje uvećanja na razliku eksponenata je neophodno jer su E1 i E2 polarizovani eksponenti, pa njihova
razlika daje E1 - E2 = e1 + uvećanje - (e2 + uvećanje) = e1 - e2, gde su ei prave vrednosti eksponenata.
Dakle, osnovni koraci postupka za deljenje u pokretnom zarezu su:
1. Oduzmu se vrednosti eksponenata i na dobijenu razliku doda uvećanje.
2. Podele se mantise brojeva (deljenje se vrši prema pravilima za deljenje celih brojeva u formatu znak i
apsolutne vrednosti).
3. Dobijeni rezultat se normalizuje sličnim postupkom kao kod sabiranja.
4. Dobijeni količnik se zaokružuje prema pravilima za zaokruživanje.
Pr. 4-12 Deljenje u pokretnom zarezu
Neka je R=2 i X1=(M1, E1) = (1010, 01), X2=(M2, E2) = (1010, 00). Odrediti X = X1 / X2.
S obzirom da se eksponent predstavlja sa 2 bita, vrednost uve ćanja je 22-1-1 = 1.
X = (1010 / 1010, (01 - 00 + 1))
= (1 0000, 10)
= (1000, 11) -- zaokruživanje + normalizacija
Opisani postupak sabiranja/oduzimanja brojeva u pokretnom zarezu može se predstaviti dijagramom sa Sl. 4-64,
koji ukazuje na hardversku strukturu odgovarajućeg digitalnog kola.
M1 E1 M2 E2
Oduzimanje
eksponenta i
deljenje
mantisa
prekoracenje potkoracenje
Detekcija
vodećih nula Postnormalizacija
i pomerač
M E
189
4.3 Sekvencijalne komponente
Kombinaciona kola, koja su razmatrana u prethodnoj sekciji, imaju osobinu da vrednost svakog njihovog izlaza
zavisi isključivo od vrednosti signala prisutnih na njihovim ulazima. Osim kombinacionih, postoji još jedna
široka klasa digitalnih kola, kod kojih vrednosti izlaza zavise ne samo od trenutnih vrednosti ulaza, već i od
ranijeg ponašanja kola. Ovakva kola sadrže memorijske elemente koji zadržavaju, pamte odnosno memorišu
vrednosti logičkih signala. Kaže se da ukupni sadržaj svih memorijskih elemenata u jednom kolu predstavlja
stanje tog kola. Kada se promene vrednosti ulaza, kolo ili ostane u istom (tj. tekućem) stanju, ili promeni svoje
stanje. Vremenom, kao posledica promena ulaza, kolo prolazi kroz sekvencu stanja. Kolo koja se ponašaju na
ovaj način zovu se sekvencijalna kola.
Sekvencijalna kola mogu biti sinhrona ili asinhrona. Asinhrona sekvencijalna kola menjaju svoje stanje uvek
kada se desi promena ulaznih vrednosti, dok sinhrona sekvencijalna kola menjaju svoje stanje i izlazne
vrednosti samo u fiksnim vremenskim trenucima, koji su određeni rastućom ili opadajućom ivicom taktnog
signala. Lečevi su primer asinhronih kola, a flip-flopovi, registarske komponente i konačni automati sinhronih
sekvencijalnih kola.
U ovoj sekciji biće razmatrana sinhrona sekvencijalna kola. Najpre će biti opisani različiti tipovi flip-flopova, a
zatim i tipične registarske komponente koje se konstruišu pomoću flip-flopova i kombinacionih struktura.
J K Q(next) Q Q(next) J K
J Q
0 0 Q 0 0 0 X
JK 0 1 0 Q(next) = JQ + K’Q 0 1 1 X
K Q’ 1 0 1 1 0 X 1
1 1 Q’ 1 1 X 0
D Q D Q(next)
D 0 0 Q(next) = D
Q’ 1 1
T Q T Q(next)
T 0 Q Q(next) = TQ’ + T’Q
Q’ 1 Q’
190
Svaki flip-flop ima jedan ili dva ulaza podataka. SR flip-flop ima dva ulaza, S (Set) i R (Reset) koji, kada su
aktivni, setuju, odnosno resetuju flip-flop. Drugim rečima, pri S=1 i R=0, izlaz flip-flopa Q se postavlja na 1, a
pri S=0 i R=1 na 0. Slično SR flip-flopu, JK flip-flop, takođe, ima dva ulaza, J i K, koji, kada su aktivni, setuju
ili resetuju flip-flop. Dodatno, kada su oba ulaza J i K aktivna u isto vreme, JK flip-flop menja (tj.
komplementira) svoje stanje. D flip-flop ima jedan ulaz, D (Data), koji setuje flip-flop ako je 1, odnosno
resetuje flip-flop ako je 0. T flip-flop ima jedan ulaz T, koji, kada je aktivan, menja (tj. komplementira) stanje
flip-flopa.
U drugoj koloni tabele sa Sl. 4-65 date su tabele prelaza, koje predstavljaju skraćenu formu tabele istinitosti. U
tabeli prelaza, za svaku kombinaciju ulaznih vrednosti i svako tekuće stanje flip-flopa, tj. stanje pre rastuće ivice
taktnog signala, navedeno je sledeće stanje flip-flopa, tj. stanje u koje flip-flop prelazi nakon rastuće ivice
taktnog signala. Tekuće stanje flip-flopa označeno je sa Q, a sledeće sa Q(next). Tabela prelaza se koristi
prilikom analize sekvencijalnog kola, kada su vrednosni ulaza u flip-flop poznate, a mi želimo da odredimo
stanje flip-flopa nakon rastuće ivice taktnog signala. Na bazi tabele prelaza mogu se izvesti prenosne funkcije
flip-flopova, koje su prikazane u trećoj koloni tabele sa Sl. 4-65.
U četvrtoj koloni tabele sa Sl. 4-65 prikazane su tabele pobude koje se koriste prilikom sinteze sekvencijalnih
kola. Tabela pobude je inverzna tabeli prelaza i definiše ulaze flip-flopa koji su potrebni da bi flip-flop iz datog
tekućeg stanja, nakon rastuće ivice taktnog signala, prešao u željeno sledeće stanje.
Tip flip-flopa Dijagram stanja
SR
JK
191
ostalim sinhronim ulazima. Drugim rečima, dok je asinhroni ulaz aktivan, vrednosti ostalih ulaza flip-flopa se
ignorišu. Dejstvo asinhronog ulaza počinje onog trenutka kada se na ulaz dovede aktivan naponski nivo (0 ili 1),
i traje sve dok se ulaz ne deaktivira. Ako flip-flop poseduje oba asinhrona ulaza, SET i CLR, njihovo
istovremeno dejstvo nije dozvoljeno. Na Sl. 4-67 su prikazani grafički simboli flip-flopova sa ulazima za
direktno postavljanje sa aktivnim niskom naponskim nivoom, što je naznačeno kružićima na odgovarajućim
ulazima. Kod asinhronih ulaza sa aktivnim visokim naponskim nivoom, kružići su izostavljeni.
D3 Q3 D2 Q2 D1 Q1 D0 Q0
I3 I2 I1 I0
Registar
Clk
Q3 Q2 Q1 Q0
Q3 Q2 Q1 Q0
(a) (b)
Sl. 4-68 4-bitni registar: (a) grafički simbol; (b) unutrašnja struktura.
Funkcionalnost osnovne varijante registra, prikazane na Sl. 4-68, može se proširiti dodavanjem različitih
upravljačkih signala. Na primer, ako registar treba biti resetovan ili setovan nezavisno od taktnog signala, bilo
pri uključenju napajanja, bilo pri pojavi nekih specifičnih događaja, mogu se dodati signali za asinhrono
resetovanje i setovanje. Takvo jedno proširenje se postiže zamenom jednostavnih flip-flopova sa Sl. 4-68(b),
flip-flopovima sa ulazima za direktno postavljanje, kao što je prikazano na Sl. 4-69.
Kao što se vidi na Sl. 4-69, kratkotrajnim aktiviranjem signala Clear sadržaj registra se briše ili resetuje, tj.
postavlja na “sve nule”. Slično, registar se setuje, tj. njegov sadržaj postaviti na “sve jedinice”, kratkotrajnim
aktiviranjem signala Set. (S obzirom da je aktivni nivo signala Clear i Set nizak, aktiviranje jednog od ova dva
signala znači postavljanje 0 na odgovarajući ulaz). Ulazi Clear i Set su nezavisni od taktnog signala i imaju
prioritet nad njim. To znači da ako je u trenutku pojave rastuće ivice taktnog signala, Set ili Clear jednak 0, ulaz
I se ignoriše, a registar se setuje, odnosno resetuje.
192
(a) (b)
Sl. 4-69 4-bitni registar sa asinhronim resetovanjem i setovanjem: (a) grafički simbol; (b) unutrašnja struktura.
Kod obe varijante registra, prikazane na Sl. 4-68 i Sl. 4-69, novi podatak se automatski upisuje u registar sa
svakom rastućom ivicom takta. Međutim, kod mnogih digitalnih sistema, podatak koji je upisan u registar ostaje
u registru nekoliko taktnih ciklusa pre nego što se upiše novi podatak. Iz tog razloga, mogućnost kontrole upisa
predstavlja korisnu funkciju registra. Kontrola upisa se postiže korišćenjem upravljačkog signala Load (ili
Enable) koji kada je 1 dozvoljava upis novog podatka u registar. Ovakav tip registra se zove registar sa
dozvolom.
Na Sl. 4-70 su prikazani grafički simbol, tabela operacija i unutrašnja struktura registar sa dozvolom. Registar
sadrži multipleksere 2-u-1 koji omogućavaju izbor između ulaznog podatka ili podatka koje je već u registru.
Signal Load upravlja multiplekserima na takav način da kada je Load=1, u registar se upisuje novi, tj. ulazni
podatak. Sa druge strane, ako je Load=0, podatak koji je prethodno upisan u registar se vraća na ulaze flip-
flopova i sa sledećom rastućom ivicom takta ponovo upisuje u registar.
(a) (b)
(c)
Sl. 4-70 Registar sa dozvolom: (a) grafički simbol; (b) tabela operacija; (c) unutrašnja struktura.
193
Iz tog razloga, ovakav registar se zove i pomerački registar sa serijskim ulazom i paralelnim izlazom (SIPO –
Serial-In, Parallel-Out).
(a) (b)
(c)
Sl. 4-71 Četvorobitni pomerački registar sa serijskim ulazom i paralelnim izlazom: (a) grafički simbol; (b) tabela
operacija; (c) unutrašnja struktura.
Korišćenjem multpleksera 4-u-1, umesto multipleksera 2-u-1, moguće je kombinovati funkcije pomeranja i
paralelnog upisa. Na primer, pomerački registar sa Sl. 4-72 ima mogućnost kako pomeranja memorisanog
sadržaja tako i upisa novog podatka. Takođe, registar sa Sl. 4-72 može da obavlja pomeranje u oba smera. Pri
pomeranju na levo 1-bitni podatak sa ulaza IR (serijski ulaz sa desne strane) se upisuje na krajnju desnu
poziciju, dok se pri pomeranju na desno, na krajnju levu poziciju se upisuje 1-bitni podatak sa ulaza IL (serijski
ulaz sa leve strane). Na Sl. 4-72 (a) i (b) su prikazani grafički simbol i tabela operacija, dok se na Sl. 4-72 (c)
može videti unutrašnja struktura ovog multi-funkcijskog registra.
Registar sa Sl. 4-72 čine četiri razreda, gde svaki razred odgovara jednoj bitskoj poziciji i sastoji se od jednog
flip-flopa i multipleksera 4-u-1. Postoje tri tipa razreda, koji se neznatno razlikuju u strukturi: krajnji levi, krajnji
desni i srednji. Srednji razredi se obično projektuju prvi, pošto je njihova funkcija najočiglednija. Na primer,
jednačine ulaza flip-flopova za svaki od tri tipa razreda, dobijene na osnovu tabele operacija sa Sl. 4-72(c) imaju
sledeći oblik:
D0=S1’S0’Q0+S1’S0’I0+S1S0’IR+S1S0Q1
D1=S1’Si’Q0+S1’S0’Ii+S1S0’Qi-1+S1S0Qi+1, 1≤i≤2
D2=S1’S0’Q3+S1’S0’I3+S1S0’Q2+S1S0IL
Pomerački registar sa paralelnim upisom može se koristiti za konverziju informacija iz serijskog u paralelni
oblik i obrnuto, sa opcijom da prilikom paralelno-serijske konverzije prvo generiše bit najmanje ili bit najveće
težine. Registri ovog tipa, često se koriste za konverziju računarskih podataka u serijski oblik pogodan za
komunikaciju i rekonstrukciju serijski prenetih podataka u cilju obrade unutar računara.
Sledeće stanje
Operacija
S1 S0 Q3 Q2 Q1 Q0
S0 IL I3 I2 I1 I0 IR
0 0 Bez promene Q3 Q2 Q1 Q0
S1 Pomerački registar
0 1 Par. upis I3 I2 I1 I0
Q 3 Q2 Q1 Q0
1 0 Pomeranje na levo Q2 Q1 Q0 IR
1 1 Pomeranje na desno IL Q 3 Q2 Q1
(a) (b)
194
(c)
Sl. 4-72 4-bitni pomerački registar sa paralelnim upisom: (a) grafički simbol; (b) tabela operacija; (c) unutrašnja
struktura.
4.3.2.3 Brojač
Brojač je posebna vrsta registara koji sadrži inkrementer, što omogućava brojanja naviše ili naniže. Na primer,
na Sl. 4-73 je prikazan brojač naviše koji ima dva upravljačka signala: signal dozvole (E), koji kada je 1
omogućava brojanje i signal Clear koji resetuje brojač, tj. postavlja ga u stanje 0. Grafički simbol 4-bitnog
binarnog brojača naviše prikazan je na Sl. 4-73(a), a tabela operacija na Sl. 4-73(b). Shodno Sl. 4-73(d)
inkrementer se sastoji od niza polu-sabirača (half-adder – HA) raspoređenih tako da su dva ulaza polu-sabirača
na bitskoj poziciji i povezani na izlaz i-tog flip-flopa Qi i izlazni prenos polu-sabirača sa pozicije i-1, Ci. Uočimo
da će nova vrednost flip-flopa Di biti 1 ako je bilo Qi bilo Ci, ali ne oba, jednako 1. Suprotno tome, izlaz Ci+1
biće jednak 1 samo ako su Qi i Ci oba jednaki 1. Tabela istinitosti polu-sabirača data je na Sl. 4-73(c). Polazeći
od ove tabele dolazimo do sledećih jednačine za Di i Ci+1:
Di = Qi ⊕ Ci
Ci+1= QiCi
Sve dok je signal E jednak 1, brojač će brojati naviše po modulu 16, dodajući 1 na svoj tekući sadržaj sa
svakom rastućom ivicom taktnog signala.
(c)
Sl. 4-73 4-bitni binarni brojač: (a) grafički simbol; (b) tabela operacija; (c) tabela istinitosti polu-sabirača; (d)
unutrašnja struktura.
195
Obostrani brojač, tj. brojač koji može brojati i naviše i naniže, konstruiše se tako što se u brojaču naviše polu-
sabirači zamene polu-sabiračima/oduzimačima (half-adder/substractor – HAS). HAS moduli, pod kontrolom
signala za izbor smera brojanja, obavljaju inkrementiranje ili dekrementiranje. Na primer, na Sl. 4-74 prikazan je
obostrani brojač koji u najvećem delu nalikuje brojaču naviše sa Sl. 4-73 s tom razlikom što poseduje dodatni
upravljački ulaz, D. Kao što je ukazano tabelom operacija sa Sl. 4-74(b), svrha ovog dodatnog ulaza je
postavljanje brojača u režim brojanja naviše, kada je njegova vrednost 0, odnosno u režim brojanja naniže, kada
je njegova vrednost 1. Na osnovu tabela istinitosti polu-sabiračima/oduzimačima sa Sl. 4-74(c) možemo izvesti
sledeće jednačine za Di i Ci+1:
Di = Qi ⊕ Ci
Ci+1= D’QiCi+ DQi’Ci
Kao što vidimo na Sl. 4-74(d), svaki polu-sabirač/oduzimač se sastoji od jednog XOR kola povezanog na ulaz
flip-flopa, kao i dva AND i jednog OR kola koja se koriste za propagaciju izlaznog prenosa.
Važno je uočiti da obostrani brojač sa Sl. 4-74 uvek počinje brojanje od 0. Međutim, u mnogim primenama
korisno je imati mogućnost postavljanja brojača na vrednost različitu od nule, a zatim nastaviti sa brojanjem,
naviše ili naniže. Ovakav tip brojača se zove brojač sa paralelnim upisom, a konstruiše se kombinovanjem
inkrementera/dekrementera i registra sa dozvolom. Kao što je prikazano na Sl. 4-75, brojač sa paralelnim upisom
ima tri upravljačka signala: E, D i Load. Signal E omogućava brojanje u smeru koji je određen signalom D, dok
signal Load, uvek kada je 1, zabranjuje brojanje i upisuje u registar podatak sa ulaza I. Sa druge strana, ako je
Load=0, brojač se ponaša na identičan način kao obostrani brojač sa Sl. 4-75. Tabela operacija i unutrašnja
struktura brojača sa paralelnim upisom prikazani su na Sl. 4-75(b) i (c).
E D Qi Ci Ci+1 Di
1 0 0 0 0 0
1 0 0 1 0 1
1 0 1 0 0 1
D 1 0 1 1 1 0
E Obostrani brojač E D Operacija
1 1 0 0 0 0
Clear Q3 Q2 Q1 Q0 0 X Bez promene 1 1 0 1 1 1
1 0 Brojanje naviše 1 1 1 0 0 1
1 1 Brojanje naniže 1 1 1 1 0 0
(c)
Sl. 4-74 4-bitni obostrani brojač: (a) grafički simbol; (b) tabela operacija; (c) tabela istinitosti polu-
sabirača/oduzimača; (d) unutračnja struktura.
Load E D Operacija
D
E Obostrani brojač 0 0 X Bez promene
0 1 0 Brojanje naviše
Load Q3 Q2 Q1 Q0
0 1 1 Brojanje naniže
1 X X Paralelni upis
(a) (b)
196
I3 I2 I1 I0
D
E
1 0 1 0 1 0 1 0
mux mux mux mux
Load
D3 Q3 D2 Q2 D1 Q1 D0 Q0
Clk
Izlazni Q3 Q2 Q1 Q0
prenos
(c)
Sl. 4-75 4-bitni obostrani brojač sa pralelenim upisom: (a) grafički simbol; (b) tabela operacija; (c) unutrašnja
struktura.
197
(a) (b)
(c)
Sl. 4-76 Registarski fajl sa jednim portom za upis i jednim portom za čitanje: (a) ćelija registarskog fajla; (b) grafički
simbol; (c) unutrašnja struktura.
Glavno ograničenje registarskog fajla sastoj se u činjenici da on omogućava ograničen pristup registrima iz fajla
– tj. uvek se može upisivati samo u jedan registar (vrstu) i čitati iz samo jednog registara (vrste). Ovakva
situacija može se donekle popraviti konstrukcijom registarskog fajla sa više od jednog porta za čitanje ili upis.
Nažalost, cena registarskog fajla raste srazmerno broju portova. Iz tog razloga, većina popularnih tipova
registarskih fajlova ima jedan ili dva porta za upis i dva porta za čitanje. Glavno opravdanje za dva porta za
čitanje jeste da su većina aritmetičkih i logičkih operacija binarne i da stoga, u isto vreme, zahtevaju dva
operanda. Sa dva porta za čitanje i jednim za upis, moguće je, u toku istog taktnog ciklusa, iz registaraskog fajla
pribaviti dva operanda i smestiti rezultat nazad u registarski fajl. Sa druge strane, opravdanje za korišćenje dva
porta za upis leži u brzini konzumiranja operanada: U svakom taktnom ciklusu koristimo dva operanda da bi
smo dobili jedan rezultat. Shodno tome, ako nam je cilj da obavljamo jednu operaciju po taktnom ciklusu, mora
postojati mogućnost da se u svakom taktnog ciklusu, pored rezultata koji se vraća u registarski fajl u registarski
fajl unese i jedan novi podatak.
(a) (b)
198
WA1 WA0 WE I3 I2 I1 I0 RAB1 RAB0 REB RAA1 RAA0 REA
Dekoder za Dekoder za
čitanje čitanje
0
2-u-4 2-u-4
0 0
1
1
2 1
2
3 2
Dekoder
za upis 3
3
2-u-4
B3 A3 B2 A2 B1 A1 B0 A0
(c)
Sl. 4-77 Registarski fajl sa jednim upisnim portom i dva porta čitanje: (a) ćelija registarskog fajla; (b) grafički
simbol; (c) unutrašnja struktura.
Na Sl. 4-77 prikazan je primer registarskog fajla sa jednim portom za upis i dva porta za čitanje. Kao što se vidi
na Sl. 4-77(a), ćelija registarskog fajla je modifikovana u odnosu na Sl. 4-77(a) kako bi se obezbedila podrška za
dva porta za čitanje. Grafički simbol registarskog fajla prikazan je na Sl. 4-77(b). Na Sl. 4-77(c) prikazana je
unutrašnja struktura registarskog fajla kapaciteta 4x4. Uočimo da je dijagram sa Sl. 4-77(c) sličan strukturi
registarskog fajla sa Sl. 4-77(c), osim što nova verzija ima dodatni dekoder za čitanje, koji, sa svoje strane, unosi
po jednu dodatnu vezu ka svakoj vrsti i koloni. Uz pomoć ovih veza omogućen je prenos sadržaja do drugog
porta za čitanje.
Registarski fajlovi spadaju u brze memorijske komponente, zahvaljujući činjenici da su memorijske ćelije
realizovane na bazi flip-flopova ili leč kola. Međutim, s obzirom da svaki flip-flop sadrži barem 6 tranzistora,
registarski fajl je skupa memorija. Iz tog razloga, registarski fajlovi se tipično koriste kao privremena memorija
malog kapaciteta kod aplikacija koje zahtevaju veliku brzinu obrade podataka.
4.3.2.5 FIFO
FIFO red je struktura koja se često koristi kada treba uravnotežiti zahteve za nekom obradom. Zamislimo, na
primer, ljude kako stoje ispred šaltera u banci ili kako ulaze u autobus, koji moraju čekati u redu dok ne stignu
na red da budu opsluženi. Slična situacija se javlja kod različitih procesora, ASIC kola ili bilo kog uređaja koji
šalje podatke nekom drugom uređaju radi dalje obrade, u smislu da onda kada u jednom trenutku brzina
generisanja podataka nadmaši brzinu kojom se podaci obrađuju, neophodno je između proizvođača i potrošača
umetnuti red čekanja, tj. FIFO red. Naravno, u takvim situacijama, brzina kojom proizvođač generiše podatke ne
može u nedogled biti veća od brzine kojom potrošač može da prihvata podatke, jer bi to zahtevalo red čekanja
beskonačne dužine. U svakom slučaju, u proseku, obe brzine moraju biti iste, a veličina reda čekanja određuje
koliko dugo se može tolerisati neujednačenost između zahteva za obradom i brzine obrade.
Svrha FIFO reda je da sačuva podatke upućene potrošaču, koje on trenutno nije u stanju da prihvati, ali koje će u
dogledno vreme preuzeti i to u redosledu u kome su oni poslati. Znači, podatak koji je prvi upisan u FIFO, prvi
se i čita, i td., kao što je ilustrovano na Sl. 4-78. Na Sl. 4-78(a) je prikazan red čekanja nakon što su brojevi 23 i
34 upisani, ali pre nego što je stigao broj 45. Na Sl. 4-78(b) možemo videti sadržaj FIFO reda nakon upisa broja
45. Uočimo da je nakon čitanja FIFO reda, broj 23 odbačene i da je sadržaj reda pomeren za jednu poziciju na
dole. Sadržaj reda čekanja nakon pomeranja prikazan je na Sl. 4-78(c).
199
(a) (b) (c)
Sl. 4-78 Princip rada FIFO reda: (a) sadržaj reda pre upisa broja 45; (b) sadržaj reda posle upis broja 45; (c) sadržaj
reda nakon čitanja broja 23.
Na Sl. 4-79 je prikazan blok dijagram FIFO reda. U opštem slučaju, FIFO red ima m ulaznih linija INi i m
izlaznih linija OUTi, gde je 0≤i≤m-1. Na izlazu OUT prisutan je podatak sa početka reda, tj. podatak koji je
najduže u redu čekanja. Na ulaz IN postavlja se podatak koji treba upisati u red. Takođe, FIFO red ima tri
upravljačka signala: R/W, Enable i Reset. Signal R/W služi za izbor operacije, upis ili čitanje. Za R/W=0, a pod
dejstvom taktnog signala clk, u FIFO se upisuje podatak prisutan na ulazu IN i smešta na kraj reda čekanja. Za
R/W=1, takođe pod dejstvom taktnog signala clk, iz FIFO reda se uklanja podatak sa početka reda (tj. podatak
koji je najduže u redu čekanja). Signal Enable se koristi kao dozvola upisa/čitanja. Upis/čitanje je dozvoljeno
ako je Enable=1. U suprotnom, Enable=0 onemogućava dejstvo taktni signal (sadržaj FIFO reda ostaje
neizmenjen). Signal Reset služi za resetovanje (pražnjenje) FIFO reda. Tipična realizacija FIFO reda ima još dva
statusna signala, Full i Empty, koji se koriste za kontrolu proizvođača i potrošača. Kada je red pun, signal Full
ima vrednost 1, što predstavlja upozorenje proizvođaču da će svaki naredni poslati podatak biti odbačen. Kada
se red isprazan, signal Empty postaje 1, što predstavlja upozorenje potrošaču da novi podaci još uvek nisu stigli.
200
Svrha izlazne logike je generisanje signala Full i Empty. Red čekanja je prazan (Empty=1) ako je stanje brojača
111, a pun (Full=1) ako je stanje brojača 011. U svim ostalim stanjima brojača, oba signala, Full i Empty, imaju
vrednost 0. Dakle:
Full = Q2’Q1Q0
Empty = Q2Q1Q0
Na Sl. 4-80 (c) dat je šematski prikaz FIFO reda dužine 4.
Read/
Enable Operacija R/W Enable S D E
write
X 0 Bez promene X 0 0 X 0
0 1 Čitanje 0 1 0 1 1
1 1 Upis 1 1 1 0 1
(a) (b)
(c)
Sl. 4-80 FIFO red dužine 4 reči: (a) tabela operacija; (b) tabela upravljanja; (c) šematski prikaz.
Redovi čekanja veće dužine, obično, umesto pomeračkih registara, za smeštanje podataka koriste RAM
memoriju i sadrže dva brojača koji ukazuju na početak i kraj reda. Takva jedna struktura poznata je pod
nazivom kružni bafer. Simbolička predstava kružnog bafera prikazana je na Sl. 4-81(a). Uočimo da struktura sa
Sl. 4-81(a) koristi RAM memoriju kapaciteta 1K reči i dva brojača, označena kao Početak i Kraj. Brojač Početak
sadrži adresu najranije upisanog podatka. Uvek kada se zahteva operacija čitanja, podatak se čita sa adrese na
koju ukazuje brojač Početak i postavlja na U/I magistralu, a brojač Početak se inkrementira. Brojač Kraj sadrži
adresu prve prazne lokacije u redu. Prilikom operacije upisa, podatak se upisuje na lokaciju na koju ukazuje
brojač Kraj, a brojač Kraj se inkrementira. Ukoliko se podaci iz reda češće čitaju nego upisuju, desiće se
situacija da bajač Početak ukazuje na istu lokaciju kao i brojač Kraj, što znači da je red prazan. Sa druge strane,
ako se u rad podaci češće upisuju nego što se čitaju, brojač Kraj koji se inkrementira po modulu 1024, u jednom
trenutku ukazivaće na istu lokaciju kao i brojač Početak, što, međutim, sada znači da je red pun. Da bi se izbegla
dvosmislenost u značenju uslova Početak=Kraj, umesto 10-bitnih možemo koristiti 11-bitne (po modulu 2048)
brojače. Kod ovakve realizacije, red čekanja je prazan ako su sadržaji oba brojača identični, dok je red pun ako
se sadržaji brojača razlikuju samo na bitu najveće težine.
201
Na Sl. 4-81 prikazana je realizacija FIFO reda koja koristi 1K RAM i dva brojača. Takođe, FIFO sadrži
multiplekser preko koga se bira jedan od brojača kao izvor adrese za RAM i komparator koji poredi sadržaje
brojača. Tabela operacija je prikazana na Sl. 4-81(b), tabela upravljanja na Sl. 4-81 (c), dok je na Sl. 4-81(d) dat
konačni šematski izgled FIFO reda zasnovanog na RAM memoriji.
0 prazno
1 podatak Početak
2 podatak
Read/ Read/ E E
... Enable Operacija Enable S CS RWS
write write (Početak) (Kraj)
1021 podatak Bez
X 0 X 0 X 0 X 0 0
promene
1022 prazno Kraj
0 1 Čitanje 0 1 1 1 0 1 0
1023 prazno
1 1 Upis 1 1 0 1 1 0 1
(a) (b) (c)
(d)
Sl. 4-81 FIFO red realizovan na bazi 1K RAM memorije: (a) princip rada; (b) Tabela operacija; (c) Tabela
upravljanja; (d) šematski prikaz.
4.3.2.6 Stek
Stek (stack) je memorijska struktura koja se često koristi kako u softveru tako i u hardveru. Po definiciji, stek je
memorija sa ograničenim pristupom. Za razliku od RAM memorije gde se bilo kom zapamćenom podatku može
pristupati u bilo kom vremenu, podacima zapamćenim u steku pristupa se samo preko jedne lokacije: vrh steka.
Drugim rečima, kada se podatak upisuje u stek, ili stavlja na stek (operacije push), on se smešta na vrh steka i
pri tome se svi prethodno upisani podaci spuštaju za jednu poziciju niz stek. Suprotno tome, kada se podatak
čita iz steka ili uzima sa steka (operacija pop), on se sklanja sa vrha steka i pri tome se svi ostali podaci podižu
za jednu poziciju naviše uz stek. Na Sl. 4-82(a) je prikazan stek dubine 4 (tj. kapaciteta 4 reči) koji inicijalno
sadrži dva broja: 34 na lokaciji Top i 23 na lokaciji Top-1. Na Sl. 4-82(b) može se videti da stavljanje broja 45 na
stek zahteva da brojevi 34 i 23 budu premešteni na lokacije Top-1 i Top-2. Sa druge strane, kada se broj 45
uzima sa steka, brojevi 34 i 23 se pomeraju naviše tako da ponovo zauzimaju lokacije Top i Top-1 (Sl. 4-82(c)).
U ovom konkretnom slučaju, na stek se može staviti najviše četiri broja, pre nego što se stek napuni. Nakon
toga, svaki novi upis u stek znači gubitak podatka sa dna steka.
202
(a) (b) (c)
Sl. 4-82 Princip rada steka: (a) sadržaj steka pre upisa broja 45; (b) sadržaj steka nakon upisa broj 45; (c) sadržaj
steka nakon čitanja broja 45.
Prilikom projektovanja steka, važno je uočiti da se prilikom operacija upisa i čitanja, zapamćeni podaci
pomeraju za jednu poziciju naniže, odnosno naviše. Na osnovu ovog zapažanja zaključujemo da za realizaciju
steka treba koristiti pomeračke registre u kombinaciji sa obostranim brojačem za detekciju praznog, odnosno
punog steka. Ove komponente su korišćene za realizaciju m-bitnog steka dubine 4 koji je prikazan na Sl. 4-83.
Uočimo da ovaj stek ima m ulaznih linija INi i m izlaznih linija OUTi, gde je 0≤i≤m-1. Takođe, stek ima tri
upravljačka signala, Push/pop, Enable i Reset.
Signal Push/pop upravlja upisom i čitanjem iz steka. Kada je Push/pop=0, podatak se upisuje u stek; kada je
Push/pop=1, podatak se čita iz steka. Signal Enable omogućava (dozvoljava) rad steka, dok signal Reset, uvek
kada je 0, briše sadržaj pomeračkih registara i resetuje obostrani brojač. Rad steka je opisan tabelom operacija sa
Sl. 4-83(a). Uočimo da stek ima dva izlazna signala, Empty i Full, koji ukazuju na status steka, na sledeći način:
kada Empty ima vrednost 1, stek je prazan; sa druge strane, kada Full ima vrednost 1, stek je pun.
Izlazi
brojača
Push/ Enable Operacija Kontrola
pop Kontrola Q2 Q1 Q0 Empty Full
pom.
X 0 Bez Push/ brojača 0 0 0 1 0
registra
promene pop Enable S1 S0 D E 0 0 1 0 0
0 1 Upis X 0 0 0 X 0 0 1 0 0 0
(push)
1 1 Čitanje 0 1 1 1 0 1 0 1 1 0 0
(pop) 1 1 1 0 1 1 1 0 0 0 1
(a) (b) (c)
(d)
Sl. 4-83 Stek dubine 4. (a) tabela operacija; (b) tabela izlaza; (c) tabela upravljanja; (d) struktura steka.
203
Na Sl. 4-83(d) se može videti da se stek sastoji od m 4-bitnih pomeračkih registara sa paralelnim upisom tako da
svakom ulazu odgovara jedan pomerački registar. Pri svakom upisu u stek, svi pomerački registri obavljaju
operaciju pomeranja na desno. Slično, pri svakom čitanju iz steka, svi pomerački registri obavljaju operaciju
pomeranja na levo. Svaki novi podatak koji se stavlja na stek preko ulaza IL pomeračkog registra i upisuje se na
poziciju Q3, koja predstavlja vrh steka. Stanje brojača ukazuje na broj podataka u steku. Sinhronizovano sa
svakom rastućom ivicom taktnog signala, pomerački registri obavljaju pomeranje na desno, a brojač broji
unapred za 1 (Push/pop=0 i Enable=1), odnosno pomeranje na levo i brojanje unazad (Push/pop=1 i Enable=1).
Vrednosti upravljačkih signala pomeračkih registara i brojača mogu se izvesti na osnovu tabele upravljanja koja
je prikazana na Sl. 4-83(b). Na osnovu ove tabele možemo izvesti sledeće jednačine:
S1 = Enable
S0 = (Push/pop)’Enable
D = (Push/pop)Enable
E = Enable
Realizacija ovih jednačina predstavlja upravljačku logiku steka.
Na osnovu tabele izlaza sa Sl. 4-83(c), vidi se da izlazna logika dekoduje stanja brojača 000 i 100. Uvek kada je
stanje brojača 000, signal Empty biće 1; u bilo kom drugom stanju Empty je 0. Suprotno, uvek kada je stanje
brojača 100, signal Full biće 1; u bilo kom drugom stanju Full je 0. Na osnovu toga, možemo izvesti sledeće
Bulove jednačine za izlaznu logiku:
Empty = Q2’Q1’Q0’
Full = Q2Q1’Q0’
Radi preglednosti, na Sl. 4-83(d) je izostavljen taktni signal koji pobuđuje pomeračke registre i brojač.
Glavna slabost rešenja steka sa Sl. 4-83 ogleda se u činjenici da je za realizaciju steka veće dubine potreban
veliki broj ¨skupih¨ pomeračkih registara. Iz tog razloga, za realizaciju steka većeg kapaciteta koristi se RAM
memorija. Sa druge strane, pošto RAM memorija nema mogućnost pomeranja memorisanog sadržaja, push i
pop operacije moraju biti realizovane na nešto drugačiji način – promenom tekuće lokacije vrha steka. Drugim
rečima, kada se podaci stavljaju na stek, adresa vrha steka biće uvećana za jedan pri svakom upisu novog
podatka. Suprotno, kada se podaci uzimaju sa steka, adresa vrha steka biće smanjena za jedan pri svakom
čitanju podatka. Neka je, na primer, stek prazan: vrh steka je na adresi 0. Pri svakom upisu podatka, podatak se
upisuje na vrh steka, a adresa vrha se uvećava za jedan, tako da vrh steka uvek ukazuje na praznu lokaciju u
koju će biti upisan sledeći podatak. Sa druge strane, pri svakom čitanju podatka, podatak se uzima iz lokacije
koja se nalazi odmah ispod vrha steka, na adresi za jedan manje od adrese vrha steka. Sledeći ovu logiku, znamo
da je za RAM memoriju kapaciteta 2n reči stek prazan ako je vrh steka na adresi 0, a pun ako je vrh na adresi 2n-
1. Uočimo da se lokacija sa adresom 2n-1 nikada ne koristi za smeštanje podatka, već samo za određivanje da li
je stek prazan. Iako se na ovaj način gubi jedna od 2n raspoloživih reči RAM memorije, opisani pristup značajno
pojednostavljuje izlaznu logiku.
Na Sl. 4-84 je prikazana realizacija steka koja koristi RAM memoriju kapaciteta 1K (2 10) i dva brojača koji
ukazuju na vrh steka i prvu lokaciju ispod vrha. Uočimo da su ulazi i izlazi i operacije steka identične kao na Sl.
4-83. Kao što se vidi sa Sl. 4-84(d), stek čine: dva 10-bitna brojača, jedan 10-bitni multiplekser 2-u-1, 1K RAM,
upravljačka i izlazna logika. Dva brojača, nazvana Top i Top-1, razlikuju se za 1, i oba se uvećavaju za jedan pri
svakoj push operaciji, a umanjuju za jedan pri pop operaciji. Pri operaciji push, adresa RAM-a je sadržaj brojača
Top, dok pri operaciji pop, adresa RAM-a je sadržaj brojača Top-1.
Polazeći od prethodnog razmatranja, u mogućnosti smo da konstruišemo tabelu upravljanja koja je prikazana na
Sl. 4-84(c) koja sadrži vrednosti svih internih signala koji upravljaju brojačima, multiplekserom i RAM
memorijom kako pri push i tako i pri pop operaciji. Na osnovu ove tabele, možemo izvesti sledeće Bulove
jednačine za upravljačku logiku:
E = CS = Enable
S = RWS = (Push/pop)’Enable
D = (Push/pop)Enable
Izlaznu logiku čine dva gejta koja ukazuju kada je stek pun, odnosno prazan. Pošto je stek prazan uvek kada je
sadržaj brojača Top jedak 0, da bi se detektovao uslov Empty koristi se 10-ulazno NOR kolo čiji ulazi su
povezani na izlaze brojača Top. Slično, stek je pun uvek kada brojač Top sadrži sve jedinice, što se detektuje 10-
ulaznim AND. Šematski prikaz strukture steka zasnovanog na RAM memoriji prikazan je na Sl. 4-84(d).
204
Push/
pop Enable Operacija Kontrola Kontrola Kontrola
X 0 Bez Push/ mux-a mem. broj.
promene pop Enable S CS RWS D E
0 1 Upis
X 0 X 0 0 X 0
(push)
1 1 Čitanje 0 1 1 1 1 0 1
(pop) 1 1 0 1 0 1 1
(d)
Sl. 4-84 Realizacija steka na bazi RAM memorije: (a) Simboličko rešenje; (b) Tabela operacija; (c) Tabela
upravljanja; (d) šematski prikaz.
205