3 Signali in prireditveni stavki Najpreprostejši stavek za opis kombinacijskih funkcij je prireditveni stavek, kjer signalu z operatorjem <= priredimo konstantno vrednost ali izraz. Enobitne konstantne vrednosti morajo biti zapisane med enojnimi narekovaji, za vektorske konstante pa uporabljamo dvojne narekovaje. Npr. -bitni vektor a postavimo na vredost 5: a <= "000001"; $e želimo vse bite vektorja postaviti na enako vrednost, uporabimo poseben zapis agregat. Agregat je zelo uporaben takrat, kadar imamo velike vektorje, ki jih želimo postaviti npr. na 0: a <= (others => '0'); Tabela 4. Vektorski signali Deklaracija -bitnega vektorja: a: std_logic_vector (7 downto 0); Prirejanje vrednosti: - celotnemu vektorju: a <= "0001"; - postavitev na ni*: a <= (others => '0'); - posameznemu bitu: a(7) <= '0'; - podvektorju: a(3 downto 0) <= "01"; Z vektorskimi signali lahko v jeziku VHDL izvajamo aritmeti.ne in logi.ne operacije. Logi.ni operatorji se pri sintezi vezja preslikajo direktno v logi.na vrata logi.ne operacije se izvajajo nad posameznimi biti, tako da dobimo toliko dvovhodnih logi.nih vrat kolikor imamo bitov. Primer: signal a, b: std_logic_vector(3 downto 0); c <= ( a and b ) xor "01"; Izrazi predstavljajo kombinacijsko logiko, katere izhod je signal, ki mu priredimo vrednost. V izrazu s 4-bitnimi vektorji je vsak logi.ni operator ponovljen štirikrat vezje vsebuje 4 vrata and in 4 vrata xor. Posameznemu signalu lahko le enkrat priredimo vrednost. $e zapišemo ve. prireditvenih stavkov za isti signal, bi dobili v vezju kratek stik!
3.1 Pogojni prireditveni stavek Kadar želimo nekemu signalu prirediti ve. razli.nih vrednosti ali izrazov pod dolo.enimi pogoji, uporabimo pogojni prireditveni stavek. Pogoj zapišemo z uporabo relacijskih operatorjev (glej tabelo 6). Tabela 5. Pogojni prireditveni stavek signal <= izraz1 when pogoj1 else izraz; signal <= izraz1 when pogoj1 else izraz when pogoj else izraz3; A Izbiralnik V splošnem s pogojnim prireditvenim stavkom izbiramo med dvema ali ve. izrazi, ki predstavljajo kombinacijske funkcije. Pogojni prireditveni stavek v osnovni obliki izbira med dvema izrazoma, zato vezje vsebuje dvovhodni izbiralnik (multipleksor): izraz1 izraz signal pogoj Slika 9. Dvovhodni izbiralnik Primer: dvovhodni štiribitni izbiralnik je vezje, ki postavi na izhod vrednost enega izmed dveh 4-bitnih vektorskih signalov a ali b. a(0) signal a, b: std_logic_vector(3 downto 0); izhod(0) b(0) izhod <= a when izbira='0' else b; a(1) izhod(1) b(1) $e je signal izbira postavljen na logi.no a() ni.lo, se prenese na izhod vrednost signala izhod() a, sicer pa vrednost signala b. Štiribitni b() vektorski izbiralnik je sestavljen iz štirih a(3) izhod(3) enobitnih izbiralnikov s skupnim izbirnim b(3) vhodom. izbira Slika. Štiribitni izbiralnik
Primer: narediti želimo kombinacijsko funkcijo, ki signalu x prišteje absolutno vrednost signala y. To lahko storimo z dvodelno funkcijo, ki naredi vsoto (x+y) kadar je y pozitiven oz. razliko (x-y),.e je y negativen: signal x, y: std_logic_vector(3 downto 0); izhod <= x+y when y>0 else x-y; Vezje dvodelne funkcije je narejeno z dvovhodnim vektorskim izbiralnikom, ki izbira med vektorskim signalom iz seštevalnika in signalom iz odštevalnika. Izbirni vhod vektorskega izbiralnika krmili primerjalnik, kot prikazuje slika. Kadar je vrednost signala y pozitivna, bo dal primerjalnik na izhod logi.no '1', sicer pa bo na izhodu primerjalnika logi.na '0'. x + y x izhod + izhod y >0 Slika. Vezje dvodelne funkcije >0 Slika. Sintetizirano vezje Program za sintezo vezij naredi vezje iz gradnikov, ki jih ima na voljo. $e je na voljo seštevalno-odštevalni gradnik, ga uporabi in naredi bolj optimalno vezje, kot prikazuje slika. B Primerjalnik Primerjalnik dobimo v vezju vsakokrat ko primerjamo vrednosti dveh vektorskih signalov z uporabo relacijskih operatorjev. Tabela 6. Relacijski operatorji = /= > >= < <= enako ni enako ve*je ve*je ali manjše manjše ali enako enako Operatorja enako in ni enako sta definirana za vse tipe podatkov, ostali pa za skalarne in vektorske tipe. Tabela 6 predstavlja relacijske operatorje v jeziku VHDL, ki jih lahko uporabljamo v pogojih pri pogojnem prireditvenem stavku. Preprost
primerjalnik opišemo tako, da uporabimo v pogojnem prireditvenem stavku namesto izrazov kar konstantne vrednosti: enako <= '1' when x=y else '0'; Pri primerjavi vrednosti vektorskih signalov se njihova vrednost interpretira kot nepredzna.eno ali predzna.eno število v dvojiškem zapisu, kar dolo.amo z uporabo knjižnjic in paketov. Primer: primerjalnik velikosti vhodne vrednosti 1 3 4 5 6 7 9 library IEEE; use IEEE.STD_LOGIC_64.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity Primerjalnik is port ( x : in std_logic_vector(7 downto 0); izhod : out std_logic); end Primerjalnik; architecture opis of Primerjalnik is izhod <= '1' when x> else '0'; end opis; V opis vezja je vklju.en paket STD_LOGIC_UNSIGNED v katerem so definirane operacije nad vektorji tipa std_logic_vector, ki predstavljajo nepredzna.ene vrednosti. Primerjalni operatorji so v knjižnjici definirani tako, da lahko primerjamo med seboj vektorske vrednosti (npr. x>"0000") ali pa vektorje in cela števila (npr. x>). $e bi uporabili paket STD_LOGIC_SIGNED, bi bil operator primerjave definiran za predzna.ene vrednosti. Rezultat primerjave bi bil enak '1' za vrednosti med "0000" (desetiško ) in "01" (desetiško 7). Kadar je najvišji bit vektorja x enak ena, se v tem primeru vrednost obravnava kot negativna in rezultat primerjave bo enak '0'. Kompleksnejše primerjave naredimo z uporabo logi.nih operatorjev: obmocje <= '1' when x> and x<0 else '0'; x > <0 obmocje Slika. Sestavljeni primerjalnik
C Prekinitveni kodirnik Naloga prekinitvenega kodirnika je, da med aktivnimi prekinitvenimi signali izbere tistega, ki ima prioriteto in izbiro sporo.i v obliki prekinitvenega vektorja. p1 p p3 PrekKod vektor prekini Slika. Model prekinitvenega kodirnika Poglejmo si primer kodirnika, ki ima na vhodu tri prekinitvene signale: p1, p in p3. Prekinitveni vektor naj bo dvobitna vrednost, ki pove zaporedno številko aktivne prekinitve. $e je hkrati postavljenih ve. prekinitev, je izbrana prekinitev z nižjo številko. Vezje naj ima tudi izhod prekini, ki naj bo postavljen na '1',.e je aktiven katerikoli prekinitveni vhod. 1 3 4 5 6 7 9 17 1 library IEEE; use IEEE.STD_LOGIC_64.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity PrekKod is port ( p1, p, p3 : in std_logic; vektor : out std_logic_vector(1 downto 0) ; prekini : out std_logic ); end PrekKod; architecture opis of PrekKod is vektor <= "01" when p1='1' else "" when p='1' else "" when p3='1' else "00"; prekini <= '1' when p1='1' or p='1' or p3='1' else '0'; end opis; Vezje je opisano s pogojnim prireditvenim stavkom v razširjeni obliki, kjer imajo zaporedni pogoji prioriteto. Pogoj, ki je napisan prvi (int1='1') se najprej preveri in.e ni izpolnjen, se preveri drugi pogoj (int='1') in tako naprej. $e sta torej dva pogoja hkrati izpolnjena, npr. int1 in int, bo obveljal prvi pogoj. Kadar ni izpolnjen noben pogoj, se izvede kon.ni else in prekinitveni vektor postavi na "00".
p1 p p3 vektor prekini 00 01 01 Slika. Simulacija prekinitvenega kodirnika Naloge 1. Naredi vezje za funkcijo maksimum. Vezje naj ima dva -bitna vhoda in en -bitni izhod. Na izhodu naj bo vedno maksimalna izmed obeh vhodnih vrednosti. x y FMaks maks. Opiši sestavljeni primerjalnik, ki preverja ali je 4-bitna vhodna vrednost znotraj nekega obmo.ja (npr. med 5 in ). Preveri na simulaciji delovanje primerjalnika in ugotovi, kaj se zgodi,.e vklju.iš knjižnjico za delo s predzna.enimi vrednostmi (STD_LOGIC_SIGNED). 3. Opiši vezje za kodiranje magnitude 7-bitnega vhodnega signala. Izhod vezja je 3-bitna vrednost, ki pove koliko bitov potrebujemo za zapis vhodne vrednosti. Kodiranje lahko opišemo z zaporedno (prioritetno) primerjavo bitov od najvišjega navzdol: -.e je na vhodu sedmi bit enak '1', bo izhod "1", sicer -.e je na vhodu šesti bit enak '1', bo izhod "0", sicer -.e je na vhodu peti bit enak '1', bo izhod "1"...
17 3. Izbirni stavek Pogojni prireditveni stavek v razširjeni obliki se nam kar sam ponuja za opis vezij, pri katerih izbiramo med ve.jim številom vhodnih signalov, ki jih ob dolo.enih pogojih pripeljemo na izhod. A Izbiralnik 4-1 Poglejmo si primer izbiralnika 4-1, ki z dvobitnim vektorjem izbira enega izmed štirih vhodov. Vhodni signali so lahko enobitni ali vektorski signali. vhod_a vhod_b vhod_c vhod_d 00 01 izhod izbira Slika. Izbiralnik 4-1 Izbiralnik opišemo s pogojnim prireditvenim stavkom v razširjeni obliki: architecture opis of mux is izhod <= vhod_a when izbira="00" else vhod_b when izbira="01" else vhod_c when izbira="" else vhod_d; end opis; Pri opisu izbiralnika nismo zapisali zadnjega pogoja (izbira=""), pa. pa smo priredili signal vhod_d v primeru da noben izmed predhodnih pogojev ni izpolnjen. To je dobra praksa pri opisovanju kombinacijskih vezij, kjer morajo biti izhodni signali definirani v vseh primerih. Kadar opisujemo kombinacijska vezja z razširjenim when-else stavkom zapišemo kon.ni else brez dodatnega pogoja. V nasprotnem primeru lahko dobimo v vezju zapah! Razširjeni pogojni prireditveni stavek obravnava zaporedne pogoje s prioriteto.e prvi pogoj ni izpoljen se preveri drugi pogoj in.e oba nista izpolnjena se preveri tretji pogoj itn. Pri sintezi vezja predstavljajo zaporedni pogoji
zaporedno (ve.nivojsko) logiko, kar pomeni ve.je in po.asnejše vezje. Kadar so pogoji s katerimi izbiramo razli.ne izhode vezani le na en signal (npr. signal izbira), lahko opišemo vezje s pomo.jo izbirnega stavka: 1 Tabela 7. Izbirni stavek with izbirni_signal select signal <= izraz1 when vrednost1, izraz when vrednost,... izrazn when others; 17 architecture opis of mux is with izbira select izhod <= vhod_a when "00", vhod_b when "01", vhod_c when "", vhod_d when others; end opis; Namesto zadnjega pogoja ("") smo uporabili rezervirano besedo others, s katero zaobjamemo vse ostale možne izbire. Ker so signali tipa std_logic, so med ostalimi možnimi vrednostmi tudi "UU", "ZZ", "XX" ipd. B 7-segmentni dekodirnik Izbirni stavek je uporaben za opis kombinacijskih dekodirnikov, pri katerih kombinacije vhodnega signala prekodiramo v kombinacije izhodnega signala. Vzemimo primer dekodirnika za 7-segmentni prikazovalnik, kot je prikazan na sliki. Tabela prikazuje prekodiranje desetiških cifer v 7-bitno kodo: število binarna vrednost 7-bitna koda 0 0000 0 1 0001 00000 00 0 3 00 0 4 00 000 5 01 001 6 00 1 7 01 00001 00 1 9 01 0 4 5 3 0 6 1 7 Slika 17. 7-segmentni prikazovalnik
Vezje dekodirnika naj ima 4-bitni BCD vhod in vhod, ki prižiga piko na prikazovalniku. Izhod je -bitni vektor pri katerem spodnjih 7 bitov prižiga segmente prikazovalnika, osmi bit pa je vezan na piko. bcd pika Dekoder 4 izhod Slika 1. Model vezja 7-segmentnega dekodirnika Za vse vhodne vrednosti, ki so izven obmo.ja BCD vrednosti, naj se na prikazovalniku pokaže znak F (7-bitna koda 001). 19 5 6 7 9 17 1 19 0 1 3 4 5 6 entity Dekoder is port ( bcd: in std_logic_vector (3 downto 0); pika: in std_logic; izhod: out std_logic_vector (7 downto 0)); end Dekoder; architecture opis of Dekoder is with bcd select izhod(6 downto 0) <= "0" when "0000", "00000" when "0001", "0" when "00", "0" when "00", "000" when "00", "001" when "01", "1" when "00", "00001" when "01", "1" when "00", "0" when "01", "001" when others; izhod(7) <= pika; end opis; V izbirnem stavku smo nastavili samo spodnjih 7 bitov vektorja izhod (vrs. ), osmi bit pa je z navadnim prireditvenim stavkom (vrs. 5) povezan na vhodni signal pika.
C Aritmetino-logina enota 0 Z izbirnim stavkom lahko na zelo kompakten na.in opišemo aritmeti.nologi.ne enote (ALE). Naredili bomo primer ALE z dvema aritmeti.nima in dvema logi.nima operacijama. Vrsto operacije dolo.a dvobitni vhodni signal: op operacija 00 a + b 01 a b a and b a or b a b ALE + IN ALI rezultat op Slika 19. Aritmeti*no-logi*na enota V opisu vezja prirejamo posamezne izraze znotraj izbirnega (with-select) stavka. Izbirni signal (op) dolo.a, kateri izraz bomo priredili rezultatu. Ko naštevamo vrednosti izbirnega signala, moramo namesto zadnje vrednosti uporabiti rezervirano besedo others. 5 6 7 9 17 1 entity ALE is port ( a, b: in std_logic_vector (7 downto 0); op: in std_logic_vector (1 downto 0); rezultat: out std_logic_vector (7 downto 0)); end ALE; architecture opis of ALE is with op select rezultat <= a + b when "00", a b when "01", a and b when "", a or b when others; end opis; Naloga 1. Naredi dekodirnik za -bitni digitalni VU-meter. Vrednost na 3-bitnem vhodu naj dolo.a koliko izhodnih bitov je postavljenih na '1'.