Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

Tervezési példák és ötletek Összeadók Összeadók Vektor szorzás Vektor szorzás Erőforrás megosztás Erőforrás megosztás Összehasonlítók (comparators) Összehasonlítók.

Hasonló előadás


Az előadások a következő témára: "Tervezési példák és ötletek Összeadók Összeadók Vektor szorzás Vektor szorzás Erőforrás megosztás Erőforrás megosztás Összehasonlítók (comparators) Összehasonlítók."— Előadás másolata:

1 Tervezési példák és ötletek Összeadók Összeadók Vektor szorzás Vektor szorzás Erőforrás megosztás Erőforrás megosztás Összehasonlítók (comparators) Összehasonlítók (comparators) Nyalábolók (multiplexors) és visszakódolók (decoders) Nyalábolók (multiplexors) és visszakódolók (decoders) Regiszterek Regiszterek Élvezérelt impulzuskeltő Élvezérelt impulzuskeltő Számlálók Számlálók

2 Egybites összeadó átvitel bemenettel Az alábbi példában a + művelet eredményének bitszáma a legnagyobb bitszámú argumentumának bitszámával fog megegyezni Az alábbi példában a + művelet eredményének bitszáma a legnagyobb bitszámú argumentumának bitszámával fog megegyezni library ieee; library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; use ieee.std_logic_unsigned.all; entity add1 is port(a,b,cin: in std_logic; cout,sum: out std_logic); end; entity add1 is port(a,b,cin: in std_logic; cout,sum: out std_logic); end; architecture rtl of add1 is architecture rtl of add1 is signal s: std_logic_vector(1 downto 0); signal s: std_logic_vector(1 downto 0); begin begin s<=(‘0’ & a)+b+cin; s<=(‘0’ & a)+b+cin; sum<=s(0); sum<=s(0); cout<=s(1); cout<=s(1); end; end;

3 Nyolcbites összeadó átvitel bemenettel library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity add8 is port(a,b:std_logic_vector(7 downto 0); cin: in std_logic; sum: out std_logic_vector(7 downto 0), cout: out std_logic); end; sum: out std_logic_vector(7 downto 0), cout: out std_logic); end; architecture rtl of add8 is signal s: std_logic_vector(8 downto 0); begin s<=(‘0’ & a)+b+cin; s<=(‘0’ & a)+b+cin; sum<=s(7 downto 0); sum<=s(7 downto 0); cout<=s(8); cout<=s(8); end;

4 Általános összeadó átvitel bemenettel Két általános, N hosszúságú vektort ad össze Két általános, N hosszúságú vektort ad össze Az N értékét beültetésnél határozzák meg Az N értékét beültetésnél határozzák meg library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity g_add is generic (N:positive:=4); generic (N:positive:=4); port(a,b:std_logic_vector(N-1 downto 0); cin: in std_logic; port(a,b:std_logic_vector(N-1 downto 0); cin: in std_logic; sum: out std_logic_vector(N-1 downto 0), cout: out std_logic); sum: out std_logic_vector(N-1 downto 0), cout: out std_logic); end; architecture rtl of add1 is signal s: std_logic_vector(N-1 downto 0); begin s<=(‘0’ & a)+b+cin; sum<=s(N-1 downto 0); cout<=s(N); s<=(‘0’ & a)+b+cin; sum<=s(N-1 downto 0); cout<=s(N); end;

5 Négybites összeadó/kivonó library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity add_sub is port(add_subn:in std_logic; a,b: in std_logic_vector(3 downto 0); port(add_subn:in std_logic; a,b: in std_logic_vector(3 downto 0); q: out std_logic_vector(4 downto 0)); end; q: out std_logic_vector(4 downto 0)); end; architecture rtl of add_sub is begin process(a,b,add_subn) process(a,b,add_subn) begin begin if add_subn=‘1’ then q<=(‘0’ & a)+b; if add_subn=‘1’ then q<=(‘0’ & a)+b; else q<=(‘0’ & a) -b; else q<=(‘0’ & a) -b; end if; end if; end process; end process; end;

6 Vektor szorzás library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity v_mult is port(a,b: in std_logic_vector(3 downto 0); port(a,b: in std_logic_vector(3 downto 0); c: out std_logic_vector(7 downto 0)); c: out std_logic_vector(7 downto 0)); end; architecture rtl of v_mult is begin c<=a*b; c<=a*b; end;

7 Erőforrás megosztás A fejlett szintézis eszközök magas szintű optimalizációt végeznek A fejlett szintézis eszközök magas szintű optimalizációt végeznek Ez többek között azt jelenti, hogy a szintézis eszköz megoszthatja az erőforrásokat, pl. egy összeadót különböző vektor összeadások között Ez többek között azt jelenti, hogy a szintézis eszköz megoszthatja az erőforrásokat, pl. egy összeadót különböző vektor összeadások között Ehhez megfelelőnek kell lenni a VHDL tervnek Ehhez megfelelőnek kell lenni a VHDL tervnek Az erőforrás megosztás feltétele az, hogy a különböző vektorokat soha nem használhatja az összeadó egyszerre. Az erőforrás megosztás feltétele az, hogy a különböző vektorokat soha nem használhatja az összeadó egyszerre. A következő példában két összeadás van ugyanabban a folyamatban, de mivel egy if-then-else utasításban vannak, soha nem hajtandók végre egyidejűleg A következő példában két összeadás van ugyanabban a folyamatban, de mivel egy if-then-else utasításban vannak, soha nem hajtandók végre egyidejűleg Így a szintézis eszköz erőforrás megosztással optimalizálhat Így a szintézis eszköz erőforrás megosztással optimalizálhat

8 Példa lehetséges erőforrás megosztásra library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity share is port(a,b,c,d: in std_logic_vector(4 downto 0); sel: in std_logic; port(a,b,c,d: in std_logic_vector(4 downto 0); sel: in std_logic; q: out std_logic_vector(4 downto 0)); end; q: out std_logic_vector(4 downto 0)); end; architecture rtl of share is begin process(a,b,c,d,sel) process(a,b,c,d,sel) begin begin if sel=‘0’ then q<=a+b; if sel=‘0’ then q<=a+b; else q<=c+d; else q<=c+d; end if; end if; end process; end process; end;

9 Példa arra, ahol összeadó erőforrás megosztása nem lehetséges library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity share is port(a,b,c,d: in std_logic_vector(4 downto 0); port(a,b,c,d: in std_logic_vector(4 downto 0); q1,q2: out std_logic_vector(4 downto 0)); end; q1,q2: out std_logic_vector(4 downto 0)); end; architecture rtl of share is begin q1<=a+b; q2<=c+d; q1<=a+b; q2<=c+d; end; Ebben az esetben a két összeadót használatát nem lehet elkerülni kombinációs hálózat alkalmazásával Ebben az esetben a két összeadót használatát nem lehet elkerülni kombinációs hálózat alkalmazásával

10 Összehasonlítók I. Az összehasonlítók a vektorok méretének összevetésére szolgálnak Az összehasonlítók a vektorok méretének összevetésére szolgálnak Az alábbi összetevő összehasonlít két hárombites vektort és létrehozza a comp kimeneti jelet Az alábbi összetevő összehasonlít két hárombites vektort és létrehozza a comp kimeneti jelet A comp kimeneti jel jelentését meghatározza a sel_f bemeneti jel: A comp kimeneti jel jelentését meghatározza a sel_f bemeneti jel: sel_f comp 00 ‘1’, ha a=b 00 ‘1’, ha a=b 01 ‘1’, ha a<b 01 ‘1’, ha a<b 10 ‘1’, ha a>b 10 ‘1’, ha a>b 11 ‘0’ 11 ‘0’

11 Összehasonlítók II. library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity comp is port(a,b: in std_logic_vector(2 downto 0); sel_f: in std_logic_vector(1 downto 0); q: out boolean); end; sel_f: in std_logic_vector(1 downto 0); q: out boolean); end; architecture rtl of comp is begin process(sel_f,a,b) process(sel_f,a,b) begin begin case sel_f iswhen “00”=>q q<=a=b; when “01”=>q q<=a<b; when “10”=>q b; when others=>q q<=false; end case; end case; end process; end process; end;

12 Kettőből-egy nyaláboló Bár többféle módon le lehet írni egy kettőből-egy nyalábolót, de a when else összeállítás az ajánlott, mivel így egyetlen sorban elfér a VHDL kódban: Bár többféle módon le lehet írni egy kettőből-egy nyalábolót, de a when else összeállítás az ajánlott, mivel így egyetlen sorban elfér a VHDL kódban: library ieee; use ieee.std_logic_1164.all; entity mux2 is port(a,b,sel: in std_logic; q: out std_logic); port(a,b,sel: in std_logic; q: out std_logic); end; architecture rtl of mux2 is begin c<=a when sel=‘0’ else b; c<=a when sel=‘0’ else b; end;

13 Négyből-egy nyaláboló Itt érdemes a when else mellett a case utasítást is használni, mert így áttekinthetőbb VHDL kód kapható (szintézis szempontjából nincs különbség) Itt érdemes a when else mellett a case utasítást is használni, mert így áttekinthetőbb VHDL kód kapható (szintézis szempontjából nincs különbség) library ieee; use ieee.std_logic_1164.all; entity mux4 is port(a: in std_logic_vector(3 downto 0); sel: in std_logic_vector(1 downto 0); q: out std_logic); end; sel: in std_logic_vector(1 downto 0); q: out std_logic); end; architecture rtl of mux4 is begin process(a,sel) process(a,sel) begin begin case sel is when“00” =>q q<=a(3); when“01” =>q q<=a(2); when“10” =>q q<=a(1); when others=>q q<=a(0); end case; end case; end process; end process; end;

14 Háromból-nyolc visszakódoló library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity decoder is port(a,b,c,g1,g2_n: in std_logic; y_n: out std_logic_vector(7 downto 0)); end; y_n: out std_logic_vector(7 downto 0)); end; architecture rtl of decoder is begin process(a,b,c,g1,g2_n) process(a,b,c,g1,g2_n) begin begin y_n ‘1’); y_n ‘1’); if g1=‘1’ and g2_n=‘0’ then if g1=‘1’ and g2_n=‘0’ then y_n(conv_integer(c&b&a))<=‘0’; y_n(conv_integer(c&b&a))<=‘0’; end if; end if; end process; end process; end;

15 Flip-flop regiszter aszinkron törléssel library ieee; use ieee.std_logic_1164.all; entity d_mem is port(clk,resetn,d_in: in std_logic; d_out: out std_logic); end; architecture rtl of d_mem is begin process(clk,resetn) process(clk,resetn) begin begin if resetn=‘0’ then d_out<=‘0’; if resetn=‘0’ then d_out<=‘0’; elsif clk’event and clk=‘1’ then d_out<=d_in; elsif clk’event and clk=‘1’ then d_out<=d_in; end if; end if; end process; end process; end;

16 Flip-flop regiszter szinkron törléssel library ieee; use ieee.std_logic_1164.all; entity d_mem is port(clk,resetn,d_in: in std_logic; d_out: out std_logic); end; architecture rtl of d_mem is begin process(clk) process(clk) begin begin if clk’event and clk=‘1’ then if clk’event and clk=‘1’ then if resetn=‘0’ then d_out<=‘0’; if resetn=‘0’ then d_out<=‘0’; else d_out<=d_in; else d_out<=d_in; end if; end if; end process; end process; end;

17 Flip-flop regiszter aszinkron törléssel és beállítással (reset and set) library ieee; use ieee.std_logic_1164.all; entity d_mem is port(clk,resetn,presetn,d_in: in std_logic; d_out: out std_logic); end; d_out: out std_logic); end; architecture rtl of d_mem is begin process(clk,resetn,presetn) process(clk,resetn,presetn) begin begin if resetn=‘0’ then d_out<=‘0’; if resetn=‘0’ then d_out<=‘0’; elsif presetn=‘0’ then d_out<=‘1’; elsif presetn=‘0’ then d_out<=‘1’; elsif clk’event and clk=‘1’ then d_out<=d_in; elsif clk’event and clk=‘1’ then d_out<=d_in; end if; end if; end process; end process; end;

18 Nyolc bites regiszter engedélyezéssel és aszinkron törléssel library ieee; use ieee.std_logic_1164.all; entity d_mem is port(clk,resetn,en: in std_logic; d_in: in std_logic_vector(7 downto 0); d_in: in std_logic_vector(7 downto 0); d_out: out std_logic_vector(7 downto 0)); end; d_out: out std_logic_vector(7 downto 0)); end; architecture rtl of d_mem is begin process(clk,resetn) process(clk,resetn) begin begin if resetn=‘0’ then d_out ‘0’); if resetn=‘0’ then d_out ‘0’); elsif clk’event and clk=‘1’ then elsif clk’event and clk=‘1’ then if en=‘1’ then d_out<=d_in; if en=‘1’ then d_out<=d_in; end if; end if; end process; end process; end;

19 Élvezérelt impulzuskeltő I. Ennek az összetevőnek a feladata impulzus létrehozása az órajelre, amikor a din bemenetnek emelkedő vagy eső éle van Ennek az összetevőnek a feladata impulzus létrehozása az órajelre, amikor a din bemenetnek emelkedő vagy eső éle van Az emelkedő vagy eső él kiválasztását a pos_negn jel vezérli Az emelkedő vagy eső él kiválasztását a pos_negn jel vezérli entity puls_g is port(din,pos_negn,clk,resetn: in std_logic; port(din,pos_negn,clk,resetn: in std_logic; puls: out std_logic); puls: out std_logic); end;

20 Élvezérelt impulzuskeltő II. architecture rtl of puls_g is begin process(clk,resetn) process(clk,resetn) begin begin if resetn=‘0’ then if resetn=‘0’ then din2<=‘0’; din2<=‘0’; puls<=‘0’; puls<=‘0’; elsif clk’event and clk=‘1’ then elsif clk’event and clk=‘1’ then din2<=din; din2<=din; if din=pos_negn and din2= not pos_negn then if din=pos_negn and din2= not pos_negn then puls<=‘1’; puls<=‘1’; else else puls<=‘0’; puls<=‘0’; end if; end if; end process; end process; end;

21 Hárombites számláló engedélyezéssel és átvitel kimenettel I. Ha az ieee.std_logic_unsigned csomagot használják, elegendő a “+” vagy “-” függvényt használni, amikor egy számláló értéket növelni vagy csökkenteni kell Ha az ieee.std_logic_unsigned csomagot használják, elegendő a “+” vagy “-” függvényt használni, amikor egy számláló értéket növelni vagy csökkenteni kell Ha a számláló vektorként van bejelentve, a számláló önműködően fog váltani, amikor az összes bit elérte az ‘1’-t Ha a számláló vektorként van bejelentve, a számláló önműködően fog váltani, amikor az összes bit elérte az ‘1’-t Ha a számlálónak meg kell állnia egy határnál, akkor szükség van egy korlát ellenőrzésre Ha a számlálónak meg kell állnia egy határnál, akkor szükség van egy korlát ellenőrzésre A következők két építmény közül az elsőben nincs korlát ellenőrzés, a másodikban van A következők két építmény közül az elsőben nincs korlát ellenőrzés, a másodikban van Az áramkör szintézis mind a kettőnél hasonló eredményt ad, mivel az if utasítás, amely ellenőrzi a korlátot, nem ad új feladatkört Az áramkör szintézis mind a kettőnél hasonló eredményt ad, mivel az if utasítás, amely ellenőrzi a korlátot, nem ad új feladatkört Dokumentációs szempontból a másodikat könnyebb olvasni, de több sorból áll Dokumentációs szempontból a másodikat könnyebb olvasni, de több sorból áll Ha a számláló egésznek van bejelentve, mindig kell korlát ellenőrzés, egyébként hiba lép fel, amikor a count=7 és a +1 kerül végrehajtásra Ha a számláló egésznek van bejelentve, mindig kell korlát ellenőrzés, egyébként hiba lép fel, amikor a count=7 és a +1 kerül végrehajtásra

22 Hárombites számláló engedélyezéssel és átvitel kimenettel II. library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity count3 is port(clk,resetn,count_en: in std_logic; port(clk,resetn,count_en: in std_logic; sum: out std_logic_vector(2 downto 0); sum: out std_logic_vector(2 downto 0); cout: out std_logic); cout: out std_logic); end;

23 Hárombites számláló engedélyezéssel és átvitel kimenettel III. architecture rtl of count3 is signal count:std_logic_vector(2 downto 0); begin process(clk,resetn) process(clk,resetn) begin begin if resetn=‘0’ then count ‘0’); if resetn=‘0’ then count ‘0’); elsif clk’event and clk=‘1’ then elsif clk’event and clk=‘1’ then if count_en=‘1’ then if count_en=‘1’ then count<=count+1; count<=count+1; end if; end if; end process; sum<=count; cout<=‘1’ when count=7 and count_en=‘1’ else ‘0’; end;

24 architecture rtl of count3 is signal count:std_logic_vector(2 downto 0); begin process(clk,resetn) process(clk,resetn) begin begin if resetn=‘0’ then count ‘0’); if resetn=‘0’ then count ‘0’); elsif clk’event and clk=‘1’ then elsif clk’event and clk=‘1’ then if count_en=‘1’ then if count_en=‘1’ then if count/=7 then if count/=7 then count<=count+1; count<=count+1; else else count ‘0’); count ‘0’); end if; end if; end process; sum<=count; cout<=‘1’ when count=7 and count_en=‘1’ else ‘0’; end; Hárombites számláló engedélyezéssel és átvitel kimenettel IV.


Letölteni ppt "Tervezési példák és ötletek Összeadók Összeadók Vektor szorzás Vektor szorzás Erőforrás megosztás Erőforrás megosztás Összehasonlítók (comparators) Összehasonlítók."

Hasonló előadás


Google Hirdetések