Gyakran előforduló tervezési hibák és elkerülésük Jelek és változók Jelek és változók Bufferek és belső dummy jelek Bufferek és belső dummy jelek Vektorok deklarációja downto-val vagy to-val Vektorok deklarációja downto-val vagy to-val Nem teljesen meghatározott kombinációs folyamat Nem teljesen meghatározott kombinációs folyamat
Jelek és változók A változókat process-ben vagy alprogramban adatok ideiglenes tárolására használják A változókat process-ben vagy alprogramban adatok ideiglenes tárolására használják Így változót csak a VHDL sorrendi részében leeht deklarálni Így változót csak a VHDL sorrendi részében leeht deklarálni A jel hozzárendelés lehet sorrendi és egyidejű is A jel hozzárendelés lehet sorrendi és egyidejű is A jeleket azonban csak az VHDL kód egyidejű részében lehet deklarálni A jeleket azonban csak az VHDL kód egyidejű részében lehet deklarálni A változók legnagyobb haszna, hogy azonnal felveszik az értéküket, míg a jelek csak egy minimum delta késleltetés múlva A változók legnagyobb haszna, hogy azonnal felveszik az értéküket, míg a jelek csak egy minimum delta késleltetés múlva Tegyük fel, hogy a következő Bool-algebrai függvényt kell leírni VHDL-ben: Tegyük fel, hogy a következő Bool-algebrai függvényt kell leírni VHDL-ben: int<=a and b and c q<=int or d; Ezeket közvetlenül is be lehetírni az építménybe egyidejű jel hozzárendeléssel, ami egy adatfolyam szintű leírás lenne, de a következőkben viselkedési szintű leírás látható Ezeket közvetlenül is be lehetírni az építménybe egyidejű jel hozzárendeléssel, ami egy adatfolyam szintű leírás lenne, de a következőkben viselkedési szintű leírás látható
Példa a jelek és változók használatára I. library ieee; use ieee.std_logic_1164.all; entity ex1 is port(a,b,c,d: in std_logic; q: out std_logic); end; Építmény jelnek deklarált belső jel alkalmazásával: architecture sig of ex1 is signal int:std_logic; begin process(a,b,c,d,int) begin int<=a and b and c; q<=int and d; end process; end; Építmény változónak deklarált belső jel alkalmazásával: architecture var of ex1 is begin process(a,b,c,d) variable int:std_logic; begin int:=a and b and c; q<=int and d; end process; end;
Példa a jelek és változók használatára II. A jelként deklarált belső jel esetén az q<=int and d; jelhozzárendelés végrehajtásakor az int még a régi értékét tartja A jelként deklarált belső jel esetén az q<=int and d; jelhozzárendelés végrehajtásakor az int még a régi értékét tartja Ezért fel kellett venni a folyamat érzékenységi listájába, így egy delta késleltetés után a folyamat újra aktiválódik A példából is látható a változó használatának előnye: A példából is látható a változó használatának előnye: a jel esetében figyelni kell a delta késleltetésre a folyamatnak kétszer kell lefutnia A változó használatának viszont előnye, hogy kapcsolható hozzá késleltetés A változó használatának viszont előnye, hogy kapcsolható hozzá késleltetés A logikai szintézis szempontjából a kétféle módszer nem okoz eltérést a szintézis eredményében A logikai szintézis szempontjából a kétféle módszer nem okoz eltérést a szintézis eredményében Ugyanakkor a logikai szintézisben rejtett hibához vezethet a belső jel használata, mivel a folyamat érzékenységi listáját figyelmen kívül hagyja sok hardver szintézis eszköz Mindezek alapján a legjobb a változók használata egy érték ideiglenes tárolására Mindezek alapján a legjobb a változók használata egy érték ideiglenes tárolására
Bufferek és belső jelek I. Amikor egy kimeneti jel értékét újra kell olvasni, három lehetőség kínálkozik: Amikor egy kimeneti jel értékét újra kell olvasni, három lehetőség kínálkozik: Az egyedmegadásnál egy jelet buffernek deklarálni Belső dummy jel használata az építményben A ‘driving_value új jel-jelzőérték (attribute) alkalmazása Az alábbiakban mind a háromra látható egy-egy példa: Az alábbiakban mind a háromra látható egy-egy példa: library ieee; library ieee; use ieee.std_logic_1164.all; entity ex3a is port(clk,resetn,din1: in std_logic; q1: buffer std_logic; q2: out std_logic); end; port(clk,resetn,din1: in std_logic; q1: buffer std_logic; q2: out std_logic); end; architecture buf of ex3a is begin process(clk,resetn) process(clk,resetn) begin begin if resetn=‘0’ then q1<=‘0’; q2<=‘0’; if resetn=‘0’ then q1<=‘0’; q2<=‘0’; elsif clk’event and clk=‘1’ then q1<=din1; q2<=q1; -- A q1 jel olvasása elsif clk’event and clk=‘1’ then q1<=din1; q2<=q1; -- A q1 jel olvasása end if; end if; end process; end process;end;
Bufferek és belső jelek II. Dummy jel használata Dummy jel használata library ieee; use ieee.std_logic_1164.all; entity ex3b is port(clk,resetn,din1: in std_logic; q1: out std_logic; q2: out std_logic); end; port(clk,resetn,din1: in std_logic; q1: out std_logic; q2: out std_logic); end; architecture buf of ex3b is signal q1_b: std_logic; -- A dummy jel begin q1<=q1_b; q1<=q1_b; process(clk,resetn) process(clk,resetn) begin begin if resetn=‘0’ then q1_b<=‘0’; q2<=‘0’; if resetn=‘0’ then q1_b<=‘0’; q2<=‘0’; elsif clk’event and clk=‘1’ then q1_b<=din1; q2<=q1_b; -- A q1_b jel olvasása elsif clk’event and clk=‘1’ then q1_b<=din1; q2<=q1_b; -- A q1_b jel olvasása end if; end if; end process; end process;end;
Bufferek és belső jelek III. ‘driving_value használata - csak a VHDL-93-ban érvényes ‘driving_value használata - csak a VHDL-93-ban érvényes library ieee; use ieee.std_logic_1164.all; entity ex3c is port(clk,resetn,din1: in std_logic; q1: out std_logic; q2: out std_logic); end; port(clk,resetn,din1: in std_logic; q1: out std_logic; q2: out std_logic); end; architecture buf of ex3c is begin process(clk,resetn) process(clk,resetn) begin begin if resetn=‘0’ then q1<=‘0’; q2<=‘0’; if resetn=‘0’ then q1<=‘0’; q2<=‘0’; elsif clk’event and clk=‘1’ then q1<=din1; q2<=q1’driving_value; elsif clk’event and clk=‘1’ then q1<=din1; q2<=q1’driving_value; end if; end if; end process; end process;end;
Bufferek és belső jelek IV. A három előbbi példa közül az első használata gondot okozhat akkor, ha szerkezeti modellben egy összetevőt be akarnak ültetni A három előbbi példa közül az első használata gondot okozhat akkor, ha szerkezeti modellben egy összetevőt be akarnak ültetni Ilyenkor szükség lenne egy buffer módú kapocs kiosztására egy out módú kapocsra, ami tilos Ilyenkor szükség lenne egy buffer módú kapocs kiosztására egy out módú kapocsra, ami tilos Ez akkor jön létre, ha az összetevő kapcsa buffer módú, s ezt kellene kivezetni az összetevőt tartalmazó egyed out módú kapcsára Ilyenkor nem jó megoldás a magasabb szintű egyed szóban forgó kapcsát is buffer módúnak deklarálni, mert azon a szinten az már tiszta out módban működik A buffer mód helyett az inout használata szintén nem jó megoldás, mivel ebben az esetben mások is tudnak az összetevő inout módú kapcsára írni A buffer mód helyett az inout használata szintén nem jó megoldás, mivel ebben az esetben mások is tudnak az összetevő inout módú kapcsára írni Az inout mód csak kétirányú jeleknál vagy wired-logikánál (wired-or, stb) használandó
Vektorok deklarálása downto- vagy to-val Két módon lehet deklarálni vektrokat VHDL-ben: Két módon lehet deklarálni vektrokat VHDL-ben: signal a:std_logic_vector(0 to 3); signal b:std_logic_vector(3 downto 0); -- Javasolt Az ajánlott módszer az, hogy a vektorokat mindig downto-val érdemes deklarálni Az ajánlott módszer az, hogy a vektorokat mindig downto-val érdemes deklarálni Ennek az az oka, hogy ha a vektorokat downto-val deklarálják, akkor a legfontosabb bit (Most Significant Bit, MSB) mindig a legnagyobb indexű lesz, míg to-val való deklarációnál az MSB lesz a 0 indexű Ennek az az oka, hogy ha a vektorokat downto-val deklarálják, akkor a legfontosabb bit (Most Significant Bit, MSB) mindig a legnagyobb indexű lesz, míg to-val való deklarációnál az MSB lesz a 0 indexű
Nem teljesen meghatározott kombinációs folyamat I. Egy kombinációs folyamatban (nem egy tároló elemben) minden kimeneti jelnek értéket kell adni, azaz nem szabad előfordulnia, hogy egy folyamat lefut úgy, hogy legalább egyszer nem adott értéket minden kimeneti jelnek Egy kombinációs folyamatban (nem egy tároló elemben) minden kimeneti jelnek értéket kell adni, azaz nem szabad előfordulnia, hogy egy folyamat lefut úgy, hogy legalább egyszer nem adott értéket minden kimeneti jelnek A következő példa mutat egy nem teljes folyamatot: A következő példa mutat egy nem teljes folyamatot: architecture ROSSZ is begin process(a,b) process(a,b) begin begin if a>b then a b then a<=‘0’; elsif a<b then a<=‘1’; elsif a<b then a<=‘1’; end if; end if; end process; end process;end; Ezt az építményt szintetizálva, a program egy latch-et fog elhelyezni a kimenetre Ezt az építményt szintetizálva, a program egy latch-et fog elhelyezni a kimenetre
Nem teljesen meghatározott kombinációs folyamat II. Az előző példa helyes leírása a következő: Az előző példa helyes leírása a következő: architecture HELYES is begin process(a,b) process(a,b) begin begin if a>b then a b then a<=‘0’; else a<=‘1’; else a<=‘1’; end if; end if; end process; end process;end; Ezt az építményt szintetizálva, tiszta kombinációs hálózat lesz az eredmény Ezt az építményt szintetizálva, tiszta kombinációs hálózat lesz az eredmény