Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti Simulace číslicových obvodů (MI-SIM) zimní semestr 2010/2011 Jiří Douša, katedra číslicového návrhu (K18103), České vysoké učení technické v Praze, fakulta informačních technologií Přednáška 4: VHDL- procesy Stručný obsah: deklarace a aktivace procesu, delta zpoždění, setrvačné a transportní zpoždění, simulační cyklus, sekvenční příkazy, příklady.
Procesy část programu, kterou lze dynamicky aktivovat v závislosti na vnější události ( ve VHDL pouze změna hodnoty signálu), provádění procesu lze přerušit a později (v závislosti na vnější události či čase) lze pokračovat od místa posledního přerušení, všechny procesy ve VHDL jsou implicitně periodické, princip aktivace: kooperativní multitasking ( každý proces dobrovolně odevzdá řízení synchronizačnímu jádru), dokončení procesu nebo explicitně vyžadovaný přechod (wait) Aktivní. automatický přechod Suspendovaný na začátku simulace (v čase 0) je automaticky zajištěná aktivace všech procesů. 21.10.2011 MI-SIM Jiří Douša 2
Příkaz procesu Syntax: [<label>] process [ ( citlivostní seznam) + -- deklarativní část (lokální deklarace): *datové typy a podtypy+, *proměnné a konstanty+, [procedury a funkce], [ soubory]. -- příkazová část (následují přípustné příkazy): příkaz assert (sekvenční), signálový přiřazovací příkaz (sekvenční), přiřazovací příkaz pro proměnné, volání podprogramů (sekvenční), if..then.. elsif.. else.., příkazy wait, case, loop, exit, return, null. end process [ <label> ]; Poznámky: z procesu nelze nic exportovat, proces jako celek je jedním z paralelních příkazů. 21.10.2011 MI-SIM Jiří Douša 3
Aktivace procesů citlivostní seznam: seznam signálů, jejichž změna způsobí provedení procesu od začátku, procesy s citlivostním seznamem nejsou přerušitelné příkazem wait, po ukončení procesu - odevzdání řízení jádru. příkaz wait: vytvoří reaktivační bod, přeruší proces a odevzdá řízení jádru, nutné stanovit podmínky pro příští pokračování procesu, příklady forem příkazu wait: wait for 10 ns; -- čeká po dobu 10 ns wait on a; -- čeká na změnu signálu a wait until a = 1 ; --čeká na změnu signálu a která končí hodnotou 1 (náběžná hrana) wait until a = 0 ; -- čeká na závěrnou hranu wait [on a] [ until b = 1 ] [ for 10ns]; -- proces pokračuje -- tehdy nastane-li událost na signálu a současně je --splněna podmínka b = 1 (max. doba čekání 10 ns), wait; -- čeká navždy 21.10.2011 MI-SIM Jiří Douša 4
Příklady aktivace procesů 1) 2) 3) 4) 5) 6) process (a) process process b<=not a; b<=not a; P4 P5 end; wait on a; b<=not a; end; P6 end; a 0 10 20 30 40 50 60 1),2) časy aktivace procesu b 4) inic. P4: wait on a; 5) inic. P5: wait until a = 1 ; 6) 3)...zacyklení procesu P6: wait until a = 1 for 10 ns; 21.10.2011 MI-SIM Jiří Douša 5
Přiřazování hodnot v procesu proměnným: okamžitě při provedení příkazu, signálům: po provedení všech fází všech naplánovaných procesů (po uplynutí delta zpoždění) důvod: vytvořit ilusi paralelního výpočtu, případně vyloučit vliv pořadí vyhodnocování procesů Příklad 1: vzájemně komunikující procesy P1, P2, P3 a P1 P2 P3 out a) pořadí bez delta: P1, P2, P3.bez zákmitů nebo P1,P3, P2, P3..zákmit na out nebo P2, P1,P3...bez zákmitů nebo P2, P3,P1,P3.zákmit na out nebo P3, P1,P2,P3.zákmit nebo P3,P2,P1,P3..zákmit b) pořadí s delta: P1, P2, P3, ulož. hodnot, P3 nebo P1, P3, P2, ulož. hodnot, P3 nebo P3, P1, P2, ulož. hodnot, P3 nebo P3,P2,P1, ulož. hodnot, P3 nebo P2,P1,P3, ulož. hodnot, P3 nebo P2,P3,P1, ulož. hodnot, P3 21.10.2011 MI-SIM Jiří Douša 6
Přiřazování hodnot v procesu Příklad 2: a P1 P2 P3 P4 P5 b 1) změna a...postupný výpočet P1, P2, P3, P4, P5 2) změna b současný výpočet všech procesů vliv pořadí bez delta: i) předpoklad: b je hranově citlivý hodinový vstup posuvného registru: pořadí např.: P1, P2, P3, P4, P5.špatně, pořadí např.: P5, P4, P3, P2, P1.správně, j) předpoklad: b není hranově citlivý vstup (např. kombinační obvod ): pořadí např. P1, P2, P3, P4, P5..správně např.: P5, P4, P3, P2, P1, P2, P3, P4, P5...po ustálení správně, ale různá pořadí produkují různé zákmity vliv pořadí s delta: i) b je hranově citlivý vstup posuvného registru: libovolné pořadí výpočtů všech procesů následované uložením výsledných hodnot za jediné delta.správně j) b není hranově citlivý vstup ( jde např o kombinační obvod): lib. pořadí všech (např.: P1, P2, P3, P4, P5), delta, uložení hodnot, lib. pořadí (např.: P2, P3, P4, P5), delta, uložení hodnot, lib. pořadí (např. P3, P4, P5), delta, uložení hodnot, lib. pořadí (např. P4, P5), delta, uložení hodnot, P5, uložení hodnot,..stejné výstupní zákmity pro všechna možná pořadí 21.10.2011 MI-SIM Jiří Douša 7
Přiřazování hodnot v procesu Příklad: rozdíly v chování procesů P0, P1 P0: process P1: process--necht a, b jsou variable a,b:integer:=0; -- signály typu integer a: = a+1; a <= a + 1; b: = a+1; b <= a + 1; wait for 10 ns; wait for 10 ns; end process ; end process ; b P0 P1 3 2 1 0 b a b a a 10 20 30 a,b a,b ns pozor: toto není nejvhodnější znázornění delta zpoždění reálný čas delta zpoždění uložení hodnot aktivace procesů 21.10.2011 MI-SIM Jiří Douša 8
Přiřazování hodnot Příklad 1: jiné znázornění delta zpoždění v procesu P1 delta (viz minulý slide) delta proces P1 proces P0 1 1...uložení a,b 0 0 ns 10 20 30 10 20 30 modelový čas [ns] Příklad 2: P1, P2, P3 procesy a b c d P1 e P2 f P3 g delta 3 2 1 změna g změna f, g: aktivace P3 změna e,f, g: aktivace P2,P3 změna a, b, c, d: aktivace P1, P2, P3 změna g změna f: aktiv. P3 změna c: aktivace P2 model. čas 21.10.2011 MI-SIM Jiří Douša 9
Simulační cyklus ve VHDL Start inicializace proměnných a signálů, time:=0 provedení všech procesů simulačního programu (bez uložení hodnot) existuje delta zpoždění? + - posun modelového času uložení vypočtených hodnot signálů a naplánování příslušných citlivých procesů Konec simulace? + Stop - provedení procesů citlivých na právě provedené změny signálů (bez uložení vypočtených hodnot) 21.10.2011 MI-SIM Jiří Douša 10
Odložený proces novinka ve VHDL-93 účel: definovat poslední události pro určitou hodnotu model.času => operační část je spuštěna až po ustálení hodnot všech signálů v daném časovém okamžiku (např. výstup hodnot do souboru) deklarace: postponed process ( ) end process; microtime -delta intervaly time provedení odloženého procesu macrotime omezení: může být pouze jeden odložený proces v operační části nelze použít příkaz wait s nulovým zpožděním v signálových přiřazovacích příkazech musí figurovat nenulové zpoždění 21.10.2011 MI-SIM Jiří Douša 11
Zápis do souboru Příklad: zápis ustálených hodnot signálů a, b ( v okamžiku změny některého z nich) do textového souboru; předpoklad: signal a,b: bit_vector (7 downto 0); zápis okamžité hodnoty modelového času pro který nastala změna některého z uvedených signálů postponed process (a, b, c, d) file vystup: text open write_mode is s1.dat ; -- VHDL-93 variable BUF : line; variable va, vb : bit_vector (7 downto 0); va := to_bitvector ( a); vb := to_bitvector ( b); write ( BUF, now); -- uložení hodnoty modelového času write (BUF, va); write (BUF, vb); writeline (vystup, BUF); -- fyzický výstup hodnoty času a -- dvojice osmic bitů end process; 21.10.2011 MI-SIM Jiří Douša 12
Modely zpoždění 2 typy zpoždění: transportní: Y <= transport X after <zpoždění>; propouští všechny pulsy, vhodné pro simulaci spojů setrvačné: Y <= X after <zpoždění;>; implicitní, vhodné pro zpoždění součástek nepropouští užší pulsy než je vlastní zpoždění pokud příkaz obsahuje zápis více hodnot, pak se chápe jako transportní zpoždění y <= 0 after 1 ns, 1 after 2 ns, 0 after 3 ns,.; při opakovaném provedení příkazu jeho funkce závisí na intervalech mezi jednotlivými provedeními a na hodnotách zpoždění při každém provedení příkazu se plánují všechny zmíněné hodnoty od začátku a rozdíly jsou následující: dopravní zpoždění - nově plánovaná hodnota pro čas t N zruší všechny původně naplánované hodnoty, které byly naplánovány pro hodnoty modelového času větší než t N setrvačné zpoždění- při plánování nové hodnoty se vždy ruší původní naplánovaná hodnota VHDL-93: Y <= reject 2 ns X after 5 ns; -- se zpožděním 5 ns propouští pulsy delší než 2 ns 21.10.2011 MI-SIM Jiří Douša 13
Modely zpoždění: Příklad: transportní zpoždění demonstrace vlivu několika navzájem zpožděných příkazů na výslednou hodnotu signálu X <= transport 1 after 10 ns; --předpoklad: now =0 wait for 12 ns; X <= transport 0 after 10 ns; --now = 12 wait for 6 ns; X <= transport 1 after 10 ns; --now = 18 wait for 2 ns; X <= transport 0 after 20 ns; --now = 20 wait for 2 ns; X <= transport 1 after 10 ns; --now = 22 0 10 20 30 40 time ruší se hodnota 0 naplánovaná pro čas 40 21.10.2011 MI-SIM Jiří Douša 14
Modely zpoždění: setrvačné zpoždění - demonstrace vlivu několika navzájem zpožděných příkazů na výslednou hodnotu signálu X <= 1 after 10 ns; --předpoklad: now = 0 wait for 12 ns; X <= 0 after 10 ns; --now = 12 wait for 6 ns; X <= 1 after 10 ns; --now = 18; zruší 0 (naplánovaná. na 22) wait for 2 ns; X <= 0 after 20 ns; --now = 20; zruší 1 (naplánovaná na 28) wait for 2 ns; X <= 1 after 10 ns; --now = 22; zruší 0 (naplánovaná na 40) 0 10 20 30 40 time x x x ruší se 21.10.2011 MI-SIM Jiří Douša 15
Příkaz if výběr jedné nebo žádné skupiny příkazů if <podmínka> then <příkazy> [elsif <podmínka> then <príkazy>+. [else <příkazy>+ --žádná podmínka end if; příklad: úplná jednobitová sčítačka - návrh dle pravdivostní tabulky : vstupy.. bin_input výstupy.s (soucet), c (přenos) if bin_input = 000 then s <= 0 ; c <= 0 ; elsif bin_input = 001 then s <= 1 ; c <= 0 ; elsif bin_input = 010 then s <= 1 ; c <= 0 ; elsif bin_input = 011 then s <= 0 ; c <= 1 ;.. elsif bin_input = 110 then s <= 0 ; c <= 1 ; else s <= 1 ; c <= 1 ; end if; 21.10.2011 MI-SIM Jiří Douša 16
Příkaz cyklu Existují 2 typy: 1) [<label>]: for <proměn. cyklu> in <rozsah> loop <příkazy> end loop [<label>]; řídící proměnná cyklu je deklarována implicitně v cyklu nelze měnit hodnotu řídící proměnné zjednodušená verse cyklu ve spojení s příkazem exit: [<label>]: loop <příkazy> exit [<label>] <příkazy> end loop; příkaz exit: ukončí provádění cyklu exit [< label>]; -- pokud chybí< label>, ukončí -- se nejbližší uzavírající cyklus exit [<label>] when <podmínka>;--podmíněné --ukončení cyklu, jinak efekt jako nepodmíněný exit příkaz next: předá řízení příští iteraci cyklu next [<label>] [when <podmínka>+; --ohledně výskytu <label> a ohledně <podmínka> platí totéž co v případě exit 21.10.2011 MI-SIM Jiří Douša 17
Příkaz cyklu 2) [<label>]: while <podmínka> loop --příkazy cyklu end loop [< label>]; Příklady ekvivalentních cyklů L1, L2, L3, L4 process ( ) variable p: integer := 7; L1: for i in 7 downto 0 loop..; end loop; -- i není třeba explicitně deklarovat L2: loop..;p := p-1; exit when p < 0 ; end loop; -- počáteční hodnota p - viz deklarace L3: loop. ;p:= p-1; if p<0 then exit; end if; end loop; -- exit uvnitř příkazu if L4: while p >= 0 loop.;p:= p-1; end loop; end process; 21.10.2011 MI-SIM Jiří Douša 18
Testování hodnot signálů Hodnoty signálů nelze testovat bezprostředně po provedení signálových přiřazovacích příkazů př.: process (..); x <= b ; -- příkaz, který neobsahuje nenulové zpoždění if x = 010 then...end if; -- tento test -- nemá smysl: v důsledku delta zpoždění zde nelze očekávat -- hodnotu přiřazenou výše end process; možná řešení: pozdržet process do provedení skutečné změny signálu: x <= b ; wait for 0 sec; --pozdržení procesu na dobu delta if x = 010 then end if; --smysluplný test nahradit signál lokální proměnnou téhož typu: pom:= b ; --hodnota signálu b do proměnné pom if pom = 010 then.end if ;--smysluplný test 21.10.2011 MI-SIM Jiří Douša 19
Příkaz case v příkazu musí být testovány všechny přípustné hodnoty výrazu, tutéž hodnotu nelze citovat vícekrát case <výraz> is when <výběr> => <příkazy> when <výběr> => <příkazy>... [when others => <příkazy>+ -- výběr všech dosud -- necitovaných hodnot ( musí být poslední ) end case; poznámky: when others => null ; -- prázdný příkaz when others => ; -- prázdný příkaz ukázky možností pro výběr: 7 downto 0 pouze pro integer, 1 2 3 1 nebo 2 nebo 3, 0101 pro bit_vector příklad: úplná jednobitová sčítačka: case bin_input is when 001 010 100 => s <= 1 ; c <= 0 ; when 011 101 110 => s <= 0 ; c <= 1 ; when 000 => s <= 0 ; c <= 0 ; when 111 => s <= 1 ; c <= 1 ; end case; 21.10.2011 MI-SIM Jiří Douša 20
Simulace kombinačních obvodů Příklad: a & process (a, b,c ) b c 1 y y <= ( a and b ) or c after 10 ns; end process; všechny vstupy kombinačního obvodu musí být uvedeny v citlivostním seznamu nebo příkazu wait (jde o lokální signály příslušné architektury nebo vstupní porty příslušné entity) Příklad: multiplexor 4 x 1 model: viz následující slide a b c d y sel(0) sel(1) 21.10.2011 MI-SIM Jiří Douša 21
Model multiplexoru P1: process (a,b,c,d, sel) --použití příkazu if if sel = 00 then y <= a after 5 ns; elsif sel = 01 then y <= b after 5 ns; elsif sel = 10 then y <= c after 5 ns; else y <= d after 5 ns; end if; end process P1; P2: process (a,b,c,d, sel) --použití příkazu case case sel is when 00 => y <=a after 5 ns; when 01 => y <=b after 5 ns; when 10 => y <=c after 5 ns; when 11 => y <=d after 5 ns; end case; end process P2; 21.10.2011 MI-SIM Jiří Douša 22
Model násobičky předpokládané deklarace: signal a, b: std_logic_vector (3 downto 0); --operandy signal soucin: std_logic_vector (7 downto 0); --pro výsledek.. process (a, b) --a,b...vstupy násobičky variable P0, P1, P2, P3:std_logic_vector (7 downto 0); constant Nula: std_logic_vector:= 00000000 ; --analogie paralelní násobičky if b(0) = 1 then P0:= ( 0000 & a); --1.částečný.součin else P0:= Nula; end if; if b(1) = 1 then P1:= ( 000 & a & 0 ); --2. částečný součin else P1:= Nula; end if; if b(2) = 1 then P2:= ( 00 & a & 00 ); --3. částečný součin else P2:= Nula; end if; if b(3) = 1 then P3:= ( 0 & a & 000 ); --4. částečný součin else P3:= Nula; end if; soucin <= P0 +P1 + P2 + P3; --součet částečných součinů -- operátor + je definován v knihovně ieee.std_logic_unsigned -- pro datové typy std_logic a std_logic_vector end process; 21.10.2011 MI-SIM Jiří Douša 23
Model násobičky -- jiná realizace násobičky nezáporných čísel -- předpokládané deklarace: viz předchozí příklad -- následující proces využívá příkaz cyklu process (a, b) variable res, pom: std_logic_vector ( 7 downto 0 ); --analogie sekvenční násobičky res := 00000000 ; --proměnná pro kumulaci částeč. součinů for i in 0 to 3 loop pom:= 00000000 ; --pro vytvoření částečných součinů if b(i) = 1 then pom ((i+3) downto i):= a; end if; res := res + pom; --postupná kumulace část. součinů end loop; soucin <= res; end process Násobička; další možnosti a) přímé vynásobení vektorů s využitím operátoru z matematické knihovny b) konverse binárních vstupních vektorů na čísla typu integer, použití operátoru násobení čísel typu integer, zpětná konverse výsledku do binárního vektoru 21.10.2011 MI-SIM Jiří Douša 24
Simulace sekvenčních obvodů Příklad zapojení sekvenčního obvodu: P1 P3 x a w(2) P2 y(1) b w(1) y(2) w(0) clk entity E is port (a, b, clk: in bit; architecture A of E is x: out bit; y: out bit_vector (2 downto 1) ) ; end E; signal w:bit_vector ( 2 downto 0 ); --lokální signály P1: process..end process P1; P2: process.end process P2; P3: process..end process P3; end A; Poznámka.: rozdělení obvodu do procesů lze provést různě; je možné navrhnout i jediný proces 21.10.2011 MI-SIM Jiří Douša 25
Synchronizace procesů viz předchozí příklad - pokračování: P1: process -- clocked process wait until clk = 1 ; -- synchronizace hod. pulsy w(2) <=...a b.. ; -- výstup klopného obvodu w(1) <=..; w(0) <=...;-- výstupy klopných obvodů end process P1; P2: process P2 -- clocked process wait until clk = 1 ; -- synchronizace hodin. pulsy y(1) <=.; y(2) <= ; end process P1; P3: process (w(1), w(2)) -- vstupy kombinační části -- kombinační obvod x <= ; --výstup komb. členu připojený na port x end process P3; 21.10.2011 MI-SIM Jiří Douša 26
Modely klopných obvodů Příklad: din clk dout res_n -- následují různé varianty klopného obvodu entity D is port ( din, res_n, clk: in bit; dout: out bit ); end D; D typ, hranový bez možnosti nulování architecture Arch of D is D1: process wait until clk = 1 ; -- synchronizace dout <= din after.; end process D1; end Arch; process (clk) -- proces s ekvivalentním chováním jako D1 if clk = 1 [ and clk event ] then dout <= din after.; end if; end process; 21.10.2011 MI-SIM Jiří Douša 27
Modely klopných obvodů D typ, hranový, synchronní nulování: process wait until clk = 1 ; if res_n = 0 then dout <= 0 after...; else dout <= din after...; end process; end if; proces (clk) -- jiný zápis téhož chování: if clk = 1 and clk event then if res_n = 0 then dout <= 0 after.; -- nulování else dout <= din after...; -- zápis vstupu end if; end if; end process; D typ, hranový, asynchronní nulování: process (clk, res_n) if res_n = 0 then dout <= 0 ; elsif clk event and clk = 1 then dout <= din; end process; --nulování --zápis vstupu end if; 21.10.2011 MI-SIM Jiří Douša 28
Modely klopných obvodů D typ, hladinový, asynchronní nulování: process (din, clk, res_n) if res_n = 0 then dout <= 0 ; elsif clk = 1 then dout <= din ; end if ; end process; D typ, hranový, asynchronní nulování, uvolňovací vstup: din en clk res_n D dout process (clk, res_n) if res_n = 0 then dout <= 0 ; --nulování elsif clk event and clk = 1 then if en = 1 then dout <= din; -- uvolňovací vstup [ else null ; ] end if; end if; end process; 21.10.2011 MI-SIM Jiří Douša 29
Modely klopných obvodů Příklad: kompletní model osmibitového hranového paralelního registru s asynchronním nulováním: entity Reg is port ( din: in bit_vector ( 7 downto 0 ) ; end Reg; dout: out bit_vector ( 7 downto 0 ) ; clk, res_n: in bit ); architecture Arch of Reg is -- nejsou potřeba žádné lokální signály process (clk, res_n) if res_n = 0 then dout <= (others => 0 ); --nulování elsif clk event and clk = 1 then dout <= din; --zápis všech vstupů end if; end process; end Arch; 21.10.2011 MI-SIM Jiří Douša 30
Modely automatů Příklad: automatový model sériové sčítačky 00/0 01/1 10/1 Q0 11/0 00/1 Q1 01/0 10/0 11/1 entity Scit is port (x, y, clk: in bit; s: out bit); architecture Ascit of Scit is type stav is (Q0, Q1); signal sstav, pstav: stav; K1: process (sstav, x, y) --přechodová funkce case sstav is end Scit; when Q0 => if x = 1 and y = 1 then pstav <= Q1; else pstav <= Q0; end if; when Q1 => if x = 0 and y = 0 then pstav <= Q0; else pstav <= Q1; end if; end case; end process K1; K2: process (sstav, x, y) --výstupní funkce case sstav is when Q0 => if (( x xor y) = 1 ) then s <= 1 ; else s <= 0 ; end if; when Q1 => if (( x xor y ) = 1 ) then s <= 0 ; else s <= 1 ; end if; end case; end process K2; FF:process wait until (clk= 1 ); sstav <=pstav; end process; end AScit; 21.10.2011 MI-SIM Jiří Douša 31
Modely automatů použití jednoho procesu pro modelování sériové sčítačky: process (clk, x, y) type stav is (Q0, Q1); variable sstav, pstav: stav; -- nositel vnitřního stavu case sstav is when Q0 => if x = 0 and y = 0 then s <= 0 ; pstav := Q0; elsif x = 0 and y = 1 then s <= 1 ; pstav := Q0; elsif x = 1 and y = 0 then s <= 1 ; pstav := Q0; elsif x = 1 and y = 1 then s <= 0 ; pstav:= Q1; end if; when Q1 => if x = 0 and y = 0 then s <= 1 ; pstav:= Q0; elsif x = 0 and y = 1 then s <= 0 ; pstav:= Q1; elsif x = 1 and y = 0 then s <= 0 ; pstav:= Q1; elsif x = 1 and y = 1 then s <= 1 ; pstav:= Q1; end if; end case; if (clk event and clk = 1 ) then sstav := pstav; end if; end process; -- tento model není správný!!!!! 21.10.2011 MI-SIM Jiří Douša 32
Modely automatů Příklad: použití jediného procesu pro simulaci jednobitové sčítačky, který využívá předchozích tabulek process (clk, x, y, sstav) type stav is (Q0,Q1); variable pstav : stav; type tab_stavu is array (stav, bit, bit) of stav; type tab_bitu is array (stav, bit, bit) of bit; constant prechody: tab_stavu:= (Q0 => ( 0 => (Q0, Q0), 1 => (Q0, Q1)), (Q1 => ( 0 => (Q0, Q1), 1 => (Q1, Q1)); -- prvé dva indexy : jmenné mapování -- třeti index: posični mapování constant vystup: tab_bitu := tab_bitu' ( Q0 => ( '0'=> ("01"), '1' => ("10") ) Q1 => ( '0'=> ("10"), '1' => ("01") ) ); pstav := prechody (sstav, x, y); --výpočet budící funkce s <= vystup (sstav, x, y); --výpočet hodnoty součtu if ( clk event and clk = 1 ) then sstav <= pstav; end if; end process; 21.10.2011 MI-SIM Jiří Douša 33