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 6: VHDL-paralelní příkazy, uživatelské knihovny Stručný obsah: přehled paralelních signálových příkazů, bloky, strážené bloky a signály, ukázky modelů v paralelním prostředí, tvorba uživatelských knihoven. 21.10.2011 MI-SIM Jiří Douša10.10.2011 1
Paralelní signálové příkazy Příklad.: předpokládejme strukturu dílčích částí b a f1 f2 c f3 d předpoklad: všechny výstupy mají nulové zpoždění následující popisy - ekvivalentní chování 1) b <= f1 (a) 2) d <= f3 (b,c) c <= f2 (b) c <= f2 (b) d <= f3 (b,c) b <= f1 (a) uložení výstupů bez delta zpoždění - nedeterministické chování použití delta zpoždění - vede jednoznačně na posloupnost a time microtime změna a => výpočet f1 změna b => výpočet f2, f3 změna c, d => výpočet f3 změna d 21.10.2011 MI-SIM Jiří Douša10.10.2011 2
Paralelní signálové příkazy dva typy: nepodmíněné: stejná syntax jako u sekvenčních příkazů podmíněné: rozlišná syntax Příklad: RS asynchronní klopný obvod SN & QQ Q RN & QQN QN entity RS is port ( SN, RN: in bit; Q, QN: out bit ); end RS; architecture Arch of RS is signal QQ, QQN : bit; QQ <= not (SN and QQN) after.; QQN <= not (RN and QQ) after.; Q <= QQ; QN <= QQN; -- zápis do výstupních portů end Arch; Poznámka: uvažujme nenulové, ale stejné zpoždění obou členů a efekt obvodu pro následující posloupnost vstupů : 00, 11 => astabilní chování, pro nulové zpoždění kmitá s delta zpožděním 21.10.2011 MI-SIM Jiří Douša10.10.2011 3
Paralelní signálové příkazy Příklad: generátor parity - nástin různých možností: jeden osmivstupový xor, symetrický strom sestavený ze tří hladin dvouvstupových elementů xor, sedmiúrovňová kaskáda z dvouvstupových elementů xor, adt. entity Suda_parita is port (vst: in bit_vector (7 downto 0); parita: out bit); end Suda_parita; architecture A1 of Suda_parita is -- kaskáda: 7 úrovní signal s: bit_vector (1 to 6); --pomocné lokální signály s (1) <= vst (0) xor vst (1); s (2) <= s (1) xor vst (2); s (3) <= s (2) xor vst (3); Srovnání s procesem: s (4) <= s (3) xor vst (4); s (5) <= s (4) xor vst (5); s (6) <= s (5) xor vst (6); výrazná pravidelnost parita <= s (6) xor vst (7); end A1; a) process ( vst ) end process; --špatně b) process ( vst ) variable s:...; end process; -- OK c) process ( vst, s ).end process; -- OK d) 7 procesů obsahujících po jediném příkazu; --OK 21.10.2011 MI-SIM Jiří Douša10.10.2011 4
Příkaz generate účel: generování podobných paralelních příkazů dvě formy: iterační typ příkazu : <for schema> analogie sekvenčního příkazu cyklu, pro generování pravidelných struktur, podmíněný typ příkazu: <if schema> analogie sekvenčního příkazu if, nelze použít alternativní větve (analogie s elsif nebo else), použití: pro podmíněné generování odlišností, syntax: <label> for < ident> in <rozsah> generate <paralelní příkaz> end generate; <label> if < podmínka> generate <paralelní příkaz> end generate; řídící proměnná cyklu je implicitně deklarována, nemůže být explicitně modifikována, je nedostupná vně příkazu generate 21.10.2011 MI-SIM Jiří Douša10.10.2011 5
Příkaz generate Příklad: generátor parity ve formě kaskády vytvořené pomocí příkazů typu data - flow (viz minulý příklad) entity Suda_parita is port (vst: in bit_vector (7 downto 0); parita: out bit); end Suda_parita; architecture A2 of Suda_parita is signal s: bit_vector ( 1 to 6); G: for i in 0 to 6 generate -- generuje sedm příkazů G0: if ( i = 0) generate --1. příkaz kaskády s(i+1) <= vst (i) xor vst (i+1); end generate; G1_5: if ( i >= 1 and i <=5 ) generate --uvnitř kaskády s(i+1) <= s (i) xor vst (i+1); end generate; end A2; G6: if ( i = 6) generate --poslední příkaz kaskády parita <= s (i) xor vst (i+1); end generate; end generate; 21.10.2011 MI-SIM Jiří Douša10.10.2011 6
Podmíněné paralelní signálové příkazy příkaz when: <cílový signál> <= <výraz> [after <zpoždění>] when <podmínka> else ; --opakování <výraz> *after <zpoždění>+; analogie sekvenčního příkazu if, provedení při změně některého signálu na pravé straně příkazu, podmínky jsou testovány v pořadí v jakém jsou uvedeny, v případě splněné podmínky dojde k přiřazení hodnoty výrazu a testování dalších podmínek končí. příkaz with: with <testovaný výraz> select <cílový signál> <= <výraz>[ after <zpoždění>] when <výběr>, ; -- opakování analogie sekvenčního příkazu case, provedení při změně některého signálu z <testovaný výraz> či z <výraz>, testovaný výraz musí být diskrétního typu, všechny hodnoty testovaného výrazu musí být v příkazu citovány právě jednou. 21.10.2011 MI-SIM Jiří Douša10.10.2011 7
Podmíněné paralelní signálové příkazy Příklad: osmibitový třístavový budič: a 8 8 bus enable a) použití příkazu when: bus <= a when enable = 0 else (others => Z ); b) použití příkazu with: with enable select bus <= a when 0, (others => Z ) when 1 ; poznámka: zde byly uvedeny dva paralelní podmíněné příkazy; každý z nich representuje chování všech osmi budičů sběrnice bus (předpoklad: a, bus jsou osmibitové vektory typu std_logic ) 21.10.2011 MI-SIM Jiří Douša10.10.2011 8
Modely kombinačních obvodů Příklad.: multiplexor 4 x 1: a b c d y příkaz when: y <= a when s = 00 else b when s = 01 else c when s = 10 else process (a,b,c,d,s) if s = 00 then y <=a; elsif...; d;... else y <=d; end if; end process; s(0) s(1) příkaz with: process (a,b,c,d,s) with s select y < = a when 00, case s is b when 01, when 00 => y <= a; c when 10,...; d when others; end case; end process; Poznámka: v paralelním prostředí je možné použít kteroukoliv z uvedených čtyř variant 21.10.2011 MI-SIM Jiří Douša10.10.2011 9
Modely klopných obvodů 1) hladinový synchronní klopný obvod typu D: entity DL is port (D, clk: in bit; Q, QN: buffer bit ); end DL; architecture Arch of DL is --hladinový klopný obvod Q <= D when clk = 1 else Q ; QN <= not Q; end Arch1; 2) hranový synchronní klopný obvod typu D (zde pouze příkazy): Q <= D when ( clk = 1 and clk event ) else Q; QN <= not Q; 3) asynchronní klopný obvod typu JK (zde pouze architektura): architecture Arch of JK is --hladinový klopný obvod Q <= Q when ( J = 0 and K = 0 ) else 0 when ( J = 0 and K = 1 ) else 1 when ( J = 1 and K = 0 ) else QN; QN <= not Q; end Arch2; 21.10.2011 MI-SIM Jiří Douša10.10.2011 10
Modely automatů Příklad: 00/0 01/1 10/1 automatový model seriové sčítačky Q0 11/0 00/1 Q1 entity Scit is port (x, y, clk: in bit; s: out bit); 01/0 10/0 11/1 end Scit; architecture Ascit of Scit is type stav is (Q0, Q1); signal sstav, pstav: stav; pstav <= Q0 when sstav = Q0 and not (x= 1 and y = 1 ) else Q1 when sstav =Q0 and Q0 when sstav =Q1 and Q1 ; (x= 1 and y = 1 ) else (x= 0 and y = 0 ) else s <= 0 when sstav = Q0 and ((x xor y) = 0 ) or sstav = Q1 and (( x xor y) = 1 ) 1 ; -- následuje vlastní přechod do nového stavu sstav <= pstav when clk event and clk = 1 else sstav; end Ascit ; else 21.10.2011 MI-SIM Jiří Douša10.10.2011 11
Paralelní příkaz assert Použití: kontrola nepřípustných situací: zakázané kombinace vstupních hodnot, kontrola parity, porušení časových omezení (předstih, přesah) syntax : assert (<podmínka>) poznámka.: [report <zpráva>+ [severity <chybová úroveň> +; provedení příkazu: při změně hodnoty některého signálu v <podmínka> pokud není splněná <podmínka> pak je zpráva vytištěna spolu s případným ukončením simulace <chybová úroveň> - jde o jednu z hodnot note, warning, error, failure I EM1 EM2 M I..interface, M...model EM1.error manager (pro všechny architektury) EM2.error manager (pro danou architekturu) entity architecture 21.10.2011 MI-SIM Jiří Douša10.10.2011 12
Příklady použití: Paralelní příkaz assert 1) kontrola předstihu klopného obvodu: entity FF is generic (predstih, presah: time); port (d,clk: in std_logic; q: out std_logic); -- parametry entity assert not (clk = 1 and clk event -- not ( je hrana clk and not d stable(predstih)) -- a d není stabilní) report predstih nedodrzen severity error; end FF; D clk DFF q 2) kontrola přesahu klopného obvodu: assert not (clk delayed (presah) = 1 and clk delayed (presah) event --not (na del(clk) hrana and not d stable (presah)) -- a d není stabilní ) -- jiná možná varianta assert: assert ( not ( clk delayed (presah) = 1 and clk delayed (presah) event ) -- není na del (clk) hrana or d stable (presah) -- nebo d je stabilní ) report presah nedodrzen severity error; 21.10.2011 MI-SIM Jiří Douša10.10.2011 13
Odložený příkaz assert provedení: v posledním delta cyklu pro danou hodnotu modelového času ( pouze ve VHDL-93 ) nereaguje na předchozí zákmity v průběhu předchozích delta cyklů Příklad: detektor parity - výstupní syndrom je průběžně indikován 1 1 1 0 0 0 0 0 0 1 a(1) a(2) a(3) a(4) a(5) xor 0 -> 1 i1 xor 0 -> 1 i2 xor 0 -> 1 i3 xor 0 -> 1 -> 0 syndrom i1 i2 i3 syndrom architecture Arch of. is signal i1, i2, i3, syndrom : bit; -- lokální signály i1 <= a(1) xor a(2); i2 <=.; i3 <= ; syndrom <= i(3) xor a(5); -- paralelní assert postponed assert ( syndrom = 0 ) report...; end Arch; 4 delta - cykly 21.10.2011 MI-SIM Jiří Douša10.10.2011 14
Paralelní příkaz procedury přípustné parametry: pouze signály módu in, out, inout nebo konstanty módu in, příkaz paralelní procedury je transformován na příkaz procesu. Příklad: deklarace a použití sčítačky v architektuře architecture Arch of. is procedure Sum -- toto je deklarační část architektury ( signal a, b: in bit_vector; signal s: out bit_vector; signal cin: in bit; signal cout: out bit ) is..; --deklarační část procedury.end Sum; --operační část procedury.; Sum ( u, v, w, p, q); end Arch; -- následuje operační část architektury -- příkaz paralelní procedury Poznámky: 1) příkaz procedury Sum je ekvivalentní příkazu process Sum ( u, v, w, p, q); wait on u, v, p; end process; 2) globální signály, které jsou v těle procedury použity jako vstupy a nejsou uvedeny v seznamu parametrů, nemohou iniciovat provedení procedury. 21.10.2011 MI-SIM Jiří Douša10.10.2011 15
Bloky mechanismus pro vnitřní členění paralelního prostředí v architektuře (příkaz bloku = paralelní příkaz), bloky lze vzájemně vnořovat, v bloku lze deklarovat vše co v architektuře, deklarované objekty jsou v daném bloku lokální, bloky mohou obsahovat porty, které umožňují jejich mapování na vnější signály bloku, strážené bloky umožňují specifikovat podmínku pro synchronizaci paralelních příkazů. globální signály A B C porty bloků architektura (paralelní prostředí) 21.10.2011 MI-SIM Jiří Douša10.10.2011 16
Bloky syntax : <label> block: [( <strážený výraz> )] -- <strážený výraz> pouze u strážených bloků -- následuje hlavička bloku [ generic (.); -- parametry bloku generic map..; + -- mapování parametrů [ port ( ) ; -- vstupy a výstupy port map..; + -- mapování portů * <deklarační část bloku> + -- lokální objekty..; end block [ <label > ]; příkazová část bloku (paralelní prostředí) Poznámka: mechanismus bloků je použit při mapování vodičů do vnořených entit (více hierarchické struktury: viz později) vnější prostředí: blok komponenty blok entity a architektury Arch globální signály porty komponenty porty vnořené entity 21.10.2011 MI-SIM Jiří Douša10.10.2011 17
Strážené bloky guarded block: blok doplněný o tzv. strážený výraz (guarded expression) ve stráženém bloku je implicitně deklarován signál guard, jehož hodnota automaticky sleduje v průběhu simulace hodnotu stráženého výrazu signál guard nelze explicitně budit žádným budičem uvnitř stráženého bloku a ani jej nelze připojovat k portům módu in, inout, buffer ve stráženém bloku lze použít signál guard k podmíněnému provedení t. zv. strážených signálových příkazů (označených symbolem guarded); toto provedení nastane: při změně hodnoty stráženého výrazu z hodnoty false na hodnotu true, v případě, že strážený výraz má hodnotu true a nastala událost na některém signálu vyskytujícím se na pravé straně stráženého příkazu. 21.10.2011 MI-SIM Jiří Douša10.10.2011 18
Strážené bloky a synchronizace příkazů Příklad: řízení signálových paralelních (a vzájemně asynchronních) příkazů signálem guard: B1: block ( control = 1 ) --následuje operační část stráženého bloku X <= guarded A and B after 5 ns; Y <= A and B after 5 ns; end block B1; -- strážený příkaz -- tento příkaz není strážený -- proto ignoruje řízení časové diagramy signálů: A B control Y X.. okamžik provedení příkazu 5ns 5ns 21.10.2011 MI-SIM Jiří Douša10.10.2011 19
Strážené bloky je přípustné i zahnízdění strážených bloků: architecture Arch of is signal control: bit; --globální signál v architektuře..; -- paralelní příkazy architektury control <=..; -- globální signál z hlediska BA BA: block ( control = 1 ) signal control: bit; -- lokální signál v bloku BA XA <= guarded A and B after ; control <=.; -- lokální signál v BA BB: block ( control = 1 and guard ) -- signál control je lokální signál z BA a signál guard zde -- zastupuje strážený výraz z bloku BA XB <= guarded A and B after ; end block BB; end block BA;..; end Arch; 21.10.2011 MI-SIM Jiří Douša10.10.2011 20
Aplikace strážených bloků Příklady: 1) hladinový synchronní obvod typu D: entity D is port (clk, D: in bit; QN: out bit; Q: buffer bit ); end D; architecture Arch of D is DL: block (clk = 1 ) Q <= guarded D ; QN <= not Q ; end block DL; end Arch; Poznámka: chování stráženého příkazu Q <= guarded D process if guard then Q <= D; end if; wait on guard, D; --pokračuj v případě události na guard nebo D end process; 21.10.2011 MI-SIM Jiří Douša10.10.2011 21
Aplikace strážených bloků 2) hladinový synchronní obvod typu JK: architecture Arch of JK is JK: block (clk = 1 ) Q <= guarded Q when ( J = 0 and K= 0 ) else 0 when (J = 0 and K= 1 ) else 1 when (J = 1 and K= 0 ) else not Q; end block JK; end Arch; 3) model seriové sčítačky entity Scit is port ( x,y, clk, start: in bit; s: out bit ); end Scit; architecture Arch of Scit is signal prenos, pstav: bit; --vnitřní stav sčítačky prech: block (clk = 1 and clk event) prenos <= guarded 0 when start = 1 else pstav; s <= x xor y xor prenos; pstav <= x and y or x and prenos or y and prenos; end block prech; end Arch; -- typ Mealy 21.10.2011 MI-SIM Jiří Douša10.10.2011 22
Strážené signály Buzení signálů (celkový přehled): signál (obyčejný): lze budit pouze jedním budičem rozhodovaný (resolved) signál: připouští existenci více paralelních budičů - resoluční funkce řeší vzájemné konflikty budiče rozhod. signálů nelze odpojovat strážený (guarded) signál připouští více budičů, které lze dynamicky jednotlivě odpojovat a připojovat strážený signál typu register po případném odpojení všech budičů signál pamatuje svou poslední hodnotu (v takovém případě příslušná resoluční funkce není vyhodnocována) strážený signál typu bus resoluční funkce je vyhodnocována vždy a musí být navržena i pro případ odpojení všech budičů 21.10.2011 MI-SIM Jiří Douša10.10.2011 23
Strážené signály Rozlišení signálů - dle jejich deklarace předpoklad: pro typ bit je definována resoluční funkce wired_or subtype mont_soucet is wired_or bit; -- jde o podtyp -- datového typu bit, který je vázaný na resoluční funkci wired_or signal S1: mont_soucet; -- rozhodovaný signál -- může být buzen více vodiči signal S2: mont_soucet register;--strážený signál -- typu register: může být odpojen od zdroje signal S3: mont_soucet bus; --strážený sig. typu bus -- může být odpojen od budiče Buzení strážených signálů: paralelní prostředí: aktivací strážených signálových přiřazovacích příkazů (ve stráženém bloku), sekvenční prostředí: aktivací budiče. Odpojení budičů od strážených signálů: paralelní prostředí: nastane v okamžiku, kdy implicitní signál guard nabude hodnoty false => budič nabývá hodnoty null ( t. zv. prázdné transakce )., sekvenční prostředí: přiřazení hodnoty null.. 21.10.2011 MI-SIM Jiří Douša10.10.2011 24
Bloky a strážené signály demonstrace vlivu více budičů na rozhodované a strážené signály předpoklad: signal A, B: bit; BL1: block (mode = 1 ) DATA<= guarded A; -- budič 1; end block B1; BL2: block (mode = 0 ) DATA <= guarded B; -- budič 2 end block B1; Rozlišíme dva případy dle deklarace signálu DATA: 1) signal DATA: mont_soucet ; -- resolved signal -- v tomto případě resoluční funkce řeší konflikty více budičů a strážený příkaz má pouze synchronizační funkci 2) signal DATA: mont_soucet register; --strážený signál -- v tomto případě dochází k připojení či odpojení stráženého signálu od budičů A B mode = 1 mode = 0 wired_or DATA 21.10.2011 MI-SIM Jiří Douša10.10.2011 25
Bloky a strážené signály časové diagramy signálů z minulého příkladu: mode A B aktivita budiče 1 aktivita budiče 2 1) případ deklarace DATA jako rozhodovaného signálu: DATA 2) případ deklarace DATA jako stráženého signálu: DATA budič B1 budič B2 21.10.2011 MI-SIM Jiří Douša10.10.2011 26
Příklad automatu: 1 Modely automatů 0 A/1 0 1 C/1 1 B/0 0 entity E is port (x, clk: in bit; y:out bit); end E; architecture Arch of E is type t_stav is (A,B,C); -- množina vnitřních stavů type stavy is array (natural range <>) of t_stav; --typ arg. resoluční f-ce function res (budice: stavy) return t_stav is return budice (budice left); end res; -- rezoluční funkce subtype res_stav is res t_stav; -- deklarace typu pro resolved signal signal stav : res_stav register:= A; --počáteční stav nb_hr: block ( clk = 1 and not clk stable ) st_a: block (guard and stav = A) stav <= guarded stav when x = 0 else B; end block; st_b: block (guard and stav = B) stav <= guarded stav when x = 0 else C; end block; st_c: block (guard and stav = C) stav <= guarded stav when x = 1 else A; end block; end block nb_hr; with stav select y <= 1 when A, 0 when B, 1 when C; end Arch; 21.10.2011 MI-SIM Jiří Douša10.10.2011 27
Knihovny VHDL připouští libovolný počet knihoven knihovna - soubor obsahující libovolný počet knihovních jednotek knihovní jednotka - samostatně analyzovatelná část primární jednotky entity, package, configuration sekundární jednotky architecture, package body musí být umístěny v téže knihovně jako odpovídající si primární jednotky každá primární jednotka může mít v téže knihovně několik sekundárních jednotek analýza - proces překladu (syntaktická analýza + sémantická kontrola + uložení do knihovny work) analýze sekundární knihovní jednotky musí předcházet analýza příslušné primární jednotky kterákoliv knihovní jednotka musí být analyzována až po provedení analýzy všech knihovních jednotek na jejichž objekty se uvažovaná jednotka odvolává konfigurace, která se odvolává na nějakou architekturu musí být analyzována až po analýze zmíněné architektury 21.10.2011 MI-SIM Jiří Douša10.10.2011 28
Knihovny předdefinované knihovny work: aktuální pracovní knihovna obsahující výsledky analýzy je implicitně viditelná, ale její knihovní jednotky nikoliv std: zdrojová knihovna, jejíž obsah se během analýzy nemění; má dvě části: std_logic_1164: package STANDARD (všechny objekty jsou vždy viditelné) package TEXTIO (operace s textovými soubory - nutno zviditelnit) datové typy a operace pro vícehodnotovou logiku std_logic_arith: matematická knihovna pro operace nad čísly typu signed i unsigned std_logic_unsigned: matematická knihovna pro binární hodnoty bez znaménka std_logic_signed: matematická knihovna pro binární hodnoty se znaménkem 21.10.2011 MI-SIM Jiří Douša10.10.2011 29
Viditelnosti ve VHDL oblast viditelnosti objektu - ve VHDL name space : od místa zviditelnění objektu do konce prostoru platnosti objektu konstrukce vytvářející prostory platností objektů: knihovny: umožňují exportovat vnitřní objekty vně entita: vnitřní deklarace jsou viditelné pouze ve všech příslušných architekturách architektura: vnitřní deklarace nejsou viditelné vně dané architektury deklarace komponenty procedura nebo funkce příkaz bloku deklarace konfigurace deklarace záznamu příkaz cyklu 21.10.2011 MI-SIM Jiří Douša10.10.2011 30
Zpřístupnění knihoven obecně nepřístupné zviditelnění jména knihovny : library <jméno knihovny>; zviditelnění jména package: use <jméno knihovny>. <jméno package>; zviditelnění všech objektů z package: use <jméno package>. all; jinak: use <jméno knihovny>.<jméno package>. all individuální zviditelnění určitého objektu z package: use <jméno package>. <jméno objektu>; příklady: library work; library std; use std.standard.all; --toto zpřístupnění není třeba uvádět; ve VHDL je zajištěno --implicitně pro každou jednotku library IEEE; use IEEE.std_logic_1164.all; --zviditelní všechny --objekty z package std_logic_1164 library IEEE, moje_kn; use IEEE. unsigned.all, moje_kn. moje_pack DFF; 21.10.2011 MI-SIM Jiří Douša10.10.2011 31
Vytváření knihovních jednotek package <jméno > is.; --interface : veřejné deklarace které lze zpřístupnit v jiných knihovnách jednotkách (entity, architecture, package) end ; -- možné deklarace: datové typy a podtypy, signály, konstanty, hlavičky funkcí a procedur, aliases, komponenty, soubory, sdílené proměnné. -- nelze deklarovat: proměnné, entity, architektury package body <jméno > is ; -- možné deklarace: hlavičky privátních funkcí a procedur, privátní datové typy a podtypy, privátní konstanty, ; -- implementace: operační části privátních funkcí a procedur, operační části exportovaných funkcí a procedur. end ; 21.10.2011 MI-SIM Jiří Douša10.10.2011 32