Laboratorij za načrtovanje integriranih vezij Univerza v Ljubljani Fakulteta za elektrotehniko 1. stopnja UNI, 2. letnik Digitalni Elektronski Sistemi Andrej Trost Literatura: A. Trost: Načrtovanje digitalnih vezij v jeziku VHDL, FE 2011 Spletna stran: http://lniv.fe.uni-lj.si/des.html 1 Vsebina predmeta Digitalni elekt. sistemi Kaj je v elektronskih napravah ? Postopki načrtovanja (zasnove) procesorji in vmesniki ocenjevanje načrta, metrike RTL opis v jeziku VHDL Uporaba 3 ključnih tehnologij tehnike načrtovanja tehnološke izvedbe (int. vezja) procesorji 2 Digitalni elektronski sistemi prikazovalnik Digitalni sistem podsistemi (moduli) vmesnik tiskano vezje digitalne strukture 3 mikroprocesor, aplikacija komunikacijski vmesniki elektronsko vezje procesor logična vrata integrirana vezja 10 > Digitalni elektronski sistemi Kaj je v elektronskih napravah ? “informacijske naprave” digitalna vezja in procesorji vmesniki Značilnosti sodobnih el. naprav ? nezahtevne za uporabo enostaven, intuitiven vmesnik porazdeljene in povezane več kot 50 v sodobnem vozilu interakcija osebne in prenosne naprave 4 info tabla pametna kamera Digitalni sistem: osebni računalnik 5 Računalnik na enem tiskanem vezju Single Board Computer 6 mikroprocesor, pomnilnik in FLASH disk vhodno / izhodne enote: USB, Ethernet, RS232 prilagojen operacijski sistem in aplikacije Računalnik na integriranem vezju (čipu) mikrokrmilnik (Microcontroller) 7 mikroprocesor, pomnilnik (RAM in FLASH) in vhodno / izhodne enote na čipu. Enostaven operacijski sistem ali ena aplikacija brez OS Vgrajeni sistemi (Embedded System) Definicija vgrajenega sistema (IEEE 1992) „A computer system that is part of a larger system and performs some of the requirements of that system.“ računalniški (digitalni) sistem vgrajen v elektronsko napravo skoraj vsi digitalni sistemi z izjemo splošno-namenskih računalnikov letno se prozvede miljone računalnikov in miljarde VS Skupne značilnosti vgrajenih sistemov Izvajajo eno nalogo Dobro omejeni ponavljajo program nizka cena, poraba, prostor Reaktivni takoj reagirajo na spremembe v okolici Izvršijejo operacije v realnem času • 60 % vsebuje več različnih integriranih vezij • 45% vsebuje programirljivo vezje (FPGA) 9 Načrtovanje vgrajenih naprav poraba časa za posamezne korake Razvoj: Robert Noyce in integrirana vezja J. Kilby in R. Noyce izumila mikroelektronsko vezje na rezini polprevodnika – integrirano vezje Fairchild Semiconductor 1957 Soustanovitelj podjetja Intel Sodobno integrirano vezje v ohišju QFP (a) in BGA (b), prerez silicijeve rezine z vezjem (c) 11 Gonilo razvoja: Moorov zakon Gordon Moore in R. Noyce ustanovila Intel 1968 Moorov zakon: število transistorjev na integriranem vezju se podvoji vsako leto (od leta 1975) 12 Def: integrirano vezje, ki izvaja vse ali večino funkcij celotnega elektronskega sistema Za sisteme je značilna kompleksnost vezja komponente so lahko zelo velika vezja (npr. RAM), vendar imajo enostavno strukturo Sistem lahko vsebuje analogne komp., vendar je večina sistema digitalno vezje 13 najbolj kompleksne funkcije lahko naredimo le z digitalnim vezjem System-onChip procesor (CPU) Pomnilnik (RAM, flash) Komunikacijski vmesnik Namenska vezja (IP) RAM IP vmesniki CPU Primer 1: digitalna kamera 14 Primer 2: CD / mp3 audio izhod analog. del audio dekoder (CPU) pomnilnik Reed-Solomon korekcija napak mehanizem 15 analog. del servo krmilnik (DSP) zunanji pomnilnik Prednosti digitalne tehnike Digitalni signal je neobčutljiv na motnje, ki jih poznamo iz analognih sistemov Digitalna vezja so učinkovita in ekonomična pri obdelavi signalov Nekatere algoritme lahko naredimo le z digitalnim vezjem 16 npr. algoritme za zgoščevanje signala, ki zmanjšajo zahteve pri shranjevanju in prenosu podatkov Kombinacijska in sekvenčna vezja x1 . . . xn fi(x) x1 . . . xn si fi(x) clk Kombinacijsko vezje yi = fi(x1,..,xn) Sekvenčno vezje 1. Pomnilni elementi 2. Časovni koraki (ura) yit = fi (x1t,…,xnt, s1t, …,smt) Sit+1 = gi(x1t,…,xnt, s1t,…,smt) 17 Načrtovanje digitalnih modulov RTL: delitev na krmilni in podatkovni del določitev zaporedja operacij (avtomat) opis gradnikov na podatkovni poti VHDL Very high-speed IC Hardware Description Language modul(arhitektura) vodilo xor, + ROM clk register a register b podatkovna pot prireditveni stavki p1: proces p2: proces vpis krmilni avtomat beri komponenta komponenta 18 q <= n; p1: process(clk) begin if rising_edge(clk) then n <= n + 1; end if; end process; komponenta Laboratorij za načrtovanje integriranih vezij Univerza v Ljubljani Fakulteta za elektrotehniko Digitalni Elektronski Sistemi Model vezja Opis modela vezja v jeziku VHDL 1 Načrtovanje s programirljivimi vezji Opis vezja in simulacija (Design Entry Utilities) Sinteza logičnega vezja (Synthesize) Prevajanje in tehnološka preslikava 1. 2. 3. • 4. določimo lokacije priključkov (User Constraints) Izdelava prog. datotek in nalaganje vezja Proces za CPLD 2 Proces za FPGA Kaj dela opisano vezje? always @ (a or b) case (b) 0: c=a; 1: c=2'b01; default: c=2'b00; endcase 3 process (a, b) begin case b is when 0 => c <= a; when 1 => c <= "01"; when others => c <= "00"; end case; end process; Izbirni stavek Primer: c <= a+b when b>0 else a-b; Kaj naredi program za sintezo vezja? operatorji +, - so kombinacijska vezja ADD {14}, ADSU {13} izbirni stavek when … else je izbiralnik MUX {8 celic} zasedenost CPLD virov: {21, 63, 0} termov celic 4 flip-flopov Postopek sinteze vključuje optimizacijo Stavek: c <= a+b when b>0 else a-b; primerjalnik (or7, and2) in ADDSUB blok zasedenost 19 / 55 / 0 Drug zapis: c <= a+b when b>=0 else a-b; 5 zasedenost 17 / 53 / 0 Način opisovanja digitalnih vezij specifikacija postopkovni (behavioral) funkcijski (dataflow, RTL) logični nivo transistorjev geometrija vezja (layout) Standardizirani jeziki (IEEE) 6 VHDL Verilog, System Verilog SystemC programirljiva vezja Nivoji opisa vezja: SystemC C VISOKONIVOJSKI JEZIKI SHEMATSKI OPIS VHDL Verilog Funkcijski opis vezja v jeziku VHDL stavki opisujejo gradnike vezja stavki za opis vezja se izvajajo paralelno vrstni red stavkov ni pomemben (sočasni stavki) entity adder is port ( a, b : in std_logic; carry : in std_logic; sum : out std_logic); end adder; architecture logic of adder is signal c : std_logic; begin sum <= c xor carry; c <= a xor b; end one; 7 adder(logic) a b c sum carry deklaracija notranjega signala Postopkovni opis vezja v jeziku VHDL v procesu opišemo delovanje vezja zgradbo vezja določi program za sintezo vezij vrstni red stavkov je pomemben (sekvenčni stavki) arhitektura p1: process ventil <= ‘0’; if pretok > 10 then ventil <= ‘1’; end if; if alarm = ‘1’ then ventil <= ‘0’; end if; end process; 8 p1: pretok 10 alarm > ventil VHDL model vezja predstavlja poenostavljen Digitalne vrednosti Kako razlikujemo med logično 1 in 0 ? Statični red 9 med 0 in 1 uvedemo nedovoljeno stanje Digitalni čas Kateri signal se je prej spremenil ? Dinamični red izogibanje “tekmovanju” med signali Laboratorij za načrtovanje integriranih vezij Univerza v Ljubljani Fakulteta za elektrotehniko Digitalni Elektronski Sistemi Delovanje realnega vezja Omejitve modela vezja 1 Model v VHDLu je poenostavljeno realno vezje V modelu imamo logične vrednosti 0 in 1, v vezju pa imamo napetosti 0 = 0V ali nekoliko višja napetost 1 = Vdd (napajanje) ali nekoliko nižja napetost V modelu ne upošteva pojavo v realnih flip-flopih če se vhod spremeni istočasno s fronto ure ne moremo napovedati kaj se bo zgodilo z izhodom 2 dobimo eno ali drugo logično stanje, ne glede na vhod ali preide v metastabilno stanje, ki preide počasi v eno izmed stabilnih stanj Statični red Statični red določa pravila za uspešen prenos digitalnih vrednosti med različnimi vezji Povezovanje dig. integriranih vezij v različnih izvedbah (TTL, CMOS, LVCMOS…) Dogovor za potenciale, ki določajo nizko ali visoko stanje 3 Prepovedano območje potencialov Kako intepretiramo signal s potencialom Vdd / 2 ? 4 da se izognemo dvoumni interpretaciji uvedemo prepovedano območje, npr.: logična ‘0’: 0V ≤ VL ≤ 2V logična ‘1’: 3V ≤ VH ≤ 5V Šum na signalnih povezavah Na povezavah v vezju se lahko pojavi šum Šum predstavimo kot dodatno napetost, ki se prišteje ali odšteje od napetosti signala Npr. Un = 0.5V šumne napetosti povzroči 5 CMOS nizko stanje 1V se poveča na 1.5V, kar je še vedno ‘0’ CMOS nizko stanje 2V se poveča na 2.5V, kar je prepovedano območje ! Rešitev: dodamo šumno mejo Za oddajnik signala (izhod) določimo manjše dovoljeno območje kot za sprejemnik (vhod) 6 razlika je šumna meja, ki dovoljuje določen nivo šuma brez vpliva na kakovost komunikacije Npr. podatki za 3.3V LVCMOS: Delovanje flip-flopov Kateri signal se je prej spremenil ? Dinamični red 7 izogibanje “tekmovanju” med signali Metastabilno stanje V2 Stable point “0” “1” Metastable point lastnost bistabilnih vezij čez čas gre v stabilno stanje nedoločen čas okrevanja verjetnost za metastabilnost eksponentno pada s časom 10 Stable point V1 Sinhronizacija z dvema D flip-flopoma metastabilno stanje na izhodu FF1 stanje se stabilizira na izhodu FF2, če je na voljo dovolj časa pri višjih frekvencah ure uporabimo več zaporednih D flip-flopov A FF1 AW FF2 AS D D Q Q Clk Clk A AW AS eksponentno pada P(napake) = P(metastab stanja) x P(ni še stabilno po tw) Zakasnitev signala je cena za sinhronizacijo, ki se ji ne moremo izogniti ! 11 Načrtovanje vmesnikov problem komunikacijskih vmesnikov je sinhronizacija asinhrone signale vzorčimo z višjo frekvenco ure in jih peljemo čez sinhronizacijsko vezje težav z metastabilnostjo ne vidimo na simulaciji ! sinhronizacija s FF rx D Q D Q rxs clk možna metastabilna stanja clk rx rxs Sinhronizacija večbitnih signalov Ali bo prikazano vezje delovalo ? 4-bitni števec dela z uro clk1, vrednost potrebujemo v vezju, ki preklaplja z uro clk2 counter clk1 cnt_w cnt D 4 Q 4 D Q cnt_s 4 clk2 Vsak bit je posebej sinhroniziran 13 Kaj se zgodi ob prehodu števca iz 0111 v 1000 ? Spremenijo se vsi biti, na izhodu je lahko napačen katerikoli… Rešitev 1: Grayev števec Binarni števec zamenjamo z Grayevim, ki naenkrat spreminja le en bit v najslabšem primeru bomo prebrali prejšnjo vrednost števca in v naslednjem ciklu branja dobili pravo vrednost 0111 => 1. cikel: 0101, 2. cikel: 0101 (brez napak) 0111 => 1. cikel : 0111, 2. cikel : 0101 (napaka) Takšno vezje se uporablja na naslovne kazalce v pomnilnikih FIFO 14 kazalec za pisanje šteje z uro clk1 Kazalec za branje šteje z uro clk2 Razlika kazalcev pove koliko je pomnilnik poln # 0000 # 0001 # 0011 # 0010 # 0110 # 0111 # 0101 # 0100 # 1100 # 1101 # 1111 # 1110 # 1010 # 1011 # 1001 # 1000 # 0000 # 0001 # 0011 # 0010 Rešitev 2: komunikacija z usklajevanjem Usklajevalni protokol (handshaking) določa časovno okno v katerem je mogoč prenos podatka Primer: paralelni vmesnik Centronics 8-bitni asinhroni prenos podatkov za zunanje naprave PC z negativnim impulzom (strobe) označi nov podatek ko naprava zazna strobe, postavi busy in prebere podatek data 0.5µs 0.5µs strobe busy 15 Sinhroniziramo le enobitne kontrolne signale (strobe in busy) Laboratorij za načrtovanje integriranih vezij Univerza v Ljubljani Fakulteta za elektrotehniko Digitalni Elektronski Sistemi Osnove jezika VHDL 1. del: signali, operacije in simulacija 1 Visokonivojski jeziki za opis vezij Standardizirani jeziki (IEEE standard) Modeliranje na različnih nivojih vhodi logična vrata, RTL (Register Transfer Level) nivo obnašanja (zapišemo algoritem) logika ura s simulacijo preverimo delovanje vezja Sinteza vezja logika registri Funkcionalna in časovna simulacija vezja VHDL (Very high-speed IC Hardware Description Language) Verilog pretvorba vezja na nivo logičnih vrat in flip-flopov izhodi Osnovni koncepti jezika VHDL Model vezja je sestavljen iz: opisa vmesnika (entity) opisa delovanja (architecture) Osnovni elementi opisa vezja so signali, ki predstavljajo povezave Pri opisu vmesnika določimo zunanje signale (port) in parametre vezja zapišemo ime signala določimo smer (in, out, inout, buffer) in podatkovni tip (npr. bit) entity adder is port ( a, b : in bit; carry : in bit; sum : out bit ); end adder; Opis delovanja (architecture) adder(one) entity adder is port ( a, b : in bit; carry : in bit; sum : out bit ); end adder; architecture one of adder is signal c : bit; begin sum <= c xor carry; c <= a xor b; end one; a b c sum carry deklaracija notranjega signala V arhitekturnem stavku določimo notranje in izhodne signale Zunanji signali Zunanji signali so enobitni (bit) ali vektorski signali (bit_vector) MSB entity alu is port ( a, b : in op : in c : out zero :out end alu; LSB alu a 16 bit_vector(15 downto 0); bit_vector(3 downto 0); bit_vector(15 downto 0); bit ); 16 b 16 op c zero 4 Podatkovni tip bit pozna dve vrednosti: 0 ali 1 za bolj realistično simulacijo potrebujemo več-vrednostno logiko ('Z', 'U', 'X') potrebujemo tudi funkcije za razrešitev npr. ko signalu vsilimo vrednost ‘0’ in ‘Z’, prevlada vrednost ‘0’ Večvrednostna logika: std_logic V knjižnici IEEE: std_logic in std_logic_vector ‘U’ nedefinirano stanje ‘X’ kratek stik ‘Z’ visoka impedanca (odprte sponke) ‘H’ pasivno visoko stanje (pullup) ... vključimo knjižnico library IEEE; use IEEE.std_logic_1164.all; entity adder is port ( a, b : in std_logic; carry : in std_logic; sum : out std_logic ); end adder; adder a b carry sum Prireditveni stavek S prireditvenim stavkom signalu priredimo konstantno vrednost ali izraz: flag <= ‘0’; sum <= a xor b; a sum b flag Prireditveni stavek predstavlja logiko, katere izhod je signal, ki mu prirejamo vrednost Za isti signal ne moremo imeti več sočasnih prireditvenih stavkov, ker bi opisali kratek stik! Pogojni prireditveni stavek Signalu priredimo vrednost ali izraz ob določenem pogoju a+b mux <= a when select=‘0’ else b; flag <= ‘1’ when a>b else ‘0’; add <= a+b when b>0 else a-b; a-b add Pogojni prireditveni stavek v osnovni obliki predstavlja izbiralnik (multiplekser) b>0 izrazi predstavljajo logiko na vhodu izbiralnika, pogoj pa logiko za izbiro vhoda Relacijski operatorji: = /= > >= < <= enako ni enako večje večje ali enako manjše manjše ali enako Konstantne vrednosti Konstantno vrednost tipa bit ali std_logic zapišemo med enojne narekovaje: one <= ‘1’; tristate <= ‘Z’; Vektorske konstante (bit_vector ali std_logic_ vector) imajo dvojne narekovaje: a <= “11110000”; b <= X”3A”; c <= (others => ‘0’); šestnajstiška konstanta agregat postavi vse bite vektorja na 0 Deklaracija signalov in konstant Zunanji signali so deklarirani v stavku port, notranji pa v arhitekturnem stavku signalu lahko ob deklaraciji priredimo začetno vrednost Konstante deklariramo v arhitekturnem stavku architecture one of test is signal flag: std_logic; signal reg: std_logic_vector(3 downto 0) := “0000”; constant zero: std_logic := ‘0’; begin Deklaracija zunanjih signalov Zunanji signali imajo poleg podatkovnega tipa določeno tudi smer in vhodni signali, ki se lahko pojavljajo le na desni strani prireditvenih stavkov in v pogojih out izhodni signali, ki se lahko pojavljajo le na levi strani prireditvenih stavkov inout dvosmerni signali (npr. dvosmerna vodila), ki se lahko pojavljajo na obeh straneh prireditev buffer izhodni signali, ki pa jih lahko uporabljamo tudi na desni strani prireditev in v pogojih Primer deklaracije: buffer entity increment is port ( a: in std_logic_vector(3 downto 0); incr_a : buffer std_logic_vector(3 downto 0); flag : out std_logic ); end increment; architecture one of increment is begin incr_a <= a + ‘1’; flag <= ‘1’ when incr_a=“1111” else ‘0’; end one; Signal incr_a mora biti deklariran kot buffer, ker se pojavlja na levi strani prireditve (kot izhod) in v pogoju (kot vhod) Podatkovni tipi: vektorji Vektorje uporabljamo za modeliranje večbitnih signalov (vodil) Območje indeksov običajno deklariramo od MSB proti LSB signal a, b, c: std_logic_vector(7 downto 0); signal high, low: std_logic_vector(3 downto 0); • Podvektor: high <= a(7 downto 4); -- 4 bitni podvektor low <= a(3 downto 0); -- 4 bitni podvektor sign <= a(7); -- sign je tipa std_logic Operacije z vektorji Logične operacije: and, or, not, xor, xnor... Sestavljanje vektorjev: & a <= high & low; b <= sign & “000” & low; • Pomikanje vektorjev – pomik naredimo s sestavljanjem in podvektorjem b <= a(6 downto 0) & ‘0’; -- pomik v levo c <= ‘0’ & a(7 downto 1); -- pomik v desno d <= a(6 downto 0) & a(7); -- rotacija v levo Aritmetične operacije z vektorji • Aritmetične operacije: +, -, * – vključimo knjižnjico: std_logic_unsigned (nepredznačena) ali std_logic_signed (predznačena števila) library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; architecture one of test is signal a, b, sum, inc, m: std_logic_vector(7 downto 0); signal d, e: std_logic_vector(3 downto 0); begin sum <= a + b; -- 8 bitni seštevalnik inc <= a + ‘1’; -- ‘1’ se razširi na “00000001” in prišteje m <= d * e; -- 4 x 4 biti = 8 bitni rezultat Podatkovni tipi: signed, unsigned Predznačeni ali nepredznačeni vektorji Vključimo knjižnico: IEEE.numeric_std Definirane osnovne aritmetične operacije library IEEE; use IEEE.std_logic_1164.all; use IEEE.numeric_std.all; architecture one of test is signal a, b, sum, inc, m: unsigned(7 downto 0); signal d, e: unsigned(3 downto 0); begin sum <= a + b; -- 8 bitni seštevalnik inc <= a + ‘1’; -- ‘1’ se razširi na “00000001” in prišteje m <= d * e; -- 4 x 4 biti = 8 bitni rezultat Obravnava VHDL modelov vezij Simulacija modela na simulatorju določimo spreminjaje vhodnih signalov in opazujemo izhode Sinteza modela program za sintezo določi zgradbo vezja, ki izhaja iz VHDL modela dogodek a b carry adder(one) a b c sum carry sum Graf simulacije (waveform) Sintetizirano vezje Simulator diskretnih dogodkov Dogodki so opisani z vrednostjo signala in časom ob katerem se zgodijo a b 1 (100 ns) 1 (200 ns) carry sum 1 (105 ns) 0 (205 ns) Ciklus simulatorja 1. simulator izračunava dogodke na signalih in jih uvršča na seznam dogodkov 2. po vseh izračunih se poveča simulacijski čas in 3. izvrši dogodke, ki spremenijo vrednosti signalom Potek simulacije dogodek adder a b a b c sum carry carry c Seznam dogodkov: a: 0, 1 (T) carry: 0, 1 (T) sum korak čas a b carry sum c seznam 0 0, 1(T) 0 0, 1(T) 0 0 izvrši T 1 0 1 0 0 izračunaj T 1 0 1 1(T+∆) 1(T+∆) izvrši T+∆ 1 0 1 1 1 izračunaj T+∆ 1 0 1 0(T+2∆) 1 izvrši T+2∆ 1 0 1 0 1 Lastnosti realnih kombinacijskih vezij Izhod se spremeni z zakasnitvijo (∆ > 0) Večina vezij je večnivojskih zaporedno vezana logična vrata v času spremembe so na izhodu motnje! Primer: seštevalnik in primerjalnik add <= a + 1; n <= '1' when add=0 else '0'; zakasnitev motnja 20 x1 . . . xn fi(x) Laboratorij za načrtovanje integriranih vezij Univerza v Ljubljani Fakulteta za elektrotehniko Digitalni Elektronski Sistemi Osnove jezika VHDL 2. del: proces 1 Procesno okolje Znotraj procesnega okolja so sekvenčni stavki vrstni red stavkov je pomemben med sekvenčne stavke spada pogojni (if) stavek signalu lahko priredimo vrednost na vač mestih, dejansko se izvrši le zadnja prireditev primerjava: process (a, b) begin enako <= ‘0’; if a=b then enako <= ‘1’; end if; end process; Zgradba procesnega okolja oznaka: process (seznam signalov) begin ..... end process; Z oznako poimenujemo del vezja, ki ga predstavlja proces Simulacija procesa se izvrši ob spremembi enega izmed signalov iz seznama pri opisu kombinacijskih vezij moramo navesti vse signale, ki predstavljajo vhode v proces Pogojni stavek (if) – – – Ob izpolnjenem pogoju se izvrši en ali več stavkov, ki so zapisani za “then” Opcija: če pogoj ni izpolnjen se izvršijo stavki za “else” Pogojni stavek zaključimo z “end if ” if pogoj then stavki(1); else stavki(2); end if; if pogoj1 then stavki(1); elsif pogoj2 then stavki(2); else stavki(3); end if; Primerjava s sočasnimi stavki Pogojni stavek spada med sekvenčne stavke uporabljamo ga lahko le znotraj procesa Pogojni prireditveni stavek je alterativa med sočasnimi stavki p_max: process(a, b) begin if a>b then max <= a; else max <= b; end if; end process; = max <= a when a>b else b; Primerjava (2) bin2bcd: process(bin) begin if bin>9 then enice <= bin – “1010”; desetice <= ‘1’; else enice <= bin; desetice <= ‘0’; end if; end process; enice <= bin - ”1010” when bin>9 else bin; = desetice <= ‘1’ when bin>9 else ‘0’; V pogojnem stavku imamo lahko več prireditev Zaporedje pogojev: prioriteta p: process(int0, int1, int2) begin if int0=‘1’ then v <= “01” elsif int1=‘1’ then v <= “10”; elsif int2=‘1’ then v <= “11”; else v <= “00”; end if; end process; = v <=”01” when int0=‘1’ else “10” when int1=‘1’ else “11” when int2=‘1’ else “00”; int0 ima prednost pred int1, ki ima prednost pred int2 ... Zaporedni pogoji se ovrednotijo s prioriteto Sekvenčni izbirni stavek (case) Odločamo se glede na vrednost enega signala Izbirni stavek nima prioritete case ime_signala is when vrednost1 => stavki(1); when vrednost2 => stavki(2); ... when others => stavki(n); end case; decod: process(digit) begin case digit is when “00” => display <= “00111111”; when “01” => display <= “00000110”; when others => display <= “11111001”; end case; end process; Primer: izbiralnik (multipleksor) Izbiralnik s štirimi vhodi (a, b, c in d) m: process(mode,a,b,c,d) begin if mode=“00” then mux <= a; elsif mode=“01” then mux <= b; elsif mode=“10” then mux <= c; else mux <= d; end if; end process; m: process(mode,a,b,c,d) begin case mode is when “00” => mux <= a; when “01” => mux <= b; when “10” => mux <= c; when others => mux <= d; end case; end process; Sočasni izbirni stavek (with...select) Na podlagi izbire priredimo signalu različne vrednosti (ali izraze) with izbira select signal <= izraz(1) when vrednost1, izraz(2) when vrednost1, ... izraz(n) when others; • Za razliko od case stavka lahko prirejamo vrednost le enemu signalu with digit select display <= “00111111” when “00”, “00000110” when “01”, “11111001” when others; Sekvenčni stavki in sinteza vezja Prirejanje vrednosti signalom na več mestih Če signalu pod kakšnim pogojem ne določimo vrednosti, se bo ohranjala zadnja vrednost dobimo sekvenčno vezje ! p: process(set_flag, clear_flag) begin if set_flag=‘1’ then flag <= ‘1’; elsif clear_flag=‘1’ then flag <= ‘0’; end if; end process; Naredili smo asinhroni zapah za signal flag ! Opis kombinacijskih vezij Definiramo vrednosti pri vseh pogojih: vrednost priredimo pri vsakem “if” in “else” ali vrednost priredimo na začetku procesa in jo spremenimo v “if” stavkih primerjava: process (a, b) begin if a=b then enako <= ‘1’; else enako <= ‘0’; end if; end process; primerjava: process (a, b) begin enako <= ‘0’; if a=b then enako <= ‘1’; end if; end process; Laboratorij za načrtovanje integriranih vezij Univerza v Ljubljani Fakulteta za elektrotehniko Digitalni Elektronski Sistemi Osnove jezika VHDL 3. del: sekvenčna vezja 1 Opis sekvenčnih vezij Sinhrona sekvenčna vezja spreminjajo izhode ob fronti ure prva fronta: clk’event and clk=‘1’ ali rising_edge(clk) zadnja: clk’event and clk=‘0’ ali falling_edge(clk) reg: process (clk) begin if rising_edge(clk) then q <= d; end if; end process; clk d q Sekvenčni elementi in sinteza vezja Program za sintezo zna narediti register ali flip-flop, če uporabimo ustrezno obliko opisa vezja I. oblika: popolnoma sinhrono vezje reg: process (clk) begin if rising_edge(clk) then q <= d; end if; end process; II. oblika: asinhroni reset reg: process (clk, reset) begin if reset=‘1’ then q <= “00000000”; elsif rising_edge(clk) then q <= d; end if; end process; Povratne zanke Znotraj sinhronega procesa lahko uporabljamo povratno zanko na podlagi stanja registra izračunamo novo stanje Npr. števec, pomikalni register, sinhroni avtomat I. oblika stev: process (clk) begin if rising_edge(clk) then q <= q + ‘1’; end if; end process; • signal q uporabljamo v povratni zanki • če je q zunanji signal, mora biti buffer Primer: BCD števec BCD števec šteje od 0 do 9 II. oblika I. oblika stev: process (clk) begin if rising_edge(clk) then if q < 9 then q <= q + ‘1’; else q <= “0000”; end if; end if; end process; stev: process (clk) begin if reset=‘1’ then q <= “0000” elsif rising_edge(clk) then if q < 9 then q <= q + ‘1’; else q <= “0000”; end if; end if; end process; Zgradba vezja BCD števca Signal q je register, ki ima na vhodu logiko povratna zanka je med izhodom registra in logiko stev: process (clk) begin if rising_edge(clk) then if q < 9 then q <= q + ‘1’; else q <= “0000”; end if; end if; end process; ‘1’ “0000” clk + q Registri in flip-flopi Prireditev vrednosti znotraj pogoja za fronto ure pomeni, da je signal register ali flip-flop I. oblika 4 bitni register flip-flop acc: process (clk) begin if rising_edge(clk) then a <= a + data; if a=“1111” then full <= ‘1’; else full <= ‘0’; end if; end if; end process; Potek simulacije Procesni stavek se izvede ob spremembi clk pogoj rising_edge() je izpolnjen, ko gre clk iz 0 na 1 acc: process (clk) begin if rising_edge(clk) then a <= a + data; if a=“1111” then full <= ‘1’; else full <= ‘0’; end if; end if; end process; korak čas clk data a full čakaj 0 0, 1 1111 0000 0 račun T 1 1111 1111 0 izvrši T+d 1 1111 1111 0 čakaj T2 0, 1 1111 1111 0 račun T2+d 1 1111 1110 1 izvrši T2+d 1 1111 1110 1 Časovni diagram in zgradba vezja clk a 1111 1110 1101 full Signal full se postavi na ‘1’ šele ob naslednji fronti ure full je izhod iz flip-flopa ! • Vezje je sestavljeno iz registra (a), flip-flopa (full) in logike na vhodih obeh sekvenčnih elementov data clk a logika logika full Opis cevovodnih vezij vhod logika r1 r2 logika logika izhod r3 clk pipe: process (clk) begin if rising_edge(clk) then r1 <= vhod - “0011”; if r1>10 then r2 <= r1; else r2 <= “1010”; end if; r3 <= r2 xor “1010”; end if; end process; Pri cevovodnih vezjih se rezultati operacij sproti shranijo v registre clk r1 r2 r3 a b c a’ b’ c’ a’’ b’’ Signali v sinhronih vezjih S signali poimenujemo povezave v vezju Signali pri simulaciji: ob izračunu izrazov se določi bodoča vrednost signala (dogodek) vrednost se priredi, šele ko se dogodki izvršijo Signali pri sintezi: v sinhronih procesih (I. ali II. oblika) vsak signal, ki mu prirejamo vrednost pomeni register ali flip-flop signali niso primerni za izračun vmesnih rezultatov s kombinacijsko logiko Spremenljivke (variable) Spremenljivke uporabljamo v procesnem okolju za izračun vmesnih rezultatov ob izračunu spremenljivka takoj dobi novo vrednost Deklaracija spremenljivke: p: process (clk) variable v: std_logic_vector(7 downto 0); begin Prireditveni operator (:=) v := vhod - “0011”; Sinteza vezja s spremenljivkami vhod logika r1 logika izhod r2 clk pipe: process (clk) variable v: std_logic_vector (3 downto 0); begin if rising_edge(clk) then v := vhod - “0011”; if v>10 then r1 <= v; else r1 <= “1010”; end if; r2 <= r1 xor “1010”; end if; end process; spremenljivka ne predstavlja model povezave spremenljivka ne predstavlja registra Zmogljivost vezja zmogljivost vezja omejujejo zakasnitve kombinacijske zakasnitve od spremembe na vhodu do spremembe izhodov poiščemo kritično pot in jo poskusimo skrajšati ASIC: prevladujejo zakasnitve v logiki lahko je več enakovrednih kritičnih poti zmanjšamo s topologijo vrat, obremenitvijo in načrtovanjem transistorjev FPGA / CPLD: velike zakasnitve v povezavah izbira kratkih in namenskih povezav Poti in zakasnitve kombinacijske zakasnitve merimo na poteh v vezju vezje graf • največja zakasnitev je na kritični poti Optimizacija sekvenčnega vezja Cevljenje (pipelining) z dodajanjem registrov L : latenca (zakasnitev med vh. in izh.) T : pretok (frekvenca obdelave podatkov) brez cevljenja dvostopenjski cevovod L=D T=1/D L = D + tFF T≤2/D D Q D Q Optimizacija površine vezja Kompleksno množenje (a + bi)(c + di) = ac – bd + (bc + ad)i a c x b x d x − x + re a a c b x x − x x im • 4 mult, 2 addsub • 2 računska cikla a d + re im • 2 mult, 1 addsub • 3 računski cikli Laboratorij za načrtovanje integriranih vezij Univerza v Ljubljani Fakulteta za elektrotehniko Digitalni Elektronski Sistemi Osnove jezika VHDL Model in optimizacija vezja 1 Model vezja na nivoju RTL Algoritem določa obnašanje vezja Na nivoju RTL je določeno obnašanje vezja ob urinih ciklih pri algoritmu ni določen časovni potek izvajanja sinteza vezij iz algoritma je precej zahtevna sinteza vezij iz RTL opisa je danes običajna Modeliramo prenos podatkov med pomnilnimi elementi in (kombinacijske) transformacije Primer: šifriranje podatkov Blokovni algoritem s 4 iteracijami šifriranja C++ int main(void) { char a, b, a_nov, b_nov; char k[] = {0xff, 0x0f, 0x03, 0x30}; cin >> a; cin >> b; for (int i=0; i<=3; i++) { a_nov = b; b_nov = (b + k[i]) ^ a; a = a_nov; b = b_nov; } cout << a << b; } VHDL Behavioral for i in 0 to 3 loop a_nov := b; b_nov := (b + k(i)) xor a; a := a_nov; b := b_nov; end loop; 1. vezje: razvijemo zanko kombinacijska izvedba zanke rezultat operacij vsakokrat shranimo v nov signal sifr1: process(vhod, a0, b0, a1, b1, a2, b2, a3, b3, a4, b4 ) begin a0 <= vhod(15 downto 8); b0 <= vhod(7 downto 0); a1 <= b0; b1 <= (b0 + k(0)) xor a0; a2 <= b1; RTL b2 <= (b1 + k(1)) xor a1; a3 <= b2; b3 <= (b2 + k(2)) xor a2; a4 <= b3; b4 <= (b3 + k(3)) xor a3; end process; VHDL Rezultat 1. vezja • registri na vhodu in izhodu sifr1 vhd clk vhod k0,k1 k2,k3 izhod CPLD Xilinx XC95288XL-10 Površina: 56 makrocelic, 32 flip-flopov Frekvenca ure: 26.8 MHz (53.6 MByte/s) Kako povečati hitrost vezja? izh 2. vezje: polna cevovodna izvedba • cevovodna izvedba zanke – rezultat vsake iteracije shranimo v register vhod a0 b1 a2 k0 b3 a4 k2 izhod clk b0 a1 b2 k1 a3 1. cikel clk izhod a0 izhod b0 a0 b0 b1 izhod b1 vhod b0+k(0) xor a0 b0+k(0) xor a0 tpd tk tpd k3 b4 opazujmo vhod in izhod registra b1 frekvenca ure je omejena s tpd+tk+ts vezje naj deluje le na eno fronto ure! Rezultat 2. vezja • 4-stopenjski cevovod vhod a0 b1 a2 k0 b3 a4 k2 clk b0 a1 k1 b2 a3 k3 CPLD Xilinx XC95288XL-10 • Površina: 80 makrocelic, 80 flip-flopov • Frekvenca ure: 90.9 MHz • Zmogljivost: 181.8 MByte/s b4 izhod 3. vezje: dvostopenjski cevovod vhod a0 b1 a2 k0 b3 a4 k2 clk b0 a1 k1 b2 a3 k3 b4 CPLD Xilinx XC95288XL-10 • Površina: 54 makrocelic, 48 flip-flopov • Frekvenca ure: 46.1 MHz • Zmogljivost: 92.2 MByte/s izhod 4. vezje: sekvenčni procesor Vezje razdelimo na podatkovni in kontrolni del vodilo clk xor, + ROM register a register b podatkovna pot sprejmi1 vpis sprejmi2 vpis zanka vpis beri krmilni avtomat oddaj1 beri oddaj2 i<3 Podatkovna pot a_in A b_in K1 K2 K3 K4 B + b1 X b2 4. Krmilni signali a_in b_in loada enable A K1 K2 K3 K4 B + b1 X b2 adr 4. Podatkovna pot v jeziku VHDL a_in b_in loada enable A B + b1 k pod: process(clk) begin if rising_edge(clk) then if enable = '1' then if loada = '1' then a <= a_in; elsif loadb = '1' then b <= b_in; else a <= b; b <= b2; end if; end if; end if; end process; X b2 b1 <= b + k; b2 <= b1 xor a; 4. ROM v jeziku VHDL za opis uporabimo zbirko (array) architecture RTL of code is ... type rom_type is array (0 to 3) of std_logic_vector (15 downto 0); constant rom : rom_type := ("0000000000000001", "0000000000000011", "0000000000000111", "0000000000001111"); signal adr: integer range 0 to 3; ... begin k <= rom(adr); K1 K2 K3 K4 adr 4. Krmilno vezje Algoritmični sekvenčni avtomat sprejmi1 adr=0; enable=‘0’ loada=‘0’;loadb=‘0’ enable=‘0’ vpis loada=‘1’; enable=‘1’ sprejmi2 loada=‘0’; enable=‘0’ vpis loadb=‘1’; enable=‘1’ zanka adr++; loadb=‘0’; adr=3 beri outa=‘1’ outa=‘0’ beri outb=‘1’; Rezultat in primerjava CPLD Xilinx XC95288XL-10 • Površina: 31 makrocelic, 22 flip-flopov • Frekvenca ure: 84.7 MHz (10,6 Mbyte/s) Vezje Površina f [MHz] Mbyte/s 1. vezje 56 26.8 53,6 2. vezje 80 90.9 181,8 3. vezje 54 46.1 92,2 4. vezje 31 84.7 10,6 Končni avtomat (Finite State Machine) Sekvenčno vezje s povratno zanko register stanj vhodna logika Izhodna logika Moorov avtomat: vhodi clk 16 stanje logika logika izhodi Primer končnega avtomata Pri vsakem stanju določimo vrednosti izhodov Start = ’1’ Enable = ‘0’ Enable = ‘0’ Done = ‘1’ S0 LD K1 DN Load = ‘0’ Enable = ‘1’ adr = 3 K2 K4 K3 Load = ‘0’ Enable = ‘1’ adr = 2 17 Load = ‘1’ Enable = ‘1’ Load = ‘0’ Enable = ‘1’ adr = 0 Load = ‘0’ Enable = ‘1’ adr = 1 Opis avtomata v jeziku VHDL Določimo podatkovni tip, kjer naštejemo stanja sinhroni proces za register stanj architecture RTL of avtomat is ... type stanja is (s0, ld, k1, k2, k3, k4, dn); signal stanje, naslednje: stanja; ... begin K regstanj: process (clk) begin if rising_edge(clk) then stanje <= naslednje; end if; end process; prehodi med stanji: preh: process (stanje, start, adr) begin case stanje is when s0 => if start = ‘1’ then naslednje <= ld; else naslednje <= s0; end if; when ld => naslednje <= k1; 18 Avtomat z zunanjim števcem namesto stanj v katerih spreminjamo adr uporabimo zunanji števec Load Start Avtomat clk Start = ’1’ Dnable S0 Done Reset LD Enable = ‘0’ Števec Load = ‘1’ Enable = ‘1’ Reset = ‘1’ Adr Adr < 4 DN Ki Enable = ‘0’ Done = ‘1’ Adr = 4 19 Load = ‘0’ Enable = ‘1’ Reset = ‘0’ Izhodna logika in števec Kombinacijska logika za izhode (when … else) Sinhroni proces za zunanji števec 20 Load <= '1' when stanje=ld else '0'; Enable <= '0' when stanje=s0 or stanje=dn else '1'; Done <= ‘1’ when stanje=dn else ‘0’; Reset <= ‘1’ when stanje=ld else ‘0’; stev: process(clk) begin if rising_edge(clk) then if Reset=‘1’ then Adr <= 0; else Adr <= Adr + 1; end if; end if; end process; -- mora biti sinhroni kombinacijski izhodi imajo šum ob prehajanju stanj ne smemo jih uporabiti za uro ali asinhroni reset… šum odstranimo, če jih pošjemo čez D flip-flop Vhodni signali Vhodni signali v sinhroni avtomat morajo biti sinhronizirani z uro ! sicer prekršimo dinamični red in avtomat gre v poljubno stanje Kako so kodirana stanja? kodiranje stanj naredi program za sintezo vezja nekatere kode ne predstavljajo stanja iz diagrama V stavku case uporabimo when others=> kjer določimo v katero stanje naj se premakne avtomat, če pride slučajno v nedefinirano stanje binarno S0= 000 LD= 001 K1= 010 K2= 011 K3= 100 K4= 101 DN=110 21 one-hot S0 = 0000001 LD = 0000010 K1= 0000100 K2= 0001000 K3= 0010000 K4= 0100000 DN= 1000000 Končni avtomat z registrskimi operacijami Kompakten opis sekvenčnega vezja V enem procesu, opišemo register in prehajanje med stanji ter operacije (npr. nalaganje registra, povečevanje – števec…) avtomat: process (clk) begin if rising_edge(clk) then case stanje is when s0 => if start=‘1’ then stanje <= ld; reg <= vhod; end if; when ld => stanje <= ki; Adr <= 0; when ki => if Adr<3 then 22 Adr <= Adr + 1; else stanje <= dn; end if; when others => stanje <= s0; end case; end if; end process; Laboratorij za načrtovanje integriranih vezij Univerza v Ljubljani Fakulteta za elektrotehniko Digitalni Elektronski Sistemi Vmesniki in sekvenčna vezja Zaporedna in vzporedna vodila 1 Vmesniki in vodila Električni vmesnik (interface) sestavljen iz fizičnih povezav in priključkov ter logičnega vezja Naloga digitalnih vmesnikov prenos podatkov in dogodkov med dvema napravama Vodilo (bus) podatki se prenašajo po vodilu vodilo omogoča prenos podatkov med dvema ali več napravami Pasivno vodilo npr. direktne povezave med procesorjem in pomnilnikom Vodilo s krmilnikom 2 krmilnik poskrbi za usklajevanje prenosa podatkov izvaja najnižji – fizični nivo prenosa (phy) Kaj prenašamo po vodilu Podatke Ukaze oz. kontrolne signale prenašajo se po besedah (byte) izberi napravo / beri / piši naslov izvora ali ponora podatkov Signale, ki jih določa protokol prenosa zahteve (request), prekinitve (interrupt) potrditve (acknowledge) časovno usklajevanje (sinhrono / asinhrono) Kako prenašamo podatke vzporedno po besedah (paralelni) ali zaporedno po bitih (serijski prenos) po smeri enosmerno dvosmerno (dvojno ali 3-stanjsko vodilo) hkrati v obe smeri po protokolu enostaven cikel blokovni prenos (burst) manj usklajevanja, večji izkoristek vodila Sinhronizacija prenosa podatkov Sinhronizacija je pomembna za doseganje visokih hitrosti dinamični red – izogibanje tekmovanju med signali Sistemska sinhronizacija izvor in ponor imata skupni oscilator za urni takt podatki izvor tcbuf tc1 tcq td ponor tcbuf tc2 oscilator • Upoštevati moramo vse zakasnitve! – pri nizkih hitrostih prenosa nimamo težav Sinhronizacija pri izvoru podatkov Izvor pošilja podatke in uro source synchronous / clock forwarded (SDRAM) podatki izvor tcq tc ura td ponor td oscilator – dolžina linij za podatke in uro se mora ujemati – v ponoru naredimo ponovno sinhronizacijo na sistemsko uro Lastna sinhronizacija podatkov Podatkovni tok vsebuje podatke in uro serijski prenos podatkov podatki in ura izvor ponor – izvor dela paralelno/serijsko pretvorbo in kodiranje podatkov in ure – ponor dela serijsko/paralelno pretvorbo in rekonstrukcijo ure s fazno sklenjeno zanko (PLL) Razvoj komunikacije v digitalnih sistemih Vzporedni prenos podatkov po tiskanem vezju s standardnimi napetostnimi nivoji (5V TTL/CMOS) Paralelna vodila na plošči osebnega računalnika vodilo ISA (Industry Standard Architecture, 1981/84) IBM AT vodilo prenaša16 bitov pri 8 MHz, TTL paralelno vodilo za disk (IDE/ATA) Vzporedno vodilo Centronics prenos podatkov do tiskalnika, na krajše razdalje Zaporedna vodila RS232, RS485 diferencialni nivoji omogočajo večje razdalje Hitra zaporedna vodila 8 USB, Ethernet, PCI Express Vodila v osebnem računalniku sistemsko vodilo pomnilnik SDRAM 32 bitov, 33 MHz (133MB/s) 64 bitov, 66 MHz (533MB/s) hitri zaporedni vmesniki 64 bitov, 133 MHz, SSTL 2.5V do 533 MHz, SSTL 1.5V vzporedno vodilo PCI odvisno od procesorja PCIe (1-16 GB/s) SATA (1.5-6 GB/s) vmesniki za zunanja vodila zaporedni USB, Ethernet RS232, PS/2 Zaporedni (serijski) vmesniki Najprimernejši za komunikacijo na daljše razdalje Sinhroni serijski vmesniki Asinhroni vmesniki pošiljajo tudi uro pošiljajo le podatke, uro mora sprejemnik rekonstruirati Protokol določa vrstni red podatkovnih in kontrolnih bitov Npr. vmesnik PS/2 pošlje najprej start (‘0’), nato pa podatkovne bite od najnižjega (LSB) proti najvišjemu (MSB)… Lastnosti zaporednih vmesnikov Bitna hitrost = frekvenca s katero se prenašajo posamezni biti, določa periodo za posamezni bit (T= fbit ) Podatkovni okvir podatkovne bite vedno spremlja nekaj kontrolnih bitov podatkovni okvir – start, kontrolna vsota ali pariteta, stop okvir omogoča usklajevanje sprejemnika in oddajnika in detekcijo ali odpravljanje napak pri prenosu hitrost prenosa podatkov (podatkovni pretok) je zaradi okvirja manjša od bitne hitrosti Prenos poteka po povezavah z običajnimi logičnimi nivoji (npr. na tiskanem vezju) ali diferencialnih povezavah (za večje razdalje ali hitrosti prenosa) 11 Sinhroni zaporedni vmesnik – I2C Ločen prenos ure (SCL) in podatkov (SDA) po vodilu Enostavni vmesnik z dvema signalnima povezavama I2C – serijski EEPROM, D/A in A/D pretvorniki, senzorji Omogoča povezavo več enot na vodilo Npr. mikroprocesor AVR ima vmesnik TWI (Two Wire Interface) za komunikacijo po I2C protokolu Sinhroni zaporedni vmesnik - SPI Prenos ure (SCLK) ter podatkov iz glavne enote (MOSI) in v glavno enoto (MISO) Uporaba: MMC, SD kartice, senzorji, nalaganje mikrokrmilnikov prenos podatkov od MSB proti LSB več podrejenih enot lahko vežemo vzporedno ali v verigo 13 Sinhroni zaporedni vmesnik – I2S Serijski avdio vmesnik Prenos ure (SCK), podatkov (SD) in izbire kanala (WS) Uporaba: avdio kodeki (AD in DA), digitalni signalni procesorji enostaven protokol za prenos avdio podatkov Ostali zaporedni protokoli za avdio S/PDIF – zahteva ekstrakcijo ure iz podatkov AC97 – prenos 256 bitnih paketov z avdio podatki in kontrolnimi podatki za registre kodeka 14 Zgradba vezja za oddajnik I2S 15 Zaporedna pretvorba podatkov v vzporedno Pretvorba s pomikalnim registrom (SIPO) zaporedno vežemo toliko DFF, kolikor je dolg podatkivni paket paziti moramo na zaporedje – prvi poslani bit je MSB ali LSB Npr. 4-bitni pomikalni register, prvi bit je LSB podatki se pomikajo v desno, proti LSB p: process (CLOCK) begin if rising_edge(CLOCK) and ENABLE=‘1’ then sr <= DATA & sr(3 downto 1); end if; end process; 16 Vzporedna zaporedna pretvorba (oddajnik) Zaporedni oddajnik s pomikalnim registrom (PISO) p: process (CLOCK) begin if rising_edge(CLOCK) then if LOAD=‘1’ then sr <= d; else sr <= ‘0’ & sr(3 downto 1); end if; end if; end process; DATA <= sr(0); 17 Pretvorba z izbiralnikom Zaporedno vzporedno pretvorbo lahko naredimo z registrom in izbiralnikom 18 števec bitov (bit_cnt) določa kateri podatek gre na izhod Sinhronizacija sprejetih podatkov Digitalni sistem običajno dela s svojo uro Sinhronizacija z medpomnilniki potrebujemo sinhronizacijo podatkov, ki se pomikajo z uro, ki jo določa hitrost prenosa uporabimo pomnilnik FIFO (First-In First-Out) z dvemi vrati, na eni strani vpisuje podatke sprejemnik, na drugi jih bere sistem Sinhronizacija ob vzorčenju 19 potrebujemo vsaj 2x višjo frekvenco kot je hitrost prenosa vzorčimo uro in podatke ter detektiramo prehode ure za določanje trenutka zajemanja podatkov Asinhroni zaporedni vmesnik – RS232 Asinhroni sprejemnik in oddajnik (UART) asinhroni podatkovni paketi, sprejemna ura se sinhronizira za vsak paket – sinhronizacija paketov vnaprej dogovorjene bitne frekvence 9600, 38400, 115200 bit/s npr. podatkovni paket 8N1: Asinhroni zaporedni vmesnik LIN LIN (Local Interconnect Network) enostaven protokol, ki je podoben RS232 razvit za avtomobilsko industrijo V primerjavi z zmogljivejšim avtomobilskim vmesnikom CAN je počasnejši in enostavnejši uporaben za monitoring senzorjev cenena izvedba vmesnika z mikrokrmilnikom ne vsebuje robustnega odpravljanja napak ni uporaben za varnostno kritične aplikacije Podrobnosti prenosa podatkov Sinhronizacija sprejemnika min. 13 bitov logična 0, ki mu sledi 1 bit premora sledi start bit (logična 0) in kombinacija 5516 min. 1 bit start 1 min. 13 bitov 0 1 0 1 0 1 0 Prenos v serijski obliki 8N1 start bit (logična 0), 8 podatkov in stop bit (log. 1) 0 start LSB bit 1 2 3 4 5 6 7 MSB stop bit Asinhroni serijski oddajnik Algoritmični avtomat nov podatkovni bit se pošlje ob clk in pogoju ce=‘1’ s števcem določimo hitrost prenosa, ce je preliv števca npr. fclk =1MHz, fbit = 38.4kHz razmerje je 26,0416… zato uporabimo števec po modulu 26 s prelivom: if rising_edge(clk) then if st < 25 then st <= st + ‘1’; ce=‘0’ else st <= “00000”; ce=‘1’ … 23 Asinhroni serijski sprejemnik Glavna naloga sprejemnika je sinhronizacija paketa Sinhronizacija s prevzorčenjem vhodni signal vzorčimo z večkratnikom frekvence prenosa Npr. signal ce4 je 4 x bitne frekvence Delovanje sinhronizacije paketa 24 ob zaznanem startnem bitu (rx=0) postavimo števec i = 0 števec se nato povečuje z večkratnikom bitne frekvence podatke beremo približno na sredini časovnega intervala za posamezni bit Asinhroni vzporedni prenos podatkov Vodilo Centronics 8-bitni asinhroni prenos podatkov za zunanje naprave Preprost usklajevalni protokol PC z impulzom (strobe) označi nov podatek naprava signalizira zasedenost (busy) data 0.5µs 0.5µs strobe busy • Dodatni signali – prekinitev ob zaključku – status naprave (out of paper, error...) Izvedba vmesnika za vodilo Centronics Podatke in kontrolne signale vzorčimo z lokalno uro strobe vzorčimo dvakrat za detekcijo fonte! clk data1 stb1 stb2 busy p: process (clk) begin if rising_edge(clk) then if stb1=‘0’ and stb2=‘1’ then busy <= ‘1’; end if; if stb1=‘1’ and stb2=‘0’ then d <= data1; ... Sinhrono vzporedno vodilo Wishbone odprt standard za vodilo v integriranem vezju enostaven protokol različne povezovalne arhitekture bralni, pisalni, blokovni prenos in RMW prenos prenos podatka v enem urinem ciklu točka s točko, deljeno vodilo, stikalo sistem gospodar/podrejena enota (master/slave) različne možnosti razširitev osnovni prenos, registrski prenos lastni signali (address, data ali cycle tag) Povezovanje dveh enot Osnovna povezava master/slave Protokol vodila Wishbone Sinhrono vodilo za povezovanje komponent znotraj integriranega vezja kontrolne signale gledamo ob fronti ure CLK_I STB_O CYC_O ACK se postavlja asinhrono! ACK_I WE_O DAT_O ADR_O MASTER pisalni cikel bralni cikel (DAT_I dobi podatke) Primer podrejene enote (slave) Npr. register na vodilu Wishbone p: process (clk_i, rst_i) begin if rst_i=‘1’ then q <= “00000000”; elsif rising_edge(clk_i) then if stb_i=‘1’ and we_i=‘1’ then q <= dat_i; end if; end if; end process; ack_o <= stb_i; Laboratorij za načrtovanje integriranih vezij Univerza v Ljubljani Fakulteta za elektrotehniko Digitalni Elektronski Sistemi Osnove jezika VHDL 5. del: komponente in testne strukture 1 Komponente Model vezja je sestavljen iz para entity-architecture Modele vezja lahko povezujemo med seboj, tako da v opis vezja vključimo vezja kot komponente Strukturno načrtovanje takšen princip uporabljamo pri risanju sheme vezja struktura (zgradba) vezja, ki temelji na povezavi komponent Hierarhična vezja celotno vezje je sestavljeno iz komponent, ki so spet lahko zgrajene iz komponent... Deklaracija komponent v povezovalni strukturi Komponente deklariramo v strukturi na začetku arhitekturnega stavka (pred begin) Navedemo ime komponente in zunanje priključke (stavek port) architecture struktura of test is component reg is port ( d : in std_logic_vector(7 downto 0); clk, en : in std_logic; q : out std_logic_vector(7 downto 0) ); end component; begin Vključevanje komponente v strukturo Komponento vključimo v vezje s stavkom port map vsaki komponenti damo enolično oznako v oklepaju navedemo povezave begin r1: reg port map (d=>data, clk=>clk, en=>en1, q=>data_reg); r2: reg port map (d=>data, clk=>clk, en=>en2, q=>op_reg); ... end struktura; Vključevanje komponent (2) oznaka: ime_komp port map (sk1=>sv1, sk2=>sv2, sk3=>open); Oznaka predstavlja ime dela vezja oznake uporabljamo za poimenovanje procesov, komponent in ostalih gradnikov vezja Ime komponente je ime iz entity stavka Povezovanje: najprej navedemo ime signala na komponenti, ki ga priredimo signalu v vezju če kakšen signal ni povezan, uporabimo open Strukture za testiranje vezij Testiranje s simulacijo, kjer simulator ročno nastavljamo omejene možnosti, predvsem za preprosta vezja simulator praktično nikoli ne poženemo le enkrat ! Testiranje s testno strukturo 6 v testni strukturi določimo časovni potek vhodov v vezje ko je testna struktura narejena, jo večkrat uporabimo za izvedbo simulacije vezja v simulatorju se ni potrebno ukvarjati z nastavljanjem vrednosti Testna struktura v jeziku VHDL Testna struktura - Test Bench model vezja (entity – architecture), ki običajno nima zunanjih priključkov Testna struktura vključuje testirano vezje kot komponento Za generiranje stimulatorjev (vhodov v vezje) uporabljamo VHDL konstrukte brez omejitev definiramo časovno spreminjanje signalov uporabljamo stavke za izpis poročil med simulacijo uporabljamo IO funkcije za branje in zapis datotek Časovno spreminjanje signalov Signalu lahko priredimo več dogodkov, ki so vezani na čas: reset <= ‘0’, ‘1’ after 100 ns, ‘0’ after 200 ns; data <= “00101100”, “ZZZZZZZZ” after 500 ns; reset data 00101110 0 ZZZZZZZZ 500 t(ns) Kadar je v testu veliko dogodkov uporabimo proces Prirejanje dogodkov le v najbolj preprostih primerih, npr. za enkratne dogodke Primer: test ALE Deklaracija komponente in notranjih signalov architecture behavior of test is component ale is port ( a, b : in std_logic_vector(7 downto 0); op : in std_logic_vector(1 downto 0); rez : out std_logic_vector(7 downto 0) ); end component; signal a,b: std_logic_vector(7 downto 0); signal op: std_logic_vector(1 downto 0); signal rez: std_logic_vector(7 downto 0); begin Vključimo komponento v test UUT: ALE port map (a=>a, b=>b, op=>op, rez=>rez); 9 Test ALE (2): nastavljanje vhodov Napišemo proces v katerem spreminjamo vhode časovni potek signalov določajo stavki wait for uporabimo proces brez seznama signalov stim_proc : process begin a <= "00000011"; b <= "00000010"; op <= "00"; -- operacija AND wait for 100 ns; op <= "01"; -- vsota wait for 100 ns; -- razlika op <= "10"; wait for 100 ns; -- odstej 1 op <= "11"; wait; -- zamrzni proces, da se ne ponavlja end process; 10 Test ALE(3): rezultat simulacije Ali lahko testna struktura samodejno preverja vezje? Da, npr. preverimo ali je vsota takšna, kot jo pričakujemo: op <= "01"; -- vsota wait for 100 ns; assert rez = 5 report "Napaka, vsota ni enaka 5 !"; … 11 Testiranje sekvenčnih vezij Za generiranje ure uporabimo procesno okolje brez seznama signalov in stavke wait for proces se izvaja, dokler ga ne ustavimo z wait GEN_URE: process begin clk <= ‘0’; wait for 50 ns; clk <= ‘1’; wait for 50 ns; end process; GEN_URE: process begin if endsim=false then clk <= ‘0’; wait for 50 ns; clk <= ‘1’; wait for 50 ns; else wait; end if; end process; Primer: testiranje akumulatorja akumulator_tb stim a op osc clk uut b a op clk reg reg nula nula akumulator V testni strukturi naredimo zunanje povezave v vezju b b <= reg V procesu osc naredimo generator ure V procesu stim pa določimo časovni potek ostalih vhodov 13 Laboratorij za načrtovanje integriranih vezij Univerza v Ljubljani Fakulteta za elektrotehniko Digitalni Elektronski Sistemi Načrtovanje v jeziku VHDL Pravila načrtovanja v jeziku VHDL 1 Pred pisanjem kode naredi načrt Pred kodiranjem je potrebno poznati strukturo vezja Nariši diagram podatkovne poti Naredi diagram stanj sekvenčnega vezja šele ko so narejeni diagrami začni kodirati Diagram stanj sekvenčnega vezja: FSM, ASM 3 Določi časovni potek signalov 4 Pravila Vezje naj bo sinhrono 1. Pravilno uporabljaj seznam signalov v procesu 2. 5. 6. 7. 5 vsi vhodi v kombinacijsko vezje signal clk za sekvenčno vezje le v testni strukturi je seznam lahko prazen Določi vrednosti vsem izhodom, 3. 4. Ne uporabljaj asinhronih signalov pri kombinacijskem vezju v vseh primerih Priredi vrednosti signalu le v enem procesu Ne testiraj vrednosti X ali Z Ne določaj zakasnitev v opisu vezja, ki ga boš sintetiziral Ne delaj kombinacijskih zank 1. Vezje naj bo sinhrono V vezju naj bo ena (globalna) ura namesto deljenih signalov za uro raje uporabi hitro uro in pogoj za omogočanje (Clock Enable) Flip-flopi določajo signale za vhode komb. logike, ki ima izhode vezane na flip-flope v vsakem urnem ciklu je le ena sprememba vrednosti signala Če je le možno NE uporabljaj asinhronih reset signalov asinhroni signali morajo biti brez motenj Ne uporabljaj nivojsko proženih zapahov (latch) 6 v vezju naj bodo le robno proženi flip-flopi 1. Vezje naj bo sinhrono Uporabi le en pogoj za fronto ure sicer se vezje ne bo dalo sintetizirati! p: process(start, stop) begin if rising_edge(start) then en_reg <= '1'; elsif rising_edge(stop) then en_reg <= '0'; end if; end process; 7 p1: process(start, stop) begin if stop='1' then en_reg <= '0'; elsif rising_edge(start) then en_reg <= '1'; end if; end process; 1. Vezje naj bo sinhrono ne uporabljaj asinhronih signalov ! 8 2. Pravilno določi seznam signalov v procesu v kombinacijskem vezju morajo biti vsi vhodi 9 2. Seznam signalov v sekvenčnem procesu v seznamu je le ura in morebitni asinhroni reset 10 3. Določi vrednosti izhodom v vseh primerih sicer bodo v vezju zapahi 11 3. Določi vrednosti izhodom v vseh primerih dovoljen_prehod <= '1' when luc=zelena; dovoljen_prehod <= '1' when luc=zelena else '0'; ali: d: process(luc) begin if luc=zelena then dovoljen_prehod <= '1'; elsif luc=rdeca then dovoljen_prehod <= '0'; end if; end process; 12 3. Določi vrednosti izhodom v vseh primerih določi privzete vrednosti 13 4. Vrednost priredimo le v enem procesu! p1: process(clk) begin if rising_edge(clk) then if tipka='1' then delam_reg <= '1'; end if; end if; end process; p1: process(clk) begin if rising_edge(clk) then if tipka='1' then delam_reg <= '1'; elsif q=5 then delam_reg <= '0'; end if; end if; end process; 14 p2: process(clk) begin if rising_edge(clk) then q <= q + 1; if q=5 then delam_reg <= '0'; end if; end if; end process; p2: process(clk) begin if rising_edge(clk) then q <= q + 1; end if; end process; 5. Ne primerjaj vrednosti z X ali Z! Deluje na simulaciji, vendar ne po sintezi! 15 6. Ne uporabljaj zakasnitev v opisu vezja Zakasnitve so del simulacijske testne strukture programu za sintezo ne moremo določiti zakasnitev a <= c xor d after 20 ns; Ne uporabljaj procesov s stavki wait za sintezo vezja ! 16 7. Ne delaj kombinacijskih zank Povratna vezava v kombinacijskem vezju ni dobra praksa C <= not C; a <= a + 1; vezje bo osciliralo ali delovalo le v posebnih primerih 17 Laboratorij za načrtovanje integriranih vezij Univerza v Ljubljani Fakulteta za elektrotehniko Digitalni Elektronski Sistemi Programirljiva vezja in mikro-programiranje FPGA, mikro-programirano krmilno vezje 1 Programirljiva vezja / procesorji programirljivo vezje programski biti določajo strukturo (konfiguracijo) LC LC delovanje logičnih celic (LC) povezave znotraj LC povezave v povezovalni mreži LC mikroprocesor program določa ukaze, ki jih CPE izvaja pomnilnik 2 LC CPE Programirljiva vezja CPLD / FPGA Complex Programmable Logic Device polje PLD gradnikov Flash tehnologija manjša vezja PLD PLD PLD Field Programmable Gate Array 3 matrika LC in povezav, dodatno RAM, CPU… CMOS SRAM tehnologija zelo velika vezja LC LC LC RAM LE CPE LE LC LC LC LC Podrobnejša zgradba FPGA pri programiranju vpišemo vrednosti v konfiguracijski RAM tehnološka preslikava določa delovanje logičnih celic (LC) in povezave v mreži načrtovano vezje preslikamo v strukturo vezja FPGA logična celica LUT, MUX, DFF prenosna logika dodatne funkcije LC bx a4 a3 a2 a1 clk 4 0000 0 0001 1 0010 1 ... vpogledna tabela y MUX 0 D yq flip-flop pomnilni element Tehnološko preslikano vezje Xilinx FPGA • • rezultat avtomatične preslikave načrtovanje vezja poteka na višjem nivoju xc3s50 tq144 500 tabel (LUT) 280 D flip-flopov 8 kB DPRAM ~ 270k log. vrat 5 Sekvenčno vezje s povratno vezavo 3-bitni seštevalnik in 3-bitni register = 3-bitni števec vezje zasede 3 logične celice 0 0 0 + a0 a1 a2 0 0 1 b0 b1 b2 0 1 0 s0 s1 s2 Sekvenčno vezje ima 23 = 8 stanj (000 do 111) 6 Sekvenčno vezje: krmilni avtomat Sekvenčno vezje vsebuje n-bitni register za 2n stanj Diagram prehajanja stanj 7 Izvedba vhodne logike s tabelami (LUT) vsebina LUT določa prehajanje stanj mir t='1' impulz t='0' spusti 8 t Mikro-programirano krmilno vezje Krmilni avtomat narejen z LUT je mikro-programiran mikro-programirano vezje ima krmilne vrednosti shranjene v pomnilniku vrste ROM ali RAM mikroukazi so besede v pomnilniku mikroprogram je zaporedje mikroukazov v programski pomnilnik vrste RAM lahko vpisujemo mikroukaze 9 naslov programski pomnilnik 5 VHOD podatek 6 4 stanje register stanj 4 naslednje stanje IZHOD Mikro-programiran krmilnik s števcem Programski števec omogoča izvedbo skokov izvajanje algoritmov, ki nimajo vseh mikroukazov v zaporedju N programski pomnilnik naslov load števec M podatek naslov izhod N IZHOD 10 Laboratorij za načrtovanje integriranih vezij Univerza v Ljubljani Fakulteta za elektrotehniko Digitalni Elektronski Sistemi Procesorji Mikro-programirana procesna enota, primeri 1 Mikro-programiran krmilnik s števcem Mikroukazi mikroprogram se izvaja kot zaporedje mikroukazov mikroukazi določajo krmilne izhode skočni ukazi ob pogoju izvršijo skok na nov naslov krmilni izhodi pogoj naslov +1 reg (PC) podatkovna pot naslov programski pomnilnik 2 mikroukaz Mikro-programirana krmilna (procesna) enota izvršilna enota z ALE in pomnilnikom krmilni izhodi pogoj naslov +1 reg (PC) ALE status naslov register register register register 3 podatk. pomnilnik programski pomnilnik mikroukaz Mikrooperacije Aritmetično-logična enota (ALE) izvaja računske mikrooperacije, npr.: Krmilni izhodi izbirajo operacijo, operande in izhodni register Skočne operacije spremenijo zaporedje izvajanja ukazov 4 operand je v registru ali v pomnilniku brezpogojni skok, ali pogojni skok, glede na rezultat zadnje operacije – status: prenos, negativni rezultat, rezultat 0…) Kode in koraki izvajanja mikrooperacij za direktno krmiljenje enot z mikroukazi potrebujemo veliko bitov npr. 4 bite za ALE, 12 za registre, 16 za pomnilnik…. krmilni signali so kodirani potrebujemo ukazni dekoder mikroukazi se izvršijo v več urnih ciklih bolj optimalna kritična pot in višja frekvenca ure nekaterih operacij ne moremo narediti v enem ciklu 5 npr. branje in pisanje v pomnilnik Von Neumannov model računalnika Centralno procesna enota (CPE) in pomnilnik vhodno – izhodna enota skrbi za komunikacijo z zunanjostjo podatkovno vodilo glavni pomnilnik registri ALE ukazni reg. izvršilna enota prog. števec naslov krmilna enota delovanje CPE določa nabor ukazov ukazi so prilagojeni programskim jezikom (C/C++) vhodnoizhodna enota Osnovni gradniki mikroprocesorja Mikroprocesor na integriranem vezju vsebuje izvršilno in krmilno enoto Mikroprocesor potrebuje za delovanje: zunanjo uro in reset zunanji pomnilnik s programskimi ukazi in podatki vhodno in izhodno (periferno) enoto za komunikacijo z okolico periferna enota je lahko del pomnilnika (na določenih naslovih) ali pa poteka komunikacija preko posebnih V/I ukazov V praksi potrebujemo vsaj dve vrsti pomnilnika 7 za program takšnega, ki ohranja vsebino (ROM, Flash) za delovne podatke pa pomnilnik s hitrim branjem in pisanjem (RAM – Random Access Memory) Mikroprocesorji za vgrajene naprave Mikrokrmilniki so sistemi na integriranem vezju, ki vsebujejo mikroprocesorsko jedro (izvršilno in krmilno enoto), programski in podatkovni pomnilnik, ter različne V/I vmesnike: vzporedna vrata (Port) zaporedne komunikacijske vmesnike: I2C, SPI, UART analogno / digitalne (A / D) in D / A pretvornike modulatorje (PWM), časovnike, števce… komunikacijske krmilnike: Ethernet MAC, USB Primer mikrokrmilnikov 8 Atmel AVR, 8-bitni procesor na razvojnem sistemu Arduino ARM-7, 32-bitni procesor na razvojnem sistemu Š-ARM Procesorsko jedro AVR Ukaze izvaja v dveh korakih (urnih ciklih) 1. 2. prenesi ukaz iz pomnilnika v ukazni register (fetch) dekodiraj, izvrši ukaz (ALE) in shrani rezultat (execute) podatkovno vodilo Flash (program) programski števec status registri ukazni reg. ALE dekodirnik RAM (podatki) 9 Procesorsko jedro ARM-7 Ukaze izvršuje v treh ciklih: prenesi dekodiraj izvrši Beri Pomakni ALE Shrani ukazni reg. podatk. reg. krmilna enota programski števec pomikalnik ALE 10 množilnik registri Učni procesor: CPU-12 koda naslov 12-bitni podatek +1 reg (PC) code FSM ALE adr naslov akumulator glavni pomnilnik mikroukaz ukazi z akumulatorjem, en operand je v pomnilniku 1. 2. 11 prenesi 4-bitno ukazno kodo in naslov operanda iz pomnilnika prenesi operand (12 bitni podatek) in izvedi ukaz Potek izvedbe programa 0 : lda 3 1 : add 3 2 : jmp 0 3: 5 12 0001 0000 0011 1000 0000 0011 0100 0000 0000 0000 0000 0101 Nadgradnja: vhodno – izhodna enota Dat_i koda naslov 12-bitni podatek +1 reg (PC) code FSM ALE adr naslov akumulator Dat_o 13 glavni pomnilnik Wr_o mikroukaz Nadgradnja ALE zgradimo univerzalne celice za posamezen bit aritmetične operacije: seštej (s prenosom), odštej, prištej 1… logične operacije: AND, OR, XOR sel(3:0 p(1:0) 0000 0001 0010 0011 0100 0101 0110 1x01 1x10 1x11 14 00 01 10 11 00 01 10 00 00 00 m(1:0) Cprop 00 00 00 00 00 00 00 01 10 11 0 0 0 0 0 1 0 0 0 0 Cinv 0 0 0 0 0 0 1 0 0 0 Cset ukaz 0 0 1 0 1 0 0 0 0 0 lda add sub dec inc adc sbc anda ora xora Laboratorij za načrtovanje integriranih vezij Univerza v Ljubljani Fakulteta za elektrotehniko Digitalni Elektronski Sistemi Delovanje procesorja AVR Zbirnik, primer programa 1 Procesor Atmel AVR ATmega328 Procesorsko jedro AVR 8 bitno, frekvenca do 20 MHz pri 5V / 10 MHz pri 3.3V 131 strojnih ukazov, RISC zmogljivost 1 ukaz/cikel (20 MIPS pri 20MHz) (razen skočnih ukazov) periferne enote: časovniki, vzporedni in zaporedni vmesniki, večkanalni A/D pretvorniki in modulatorji PWM Pomnilni elementi 32KB Flash (program) 1KB EEPROM in 2KB SRAM (podatki) 32 registrov 2 8 bitni registri R0-R31 3 registrski pari za16 bitne vrednosti (X,Y, Z) Delovanje AVR procesorskega jedra programski števec vsebuje naslov naslednjega ukaza IR vsebuje naslednji ukaz ID vsebuje trenutni ukaz Registri: R0-R31 ALE – glej označeno interno podatkovno pot Flash programski pomnilnik 16 oz. 32 bitni ukazi RAM vsebuje delovne podatke EEPROM trajni podatki 3 počasen dostop, omejeno število vpisov v pomnilnik 8-bitno podatkovno vodilo Flash (program) prog. števec status registri ukazni reg. IR ALE ukazni dek. ID RAM (podatki) EEPROM Nabor strojnih ukazov procesorja AVR mikrooperacije aritmet. / logične podatkovni prenos a+b ADD reg1=reg2 MOV operacije z biti a-b SUB reg=17 LDI a<<1 LSL a&b AND reg=mem LDS a>>1 LSR, a|b OR reg=*mem LD a++ INC mem=reg STS ØC (ni v C) ROL, ROR a-- DEC *mem=reg ST -a NEG periferni IN statusni biti a=0 CLR periferni OUT SEI, CLI, CLZ... sklad PUSH ni operacije NOP sklad POP … … … 4 … … … Primer ukazov in njihove strojne kode Naloži neposredno konstanto (Rd <= K) LDI Rd, K strojna koda: 1110 bbbb rrrr bbbb omejitve: registri R16-R31; konstanta K < 255 LDI R16, $2C koda: 1110 0010 0000 1100 ali $E20C Seštej in shrani v Rd (Rd <= Rd + Rr) ADD Rd, Rr strojna koda: 0000 11rd dddd rrrr Rd in Rr sta katerakoli registra R0-R31 ADD R16, R17 5 ddddd je 10000, rrrrr je 10001, koda ukaza: $0F01 Strojni program Naloži program v pomnilnik na naslov 0 shranimo $E20C na naslov 1 shranimo $E01F na naslov 2 shranimo $0F01 0000: $E20C LDI R16, $2C 0001: $E01F LDI R17, $0F 0002: $0F01 ADD R16, R17 Izvršimo zaporedje treh ukazov nastavi prog. števec na 0 in izvedi 3 ukazne cikle (prenos/izvrši) Pregled rezultata: R16 = R16 + R17 = $2C + $0F = $3B Kaj se bo izvršilo po teh treh ukazih? ne vemo, odvisno kaj je zapisano v pomnilniku Flash… 6 Sintaksa ukazov v zbirniku (Assembler) 3 možne oblike, [] pomenijo opcijo [oznaka:] direktiva operandi [;komentar] [oznaka:] ukaz operandi [;komentar] [oznaka:] [;komentar] Vsaka vrstica je direktiva ali ukaz ali oznaka ali pa prazna vrstica komentar začnemo s podpičjem, zaključi se na koncu vrstice direktiva ukaz in operand oznaka 7 komentar Skočni ukazi in primeri v jeziku C JMP, RJMP: brezpogojni skok npr. neskončna zanka: M_LOOP: …ukazi… jmp M_LOOP while (1) { ...ukazi... } CALL, RET: klic podprograma in vrnitev (return) npr. podprogram: M_LOOP: … CALL FV … FV:…ukazi… RET 8 void fv() { …ukazi… return; } void main () {… fv(); } Pogojni stavek Skoči na L1, če je a==b, sicer skoči na L2 naredimo s kombinacijo pogojnih in brezpogojnih skokov M_LOOP: ; primerjaj, CPSE a, b ; preskoči, če a=b JMP L2 L1:… ; a == b JMP M_LOOP L2:… ; a != b JMP M_LOOP while (1) { if (a==b) { (L1) } else { (L2) } } CPSE (compare, skip if equal) preskoči naslednji ukaz (JMP L2) če sta operanda enaka, tako da se izvršijo ukazi za oznako L1. Hitro nastane zmešnjava – NARIŠI DIAGRAM POTEKA! 9 Pogojni skočni ukazi Skok, ki se izvede glede na rezultat prejšnjega ukaza Aritmetični in logični ukazi shranijo rezultat in zastavice Primerjava (CP) naredi odštevanje, vendar ne shrani rezultat ampak samo postavi zastavice Z=1, če je rezultat 0, N=1,če je rezultat negativen, C=1, če je prišlo do prenosa Npr. BRNE: skok, kadar je rezultat različen od 0 (Z=0) BREQ, skok, kadar je rezultat enak 0 (Z=1) 10 Zanke s 16-bitnim števcem For zanka, ki se ponovi 20000-krat ($4E20) LDI temp0, 0x20 LDI temp1, 0x4E LOOP: ... DEC temp0 BRNE LOOP DEC temp1 BRNE LOOP ; spodnji bajt ; zgornji bajt for (i=20000; i!=0; i--) { ... }; ; odštej 1 ; skok če !=0 Najprej se DEC temp0 ponovi32-krat (0x20), dokler ni 0 Potem se izvršita vgnezdeni zanki temp0 se ponovi 256-krat, temp1 pa 78-krat ($4E), kar je skupaj 19968-krat (če dodamo 32 dobimo 20000) 11 Dostop do perifernih enot vzporedna vrata (I/O port) nastavi 4 vh. in 4 izh. bite beri vhode izhodi 12 LDI R19, $F0 OUT DDRD, R19 IN R20, PORTC LDI R21, $50 OUT PORTD, R21 smer izhodna vred. / pullup vhodna vred. DDRx PORTx PINx Seštevanje 16-bitnih nepredznačenih števil Vsak izmed operandov je shranjen v dveh bajtih Najprej seštejemo spodnja bajta, nato pa še zgornja bajta z upoštevanjem prenosa od spodnjih Npr. prvi operand je v (R1, R0) drugi operand je v (R3, R2) ADD R0, R2 ADC R1, R3 seštej s prenosom 13 + R1 R0 R3 R2 R1 R0 unsigned short a, b; a = a + b; Množenje in deljenje Nekateri procesorji AVR imajo 8-bitni strojni množilnik Rezultat se izračuna v dveh urnih ciklih in shrani v R1 R0 Npr. R16 vsebuje vrednost 100, R17 vsebuje vrednost 200 MUL R16, R17 produkt je 16-bitna vrednost, rezultat: R1 <= $4E, R2 <= $20 Množenje ali deljenje z 2 s pomikanjem bitov Pomakni bite v bajtu na levo (LSL) ali desno (LSR) Npr. LDI R16, 0b11011100; (22010) LSL R16; rezultat 0b10111000 (18410) in zastavica C=1 LSR R16; rezultat 0b01101110 (11010), C=0 14 prazna mesta se zapolnijo z ničlami bit, ki pri prenosu izpade, se shrani v zastavico C Primer: filtriranje podatkovnega toka Zaporedje digitalnih vzorcev pošljemo skozi sito obdelava zvoka, slike … Filtriranje izvedemo z matematično konvolucijo, kjer zaporedne vzorce množimo s konstantami in seštejemo Npr. Gaussovo nizko sito s koeficienti 1/8, 6/8, 1/8 vzorec1 X 1/8 vzorec2 X 6/8 vzorec3 X 1/8 Σ rezultat1 15 rezultat2 vzorec4 Izvedba konvolucije s procesorjem 8-bitne vzorce preberemo iz PINB naredimo množenje s 6 in seštejemo 16-bitne vrednosti naredimo deljenje z 8 s pomikom in rotacijo loop: MOV r22, r21 ;premakni MOV r21, r20 ;premakni IN r20, PINB ;beri R22 16 r21, Konst6 r0, r20 r1, Konst0 r0, r22 r1, Konst0 ; x6 ;vsota ;prenos ;vsota ;prenos R21 R20 X 6 + MUL ADD ADC ADD ADC PINB R1 R0 Konst0 R20 R1 R0 Izvedba konvolucije s procesorjem 2 naredimo deljenje z 8 s pomikom in rotacijo pošljemo rezultat na PORTD R1 R0 C LSR ROR LSR ROR LSR ROR r1 r0 r1 r0 r1 r0 ; 3x pomik ; in rotacija OUT PORTD, r0 JMP loop 17 ; izhod Delovanje procesorja Za izračun enega rezultata potrebujemo 20 urnih ciklov Kako vemo, kdaj je na voljo podatek (rezultat) ? 1. Naredimo usklajevalni protokol z uporabo ostalih priključkov 2. Napišemo zanko v prekinitveni rutini 18 potrebnih je še več ciklov procesor ob zuanjem prekinitvenem signalu skoči na rutino in napravi en računski cikel komunikacijske enote izvedejo prekinitev, ko dobijo nov podatek
© Copyright 2024