Szerkezeti leírás Összetevők és beültetésük Összetevők és beültetésük Általános kiosztás (generic map) Általános kiosztás (generic map) Generate parancs Generate parancs Összetevők a csomagokban Összetevők a csomagokban
Rövid áttekintés I. Utasítások<= after 10 ns block utasítás egyidejű eljáráshívás generate utasítás assert utasítás Értelmezésük Egyidejű jelhozzárendelés, adatáramláson végzett művelet leírására szolgál Szimuláció kezdetétől számított idő Egyidejű utasítások csoportba foglalása Eljárások egyidejű hívására való Többször beültetés hatékony leírására szolgál Valamilyen követelmény megfogalmazása, amely ha nem teljesül, egy üzenet jön létre
Rövid áttekintés II. Utasítások Összetevő beültetési utasítás Eljárás, függvény Process (folyamat) utasítás Típusok és állandók bejelentése when-else, with Értelmezésük Ez más néven példányosítás Eljárás és függvény leírása Elvonatkoztatás, amelyen belül algoritmikusan adható meg a hardver feladatkör Átfogóak, mindenhonnan láthatóak Adatáramláson végzet művelet leírására szolgál
Példa a szerkezeti leírásra Entity mux is port (d0,d1,sel: in std_logic; q: out std_logic); port (d0,d1,sel: in std_logic; q: out std_logic);end; Architecture struct_mux of mux is -- Összetevő deklaráció -- Összetevő deklaráció component and_comp port (a,b: in std_logic; c: out std_logic); end component; component and_comp port (a,b: in std_logic; c: out std_logic); end component; component or_comp port (a,b: in std_logic; c: out std_logic); end component; component or_comp port (a,b: in std_logic; c: out std_logic); end component; component inv_comp port (a: in std_logic; b: out std_logic); end component; component inv_comp port (a: in std_logic; b: out std_logic); end component; signal i1,i2,sel_n:std_logic; -- Összetevő specifikáció for U1: inv_comp Use Entity work.inv_comp(rtl); for U2,U3: and_comp Use Entity work.and_comp(rtl); for U4: or_comp Use Entity work.or_comp(rtl);
Példa a szerkezeti leírásra (folyt.) begin -- Összetevő beültetés -- Összetevő beültetés U1: inv_comp port map(sel,sel_n); U1: inv_comp port map(sel,sel_n); U2: and_comp port map(d0,sel,i1); U2: and_comp port map(d0,sel,i1); U3: and_comp port map(sel_n,d1,i2); U3: and_comp port map(sel_n,d1,i2); U4: or_comp port map(i1,i2,q); U4: or_comp port map(i1,i2,q);end;
Bekötetlen kimenetek Előfordulhat beültetésnél, hogy az összetevő nem minden kapcsa kerül kiosztásra Előfordulhat beültetésnél, hogy az összetevő nem minden kapcsa kerül kiosztásra Ezt a helyzetet kezeli az open VHDL kulcsszó Ezt a helyzetet kezeli az open VHDL kulcsszó Tegyük fel, hogy az ex4 összetevő q2 kimenete bekötetlen a beültetésnél: Tegyük fel, hogy az ex4 összetevő q2 kimenete bekötetlen a beültetésnél: Architecture rtl of top_level is component ex4 component ex4 port (a,b: in std_logic; q1,q2: out std_logic); port (a,b: in std_logic; q1,q2: out std_logic); end component; end component; For U1: ex4 use entity work.ex4(rtl); begin U1: ex4 port map(a=>a, b=>b, q1=>dout, q2=>open); U1: ex4 port map(a=>a, b=>b, q1=>dout, q2=>open);end;
Bekötetlen kimenetek (folyt.) A port map parancsból el is hagyható a bekötetlen kimenet, ilyenkor a következő alakban írható: A port map parancsból el is hagyható a bekötetlen kimenet, ilyenkor a következő alakban írható: U1: ex4 port map(a=>a, b=>b, q1=>dout); A rövidített port map felírási módnál a bekötetlen kimenet csak akkor hagyható el, ha az az utolsó A rövidített port map felírási módnál a bekötetlen kimenet csak akkor hagyható el, ha az az utolsó Ez egy hátránya a rövidített felírásnak Ez egy hátránya a rövidített felírásnak
Bekötetlen bemenetek I. A bemeneti kapocs nem lebeghet (floating) beültetés után A bemeneti kapocs nem lebeghet (floating) beültetés után Ha egy összetevő bemenete nem használt, akkor a jelnek vagy VCC-re vagy GND-re kell kapcsolódnia Ha egy összetevő bemenete nem használt, akkor a jelnek vagy VCC-re vagy GND-re kell kapcsolódnia A VHDL-87 szabványban nem lehetett közvetlenül kiosztani ezekre a kapcsokat a port map parancsban, hanem egy belső jelet kellett használni A VHDL-87 szabványban nem lehetett közvetlenül kiosztani ezekre a kapcsokat a port map parancsban, hanem egy belső jelet kellett használni Ezt a belső jelet hozzá kell rendelni a ‘0’-hoz vagy az ‘1’-hez, s a nem használt bementet erre a belső jelre kellett kiosztani: Ezt a belső jelet hozzá kell rendelni a ‘0’-hoz vagy az ‘1’-hez, s a nem használt bementet erre a belső jelre kellett kiosztani: Architecture rtl of top_level is component ex1 port (a,b: in std_logic; q1,q2: out std_logic); end component; component ex1 port (a,b: in std_logic; q1,q2: out std_logic); end component; For U1: ex1 use entity work.ex4(rtl); signal gnd: std_logic; begin gnd<=‘0’; gnd<=‘0’; U1: ex1 port map(a=>gnd, b=>b, q1=>dout, q2=>d2); U1: ex1 port map(a=>gnd, b=>b, q1=>dout, q2=>d2); end;
Bekötetlen bemenetek II. Egy hibás példa: Egy hibás példa: Architecture rossz of top_level is component ex1 component ex1 port (a,b: in std_logic; q1,q2: out std_logic); port (a,b: in std_logic; q1,q2: out std_logic); end component; end component; For U1: ex1 use entity work.ex4(rtl); begin U1: ex1 port map(a=>open, b=>b, q1=>dout, q2=>d2); U1: ex1 port map(a=>open, b=>b, q1=>dout, q2=>d2); -- Előző sor hibás -- Előző sor hibás end;
Bekötetlen bemenetek III. VHDL-93-ban megengedett a kapcsok közvetlen kiosztása ‘0’-ra vagy ‘1’- re: VHDL-93-ban megengedett a kapcsok közvetlen kiosztása ‘0’-ra vagy ‘1’- re: Architecture rossz of top_level is component ex1 component ex1 port (a,b: in std_logic; q1,q2: out std_logic); port (a,b: in std_logic; q1,q2: out std_logic); end component; end component; For U1: ex1 use entity work.ex4(rtl); begin U1: ex1 port map(a=>’0’, b=>b, q1=>dout, q2=>d2); U1: ex1 port map(a=>’0’, b=>b, q1=>dout, q2=>d2); -- VHDL-87-ben hibás, VHDL-93-ban érvényes -- VHDL-87-ben hibás, VHDL-93-ban érvényes end;
Általános kiosztás (generic map) parancs Ha általános összetevőt írnak elő a beültetendő összetevőben, akkor az értékei a generic map paranccsal módosíthatók a beültetés során Ha általános összetevőt írnak elő a beültetendő összetevőben, akkor az értékei a generic map paranccsal módosíthatók a beültetés során Jelölésmód: Jelölésmód: generic map( ); Az általánosságok használatával paraméterezhető összetevők tervezhetők Az általánosságok használatával paraméterezhető összetevők tervezhetők A következő példa általánosságokat használ mind az összetevő késleltetésre, mind a bemenetek számára A következő példa általánosságokat használ mind az összetevő késleltetésre, mind a bemenetek számára Ha az összetevőt beültetik, az összetevő késleltetését és a bemenetek számát meghatározzák: entity and_comp is generic (tdelay:time:=10 ns; n:positive:=2); generic (tdelay:time:=10 ns; n:positive:=2); port (a: in bit_vector(n-1 downto 0); c: out bit); port (a: in bit_vector(n-1 downto 0); c: out bit); end;
Általános kiosztási példa folytatása Architecture bhv of and_comp is begin po: process(a) po: process(a) variable int:bit; variable int:bit; begin begin int:=‘1’; int:=‘1’; for i in a’length-1 downto 0 loop for i in a’length-1 downto 0 loop if a(i)=‘0’ then if a(i)=‘0’ then int:=‘0’; int:=‘0’; end if; end if; end loop; end loop; c<=int after tdelay; c<=int after tdelay; end process; end process; end;
Általános összetevő felhasználása Az előző példában meghatározott összetevő felhasználásával ha egy tervben egy három bemenetű and összetevő szükséges 12 ns késleltetéssel és egy két bemenetű 8 ns késleltetéssel, akkor a jelölésmód a következő: Az előző példában meghatározott összetevő felhasználásával ha egy tervben egy három bemenetű and összetevő szükséges 12 ns késleltetéssel és egy két bemenetű 8 ns késleltetéssel, akkor a jelölésmód a következő: entity ex is port (d1,d2,d3,d4,d5: in bit; q1,q2: out bit); end; Architecture bhv of ex is component and_comp generic(tdelay:time; n:positive); component and_comp generic(tdelay:time; n:positive); port (a: in bit_vector(n-1 downto 0); c: out bit); end component; port (a: in bit_vector(n-1 downto 0); c: out bit); end component; for U1,U2: and_comp use entity work.and_comp(bhv) for U1,U2: and_comp use entity work.and_comp(bhv)begin U1: and_comp generic map(n=>2, tdelay=>8 ns) U1: and_comp generic map(n=>2, tdelay=>8 ns) port map(a(0)=>d1, a(1)=>d2, c=>q1); port map(a(0)=>d1, a(1)=>d2, c=>q1); U2: and_comp generic map(n=>3, tdelay=>12 ns) U2: and_comp generic map(n=>3, tdelay=>12 ns) port map(a(0)=>d3, a(1)=>d4, a(2)=>d5, c=>q2); port map(a(0)=>d3, a(1)=>d4, a(2)=>d5, c=>q2); end;
A generate parancs Ha azonos összetevőt sokszor kell beültetni ugyanazon építménybe, hatékonyabb a port map parancsot hurokba helyezni Ha azonos összetevőt sokszor kell beültetni ugyanazon építménybe, hatékonyabb a port map parancsot hurokba helyezni Tegyük fel, hogy a c1 összetevőt hatszor kell beültetni a top összetevőbe Tegyük fel, hogy a c1 összetevőt hatszor kell beültetni a top összetevőbe Ez a generate paranccsal tehető meg: Ez a generate paranccsal tehető meg: entity top is port(a,b: in std_logic_vector(4 downto 0); q:out std_logic_vector(4 downto 0)); port(a,b: in std_logic_vector(4 downto 0); q:out std_logic_vector(4 downto 0)); end; architecture rtl of top is component c1 port(a,b: in std_logic; q:out std_logic); end component; component c1 port(a,b: in std_logic; q:out std_logic); end component; for U1: c1 use entity work.c1(rtl); for U1: c1 use entity work.c1(rtl);begin c_gen: for i in 0 to 5 generate c_gen: for i in 0 to 5 generate U: c1 port map(a(i), b(i), q(i)); U: c1 port map(a(i), b(i), q(i)); end generate c_gen; end generate c_gen; end;
Közvetlen beültetés A közvetlen beültetést a VHDL-93 szabvány vezette be A közvetlen beültetést a VHDL-93 szabvány vezette be Eszerint sem az összetevő bejelentés, sem az összeállítás nem szükséges egy összetevő beültetéséhez Eszerint sem az összetevő bejelentés, sem az összeállítás nem szükséges egy összetevő beültetéséhez A következő példa bemutatja a kétféle beültetés közti különbséget: A következő példa bemutatja a kétféle beültetés közti különbséget: -- VHDL-87 szerinti leírás architecture rtl of top_level is component c1 component c1 port(a,b: in std:logic; q: out std_logic); port(a,b: in std:logic; q: out std_logic); end component; end component; for U1: c1 use entity work.c1(rtl); begin U1: c1 port map(a,b,q); U1: c1 port map(a,b,q); end; -- VHDL-93 szerinti leírás architecture rtl of top_level is begin U1: entity work.c1(rtl) port map(a,b,q); U1: entity work.c1(rtl) port map(a,b,q); end;
Összetevők a csomagokban I. Ha a csomagokban határozzák meg az összetevőket, akkor az építményben nincs szükség összetevő bejelentésre a beültetésnél Ha a csomagokban határozzák meg az összetevőket, akkor az építményben nincs szükség összetevő bejelentésre a beültetésnél Példa: Példa: package mypack is function minimum (a,b:in std_logic_vector) return std_logic_vector; function minimum (a,b:in std_logic_vector) return std_logic_vector; component c1 port(clk,resetn,din:in std_logic; q1,q2:out std_logic); end component; component c1 port(clk,resetn,din:in std_logic; q1,q2:out std_logic); end component; component c2 port(a,b:in std_logic; q:out std_logic); end component; component c2 port(a,b:in std_logic; q:out std_logic); end component; end mypack; package body mypack is function minimum (a,b:in std_logic_vector) return std_logic_vector is function minimum (a,b:in std_logic_vector) return std_logic_vector is begin begin if a<b then return a; if a<b then return a; else return b; else return b; end if; end if; end minimum; end minimum; end mypack;
Összetevők a csomagokban II. Az összetevő felhasználásához csak a csomagot kell bejelenteni a VHDL-kód elején: Az összetevő felhasználásához csak a csomagot kell bejelenteni a VHDL-kód elején: library ieee; use ieee.std_logic_1164.ALL; use work.mypack.ALL; entity ex is port(clk,resetn:in std_logic; d1,d2:out std_logic; a,b: in std_logic_vector(3 downto 0); port(clk,resetn:in std_logic; d1,d2:out std_logic; a,b: in std_logic_vector(3 downto 0); q1,q2,q3: out std_logic; q4:out std_logic_vector(3 downto 0)); q1,q2,q3: out std_logic; q4:out std_logic_vector(3 downto 0)); end; Architecture rtl of ex is begin U1: c1 port map(clk,resetn,d1,q1,q2); U1: c1 port map(clk,resetn,d1,q1,q2); U2: c2 port map(d1,d2,q3); U2: c2 port map(d1,d2,q3); q4<=minimum(a,b); q4<=minimum(a,b); end;