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 5: VHDL- atributy signálů, funkce a procedury Stručný obsah: budiče signálů, atributy signálů, příkaz assert, pasivní procesy, odpojování budičů v sekvenčním prostředí, sdílené proměnné, procedury a funkce, formální a aktuální parametry, přetěžování funkcí a operátorů, resoluční funkce.
Budiče signálů sdruženy se signálovými přiřazovacími příkazy ( nikoliv s deklaracemi signálů), vytvoření: v průběhu zpracování modelu a to pro každý element (v případě pole), každý process vytvoří budič pro každý uvnitř buzený signál, komponenta vytvoří budič pro každý aktuální výstupní port při své instalaci, příkaz paralelní procedury vytvoří budič pro každý aktuální výstupní parametr třídy signal, paralelní přiřazovací signálový příkaz vytvoří budič pro signál na levé straně, počáteční hodnota budiče = počáteční hodnotě přidruženého signálu ( implicitně nebo explicitně definované), syntetizátory ignorují počáteční nastavení portů a signálů, budič existuje po celou dobu simulace bez ohledu zda k přiřazení dojde či ne, 10.1.2012 MI-SIM Jiří Douša 2
Atributy signálů transakce (transaction) - přiřazení nové hodnoty signálu (bez ohledu zda dochází k její změně) přesněji dvojice: hodnota model. času + hodnota signálu budič signálu plánuje transakce; pro hodnoty modelového času rovné časům těchto transakcí nastává aktivita daného budiče událost (event) - transakce doprovázená změnou hodnoty signálu atributy: funkce: poskytují některé informace o transakcích nebo událostech na zvoleném signálu signály: druhotně odvozené od událostí či transakcí zvolených signálů; jsou použitelné opět jako signály funkce: s active...vrací hodnotu true (typ boolean), pokud je v daném simulačním cyklu signál s aktivní (nastala transakce) s last_active.vrací časový interval (hodnota typu time), který uplynul od poslední transakce na signálu s; pokud transakce nikdy nenastala, má funkce hodnotu 0 10.1.2012 MI-SIM Jiří Douša 3
Atributy signálů s event...vrací hodnotu true pokud v daném simulačním cyklu nastala změna hodnoty signálu s s last_event. vrací časový interval (hodnoty typu time), který uplynul od poslední události na signálu; pokud událost nikdy nenastala je hodnota funkce 0, s last_value..vrací hodnotu signálu s před poslední událostí; pokud událost nikdy nenastala, je hodnota funkce rovna současné hodnotě signálu, signály: s delayed..vytvoří nový signál stejného typu, ale zpožděný o delta zpoždění, s delayed (T).vytvoří nový signál stejného typu, ale zpožděný o hodnotu T, s stable.nový signál typu boolean, který má hodnotu true, pokud v daném simulačním cyklu nenastala na signálu s žádná událost, 10.1.2012 MI-SIM Jiří Douša 4
Atributy signálů s stable (T).nový signál typu boolean, který má hodnotu true pokud na signálu s nenastala během intervalu T žádná událost; v opačném případě má hodnotu false, s quiet..nový signál typu boolean, který má hodnotu true, pokud na signálu s v daném simulačním cyklu nenastala žádná transakce; v opačné případě má hodnotu false, s quiet (T)..nový signál typu boolean, který má hodnotu true pokud na signálu s nenastala během intervalu T žádná transakce, s transaction nový signál typu bit, který mění svou hodnotu při každém výskytu transakce na signálu s; nová hodnota je negací hodnoty předchozí, 10.1.2012 MI-SIM Jiří Douša 5
Atributy signálů Příklad použití: test předstihu a přesahu clk DATA předstih přesah a) individuální test předstihu idea: if náběžná hrana clk then if D je stabilní (v intervalu předstih) then OK else porušení př. způsob realizace : if clk = 1 and clk event then if not D stable (predstih) then porušení př. end if; end if; b) společný test: if clk delayed (presah) = 1 and clk delayed (presah) event then end if; if not D stable (predstih + presah) then porušení předstihu end if; 10.1.2012 MI-SIM Jiří Douša 6
Příkaz assert účel: test splnění nějaké podmínky (v okamžiku provedení příkazu) syntax: assert <podmínka> report <zpráva> severity < error level>; 4 úrovně chyb rozlišují vážnost situace- lze nastavit na kteroukoliv : note warning error failure effekt: pokud není splněná podmínka pak dojde k výstupu zprávy, případně zastavení simulace Příklady použití: 1) assert now <= 100 ms report vyčerpání času -konec simulace severity failure; -- ukončení simulace 2) if clk = 1 and clk event then assert D stable (predstih) report porušení předstihu severity warning; -- varování end if; Poznámka: nutné zajistit správný okamžik provedení!!!!!!!! 10.1.2012 MI-SIM Jiří Douša 7
Pasivní procesy ve VHDL nemají žádný výstup (kontrolní účely) lze je použít i v operační části entity Příklad: entity E is port (signal clk : bit;..); -- následuje operační část entity process (clk delayed (presah)) -- synchronizace --následuje sekvenční příkaz assert vložený do příkazu if if (clk delayed (presah) = 1 then assert (D stable (predstih + presah)) report nedodrzen predstih nebo presah severity error; end if; end process; end E; 10.1.2012 MI-SIM Jiří Douša 8
Synchronizace procesů příklad: producent - konsument : verse 1: producent konsument příprava dat BUF plnění bufferu producent konsument čtení bufferu zpracování dat Poznámka: zde je synchronizace pouze v jednom směru, proto musí být splněna podmínka: konsument je rychlejší než producent 10.1.2012 MI-SIM Jiří Douša 9
Producent - konsument: verse 1 prod: process -- tento proces je nezávislý na vnějších -- signálech wait for.; -- doba pro přípravu dat a plnění -- bufferu BUF <=..; --fyzické plnění bufferu end process; kons: process variable I: integer; wait on BUF transaction; --čeká na buffer wait for ; --doba pro výběr bufferu a pro --zpracování dat I:= BUF; -- fyzický výběr z bufferu end process; 10.1.2012 MI-SIM Jiří Douša 10
Producent - konsument: synchronizace producent konsument OFFER příprava dat ACK vyprazdňování bufferu plnění bufferu zpracování dat 10.1.2012 MI-SIM Jiří Douša 11
Producent - konsument: návrh verse 2 OFFER signály: producent ACK BUF konsument problém dvojího buzení signálů OFFER a ACK oba signály lze koncipovat jako pulsy, ale musí být očekávány přijímacím procesem producent příprava plnění. příprava plnění OFFER ACK OFFER konsument vyprázdnění zpracování podmínka: doba přípravy dat < doba vyprazdňování doba zpracování dat < doba plnění bufferu 10.1.2012 MI-SIM Jiří Douša 12
Producent - konsument: verse 2 prod: process variable start: boolean:= true; wait for.ns; -- příprava dat if not start then wait until ACK; else start := false; end if; wait for...ns; --čeká během plnění bufferu BUF <=...; OFFER <= true, false after 1 ns; -- puls OFFER end process prod; kons: process variable i:integer; wait until OFFER; wait for.ns; -- vyprazdňování bufferu I <= BUF; ACK <= true, false after 1 ns; -- puls ACK wait for.ns; -- zpracování dat end process kons; 10.1.2012 MI-SIM Jiří Douša 13
Producent - konsument: návrh verse 3 použití klopného obvodu natavovaného, resp. nulovaného z procesu producent, resp. konsument BUFFER producent konsument OFFER RS FF ACK NDATA producent přípr. pl. přípr. pl. konsument OFFER ACK NDATA vypr. zpr. 10.1.2012 MI-SIM Jiří Douša 14
Producent - konsument: verse 3 prod: process wait for.ns; -- příprava dat if NDATA then wait until not NDATA; end if wait for..ns; -- plnění bufferu BUF<= ; OFFER<= true, false after 1 ns; end process prod; kons: process variable I: integer; if not NDATA then wait until NDATA; end if; wait for.ns; --čtení dat z bufferu I:= BUF; ACK<= true, false after 1 ns; wait for..ns; --zpracování dat end process kons; RS_FF: process (OFFER, ACK) if OFFER event and OFFER=true then NDATA <= true; end if; if ACK event and ACK =true then NDATA <= false; end if; end process; 10.1.2012 MI-SIM Jiří Douša 15
Producent - konsument: návrh verse 4 BUF producent konsument ano ne NDATA pouze indikace připravených dat problémy: 2 budiče signálu NDATA (v procesu producent i konsument) => nezbytná resoluční funkce lze využít: a) odpojování signálů po zápisu hodnoty (je potřeba pamatovat poslední uloženou hodnotu ) b) koncipovat objekt NDATA jako sdílenou proměnnou (pouze ve VHDL-93) 10.1.2012 MI-SIM Jiří Douša 16
Odpojování budičů v procesu budiče lze odpojovat pouze od strážených signálů zasláním hodnoty null strážený (quarded) signál: jde o rozhodovaný (resolved) signál doplněný klíčovým slovem register nebo bus - další viz později signal c : std_logic register := '0'; -- strážený signál P1: process c <= null; -- odpojení budiče wait for 1 ns; c <= '1'; -- zápis hodnoty do signálu wait for 0 ns; c <= null; -- odpojení budiče end process P1; P2: process c <= null; wait for 2 ns; c <= '0'; wait for 0 ns; c<= null; end proces P1; P1: P2: 1 X 0 0 1 2 3 4 ns 10.1.2012 MI-SIM Jiří Douša 17
Producent konsument: verse 4 signal NDATA: std_logic register := '0 -- strážený signál prod: process NDATA <= null; -- odpojení budiče wait for...ns; -- příprava dat if NDATA = '1' then wait until NDATA = '0'; end if; wait for... ns; -- doba plnění bufferu BUF <=.; -- skutečné plnění bufferu NDATA <= '1'; wait for 0 ns; --indikace dat end process; kons: process variable i : bit; NDATA <= null; --odpojení budiče if NDATA = '0' then wait until NDATA = '1'; end if; wait for... ns; -- doba vyprazdňování bufferu i :=.; -- čtení bufferu NDATA <= '0'; wait for 0 ns; -- zrušení indikace dat NDATA <= null; -- odpojení budiče wait for... ns; -- zpracování dat end process; 10.1.2012 MI-SIM Jiří Douša 18
Sdílené proměnné VHDL - 93: zavádí sdílené proměnné: mohou zajistit přenos hodnot mezi procesy nejsou dostupné v paralelním prostředí a nemohou být začleněny do citlivostních seznamů procesů Producent - konsument: návrh verse 5 producent BUF konsument NDATA tik sdílená proměnná producent konsument NDATA tik BUF příprava dat plnění BUF 10.1.2012 MI-SIM Jiří Douša 19
Producent - konsument: verse 5 shared variable NDATA: bolean:= false; --do této proměnná mohou zapisovat oba procesy; zde je použita k pozastavení rychlejšího procesu signal BUF: integer; signal tik: bit; --signál BUF, resp. tik slouží k aktivaci procesu kons, resp. prod prod: process wait for..ns; if NDATA then wait on tik; end if; wait for.ns; BUF <= ; NDATA := true; end process; -- příprava dat --čeká na tik --plnění kons: process variable I: integer; if not NDATA then wait on BUF transaction; end if; wait for ; --doba výběru z bufferu I:=BUF; NDATA:= false; tik <= not tik; -- aktivace případně čekajícího producenta wait for.; -- doba zpracování end process; 10.1.2012 MI-SIM Jiří Douša 20
Podprogramy uvnitř představují sekvenční prostředí inicializace proměnných: implicitní nebo explicitní, (na rozdíl od procesu při každém volání) je možné přetěžování podprogramů (overloading) podprogramy lze volat rekursivně je možné přetěžování operátorů (jako deklarace funkcí se jménem operátoru) je-li formálním parametrem pole (např. bit_vector) není třeba specifikovat rozměr nedovolují vedlejší efekty možné deklarace: v knihovně (package) : po zpřístupnění možno použít v různých architekturách, v entitě: dostupná ve všech architekturách dané entity, v architektuře: lokální v dané architektuře, v procesu: lokální v procesu procedura : parametry: signály, proměnné, konstanty volání: sekvenční: v procesu nebo jiné proceduře (parametry: signály, proměnné i konstanty) paralelní: v paralelním prostředí (parametry: pouze signály a konstanty) 10.1.2012 MI-SIM Jiří Douša 21
Procedury Přiklad: násobička nezáporných čísel pro typ std_logic architecture Arch of..; signal a,b: std_logic_vector ( 3 downto 0 ); signal soucin: std_logic_vector ( 7 downto 0 ) :="00000000"; procedure NAS (signal a, b : in std_logic_vector (3 downto 0); signal soucin : out std_logic_vector (7 downto 0) ) is variable res, pom: std_logic_vector ( 7 downto 0 ); lok. prom. res := "00000000"; -- pro kumulaci částečných součtů for i in 0 to 3 loop pom := "00000000"; --pro vytváření jednotlivých částeč. součtů if b(i) = '1' then pom (( i+3 ) downto i) := a; end if; res := res + pom; -- tento operátor vyžaduje dat. typ std_logic end loop; soucin <= res; [ return ]; end procedure ; -- následuje paralelní prostředí..; NAS (a,b, soucin); --paralelní volání procedury..; end Arch; 10.1.2012 MI-SIM Jiří Douša 22
Procedury Příklad: násobička pro datový typ bit_vector procedure NAS ( signal a, b : in bit_vector (3 downto 0); signal soucin : out bit_vector (7 downto 0) ) variable res, pom : bit_vector ( 7 downto 0 ); variable c, s: bit; -- přenos a jednobitový součet is res := "00000000"; -- pro kumulaci částečných součtů L1: for i in 0 to 3 loop pom := "00000000"; --pro vytváření časteč. součinů if b(i) = '1 then pom (( i+3 ) downto i) := a; end if; c : = 0 ; -- přenos mezi binárními řády L2: for j in 0 to 7 loop --realizace seriové sčítačky s := res(j) xor pom (j) xor c ; -- součet j-tého řádu c := ( res(j) and pom (j) ) -- přenos pro j+1 řád or ( pom (j) and c) or ( res(j) and c ); res (j) := s; -- jeden bit částečného součtu end loop L2; -- konec přičtení částečného součtu end loop L1; soucin <= res; end procedure NAS; 10.1.2012 MI-SIM Jiří Douša 23
Inicializace formálních parametrů procedury nelze inicializovat: formální parametry třídy signal, formální parametry třidy variable módu out nebo inout, Příklad: procedure P ( constant C1: in bit := 0 ; -- OK constant C2: out bit := 1 ; -- error : chybný mód constant C3: inout bit := 0 ; -- error : chybný mód variable V1: in bit := 0 ; -- OK variable V2: out bit := 0 ; -- error : nelze inicializovat variable V3: inout bit := 0 ; -- error signal S1: in bit := 0 ; -- error signal S2: out bit := 0 ; -- error signal S3: inout bit := 0 ; ) error v případě inicializovaného parametru třídy variable a módu in lze aktuální parametr při volání podprogramu vynechat, hodnota aktuálního parametru má větší prioritu než hodnota příslušného inicializovaného parametru třídy variable a módu in, 10.1.2012 MI-SIM Jiří Douša 24
Atributy aktuálních signálů pokud je aktuálním parametrem podprogramu signál pak v operačních částech těchto podprogramů nejsou dostupné ty atributy aktuálních parametrů, které jsou třídy signal, jako aktuální parametr procedury je možné použít některý z atributů signálu: Příklad: process ( clk ) -- flip-flop -- test předstihu koncipujeme voláním procedury test: if (clk event and clk = 1 ) then endif ; end process; test ( D = > D ); Q < = D after 4 ns; 1) nepřípustná varianta procedury test: procedure test ( signal D : in bit ) is assert D stable ( 8 ns ) error: atribut signál report severity..; end test; 10.1.2012 MI-SIM Jiří Douša 25
Atributy aktuálních signálů 2) přípustná varianta procedury test: procedure test ( signal D : in bit ) is assert not D last_event < 8 ns -- OK: jde o atribut funkci report severity..; end test; Příklad: process (clk) -- flip-flop if (clk event and clk = 1 ) then -- atribut signálu D je použit jako aktuální parametr test ( D = > D stable ( 8 ns) ); Q < = D after 4 ns; endif ; end process; procedure test ( signal D : boolean ) is assert D report severity..; end test; 10.1.2012 MI-SIM Jiří Douša 26
Formální a aktuální parametry podprogramů třída FP mód FP třída AP omezení AP signal in signal statický signal inout viz. 1), 2) out variable in variable, out file (pouze VHDL 87) inot constant in signal, variable, literal, konstantní výraz file (VHDL 93) in file out 1) statický signal je-li formálním parametrem signal typu pole, pak dimenze AP musí být určena v průběhu zpracování modelu 2) při vzájemném mapování aktuálních a formálních parametrů třídy signal nelze použít žádnou funkci aplikovanou na formální část nebo na aktuální část, 3) je-li FP omezené pole, pak rozměr AP musí souhlasit s rozměrem FP 4) AP musí být typu jako FP nebo musí být ve vztahu typu a podtypu, 5) je-li FP typu pole, pak při mapování na AP lze toto provést tak, že pro dílčí řezy FP lze použít více aktuálních parametrů př.: Proc ( s(7) =>, s(6 downto 0 ) => ); 10.1.2012 MI-SIM Jiří Douša 27
Formální a aktuální parametry podprogramů Příklad: entity E is ( generic g1: integer := 3 ) end E; architecture A of E is procedure P1 ( signal S: inout bit_vector ) is.end P1; function F1 ( signal R: in bit_vector ) return bit_vector is..end P1; signal S1: integer := 4; -- přiřazení provedeno na začátku simulace! signal S2: bit_vector ( 0 to 7); P1 ( S => S2 ( 0 to 7 ) ); ; -- OK P1 ( S => S2 ( 0 to S1) ); -- error: řez signálu S2 není static -- S1 není vyhodnocen při analýze nebo při zpracování entity ; P1 ( S => S2 ( 0 to g1) ); ; P1 ( S => F1 ( R =>S2 ) ); ; end A; -- OK, g1 je static -- error: funkce aplikovaná na AP -- třídy signal 10.1.2012 MI-SIM Jiří Douša 28
Přiřazování budičů pro každý formální parametr třídy signál, který je módu out nebo inout se v podprogramu vytvoří budič, při každém volání podprogramu se budič takového formálního signálu sloučí s budičem aktuálního parametru třídy signal => přiřazení hodnoty formálnímu signálu = přiřazení hodnoty příslušnému aktuálnímu signálu, Důsledek pro buzení nelokálních signálů uvnitř procedur: 2 případy: procedura je deklarována v deklarační části architektury: procedura nevlastní budiče signálů, které nefigurují jako formální parametry módu out nebo inout => vedlejší efekty na signálech nejsou přípustné procedura je deklarována uvnitř procesu všechny porty entity a signály architektury jsou viditelné uvnitř procesu, proces vlastní budiče všech signálů vyskytujících se na levé straně přiřazovacích signálů => buzení signálů či portů, které nejsou v seznamu formálních parametrů procedury je možné 10.1.2012 MI-SIM Jiří Douša 29
Viditelnosti a volání podprogramů Viditelné objekty: případ deklarace podprogramu v deklarační části architektury: porty entity, signály, případně sdílené proměnné příslušné entity, signály, případně sdílené proměnné architektury, signály, případně sdílené proměnné viditelných knihoven, případ deklarace podprogramu v procesu: vše předešlé plus navíc: lokální proměnné procesu. Volání procedury: paralelní: jako paralelní příkaz na konci operační části se implicitně inzeruje příkaz wait on s citlivostním seznamem obsahujícím všechny formální signály módu in nebo inout, procedura může obsahovat další příkazy wait, provedení: při události na některém aktuálním signálu, který je sdružen s formálním signálem módu in nebo inout, sekvenční: uvnitř procesu či jiné procedury na konci operační části není implicitně inzerován příkaz wait, Poznámka: funkce nesmí obsahovat příkaz wait, 10.1.2012 MI-SIM Jiří Douša 30
Podprogramy ve VHDL 93 VHDL 93 zavádí odložený příkaz paralelní procedury v paralelním prostředí je provedena až v posledním simulačním cyklu pro danou hodnotu simulačního času (podobně jako odložený proces) syntax odloženého příkazu: [ label ]: [ postponed ] < ident. procedury> [ (<akt. parametry>) ] ; VHDL 93 odlišuje 2 typy funkcí: pure functions: nedovolují žádné vedlejší efekty = > hodnoty formálních parametrů jednoznačně určují funkční hodnotu, impure functions: dovolují vedlejší efekty = > mohou vracet různé funkční hodnoty pro různá volání se stejnými hodnotami formálních parametrů, syntax: [ pure impure ] function < identifikátor funkce > ( < seznam formálních parametrů > ) return < typ výsledku> is end ; Poznámka: function je implicitně chápána jako pure function 10.1.2012 MI-SIM Jiří Douša 31
Přetěžování podprogramů možná rozlišení přetížených podprogramů: počet parametrů, typy a pořadí parametrů, jména formálních parametrů ( v případě jmenného mapování), typ výsledku (u funkcí). Příklad: signal Data: bit_vector (7 down to 0); signal clk : bit; procedure test -- test předstihu ( constant predstih : in time; signal D : in bit_vector, signal clk : in bit ) is.end test; procedure test -- test přesahu ( constant presah : in time; signal D : in bit_vector, signal clk : in bit ).end test; is -- následují ukázky volání obou procedur test: test ( predstih => 8ns, D => Data, clk => clk ); -- OK test ( presah => 3ns, D => Data, clk => clk ); -- OK test ( 8 ns, Data, clk ); -- error test ( 3 ns, D => Data, clk => clk ); -- error 10.1.2012 MI-SIM Jiří Douša 32
Přetěžování operátorů specifikace ve formě funkcí operujících na formálních parametrech Příklad: architecture A of E is function + ( constant L: integer ; constant R: real ) return real is return real ( L ) + R; end + ` ; function + ( constant L: real ; constant R: integer ) return real is return L + real ( R ); end + ` ; signal X, W1, W2: real; signal Y integer; process variable result: real; result := 3 + 4.0; -- volání 1. funkce v procesu result := 3.11 + 111; -- volání 2. funkce end process; W1 < = X + Y; -- volání 2. funkce v operační části architektury W2 < = Y + X; -- volání 1. funkce end; 10.1.2012 MI-SIM Jiří Douša 33
Funkce parametry: konstanty nebo signály módu in volání: v sekvenčním i paralelním prostředí operační část nesmí obsahovat příkaz wait Příklad: architecture Arch of E is function max (signal a, b: in bit_vector) return bit_vector if a >= b then return a; else return b; end if; end max; is --následuje příkazová část architektury process (.)..; y <= max (..,..) ; -- sekvenční volání funkce...; end process; z <= max (..;..) ; end Arch; -- paralelní volání funkce 10.1.2012 MI-SIM Jiří Douša 34
Resoluční funkce řeší konflikty vznikající při buzení signálu více budiči, volání: automaticky při aktivitě některého z budičů architecture Arch is..deklarace D; -- následují paralelní příkazy architektury process (a, e1) -- budič signálu c if e1= 0 then c <= a; else c <= Z ; end if; end process; process (b, e2) --budič signálu c if e2= 0 then c <= b; else c <= Z ; end if; end process;..; --další paralelní příkazy end A; a b situace: e1 e2 c 10.1.2012 MI-SIM Jiří Douša 35
Resoluční funkce deklarace D pro minulý příklad: signal a,b : std_logic; signal c: std_logic; --c je buzen více budiči; proto --musí být deklarován jako typ std_logic, který je definován v knihovně std_logic_1164 a který je svázán s resoluční funkcí subtype std_logic is resolved std_ulogic; nový podtyp signálu typ definovaný dříve vázaný na funkci resolved identifikátor resoluční funkce budiče efektivní hodnota (typ std_logic) budící hodnoty 10.1.2012 MI-SIM Jiří Douša 36
Resoluční funkce resolved type std_logic_table is array (std_ulogic, std_ulogic) of std_ulogic; constant res_tab: stdlogic_table: = ( -- U X 0 1 Z W L H - ------------------------------------------------------- ( U, U, U, U, U ; U, U, U, U ), -- U ( U, X, X, X, X, X, X, X, X ), -- X ( U, X, 0, X, 0, 0, 0, 0, X ), -- 0 ( U, X, X, 1, 1, 1, 1, 1, X ), -- 1 ( U, X, 0, 1, Z, W, L, H, X ), -- Z ( U, X, 0, 1, W, W, W, W, X ), -- W ( U, X, 0, 1, L, W, L, W, X ), -- L ( U, X, 0, 1, H, W, W, H, X ), -- H ( U, X, X, X, X, X, X, X, X )) ; -- - 10.1.2012 MI-SIM Jiří Douša 37
Resoluční funkce takto je definována resoluční funkce v knihovně std_logic_1164: function resolved (s: std_ulogic_vector) return std_ulogic is variable res: std_ulogic := Z ; --počáteční nastavení if s length = 1 then return s (s low); --případ jednoho budiče else for i in s range loop -cykl přes všechny budiče signálu s res:= res_tab (res, s(i)); -- výpočet -- resoluční funkce argumentů res a s(i) end loop; end if; return res; --hodnota funkce (efektivní hodnota) = --superposice výstupů všech budičů end resolved; 10.1.2012 MI-SIM Jiří Douša 38
Resoluční funkce Příklad: signal a: std_logic := '0'; -- počáteční hodnota -- každého budiče signálu a. P1: process wait for 1 ns; a <= not a; end process; P1 a P2: process wait for 2 ns; a <= not a; end process; P2 1 a X 0 1 ns time 10.1.2012 MI-SIM Jiří Douša 39
Resoluční funkce Příklad: signal a, b, c: std_logic := '0';..; P1: process wait for 1 ns; a <= not a; wait for 0 ns; c <= a; end process; P1 P2 a b c P2: process wait for 2 ns; b <= not b; wait for 0 ns; c <= b; end process; a b c 1 2 3 4 ns 10.1.2012 MI-SIM Jiří Douša 40