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 7: VHDL-specifikace struktur, testování modelů, syntetizovatelné konstrukce jazyka. Stručný obsah: osazování a instalace komponent, mapování portů, parametrizace entit, konfigurace strukturních hierarchických schémat, syntetizovatelné konstrukce jazyka. 21.10.2011 MI-SIM: Jiří Douša 1
Strukturní popis více konkrétní než model chování vyjadřuje konkrétní vazby na jiné (dílčí) jednotky zahrnuje modely dílčích jednotek v každé architektuře lze mixovat strukturní popis, data - flow popis a sekvenční popis umožňuje hierarchické uspořádání modelu - struktury mohou být zahnízděny do hloubky příklad hierarchie: TEST D1 buzení D1 deska D1 K1. KN KS1. KSN..... 21.10.2011 MI-SIM: Jiří Douša 2
Prostředky VHDL pro strukturní popis: Deklarace subkomponent: v knihovně nebo přímo v deklarační části architektury ( není nutno u VHDL-93) - účel: reservace místa pro vnoření entit; syntax: component < jméno typu komponenty > [ generic.; ] -- formální parametry port (..); end component; -- formální porty deklarace lokálních signálů: v deklarační části architektur - účel: získání propojovacích vodičů konfigurace (sub) komponent: v deklarační části architektury (component specifikation) nebo vně entity (configuration) účel - přiřazení entit a architektur dílčím komponentám syntax: for <label>:< jméno typu komponenty> use entity <jméno knihovny>.<jméno entity>. (<jméno architektury>); instalace a zapojení subkomponent: v operační části architektury syntax instalačního příkazu: <label> : <jméno typu komponenty > [generic map (<seznam parametrů>) ] --aktuální parametry port map ( < mapování portů> ) ; -- popis struktury 21.10.2011 MI-SIM: Jiří Douša 3
Analogie s reálnými obvody Příklad: deska tištěných spojů: deska D konector K K1:S16 K2:S16 KN:S40 IO konektor K. entity deska_d..architecture sokl (patice).component tištěný spoj...signal pájený pin..port map zasunutí IO do soklu configuration IO..entity + architecture 21.10.2011 MI-SIM: Jiří Douša 4
Celkový nástin strukturního popisu entity deska_d is..end deska_d; architecture Struk of deska_d is signal.; -- deklarace lokálních vodičů component S16 -- jméno komponenty * generic (.); + --formální parametry (může chybět) port (..); --rozhraní komponenty (formál. porty) end component; component S40 end component S40; -- následuje konfigurace (osazení) komponent (může chybět) [ for K1:S16 use entity work. E193(A193); --osazení K1...... for KN: S40 use entity work. E8255(A8255); ] --osazení KN begin --následuje instalace a propojování komponent K1: S16 *generic map + --zadání aktuálních param. pro K1 port map...; -- propojení soklu K1 ; --propojení ostatních komponent KN: S40 *generic map.+ --zadání aktuál. parametrů pro K2 port map... ; --propojení soklu KN end Struk; 21.10.2011 MI-SIM: Jiří Douša 5
Osazování komponent: přiřazení entity a architektury dílčí komponentě: lze v architektuře vynechat v případě, že: komponenta a entita mají stejná rozhraní (tj. jména & porty) - default configuration osazení bude provedeno později (configuration) ve VHDL-93: přímá instalace komponent mapování portů entity na porty komponenty: při shodě jmen odpovídajících si portů entity a komponenty lze vynechat různá jména nutno mapovat explicitně: EIO (AIO)...dvojice: pe2 (entita & architektura.) pe3 mapování při osazení pe1 pe4 komponenty C x p1 komponenta C p2 p3 p4 w z y. mapování při instalaci komponenty C 21.10.2011 MI-SIM: Jiří Douša 6
Osazení komponenty v architektuře Příklad: osazení komponenty S16 v architektuře Struk entity EIO is -- tato entita je určena pro osazení -- komponenty S16 v architektuře Struk entity deska_d ( port pe1: in bit; pe2: out bit; pe3: inout bit; pe4: buffer bit ); end EIO; architecture AIO of EIO is.;.end AIO; entity deska_d is..;end deska_d; architecture Arch of deska_d is signal x, y, z, w : bit; --deklarace lokálních vodičů na desce component S16 port (p1 :in bit; p2: out bit; p3: inout bit; p4: buffer bit); end component; -- následuje osazení komponenty S16 a mapování pinů for K1: S16 use entity work.eio (AIO) port map ([ pe1 =>] p1, [pe2 =>] p2, [ pe3 =>]p3, [pe4 =>] p4 ); --zde je možné použít i posiční mapování portů entity EIO do --portů komponenty K1 (případně obojí) begin..--mapování portů komponenty S16 na vodiče (zde vynecháno) end AIO; 21.10.2011 MI-SIM: Jiří Douša 7
Zapojení komponent v architektuře Příklad: propojení komponenty S16 v architektuře Struk entity deska_d is port ( a: in bit; b: out bit; c: inout bit; d: buffer bit ); end deska_d; architecture Arch of deska_d is.; --deklarace signálů a osazení komponenty - viz. minulý příklad begin -- následují různé způsoby propojení komponent K1: S16 port map -- následuje mapování pinů komponenty K1do signálů či portů nadřazené entity deska_d (p1 => x, p2 => y, p3 => z, p4 => w); --jmenné mapování (x, y, z, w); -- poziční mapování na signály x,y,z,w (p1 =>a, p2 => b p3 => c, p4 => d); -- mapování na porty (a, b, c, d); p1 => x, p2 => open, p3 => c, p4 => d); --poziční mapování na porty --mapování na -- signály nebo porty, p2 je nezapojený výstup -- jde o různé varianty zapojení komponenty K1.; --propojení dalších komponent KN: S40 port map (..); end Arch; 21.10.2011 MI-SIM: Jiří Douša 8
Přímá instalace komponent ve VHDL- 93: odpadá deklarace komponent osazení dílčími entitami je spojeno s jejich instalací v příkazové části architektury Příklad: architektura předchozí desky_d architecture Struk of deska_d is signal.; -- deklarace lokálních vodičů begin K1: entity work.e193(a193) --instalace IO 193 [ generic map.. + -- parametry IO 193 port map ; -- mapování rozhraní -- IO 193 na okolní vodiče (signály či porty architektury Struk)..; KN: entity work.e8255(a8255) * generic map + port map.; end Struk; 21.10.2011 MI-SIM: Jiří Douša 9
Dodatky k mapování portů povolená propojení při mapování portů vnořené entity do dílčí komponenty nebo při mapování portů komponenty do nadřazené entity Vnější buzení: ano ne / ano ne / ano ne in out inout buffer in out inout buffer přípustná mapování zápis čtení ne ano ano ano ano ne ano ano komponenta nebo nadřazená entita vnořená entita nebo komponenta konstantní vstupy komponent (s hodnotou 0 nebo 1 ): možnosti VHDL-87: a) deklarovat a inicializovat lokální signály, připojit je na porty komponenty a nebudit dalším budičem b) v deklaraci vnořené entity inicializovat port žádanou hodnotou : port ( x: in bit:= 1 ;..); při mapování portů příslušné komponenty do okolí použít označení open, např. K1: S16 port map (p1 => open, ); jde o nezapojený vstup možnosti VHDL-93: při mapování portů komponenty do okolí lze použít přímé konstanty 0 nebo 1, např.: K1: S16 port map ( p1 = > 0,..) 21.10.2011 MI-SIM: Jiří Douša 10
Nedeterminované meze portů porty deklarované jako neomezená pole možnosti nastavení dimense portu: a) pomocí rozměru pole reprezentujícího signál, který je namapován do daného portu při instalaci komponenty Příklad: entita compare bude použita v architektuře Arch entity E: entity compare is -- umožňuje srovnání n-bitových čísel port ( a,b: in bit_vector; x,y : out bit); --neurčené meze end compare; architecture Arch of E is component compare port ( a,b: in bit_vector; x,y: out bit); --neurčené meze end component; signal s1, s2: bit_vector (7 downto 0); signal s3, s4: bit_vector (15 downto 0); begin C1: compare port map ( a => s1, b => s2,..); --8 bitů C2 :compare port map ( a => s3, b => s4,..); --16 bitů end Arch; b) pomocí mechanismu generic (viz další slide) 21.10.2011 MI-SIM: Jiří Douša 11
Parametrizace entit generic: mechanismus pro jednorázové předávání hodnot entitám (konstanty, které mohou ovlivnit simulaci ale nemohou být modifikovány) použití: zpoždění, zátěž obvodu, počet vstupů způsoby předání hodnot parametrů: b1) inicializací formálních parametrů v entitě - platí pro všechny architektury této entity b2) explicitně při instalaci komponenty v architektuře (následující slide) nebo v konfiguraci (viz později); toto explicitní předání lze vynechat, byla-li definována implicitní hodnota dle b1) ad b1) entity EXor2 is generic ( [ constant ] zpe: [ in ] time:= 8 ns; [ constant ] zateze:[ in ] integer: = 2 )--inicializace port (i1e, i2e: in bit; oe: out bit); end EXor2; architecture AXor2 of Exor2 is begin oe <= i1e xor i2e after ( zpe + ( zateze * 2 ns )); end AXor2; 21.10.2011 MI-SIM: Jiří Douša 12
Parametrizace entit ad b2) zadávání hodnot parametrů při instalaci komponent v operační části architektury Příklad: vnoření předchozí entity Exor do strukturní architektury Arch nadřazené entity deska_d: entity deska_d is...end deska_d; architecture Arch of deska_d is signal a, b, c, d, x, y,.; -- lokální vodiče component SXor2 generic ( zpc: time; zatezc: integer ); -- formální parametry port (i1c, i2c: in bit; oc: out: bit); -- piny soklu end component; for X1: SXor2 use entity work.exor2 (AXor2) --následuje mapování parametrů: EXor2 => X1 generic map ( [zpe =>] zpc, [ zateze =>] zatezc ) --následuje mapování jmen portů: EXor2 => X1 port map ( [ i1e =>] i1c, [ i2e =>] i2c, [ oe =>] oc ); ; -- osazování dalších komponent -- příkazová část architektury Arch - viz další slide 21.10.2011 MI-SIM: Jiří Douša 13
Parametrizace entit - následuje operační část Arch: begin X1: SXor2 generic map (10 ns, 3) port map (a, b, x); -- parametry pro X1 -- propojení X1 s okolím X2: SXor2 generic map (zpc =>10 ns, zatezc => 4 ) --parametry pro X2 port map (c,d,y);..; -- propojení dalších vnořených komponent..; -- jakékoliv paralelní příkazy end Arch; signály a b 10 ns 3 parametry SXor2 i1c i2c zpc zatezc e i1e i2e zpe zateze AXor2 -- propojení X2 s okolím X1 oe EXor2 dědění parametrů a portů parametrizace při osazování parametrizace při zapojení komponenty oc x 21.10.2011 MI-SIM: Jiří Douša 14
Příkaz generate Příklad: strukturní model paralelního registru předpoklad: existuje entita (model jednobitového registru) entity latch is port (clk, i1:in bit; o1: out bit); end latch; architecture A of latch is. end A; entity ERg is generic ( n: integer := 32);--plati, chybi-li. explicitní specifikace port (a: in bit_vector (n -1 downto 0); clk: in bit; b: out bit_vector (n -1 downto 0) ); end ERg; architecture ARg of ERg is component latch; port (clk, i1 : in bit; o1:out bit); -- interface soklu end component; -- for L: latch use work.latch (A); zde není třeba begin -- následuje generování třiceti dvou komponent G: for i in n - 1 downto 0 generate L: latch port map (clk, a(i), b(i) ); end generate; end ARg; 21.10.2011 MI-SIM: Jiří Douša 15
Příkaz generate Příklad: paralelní sčítačka (pro sčítání různých délek; maximálně 24 bitů) a(n-1) b(n-1) a(0) b(0) cn c(n-1) c(1) co s(n-1) s(0) c(1) c(n-1).vnitřní signály entity EN_bit_sum is generic ( n: integer := 16); -- implicitní šíře port (a,b: in bit_vector ( n - 1 downto 0 ); co: in bit; cn: out bit; s: out bit_vector ( n - 1 downto 0 ) ); begin --následuje kontrola šířky operandů assert ( n > 1 and n < = 24 ) report operandy mimo rozsah severity error; end EN_bit_sum; 21.10.2011 MI-SIM: Jiří Douša 16
Příkaz generate Příklad: pokračování paralelní sčítačky architecture Arch of EN_bit_sum is component Upl_scit port (x,y,cin: in bit; cout, sum: out bit); end component; signal c: bit_vector (n - 1 downto 1); --vnitřní přenosy for all: Upl_scit use entity work. EUS (AUS); begin --počet úplných sčítaček je přizpůsoben hodnotě n G: for i in n - 1 downto 0 generate MSB: if i = n-1 generate S_n_1: Upl_scit port map (a(i), b(i), c(i), cn, s(i)); end generate; LSB: if i = 0 generate S_0: Upl_scit port map(a(i), b(i), co, c(i+1),s(i)); end generate; Normal: if i > 0 and i < n-1 generate S: Upl_scit port map (a(i),b(i),c(i),c(i+1),s(i)); end generate; end generate; end Arch; 21.10.2011 MI-SIM: Jiří Douša 17
Konfigurace strukturních schémat konfigurace - mechanismus pro: a) vzájemné přiřazení architektury a entity (při vynechání: automatický výběr posledně překládané architektury) b) přiřazení dvojice entity + architektura komponentě: jde o analogii s osazováním soklů obě výše zmíněná přiřazení lze provést na různých úrovních vývoje modelu: 1) konfigurace v deklarační části architektury (component specification) for K1: S16 use entity work. E193(A193);--individuální --osazení komponenty typu S16 dvojicí E193 + A193 for K1: S16 use entity work.e193;--přiřadí se nejmladší -- architektura, tj. přeložená jako poslední (automatic -- configuration); v případě, že komponenta a entita mají --stejné rozhraní lze toto přiřazení úplně vynechat for all: S16 use entity.worke193(a193) ; --osazení všech -- komponent typu S16 dvojicí E193 + A193 for others: S16 use entity...; --osazení zbývajících dosud -- neosazených komponent S16 21.10.2011 MI-SIM: Jiří Douša 18
Konfigurace strukturních schémat 2) konfigurace vně architektury: cofiguration declaration - samostatná část zdrojového programu: umožňuje odložit osazení soklů a toto soustředit do jednoho místa => možnost rychlé záměny integrovaných obvodů bez nutnosti nového překladu osazované strukturní architektury Příklad : dodatečné osazení dvouúrovňové architektury Struk a její vazba na entitu deska_d1 configuration Konf1 of deska_d1 is for Struk --volba architektury Struk for K1: S16 use entity work.e193 (A193) --osazení komponenty K1 typu S16 dvojicí E193 a A193 [generic map( ) ] port map(...); --mapování param. a portů end for ; for KN: S40 use entity work. E8255 ( A8255); end for ; --osazení komponenty KN dvojicí E8255 a A8255 [generic map( ) ] port map(...); --mapování param. a portů end for ; --konec volby a osazení architektury Struk end Konf1; 21.10.2011 MI-SIM: Jiří Douša 19
Konfigurace strukturních schémat Příklad: dodatečné osazení dvouúrovňové architektury s dílčími vnitřními bloky BL1, BL2 configuration Konf2 of deska_2 is for Struk -- volba architektury Struk for K1: S16 use end for ; --osazení K1 (mimo blok) for K2: S40 use end for; --osazení K2.--osazení zbývajících komponent na úrovni 1 for BL1 --otevření bloku BL1 for A1:S40 use end for; --osazení uvnitř BL1 for A2:S80 use end for; --další osazení v BL1 for.end for; end for; --uzavření bloku BL1 for BL2 --otevření bloku BL2 for A1: S40 use...end for; --osazení A1 uvnitř bloku BL2 for E1: S20 use..end for; -- další osazení v bloku BL2 end for; --uzavření bloku BL2 end for; end Konf2; 21.10.2011 MI-SIM: Jiří Douša 20
Konfigurace strukturních schémat Příklad 3: nástin osazení víceúrovňové architektury Struk s dalšími neosazenými dílčími strukturními entitami Struk deska_d3 E193(A193) EK(AEK) EK(AEK) K1:S16 K1 K2 Kn SK1 SKm E8255(A8255) E1(SAE1) Em(SAEm) 21.10.2011 MI-SIM: Jiří Douša 21
Konfigurace strukturních schémat Příklad 3: osazení architektury Struk (viz minulý slide): configuration Konf3 of deska_d3 is for Struk -- volba architektury Struk for K1: S16 use entity work.e193 (A193); end for; for Kn: S40...E8255 (A8255); end for; for SK1:S80 use E1 (SAE1); for SAE1 -- otevření strukturní architektury SAE1 for K1: S20 use entity work. EK (AEK) end for; for...end for; -- další komponenta end for; -- uzavření SAE1 end for; for SKm: S80 use..em(saem); for SAEm -- otevření SAEm for K2: S20 use entity work EK (AEK) end for; for...end for; end for ; end for; end for; end Konf3; 21.10.2011 MI-SIM: Jiří Douša 22
Generování testovacích vstupů a) programové generování v architektuře testbench: explicitní seznam hodnot v příkazech typu data - flow: vstupy <= X 01, X 02 after 10 ns, X 03 after 20 ns,. programově vygenerovaná vstupní sekvence pomocí algoritmu v procesu buzeni: process begin -- buzení s náběžnou hranou wait until clk = 1 ; vstupy <=.; clk <= not clk after..; end process buzeni ; b) průběžné čtení hodnot vstupů v architektuře ze souboru: c) instalace generátoru vstupních průběhů vnitřní funkce generátoru: vložení dat do pomocné paměti generátoru inicializací konstanty příslušného datového typu v knihovně jednorázovým načtením pomocné paměti ze souboru adresace pomocné paměti generátoru, postupný výběr dat z pomocné paměti a buzení vstupních signálů testované entity 21.10.2011 MI-SIM: Jiří Douša 23
Průběžné čtení vstupů: předpoklad: hodnoty vstupů i1,i2 (typu signal i1,i2 : bit_vector ( 7 downto 0); jsou uloženy v textovém souboru test1.dat proces čte hodnoty ze souboru test1.dat a nastavuje nové hodnoty signálů i1, i2 vždy při každé náběžné hraně hodinového pulsu cti: process variable L: line; variable v1, v2: bit_vector (7 downto 0); file vstup_dat : text is "test1.dat"; -- otevření pro vstup begin while not endfile (vstup_dat) loop readline (vstup_dat, L); -- fyzické naplnění vyrov. paměti read (L, v1); read (L, v2); -- přesun do proměnných v1 a v2 wait until clk = '1'; -- pozastavení čtení i1 <= v1; i2 <= v2; --buzení signálů end loop; wait for.. ns; -- čekej na výpočet poslední odezvy modelu assert false report " konec souboru " severity failure; end process cti; -- ukončení simulace 21.10.2011 MI-SIM: Jiří Douša 24
Generátor vstupních průběhů Příklad: generátor vstupních průběhů; na začátku simulace naplní pamětˇ ROM ze souboru a posléze těmito údaji budí vstupy testované entity. entity Gen is generic ( max: integer ); port (clk: in bit; vyst : out bit_vector ( 7 downto 0)); end Gen; architecture AGEN of GEN is subtype byte is bit_vector ( 7 downto 0); type mem_1kb is array ( 0 to max - 1) of byte; signal ROM : mem_1kb; begin -- operační část generátoru citac: process (clk) -- periodicky čte ROM a v okamžiku -- náběžné hrany clk budí výstupy generátoru variable adr: integer :=0; begin if clk = '1' then vyst <= ROM (adr mod max); adr := adr + 1; end if; end process citac; 21.10.2011 MI-SIM: Jiří Douša 25
Generátor vstupních průběhů --následující proces naplní na začátku simulace pamětˇ ROM --daty z binárního souboru test2.dat. nastav_rom: process type soubor is file of byte; file vstup_dat: soubor is in "test2.dat";--otevření pro vstup variable V: byte; variable adr: integer := 0; begin while not endfile ( vstup_dat) loop read (vstup_dat, V); ROM (adr) <= V; adr := adr + 1; end loop; end AGEN; wait; -- pro jednorázové čtení soboru do paměti ROM end process nastav_rom; 21.10.2011 MI-SIM: Jiří Douša 26
Testování entit Příklad : testování entity E (AE) pomocí generátoru GEN entity testbench is end testbench; -- testovací entita architecture Atest of testbench is signal vstupy: bit_vector (7 downto 0); -- pro propojení GEN a E signal vystupy:..; -- odezva testované entity signal reset, clk: bit := '0'; constant per_2: time:= 10 ns; component KOMP -- pro testovanou entitu port (..); end component; component GEN -- pro generátor generic ( max: integer ); port (clk: in bit; vyst : out bit_vector ( 7 downto 0)); end component; for K: KOMP use entity work: E (AE); -- osazení testovanou entitou E for G: GEN use entity work.gen (AGEN); --osazení generátorem begin G: GEN generic map (1024) port map (clk=>clk, vyst=> vstupy); K: KOM port map (clk, vstupy, vystupy); clk <= not clk after per_2 ns; reset <= 1 after 2 ns; end Atest; 21.10.2011 MI-SIM: Jiří Douša 27
Syntetizovatelné konstrukce jazyka VHDL IEEE P 1076.6: Draft Standard for VHDL Register Transfer Level Synthesis (syntax + sémantika pro syntézu) Nepodporované nebo ignorované konstrukce: file, alias, assert, sdílené proměnné Podporované konstrukce: library: podporována work package: podporovány: předdefinované: Standard ( mimo funkcí s nepodporovanými parametry a package TEXTIO), Std_Logic_1164, unsigned, signed, arith, uživatelem definované package: nelze deklarovat sdílené proměnné, nepodporované typy a operátory, konstrukce nepodporované v podprogramech, configuration: umožňují přiřadit architekturu entitě na nejvyšší úrovni, nelze osazovat komponenty žádné architektury, entity: generics: lze inicializovat (podporován pouze typ integer), porty nelze inicializovat, buffer je transformován na out, deklarační část není podporována, operační část ignorována, 21.10.2011 MI-SIM: Jiří Douša 28
Syntetizovatelné konstrukce jazyka VHDL architecture: podporováno více architektur (užita první nebo ta specifikovaná v configuration ), deklarace komponent je podporována, osazování komponent v deklarační části je ignorováno (implicitní osazení podporováno), signal, variable, constant: nejsou podporovány strážené signály (bus a register), signály a proměnné nelze inicializovat, type, subtypes: podporované typy: integer : automaticky převeden na minimální počet bitů typu unsigned nebo signed dle rozsahu v deklaraci, natural, positive, char, bit, bit_vector, boolean, Std_Logic, Std_Logic_Vector, uživatelsky definované podtypy výše uvedených typů, jednorozměrná pole (omezená i neomezená ) s elementy výše uvedených typů ( rozsahy: static integer), jednorozměrné pole jednorozměrných polí, záznamy s elementy výše uvedených typů, ignorovány: funkce pro dynamické přidělování paměti, deklarace ukazatelů a nekompletní deklarace, typy real, time, víceroměrná pole, fyzikální typy 21.10.2011 MI-SIM: Jiří Douša 29
Syntetizovatelné konstrukce jazyka VHDL operatory: podporovány: logické operátory, relační operátory, aritmetické operátory +, *, div, **, rem, mod, operátor &, operátory /, mod, rem mohou být aplikovány pouze pro případ kdy oba operandy jsou stat. konstanty nebo pravý operand je statická konstanta, jejíž hodnota je mocnina 2, operátor ** lze aplikovat pouze v případě, že oba operandy jsou stat. konstanty nebo levý operand je 2, operátory přiřazení ( :=, <= ) nepodporované: operátory posuvů ( sll, srl, sla, sra, rol, ror ) subroutine: parametry: objekty tříd constant, variable, signal deklarace v knihovnách nebo v deklaračních částech architektur, počet rekursí musí být static, formální parametry nelze inicializovat, násobný výskyt příkazu wait v operační části není povolen, přetěžování podprogramů je podporováno, není podporovaná funkce now a uživatelsky definované resoluční funkce, 21.10.2011 MI-SIM: Jiří Douša 30
Syntetizovatelné konstrukce jazyka VHDL atributes: podporované atributy: left, right, high, low, range, reverse_range, length, atributy event, stable mohou být použity pouze v příkazech if nebo wait, sequential statements: podporované příkazy: wait: povolen pouze jediný příkaz s doložkou until na začátku procesu, signálový přiřazovací příkaz ( doložka after je ignorována ) nepodporováno: klíčová slova reject,, více budoucích hodnot na pravé straně ( multiple waveform elements ), přiřazení do proměnné, volání procedury, if, case: jestliže do proměnné nebo do signálu je přiřazena hodnota pouze v některých větvích příkazů nebo čtení předchází zápisu, pak ( pokud přiřazení není podmíněno existencí hrany hodinového signálu) je generován hladinový klopný obvod, loop povolen pouze cyklus typu for..loop ( index musí být integer), next, exit, return, null, 21.10.2011 MI-SIM: Jiří Douša 31
Syntetizovatelné konstrukce jazyka VHDL concurrent statements: podporované příkazy: příkaz procesu (s citlivostním seznamem i bez), příkaz paralelní procedury (s jedním příkazem wait), nepodmíněné signálové přiřazovací příkazy ( vyjma klíčových slov typu transport a doložek after) podmíněné signálové přiřazovací příkazy when a with (vyjma klíčových slov typu transport a after) příkaz instalace komponenty, není podporována přímá instalace entit a architektur v operační části architektury ( viz VHDL 93) příkaz generate, příkaz bloku: nepodporovány:» porty a generics bloku,» strážené výrazy, nepodporovaný příkazy: postponed process, postponed procedure, strážené příkazy guarded, jakékoliv příkazy obsahující specifikaci hran signálů 21.10.2011 MI-SIM: Jiří Douša 32
Syntéza kombinačních obvodů použití paralelních příkazů typu data - flow použití procesů: citlivostní seznam musí obsahovat všechny vstupy obvodu, úplně specifikované příkazy if a case se zápisem do signálu nebo do proměnné: definují kombinační obvod => neinstalují se žádné hranově citlivé obvody, Příklady: implementace multiplexoru process ( sel, a, b ) begin case sel is when 1 = > z <= a; when 0 = > z <= b; end case; end process; process ( sel, a, b ) begin if sel = 1 then z <= a; else z <= b; end if; end process; doporučení: pro implementaci složitějšího multiplexoru preferovat příkaz case před příkazem if (souměrná kaskáda), 21.10.2011 MI-SIM: Jiří Douša 33
Syntéza kombinačních obvodů v procesu lze použít proměnných, vkládání hladinových klopných obvodů je možné, ale nežádoucí, situace vedoucí ke vložení latch: jde o přiřazení do signálu či proměnné v procesu, který neobsahuje žádnou specifikaci hrany, existují taková provedení procesu, při nichž nedojde k žádnému přiřazení hodnoty ( do uvedeného signálu či proměnné ) Příklady neúplného přiřazení: process ( sel, x ) begin case sel is when 1 = > z <= x; when others => null ; end case; end process; -- prázdný příkaz process ( sel, x ) begin if sel = 1 then z <= x; end if; end process; process ( a, b, c ) begin if a = 1 then Q <= 00 ; elsif b = 1 then Q <= 01 ; elsif c = 0 then Q <= 10 ; end if; end process; 21.10.2011 MI-SIM: Jiří Douša 34
Syntéza kombinačních obvodů způsoby eliminace neúplně specifikovaných příkazů: přiřazení implicitní hodnoty do Q na začátku procesu: process (a,b,c) begin Q <= 11 ; -- prvotní zápis if a = 1 then Q <= 00 ; elsif b = 1 then Q <= 01 ; elsif c = 0 then Q <= 10 ; end if; specifikovat odezvu pro všechny vstupní kombinace ( např. používat else místo elsif ): process (a,b,c) begin If a = 1 then Q <= 00 ; elsif b = 1 then Q <= 01 ; else Q <= 10 ; -- všechny zbývající kombinace end if; 21.10.2011 MI-SIM: Jiří Douša 35
Syntéza sekvenčních obvodů používání výhradně hranově citlivých klopných obvodů, specifikace pomocí procesů s citlivostním seznamem: citlivostní seznam obsahuje pouze hodinový signál, případně signál pro asynchronní nastavení klopných obvodů, syntetizér rozeznává tzv. synchronizované procesy ( clocked procesy ) aktivované hranou nějakého signálu; možné formy identifikace synchronizovaných procesů: if (nebo elsif) clk event and clk = 1 then.; if (nebo elsif) Rising_Edge (clk) then.; if (nebo elsif) Falling_Edge (clk) then.; if (nebo elsif) not clk stable and clk = 1 then.; specifikace pomocí procesu s jediným příkazem wait ( bez citlivostního seznamu ): poznámky: možné formy identifikace synchronizovaných procesů: wait until clk = 1 ; místo 1 lze použít 0, wait until clk event and clk = 1 ; wait until Rising_Edge (clk); wait until Falling_Edge(clk); wait until not clk stable and clk = 1 ; na pořad operandů v operaci and nezáleží 21.10.2011 MI-SIM: Jiří Douša 36
Syntéza sekvenčních obvodů podmínky vkládání hranově citlivých registrů do schématu: výskyt zápisu hodnoty do signálu za příkazem wait, či v příkazu if nebo elsif, za příkazem wait, či v příkazu if nebo elsif se vyskytuje zápis do proměnné, kterému předchází čtení dané proměnné ( hodnoty proměnných se při každé aktivaci procesu neinicializují => považují se za hodnoty registru z minulého taktu ); pokud při každé aktivaci procesu nastane zápis do proměnné dříve než její čtení, pak registr není vložen; specifikace automatů - doporučení: použít 3 samostatné procesy, 2 procesy pro popis kombinačních částí (přechodové funkce a výstupní funkce), 1 proces pro popis paměťové části, pro reprezentaci vnitřních stavů použít výčtového typu, 21.10.2011 MI-SIM: Jiří Douša 37
Syntéza sekvenčních obvodů Příklad: model sekvenčního obvodu 1. varianta: případ, kdy proměnná není výstupem klopného obvodu entity FF is port ( clk, reset, A, B: in bit; Q: out bit); end FF; architecture AFF of FF is signal Q_s: bit; begin process variable prom: bit ; begin wait until clk event and clk = 1 ; -- čekej na hranu if reset = 1 then Q_s <= 0 ; else pom := A and B; -- pom nebude FF Q_s <= pom; -- Q_s bude FF -- zapis do promenne pom predchazi jejimu cteni end if; end process; Q <= Q_s ; end AFF; 21.10.2011 MI-SIM: Jiří Douša 38
Syntéza sekvenčních obvodů 2. varianta: chybné použití proměnné => nežádoucí vložení FF entity FF is port ( clk, reset, A, B: in bit; Q: out bit); end FF; architecture AFF of FF is signal Q_s: bit; begin process variable prom: bit ; begin wait until clk event and clk = 1 ; -- čekej na hranu if reset = 1 then Q_s <= 0 ; else Q_s <= pom; -- Q_s bude FF pom := A and B; -- pom bude FF -- cteni do pom predchazelo zapisu do pom end if; end process; Q <= Q_s ; end AFF; 21.10.2011 MI-SIM: Jiří Douša 39
Syntéza sekvenčních obvodů Příklad: synchronní čitač mod 15; entity Counter is port ( clk, reset: in bit; count_s: out bit_vector (3 downto 0 ) ); end FF; architecture ACounter of Counter is begin process variable count_v: bit_vector (3 downto 0); begin wait until clk = 1 ; if reset = 1 then count_v := ( others => 0 ) ; -- reset čítače -- následuje větev, ve které čtení předchází zápisu => proměnn -- count_v je výstupem hranového klopného obvodu else count_v := count_v + 1 ; end if; count_s <= count_v; end process; end ACounter; -- inkrement 21.10.2011 MI-SIM: Jiří Douša 40