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 if not D´stable (predstih + presah) then „porušení předstihu“ end if; 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
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; …………………..); begin -- následuje operační část entity process (clk´delayed (presah)) -- synchronizace begin --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 BUF
příprava dat 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 begin -- 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; begin 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
ACK vyprazdňování bufferu
příprava dat
zpracování dat
plnění bufferu
10.1.2012
MI-SIM Jiří Douša
11
Producent - konsument: návrh verse 2 signály: OFFER
konsument
ACK
producent
BUF • 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
příprava
plnění.
příprava
plnění
producent OFFER konsument
ACK
OFFER
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; begin 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; begin 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
ACK „RS FF“
NDATA
producent konsument
přípr.
pl. přípr. vypr.
pl. zpr.
OFFER ACK
NDATA 10.1.2012
MI-SIM Jiří Douša
14
Producent - konsument: verse 3 prod: process begin 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; begin 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) begin 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 begin 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 begin c <= null; P1: 1 wait for 2 ns; c <= '0'; P2: 0 wait for 0 ns; 0 c<= null; end proces P1; 10.1.2012
X 1
MI-SIM ©Jiří Douša
2
3
4
ns
17
Producent – konsument: verse 4 signal NDATA: std_logic register := '0 -- strážený signál prod: process begin 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; begin 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 sdílená proměnná
tik příprava dat
plnění BUF
producent
konsument
NDATA tik 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 begin 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; begin 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. begin 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 ; begin -- 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
begin 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 begin -- test předstihu koncipujeme voláním procedury test: if (clk´event and clk = ´1´ ) then test ( D = > D ); Q < = D after 4 ns; endif ; end process; 1) nepřípustná varianta procedury test: procedure test ( signal D : in bit ) is begin 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 begin assert not D´last_event < 8 ns -- OK: jde o atribut funkci report ……… severity …..; end test; Příklad: process (clk) -- flip-flop begin 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 begin 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 signal
variable
constant file (VHDL´93)
mód FP in inout out in out inot in in out
třída AP signal
omezení AP statický signal viz. 1), 2)
variable, file (pouze VHDL´87) signal, variable, literal, konstantní výraz file
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 begin……………………………….end P1; function F1 ( signal R: in bit_vector ) return bit_vector is begin………………………………..end P1; signal S1: integer := 4; -- přiřazení provedeno na začátku simulace ! signal S2: bit_vector ( 0 to 7); begin 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) ); -- OK, g1 je static …………; P1 ( S => F1 ( R =>S2 ) ); -- error: funkce aplikovaná na AP -- třídy signal …………; end A; 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> [ () ] ; • 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 begin ………… 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 begin ……………….end test; procedure test -- test přesahu ( constant presah : in time; signal D : in bit_vector, signal clk : in bit ) begin ……………….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 begin return real ( L ) + R; end “+”` ; function “ + “ ( constant L: real ; constant R: integer ) return real is begin return L + real ( R ); end “+”` ; signal X, W1, W2: real; signal Y integer; begin process variable result: real; begin 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 is begin if a >= b then return a; else return b; end if; end max; begin --následuje příkazová část architektury process (…….) begin ……..; y <= max (.. , ..) ; -- sekvenční volání funkce …………...; end process; z <= max (..;..) ; end Arch;
10.1.2012
-- paralelní volání funkce
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; begin -- následují paralelní příkazy architektury process (a, e1) -- budič signálu c begin if e1=´0´then c <= a; else c <= ´Z´; end if; end process; process (b, e2) --budič signálu c begin 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´, ´X´, ´X´, ´X´, ´X´, ´X´, ´X´, ´X´, ´X´), (´U´, ´X´, ´0´, ´X´ , ´0´, ´0´, ´0´, ´0´, ´X´), (´U´, ´X´, ´X´, ´1´, ´1´, ´1´, ´1´, ´1´, ´X´), (´U´, ´X´, ´0´, ´1´, ´Z´, ´W´, ´L´, ´H´, ´X´), (´U´, ´X´, ´0´, ´1´, ´W´, ´W´, ´W´, ´W´, ´X´), (´U´, ´X´, ´0´, ´1´, ´ L´, ´W´, ´L´, ´W´, ´X´), (´U´, ´X´, ´0´, ´1´, ´H´, ´W´, ´W´, ´H´, ´X´), (´U´, ´X´, ´X´, ´X, ´X´, ´X´, ´X´, ´X´, ´X´)) ;
10.1.2012
MI-SIM ©Jiří Douša
----------
U X 0 1 Z W L H -
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í begin 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 begin a wait for 1 ns; a <= not a; P1 end process; P2: process begin wait for 2 ns; a <= not a; end process;
P2
a 1 X 0
1 ns 10.1.2012
MI-SIM ©Jiří Douša
time
39
Resoluční funkce Příklad: signal a, b, c: std_logic := '0'; …………..; P1: process begin P1 wait for 1 ns; a <= not a; P2 wait for 0 ns; c <= a; end process; P2: process begin wait for 2 ns; b <= not b; wait for 0 ns; c <= b; end process;
10.1.2012
a
c
b
a b c
1
MI-SIM ©Jiří Douša
2
3
4 ns
40