Návrh FPGA systémů Jazyk VHDL, principy simulace Ing. Jakub Št astný, Ph.D. 1 1 stastnj1@seznam.cz FPGA laboratory under the Biosignal processing laboratory Department of Circuit Theory, FEE CTU Prague Technická 2, Praha 6, 166 27 http://amber.feld.cvut.cz/fpga Cvičení SČS
Varování Pozor! Tato verze přednášky obsahuje materiál třetích stran. Je určena pouze k internímu použití a vystavení na WWW stránkách Laboratoře biologických signálů, Katedry teorie obvodů ČVUT FEL, Praha! http://amber.feld.cvut.cz/fpga/prednasky/bmi/bmi.html
1 Software pro návrh Prerekvizity Co je FPGA? Návrhový software 2 Příklady ve VHDL Kombinační funkce Sekvenční funkce Triviální DSP bloky 3 Pro ty, co chtějí vědět víc... Více o syntéze
Co už máte umět Booleovská algebra minimalizace logické funkce (Karnaugh, Quine-McCluskey) realizace logické funkce (hradla, úplná množina log. funkcí, Rottova mřížka) časové parametry log. prvků 1 zpoždění na hradlech 2 předstih (setup) DFF 3 přesah (hold) DFF 4 zotavení po resetu (reset recovery) DFF 5 min. perioda hodin minimální požadavky pro zaměstnání
Základní studijní literatura Dostupné na WWW stránkách: perfektní bakalářká práce Milana Křemečka Implementace základních funkcí na FPGA viz WWW stránky J. Št astný, Použití jazyka VHDL pro návrh číslicových obvodů. Automatizace, vol. 52, no. 7-8, pp. 440-445, 2008. J. Št astný, Návrh obvodů založených na programovatelných hradlových polích. Automatizace, vol. 52, no. 5, pp. 317-321, 2008. J. Št astný, Programovatelná hradlová pole (Field Programmable Gate Arrays). Automatizace, vol. 52, no. 1, pp. 9-13, 2008. J. Št astný, Návrh specifických struktur na programovatelných hradlových polích. Automatizace, vol. 52, no. 11, pp. 688-696, 2008. J. Št astný, Návrh aritmetických operátorů na FPGA.
Software pro návrh FPGA obvodů
Co je FPGA?
Co je FPGA? SET_n X G1 G2 G3 G4 LUT4 D S Q XQ R CLK Y F1 F2 F3 F4 LUT4 D S Q YQ R RES_n
Design flow vodopád nástrojů Specifikace system (systemova) algorithmic (algoritmicka) systémový návrh volba FPGA hotové RTL constraints netlist constraints konfigurace FPGA Návrh systému Kódování návrhu (Design Capture) Syntéza Rozmístení+propojení (Place & Route) RTL simulace Gate level simulace Statická casová analýza Urovne abstrakce RTL (register transfer level) gate level (hradlova) physical, transistor (fyzicka, tranzistorova)
Návrh systému invertor 1 LIBRARY IEEE; 2 USE IEEE.std_logic_1164.ALL; 3 4 ENTITY invertor IS 5 PORT ( 6 x : IN std_logic; 7 y : OUT std_logic 8 ); 9 END ENTITY invertor; 10 11 ARCHITECTURE rtl OF invertor IS 12 BEGIN 13 y<=not(x); 14 END ARCHITECTURE rtl; Specielní jazyky, VHDL 1 VHSIC Hardware Description Language 2 Very High Speed Integrated Circuit 3 std. IEEE 1076 4 ADA 5 striktní typová kontrola 6 simulace, podmnožina pro syntézu 7 Američani...
Návrhový software v FPGA laboratoři dig. simulátor Mentor Graphics, ModelSim PE (doma ModelSim XE Free, omezení) syntéza,pnr Xilinx Foundation (doma ISE WebPACK) odkud http://www.xilinx.com, odkaz ISE WebPACK další... FPGA Advantage 7.2, LS, PS
VHDL v příkladech
Kombinační logika
Invertor 1 LIBRARY IEEE; 2 USE IEEE.std_logic_1164.ALL; 3 4 ENTITY invertor IS 5 PORT ( 6 x : IN std_logic; 7 y : OUT std_logic 8 ); 9 END ENTITY invertor; 10 11 ARCHITECTURE rtl OF invertor IS 12 BEGIN 13 y<=not(x); 14 END ARCHITECTURE rtl; std_logic_1164 1 std_logic 2 std_logic_vector 3 9-ti stavová logika 4 aproximace reálného analogového světa 5 10XHLUZW-
Invertor 1 LIBRARY IEEE; 2 USE IEEE.std_logic_1164.ALL; 3 4 ENTITY invertor IS 5 PORT ( 6 x : IN std_logic; 7 y : OUT std_logic 8 ); 9 END ENTITY invertor; 10 11 ARCHITECTURE rtl OF invertor IS 12 BEGIN 13 y<=not(x); 14 END ARCHITECTURE rtl; Rozhraní bloku x INVERTOR y
Invertor 1 LIBRARY IEEE; 2 USE IEEE.std_logic_1164.ALL; 3 4 ENTITY invertor IS 5 PORT ( 6 x : IN std_logic; 7 y : OUT std_logic 8 ); 9 END ENTITY invertor; 10 11 ARCHITECTURE rtl OF invertor IS 12 BEGIN 13 y<=not(x); 14 END ARCHITECTURE rtl; Implementace bloku x INVERTOR y
AND konfigurace bloků 1 LIBRARY IEEE; 2 USE IEEE.std_logic_1164.ALL; 3 ENTITY and_gate IS 4 GENERIC ( 5 n : natural := 3 6 ); 7 PORT ( 8 x : IN std_logic_vector(n 1 DOWNTO 0); 9 y : OUT std_logic 10 ); 11 END ENTITY and_gate; 12 ARCHITECTURE rtl OF and_gate IS 13 BEGIN 14 gate_output : PROCESS (x) 15 VARIABLE cnt : natural; 16 BEGIN 17 y <= 1 ; 18 FOR cnt IN 0 TO n 1 LOOP 19 IF x(cnt)/= 1 THEN 20 y <= 0 ; 21 END IF; 22 END LOOP; 23 END PROCESS gate_output; 24 END ARCHITECTURE rtl; Rozhraní bloku n x(0) AND x(1) x(n 1) y
AND konfigurace bloků 1 LIBRARY IEEE; 2 USE IEEE.std_logic_1164.ALL; 3 ENTITY and_gate IS 4 GENERIC ( 5 n : natural := 3 6 ); 7 PORT ( 8 x : IN std_logic_vector(n 1 DOWNTO 0); 9 y : OUT std_logic 10 ); 11 END ENTITY and_gate; 12 ARCHITECTURE rtl OF and_gate IS 13 BEGIN 14 gate_output : PROCESS (x) 15 VARIABLE cnt : natural; 16 BEGIN 17 y <= 1 ; 18 FOR cnt IN 0 TO n 1 LOOP 19 IF x(cnt)/= 1 THEN 20 y <= 0 ; 21 END IF; 22 END LOOP; 23 END PROCESS gate_output; 24 END ARCHITECTURE rtl; Implementace bloku n x(0) AND x(1) x(n 1) y
AND konfigurace bloků 1 LIBRARY IEEE; 2 USE IEEE.std_logic_1164.ALL; 3 ENTITY and_gate IS 4 GENERIC ( 5 n : natural := 3 6 ); 7 PORT ( 8 x : IN std_logic_vector(n 1 DOWNTO 0); 9 y : OUT std_logic 10 ); 11 END ENTITY and_gate; 12 ARCHITECTURE rtl OF and_gate IS 13 BEGIN 14 gate_output : PROCESS (x) 15 VARIABLE cnt : natural; 16 BEGIN 17 y <= 1 ; 18 FOR cnt IN 0 TO n 1 LOOP 19 IF x(cnt)/= 1 THEN 20 y <= 0 ; 21 END IF; 22 END LOOP; 23 END PROCESS gate_output; 24 END ARCHITECTURE rtl; Sekvenční prostředí 1 sekvenční výpočet 2 delta-čas 3 nekonečně rychlé vykonání
Chování procesu kauzalita a nekonečná rychlost VHDL kód 1 log: PROCESS (a,b,c) 2 BEGIN 3 d <= a AND b; 4 y <= d OR c; 5 END PROCESS log; b a c g5 d andor1d1
Chování procesu kauzalita a nekonečná rychlost VHDL kód 1 log: PROCESS (a t,b t,c t ) 2 BEGIN 3 d t+1 <= a t AND b t ; 4 y t+1 <= d t OR c t ; 5 END PROCESS log; b a c g5 d andor1d1
Chování procesu kauzalita a nekonečná rychlost VHDL kód 1 log: PROCESS (a t,b t,c t,d t ) 2 BEGIN 3 d t+1 <= a t AND b t ; 4 y t+1 <= d t OR c t ; 5 END PROCESS log; b a c g5 d andor1d1
NOR instance bloků 1 2 LIBRARY IEEE; USE IEEE.std_logic_1164.ALL; 3 4 ENTITY nor_gate IS 5 PORT ( 6 a : IN std_logic; 7 b : IN std_logic; 8 y : OUT std_logic 9 ); 10 11 END ENTITY nor_gate; 12 13 ARCHITECTURE rtl OF nor_gate IS 14 SIGNAL or_result : std_logic; 15 16 17 COMPONENT invertor IS PORT ( 18 x : IN std_logic; 19 y : OUT std_logic 20 ); 21 END COMPONENT invertor; 22 23 BEGIN 24 or_result <= a OR b; 25 26 inv_i : invertor 27 PORT MAP ( 28 29 x => or_result, y => y 30 ); 31 32 END ARCHITECTURE rtl; Rozhraní bloku nor_gate a b or_result INVERTOR x y y
NOR instance bloků 1 2 LIBRARY IEEE; USE IEEE.std_logic_1164.ALL; 3 4 ENTITY nor_gate IS 5 PORT ( 6 a : IN std_logic; 7 b : IN std_logic; 8 y : OUT std_logic 9 ); 10 11 END ENTITY nor_gate; 12 13 ARCHITECTURE rtl OF nor_gate IS 14 SIGNAL or_result : std_logic; 15 16 17 COMPONENT invertor IS PORT ( 18 x : IN std_logic; 19 y : OUT std_logic 20 ); 21 END COMPONENT invertor; 22 23 BEGIN 24 or_result <= a OR b; 25 26 inv_i : invertor 27 PORT MAP ( 28 29 x => or_result, y => y 30 ); 31 32 END ARCHITECTURE rtl; Komponenty nor_gate a b or_result INVERTOR x y y
NOR instance bloků 1 2 LIBRARY IEEE; USE IEEE.std_logic_1164.ALL; 3 4 ENTITY nor_gate IS 5 PORT ( 6 a : IN std_logic; 7 b : IN std_logic; 8 y : OUT std_logic 9 ); 10 11 END ENTITY nor_gate; 12 13 ARCHITECTURE rtl OF nor_gate IS 14 SIGNAL or_result : std_logic; 15 16 17 COMPONENT invertor IS PORT ( 18 x : IN std_logic; 19 y : OUT std_logic 20 ); 21 END COMPONENT invertor; 22 23 BEGIN 24 or_result <= a OR b; 25 26 inv_i : invertor 27 PORT MAP ( 28 29 x => or_result, y => y 30 ); 31 32 END ARCHITECTURE rtl; Implementace bloku nor_gate a INVERTOR b or_result x y y
NOR instance bloků 1 2 LIBRARY IEEE; USE IEEE.std_logic_1164.ALL; 3 4 ENTITY nor_gate IS 5 PORT ( 6 a : IN std_logic; 7 b : IN std_logic; 8 y : OUT std_logic 9 ); 10 11 END ENTITY nor_gate; 12 13 ARCHITECTURE rtl OF nor_gate IS 14 SIGNAL or_result : std_logic; 15 16 17 COMPONENT invertor IS PORT ( 18 x : IN std_logic; 19 y : OUT std_logic 20 ); 21 END COMPONENT invertor; 22 23 BEGIN 24 or_result <= a OR b; 25 26 inv_i : invertor 27 PORT MAP ( 28 29 x => or_result, y => y 30 ); 31 32 END ARCHITECTURE rtl; Paralelní prostředí a b simulace HW paralelismus! event-driven sim. nor_gate INVERTOR or_result x y y
Sekvenční logika
Jednoduchý registr 1 2 LIBRARY IEEE; USE IEEE.std_logic_1164.ALL; 3 4 ENTITY flipflop IS 5 PORT ( 6 clk : IN std_logic; 7 res : IN std_logic; 8 9 x : IN std_logic; 10 we : IN std_logic; 11 12 y : OUT std_logic 13 ); 14 END ENTITY; 15 16 ARCHITECTURE rtl OF flipflop IS 17 BEGIN 18 19 ff_process : PROCESS (clk, res) 20 reacts just to the clk/res changes 21 BEGIN 22 23 IF res= 1 THEN 24 y <= 0 ; reset 25 26 ELSIF clk= 1 AND clk EVENT THEN active edge 27 28 IF we= 1 THEN y <= x; write enable 29 END IF; 30 END IF; 31 32 END PROCESS ff_process; 33 34 END ARCHITECTURE rtl; Rozhraní bloku res 0 D Q 1 x clk we y
Jednoduchý registr 1 2 LIBRARY IEEE; USE IEEE.std_logic_1164.ALL; 3 4 ENTITY flipflop IS 5 PORT ( 6 clk : IN std_logic; 7 res : IN std_logic; 8 9 x : IN std_logic; 10 we : IN std_logic; 11 12 y : OUT std_logic 13 ); 14 END ENTITY; 15 16 ARCHITECTURE rtl OF flipflop IS 17 BEGIN 18 19 ff_process : PROCESS (clk, res) 20 reacts just to the clk/res changes 21 BEGIN 22 23 IF res= 1 THEN 24 y <= 0 ; reset 25 26 ELSIF clk= 1 AND clk EVENT THEN active edge 27 28 IF we= 1 THEN y <= x; write enable 29 END IF; 30 END IF; 31 32 END PROCESS ff_process; 33 34 END ARCHITECTURE rtl; Write enable res 0 D Q 1 x clk we NE! hradlování hodin y
1 LIBRARY IEEE; 2 USE IEEE.STD_LOGIC_1164.ALL; 3 USE IEEE.STD_LOGIC_UNSIGNED.ALL; 4 5 ENTITY cnt IS 6 PORT ( 7 clk : IN std_logic; 8 res : IN std_logic; 9 outp : OUT std_logic_vector(3 downto 0) 10 ); 11 END CNT; 12 13 ARCHITECTURE rtl OF cnt IS 14 SIGNAL cnt_in : std_logic_vector (3 DOWNTO 0); 15 SIGNAL cnt_out : std_logic_vector (3 DOWNTO 0); 16 BEGIN 17 18 cnt: PROCESS (clk, res) 19 BEGIN 20 IF res= 1 THEN 21 cnt_out <= "0000"; 22 ELSIF clk EVENT AND clk= 1 THEN 23 cnt_out <= cnt_in; 24 END IF; 25 END PROCESS cnt; 26 27 cnt_in <= cnt_out+1 WHEN cnt_out /= "1100" ELSE 28 (OTHERS => 0 ); 29 30 not possible to read output inside! 31 outp <= cnt_out; 32 33 END ARCHITECTURE rtl; Čítač
Aritmetika ve VHDL 27 cnt_in <= cnt_out+1 WHEN cnt_out /= "1100" ELSE 28 (OTHERS => 0 ); std_logic_unsigned detaily: MXE_prog_dir\vhdlsrc\synopsys\ mti_std_logic_unsigned.vhd +,-,ABS,<,>,<=,>=,=,/=,shl,shr,* std_logic_vector = std_logic_vector op std_logic_vector std_logic_vector = std_logic_vector op integer když potřebujete jen unsigned operátory
Aritmetika ve VHDL 2 27 cnt_in <= cnt_out+1 WHEN cnt_out /= "1100" ELSE 28 (OTHERS => 0 ); std_logic_unsigned function "+"(L: STD_LOGIC_VECTOR; R: STD_LOGIC_VECTOR) r eturn STD_LOGIC_VECTOR is - - pragma label_applies_to plus constant length: INTEGER := maximum(l length, R length); variable result : STD_LOGIC_VECTOR (length-1 downto 0); begin result := UNSIGNED(L) + UNSIGNED(R);- pragma label plus return std_logic_vector(result); end;
Aritmetika ve VHDL 3 27 cnt_in <= cnt_out+1 WHEN cnt_out /= "1100" ELSE 28 (OTHERS => 0 ); std_logic_signed detaily: MXE_prog_dir\vhdlsrc\synopsys\ mti_std_logic_signed.vhd +,-,ABS,<,>,<=,>=,=,/=,shl,shr,* std_logic_vector = std_logic_vector op std_logic_vector std_logic_vector = std_logic_vector op integer když potřebujete jen signed operátory
Aritmetika ve VHDL 4 27 cnt_in <= cnt_out+1 WHEN cnt_out /= "1100" ELSE 28 (OTHERS => 0 ); std_logic_signed function "+"(L: STD_LOGIC_VECTOR; R: STD_LOGIC_VECTOR) r eturn STD_LOGIC_VECTOR is - - pragma label_applies_to plus constant length: INTEGER := maximum(l length, R length); variable result : STD_LOGIC_VECTOR (length-1 downto 0); begin result := SIGNED(L) + SIGNED(R); - pragma label plus return std_logic_vector(result); end;
Aritmetika ve VHDL 5 27 cnt_in <= cnt_out+1 WHEN cnt_out /= "1100" ELSE 28 (OTHERS => 0 ); std_logic_arith detaily: MXE_prog_dir\vhdlsrc\synopsys\ mti_std_logic_arith.vhd využíváno signed i unsigned knihovnou +,-,ABS,<,>,<=,>=,=,/=,shl,shr,* konverze std_logic číslo datové typy signed, unsigned unsigned/signed = unsigned/signed op unsigned/signed unsigned/signed = unsigned/signed op integer když potřebujete signed i unsigned operátory
Aritmetika ve VHDL 6 konverze uns. std_logic_vector číslo num := conv_integer(unsigned(sig)); sig. std_logic_vector číslo num := conv_integer(signed(sig)); std_logic_vector uns. číslo sig := std_logic_vector(conv_unsigned(num,n)); std_logic_vector sig. číslo sig := std_logic_vector(conv_signed(num,n));
Široký multiplexer užití konverzí 1 LIBRARY IEEE; 2 USE IEEE.std_logic_1164.ALL; 3 USE IEEE.std_logic_arith.ALL; 4 5 ENTITY mux IS 6 PORT ( 7 in_data : IN std_logic_vector (255 DOWNTO 0); 8 sel_dat : IN std_logic_vector (7 DOWNTO 0); 9 out_dat : OUT std_logic 10 ); 11 END ENTITY mux; 12 13 ARCHITECTURE rtl OF mux IS 14 BEGIN 15 out_dat <= in_data(conv_integer(unsigned(sel_dat))); 16 END ARCHITECTURE rtl;
1 LIBRARY IEEE; 2 USE IEEE.std_logic_1164.ALL; 3 4 ENTITY automat IS 5 PORT ( 6 clk : IN std_logic; 7 res : IN std_logic; 8 9 sc : OUT std_logic; 10 rdy : IN std_logic; 11 12 we1 : OUT std_logic; 13 we2 : OUT std_logic 14 ); 15 END ENTITY automat; 16 17 ARCHITECTURE rtl OF automat IS 18 19 TYPE t_state IS (gen_sc, rdy_wait, we1_gen, we2_gen); 20 SIGNAL current_s : t_state; 21 SIGNAL next_s : t_state; 22 23 SIGNAL rdy_sc1 : std_logic; 24 SIGNAL rdy_sc2 : std_logic; 25 26 BEGIN FSM
next state next_state_gen : PROCESS (current_s, rdy_sc2) BEGIN CASE current_s IS WHEN gen_sc => next_s <= rdy_wait; WHEN rdy_wait => IF rdy_sc2= 1 THEN next_s <= we1_gen; ELSE next_s <= rdy_wait; END IF; WHEN we1_gen => next_s <= we2_gen; WHEN we2_gen => next_s <= gen_sc; WHEN OTHERS => next_s <= gen_sc; END CASE; END PROCESS next_state_gen; FSM
1 output signals 2 outputs : PROCESS (current_s) 3 BEGIN 4 CASE current_s IS 5 WHEN gen_sc => 6 we1 <= 0 ; 7 we2 <= 0 ; 8 sc <= 1 ; 9 WHEN rdy_wait => 10 we1 <= 0 ; 11 we2 <= 0 ; 12 sc <= 0 ; 13 WHEN we1_gen => 14 we1 <= 1 ; 15 we2 <= 0 ; 16 sc <= 0 ; 17 WHEN we2_gen => 18 we1 <= 0 ; 19 we2 <= 1 ; 20 sc <= 0 ; 21 WHEN OTHERS => 22 we1 <= 0 ; 23 we2 <= 0 ; 24 sc <= 0 ; 25 END CASE; 26 END PROCESS outputs; 27 28 END ARCHITECTURE rtl; FSM
Triviální DSP
Akumulátor 1 LIBRARY IEEE; 2 USE IEEE.std_logic_1164.ALL; 3 USE IEEE.std_logic_signed.ALL; 4 5 ENTITY acc IS 6 GENERIC ( 7 n : natural := 4; 8 a : natural := 2 9 ); 10 PORT ( 11 clk : IN std_logic; 12 res : IN std_logic; 13 14 ctrl : IN std_logic; 15 16 x : IN std_logic_vector (n-1 DOWNTO 0); 17 y : OUT std_logic_vector (n+a-1 DOWNTO 0) 18 ); 19 END ENTITY acc; 20 21 ARCHITECTURE rtl OF acc IS 22 SIGNAL in_ext : std_logic_vector (n+a-1 DOWNTO 0); 23 SIGNAL feedback : std_logic_vector (n+a-1 DOWNTO 0); 24 SIGNAL added : std_logic_vector (n+a-1 DOWNTO 0); 25 BEGIN 26 27 - - sign extension 28 in_ext(n-1 DOWNTO 0) <= x; 29 in_ext(n+a-1 DOWNTO n) <=(OTHERS => x(n-1)); 30 31 - -sumation (signed) 32 added <= in_ext + feedback; 33 34 accumulator : PROCESS (res, clk) 35 BEGIN 36 IF res= 1 THEN 37 feedback <= (OTHERS => 0 ); 38 ELSIF clk= 1 AND clk EVENT THEN 39 IF ctrl= 1 THEN 40 feedback <= added; 41 END IF; 42 END IF; 43 END PROCESS accumulator; 44 45 y <= feedback; 46 47 END rtl; Trocha DSP n-bitů vstupu a-bitů pro saturaci 2 s cpl: 2 MSB fraction formát < 1;+1 2 n+1 > součet 2 a čísel OK detailní rozbor: zpráva #Z05-2 WWW laboratoře, stránka Publikace
Akumulátor 1 LIBRARY IEEE; 2 USE IEEE.std_logic_1164.ALL; 3 USE IEEE.std_logic_signed.ALL; 4 5 ENTITY acc IS 6 GENERIC ( 7 n : natural := 4; 8 a : natural := 2 9 ); 10 PORT ( 11 clk : IN std_logic; 12 res : IN std_logic; 13 14 ctrl : IN std_logic; 15 16 x : IN std_logic_vector (n-1 DOWNTO 0); 17 y : OUT std_logic_vector (n+a-1 DOWNTO 0) 18 ); 19 END ENTITY acc; 20 21 ARCHITECTURE rtl OF acc IS 22 SIGNAL in_ext : std_logic_vector (n+a-1 DOWNTO 0); 23 SIGNAL feedback : std_logic_vector (n+a-1 DOWNTO 0); 24 SIGNAL added : std_logic_vector (n+a-1 DOWNTO 0); 25 BEGIN 26 27 - - sign extension 28 in_ext(n-1 DOWNTO 0) <= x; 29 in_ext(n+a-1 DOWNTO n) <=(OTHERS => x(n-1)); 30 31 - -sumation (signed) 32 added <= in_ext + feedback; 33 34 accumulator : PROCESS (res, clk) 35 BEGIN 36 IF res= 1 THEN 37 feedback <= (OTHERS => 0 ); 38 ELSIF clk= 1 AND clk EVENT THEN 39 IF ctrl= 1 THEN 40 feedback <= added; 41 END IF; 42 END IF; 43 END PROCESS accumulator; 44 45 y <= feedback; 46 47 END rtl; Akumlátor y(5:0) ctrl x(3:0) S clk res Q D CE R cin cout a(5:0) d(5:0) + b(5:0)
Akumulátor 1 LIBRARY IEEE; 2 USE IEEE.std_logic_1164.ALL; 3 USE IEEE.std_logic_signed.ALL; 4 5 ENTITY acc IS 6 GENERIC ( 7 n : natural := 4; 8 a : natural := 2 9 ); 10 PORT ( 11 clk : IN std_logic; 12 res : IN std_logic; 13 14 ctrl : IN std_logic; 15 16 x : IN std_logic_vector (n-1 DOWNTO 0); 17 y : OUT std_logic_vector (n+a-1 DOWNTO 0) 18 ); 19 END ENTITY acc; 20 21 ARCHITECTURE rtl OF acc IS 22 SIGNAL in_ext : std_logic_vector (n+a-1 DOWNTO 0); 23 SIGNAL feedback : std_logic_vector (n+a-1 DOWNTO 0); 24 SIGNAL added : std_logic_vector (n+a-1 DOWNTO 0); 25 BEGIN 26 27 - - sign extension 28 in_ext(n-1 DOWNTO 0) <= x; 29 in_ext(n+a-1 DOWNTO n) <=(OTHERS => x(n-1)); 30 31 - -sumation (signed) 32 added <= in_ext + feedback; 33 34 accumulator : PROCESS (res, clk) 35 BEGIN 36 IF res= 1 THEN 37 feedback <= (OTHERS => 0 ); 38 ELSIF clk= 1 AND clk EVENT THEN 39 IF ctrl= 1 THEN 40 feedback <= added; 41 END IF; 42 END IF; 43 END PROCESS accumulator; 44 45 y <= feedback; 46 47 END rtl; Akumlátor y(5:0) ctrl x(3:0) S clk res Q D CE R cin cout a(5:0) d(5:0) + b(5:0)
Akumulátor 1 LIBRARY IEEE; 2 USE IEEE.std_logic_1164.ALL; 3 USE IEEE.std_logic_signed.ALL; 4 5 ENTITY acc IS 6 GENERIC ( 7 n : natural := 4; 8 a : natural := 2 9 ); 10 PORT ( 11 clk : IN std_logic; 12 res : IN std_logic; 13 14 ctrl : IN std_logic; 15 16 x : IN std_logic_vector (n-1 DOWNTO 0); 17 y : OUT std_logic_vector (n+a-1 DOWNTO 0) 18 ); 19 END ENTITY acc; 20 21 ARCHITECTURE rtl OF acc IS 22 SIGNAL in_ext : std_logic_vector (n+a-1 DOWNTO 0); 23 SIGNAL feedback : std_logic_vector (n+a-1 DOWNTO 0); 24 SIGNAL added : std_logic_vector (n+a-1 DOWNTO 0); 25 BEGIN 26 27 - - sign extension 28 in_ext(n-1 DOWNTO 0) <= x; 29 in_ext(n+a-1 DOWNTO n) <=(OTHERS => x(n-1)); 30 31 - -sumation (signed) 32 added <= in_ext + feedback; 33 34 accumulator : PROCESS (res, clk) 35 BEGIN 36 IF res= 1 THEN 37 feedback <= (OTHERS => 0 ); 38 ELSIF clk= 1 AND clk EVENT THEN 39 IF ctrl= 1 THEN 40 feedback <= added; 41 END IF; 42 END IF; 43 END PROCESS accumulator; 44 45 y <= feedback; 46 47 END rtl; Akumlátor y(5:0) ctrl x(3:0) S clk res Q D CE R cin cout a(5:0) d(5:0) + b(5:0)
FIR8 1 LIBRARY IEEE; 2 USE IEEE.std_logic_1164.ALL; 3 USE IEEE.std_logic_signed.ALL; 4 5 ENTITY fir_8 IS 6 PORT ( 7 clk : IN std_logic; 8 res_n : IN std_logic; 9 x : IN std_logic_vector (31 DOWNTO 0); 0 y : OUT std_logic_vector (31 DOWNTO 0) 1 ); 2 END ENTITY fir_8; 3 4 ARCHITECTURE rtl OF fir_8 IS 5 TYPE t_vzorky IS ARRAY(7 DOWNTO 1) OF std_logic_vector (31 DOWNTO 0); 6 7 SIGNAL vzorky : t_vzorky; 8 SIGNAL add_01 : std_logic_vector (31 DOWNTO 0); 9 SIGNAL add_23 : std_logic_vector (31 DOWNTO 0); 0 SIGNAL add_45 : std_logic_vector (31 DOWNTO 0); 1 SIGNAL add_67 : std_logic_vector (31 DOWNTO 0); 2 SIGNAL add_0123 : std_logic_vector (31 DOWNTO 0); 3 SIGNAL add_4567 : std_logic_vector (31 DOWNTO 0); 4 SIGNAL add_all : std_logic_vector (31 DOWNTO 0); 5 BEGIN 6 7 pameti : PROCESS (clk, res_n) 8 VARIABLE citac : NATURAL; 9 BEGIN 0 globalni asynchronni reset 1 IF res_n= 0 THEN 2 FOR citac IN 7 DOWNTO 1 LOOP 3 vzorky(citac) <= (OTHERS => 0 ); 4 END LOOP; 5 ELSIF clk= 1 AND clk EVENT THEN 6 posuv vzorku 7 vzorky(1) <= x; 8 FOR citac IN 7 DOWNTO 2 LOOP 9 vzorky(citac) <= vzorky(citac 1); 0 END LOOP; 1 END IF; 2 END PROCESS pameti; Klouzavé průměry y[n] <= x[n 7]+x[n 6]+...+x[n] 8
1 LIBRARY IEEE; 2 USE IEEE.std_logic_1164.ALL; 3 USE IEEE.std_logic_signed.ALL; 4 5 ENTITY fir_8 IS 6 PORT ( 7 clk : IN std_logic; 8 res_n : IN std_logic; 9 x : IN std_logic_vector (31 DOWNTO 0); 0 y : OUT std_logic_vector (31 DOWNTO 0) 1 ); 2 END ENTITY fir_8; 3 4 ARCHITECTURE rtl OF fir_8 IS 5 TYPE t_vzorky IS ARRAY(7 DOWNTO 1) OF std_logic_vector (31 DOWNTO 0); 6 7 SIGNAL vzorky : t_vzorky; 8 SIGNAL add_01 : std_logic_vector (31 DOWNTO 0); 9 SIGNAL add_23 : std_logic_vector (31 DOWNTO 0); 0 SIGNAL add_45 : std_logic_vector (31 DOWNTO 0); 1 SIGNAL add_67 : std_logic_vector (31 DOWNTO 0); 2 SIGNAL add_0123 : std_logic_vector (31 DOWNTO 0); 3 SIGNAL add_4567 : std_logic_vector (31 DOWNTO 0); 4 SIGNAL add_all : std_logic_vector (31 DOWNTO 0); 5 BEGIN 6 7 pameti : PROCESS (clk, res_n) 8 VARIABLE citac : NATURAL; 9 BEGIN 0 globalni asynchronni reset 1 IF res_n= 0 THEN 2 FOR citac IN 7 DOWNTO 1 LOOP 3 vzorky(citac) <= (OTHERS => 0 ); 4 END LOOP; 5 ELSIF clk= 1 AND clk EVENT THEN 6 posuv vzorku 7 vzorky(1) <= x; 8 FOR citac IN 7 DOWNTO 2 LOOP 9 vzorky(citac) <= vzorky(citac 1); 0 END LOOP; 1 END IF; 2 END PROCESS pameti; FIR8
1 scitacky 2 add_01 <= x + vzorky(1); 3 add_23 <= vzorky(2) + vzorky(3); 4 add_45 <= vzorky(4) + vzorky(5); 5 add_67 <= vzorky(6) + vzorky(7); 6 add_0123 <= add_01 + add_23; 7 add_4567 <= add_45 + add_67; 8 add_all <= add_0123 + add_4567; 9 10 vystupni_registr : PROCESS (clk, res_n) 11 12 BEGIN globalni asynchronni reset 13 14 IF res_n= 0 THEN y <= (OTHERS => 0 ); 15 16 ELSIF clk= 1 AND clk EVENT THEN zapis vzorku 17 y <= add_all; 18 19 END IF; END PROCESS vystupni_registr; 20 21 END ARCHITECTURE rtl; FIR8
1 LIBRARY IEEE; 2 USE IEEE.std_logic_1164.ALL; 3 USE IEEE.std_logic_signed.ALL; 4 5 ENTITY fir_8 IS 6 PORT ( 7 clk : IN std_logic; 8 res_n : IN std_logic; 9 x : IN std_logic_vector (31 DOWNTO 0); 0 y : OUT std_logic_vector (31 DOWNTO 0) 1 ); 2 END ENTITY fir_8; 3 4 ARCHITECTURE rtl OF fir_8 IS 5 TYPE t_vzorky IS ARRAY(7 DOWNTO 1) OF std_logic_vector (31 DOWNTO 0); 6 7 SIGNAL vzorky : t_vzorky; 8 SIGNAL add_01 : std_logic_vector (31 DOWNTO 0); 9 SIGNAL add_23 : std_logic_vector (31 DOWNTO 0); 0 SIGNAL add_45 : std_logic_vector (31 DOWNTO 0); 1 SIGNAL add_67 : std_logic_vector (31 DOWNTO 0); 2 SIGNAL add_0123 : std_logic_vector (31 DOWNTO 0); 3 SIGNAL add_4567 : std_logic_vector (31 DOWNTO 0); 4 SIGNAL add_all : std_logic_vector (31 DOWNTO 0); 5 BEGIN 6 7 pameti : PROCESS (clk, res_n) 8 VARIABLE citac : NATURAL; 9 BEGIN 0 globalni asynchronni reset 1 IF res_n= 0 THEN 2 FOR citac IN 7 DOWNTO 1 LOOP 3 vzorky(citac) <= (OTHERS => 0 ); 4 END LOOP; 5 ELSIF clk= 1 AND clk EVENT THEN 6 posuv vzorku 7 vzorky(1) <= x; 8 FOR citac IN 7 DOWNTO 2 LOOP 9 vzorky(citac) <= vzorky(citac 1); 0 END LOOP; 1 END IF; 2 END PROCESS pameti; FIR8 něco není v pořádku!
FIR8 1 LIBRARY IEEE; 2 USE IEEE.std_logic_1164.ALL; 3 USE IEEE.std_logic_signed.ALL; 4 5 ENTITY fir_8 IS 6 PORT ( 7 clk : IN std_logic; 8 res_n : IN std_logic; 9 x : IN std_logic_vector (31 DOWNTO 0); 0 y : OUT std_logic_vector (31 DOWNTO 0) 1 ); 2 END ENTITY fir_8; 3 4 ARCHITECTURE rtl OF fir_8 IS 5 TYPE t_vzorky IS ARRAY(7 DOWNTO 1) OF std_logic_vector (31 DOWNTO 0); 6 7 SIGNAL vzorky : t_vzorky; 8 SIGNAL add_01 : std_logic_vector (31 DOWNTO 0); 9 SIGNAL add_23 : std_logic_vector (31 DOWNTO 0); 0 SIGNAL add_45 : std_logic_vector (31 DOWNTO 0); 1 SIGNAL add_67 : std_logic_vector (31 DOWNTO 0); 2 SIGNAL add_0123 : std_logic_vector (31 DOWNTO 0); 3 SIGNAL add_4567 : std_logic_vector (31 DOWNTO 0); 4 SIGNAL add_all : std_logic_vector (31 DOWNTO 0); 5 BEGIN 6 7 pameti : PROCESS (clk, res_n) 8 VARIABLE citac : NATURAL; 9 BEGIN 0 globalni asynchronni reset 1 IF res_n= 0 THEN 2 FOR citac IN 7 DOWNTO 1 LOOP 3 vzorky(citac) <= (OTHERS => 0 ); 4 END LOOP; 5 ELSIF clk= 1 AND clk EVENT THEN 6 posuv vzorku 7 vzorky(1) <= x; 8 FOR citac IN 7 DOWNTO 2 LOOP 9 vzorky(citac) <= vzorky(citac 1); 0 END LOOP; 1 END IF; 2 END PROCESS pameti; Co je tu špatně? Kolik je 1+1? 1 0xFFFFFFFF 1 + 1 = 0xFFFFFFFF + 0xFFFFFFFF = 1FFFFFFFE Pro sečtení dvou čísel potřebujeme o bit víc, abychom zabránili přetečení nutno ošetřit
ADD4 pipelining Funkce Sčítáme 4 čtyřbitová čísla. Příklad pipeline v logice: mezi sčítačky vložíme registry abychom zvýšili maximální dosažitelnou hodinovou frekvenci. Rozbijeme tak dlouhou cestu kombinační logikou ze vstupu na výstup obvodu. Zvýší se ovšem latence obvodu. e <= a + b + c + d. e <= ((a + b) + (c + d)). všimněte si, že se výsledek rozšiřuje mezi 4 bity 5 bitu 6 bitu a b c d a_in b_in c_in d_in a_b c_d e_in e Pouze pro kladná císla! clk res
ADD4 pipelining 1 LIBRARY IEEE; 2 USE IEEE.std_logic_1164.ALL; 3 USE IEEE.std_logic_arith.ALL; 4 USE IEEE.std_logic_unsigned.ALL; 5 6 ENTITY add4 IS 7 PORT ( 8 clk : IN std_logic; 9 res : IN std_logic; 10 a : IN std_logic_vector (3 DOWNTO 0); 11 b : IN std_logic_vector (3 DOWNTO 0); 12 c : IN std_logic_vector (3 DOWNTO 0); 13 d : IN std_logic_vector (3 DOWNTO 0); 14 e : OUT std_logic_vector (5 DOWNTO 0) 15 ); 16 END ENTITY add4; 17 18 ARCHITECTURE rtl OF add4 IS 19 SIGNAL a_b : std_logic_vector (4 DOWNTO 0); 20 SIGNAL c_d : std_logic_vector (4 DOWNTO 0); 21 SIGNAL a_in : std_logic_vector (3 DOWNTO 0); 22 SIGNAL b_in : std_logic_vector (3 DOWNTO 0); 23 SIGNAL c_in : std_logic_vector (3 DOWNTO 0); 24 SIGNAL d_in : std_logic_vector (3 DOWNTO 0); 25 SIGNAL e_in : std_logic_vector (5 DOWNTO 0); 26 BEGIN 27 a_b <= ( 0 &a_in) + ( 0 &b_in); 28 c_d <= ( 0 &c_in) + ( 0 &d_in); 29 30 e_in <= ( 0 &a_b) + ( 0 &c_d); 31 32 out_reg : PROCESS (clk, res) 33 BEGIN 34 IF res= 1 THEN 35 e <= (OTHERS => 0 ); 36 a_in <= (OTHERS => 0 ); 37 b_in <= (OTHERS => 0 ); 38 c_in <= (OTHERS => 0 ); 39 d_in <= (OTHERS => 0 ); 40 ELSIF clk= 1 AND clk EVENT THEN 41 e <= e_in; 42 a_in <= a; 43 b_in <= b; 44 c_in <= c; 45 d_in <= d; 46 END IF; 47 END PROCESS out_reg; 48 END ARCHITECTURE rtl; Porty bloku 4 bity a b c d a_in b_in c_in d_in 5 bitu a_b c_d 6 bitu e_in e Pouze pro kladná císla! clk res
ADD4 pipelining 1 LIBRARY IEEE; 2 USE IEEE.std_logic_1164.ALL; 3 USE IEEE.std_logic_arith.ALL; 4 USE IEEE.std_logic_unsigned.ALL; 5 6 ENTITY add4 IS 7 PORT ( 8 clk : IN std_logic; 9 res : IN std_logic; 10 a : IN std_logic_vector (3 DOWNTO 0); 11 b : IN std_logic_vector (3 DOWNTO 0); 12 c : IN std_logic_vector (3 DOWNTO 0); 13 d : IN std_logic_vector (3 DOWNTO 0); 14 e : OUT std_logic_vector (5 DOWNTO 0) 15 ); 16 END ENTITY add4; 17 18 ARCHITECTURE rtl OF add4 IS 19 SIGNAL a_b : std_logic_vector (4 DOWNTO 0); 20 SIGNAL c_d : std_logic_vector (4 DOWNTO 0); 21 SIGNAL a_in : std_logic_vector (3 DOWNTO 0); 22 SIGNAL b_in : std_logic_vector (3 DOWNTO 0); 23 SIGNAL c_in : std_logic_vector (3 DOWNTO 0); 24 SIGNAL d_in : std_logic_vector (3 DOWNTO 0); 25 SIGNAL e_in : std_logic_vector (5 DOWNTO 0); 26 BEGIN 27 a_b <= ( 0 &a_in) + ( 0 &b_in); 28 c_d <= ( 0 &c_in) + ( 0 &d_in); 29 30 e_in <= ( 0 &a_b) + ( 0 &c_d); 31 32 out_reg : PROCESS (clk, res) 33 BEGIN 34 IF res= 1 THEN 35 e <= (OTHERS => 0 ); 36 a_in <= (OTHERS => 0 ); 37 b_in <= (OTHERS => 0 ); 38 c_in <= (OTHERS => 0 ); 39 d_in <= (OTHERS => 0 ); 40 ELSIF clk= 1 AND clk EVENT THEN 41 e <= e_in; 42 a_in <= a; 43 b_in <= b; 44 c_in <= c; 45 d_in <= d; 46 END IF; 47 END PROCESS out_reg; 48 END ARCHITECTURE rtl; Vnitřní signály 4 bity a b c d 5 bitu a_in b_in a_b c_in d_in c_d 6 bitu e_in e Pouze pro kladná císla! clk res
ADD4 pipelining 1 LIBRARY IEEE; 2 USE IEEE.std_logic_1164.ALL; 3 USE IEEE.std_logic_arith.ALL; 4 USE IEEE.std_logic_unsigned.ALL; 5 6 ENTITY add4 IS 7 PORT ( 8 clk : IN std_logic; 9 res : IN std_logic; 10 a : IN std_logic_vector (3 DOWNTO 0); 11 b : IN std_logic_vector (3 DOWNTO 0); 12 c : IN std_logic_vector (3 DOWNTO 0); 13 d : IN std_logic_vector (3 DOWNTO 0); 14 e : OUT std_logic_vector (5 DOWNTO 0) 15 ); 16 END ENTITY add4; 17 18 ARCHITECTURE rtl OF add4 IS 19 SIGNAL a_b : std_logic_vector (4 DOWNTO 0); 20 SIGNAL c_d : std_logic_vector (4 DOWNTO 0); 21 SIGNAL a_in : std_logic_vector (3 DOWNTO 0); 22 SIGNAL b_in : std_logic_vector (3 DOWNTO 0); 23 SIGNAL c_in : std_logic_vector (3 DOWNTO 0); 24 SIGNAL d_in : std_logic_vector (3 DOWNTO 0); 25 SIGNAL e_in : std_logic_vector (5 DOWNTO 0); 26 BEGIN 27 a_b <= ( 0 &a_in) + ( 0 &b_in); 28 c_d <= ( 0 &c_in) + ( 0 &d_in); 29 30 e_in <= ( 0 &a_b) + ( 0 &c_d); 31 32 out_reg : PROCESS (clk, res) 33 BEGIN 34 IF res= 1 THEN 35 e <= (OTHERS => 0 ); 36 a_in <= (OTHERS => 0 ); 37 b_in <= (OTHERS => 0 ); 38 c_in <= (OTHERS => 0 ); 39 d_in <= (OTHERS => 0 ); 40 ELSIF clk= 1 AND clk EVENT THEN 41 e <= e_in; 42 a_in <= a; 43 b_in <= b; 44 c_in <= c; 45 d_in <= d; 46 END IF; 47 END PROCESS out_reg; 48 END ARCHITECTURE rtl; Sčítačky 4 bity a b c d a_in b_in c_in d_in 5 bitu a_b c_d 6 bitu e_in e Pouze pro kladná císla! clk res
ADD4 pipelining 1 LIBRARY IEEE; 2 USE IEEE.std_logic_1164.ALL; 3 USE IEEE.std_logic_arith.ALL; 4 USE IEEE.std_logic_unsigned.ALL; 5 6 ENTITY add4 IS 7 PORT ( 8 clk : IN std_logic; 9 res : IN std_logic; 10 a : IN std_logic_vector (3 DOWNTO 0); 11 b : IN std_logic_vector (3 DOWNTO 0); 12 c : IN std_logic_vector (3 DOWNTO 0); 13 d : IN std_logic_vector (3 DOWNTO 0); 14 e : OUT std_logic_vector (5 DOWNTO 0) 15 ); 16 END ENTITY add4; 17 18 ARCHITECTURE rtl OF add4 IS 19 SIGNAL a_b : std_logic_vector (4 DOWNTO 0); 20 SIGNAL c_d : std_logic_vector (4 DOWNTO 0); 21 SIGNAL a_in : std_logic_vector (3 DOWNTO 0); 22 SIGNAL b_in : std_logic_vector (3 DOWNTO 0); 23 SIGNAL c_in : std_logic_vector (3 DOWNTO 0); 24 SIGNAL d_in : std_logic_vector (3 DOWNTO 0); 25 SIGNAL e_in : std_logic_vector (5 DOWNTO 0); 26 BEGIN 27 a_b <= ( 0 &a_in) + ( 0 &b_in); 28 c_d <= ( 0 &c_in) + ( 0 &d_in); 29 30 e_in <= ( 0 &a_b) + ( 0 &c_d); 31 32 out_reg : PROCESS (clk, res) 33 BEGIN 34 IF res= 1 THEN 35 e <= (OTHERS => 0 ); 36 a_in <= (OTHERS => 0 ); 37 b_in <= (OTHERS => 0 ); 38 c_in <= (OTHERS => 0 ); 39 d_in <= (OTHERS => 0 ); 40 ELSIF clk= 1 AND clk EVENT THEN 41 e <= e_in; 42 a_in <= a; 43 b_in <= b; 44 c_in <= c; 45 d_in <= d; 46 END IF; 47 END PROCESS out_reg; 48 END ARCHITECTURE rtl; Registry 4 bity a b c d a_in b_in c_in d_in 5 bitu a_b c_d 6 bitu e_in e Pouze pro kladná císla! clk res
Design flow vodopád nástrojů Specifikace system (systemova) algorithmic (algoritmicka) systémový návrh volba FPGA hotové RTL constraints netlist constraints konfigurace FPGA Návrh systému Kódování návrhu (Design Capture) Syntéza Rozmístení+propojení (Place & Route) RTL simulace Gate level simulace Statická casová analýza Urovne abstrakce RTL (register transfer level) gate level (hradlova) physical, transistor (fyzicka, tranzistorova)
Pro ty, co chtějí vědět víc...
Design flow zblízka Nejprve se podívejme na jednotlivé kroky při zpracování VHDL kódu.
Syntéza Konverze popisu systému na vysoké úrovni abstrakce do seznamu logických prvků dané technologie a jejich vzájemného propojení (netlist) Vstup: syntetizovatelná podmnožina VHDL Výstup: netlist (prvky FPGA jak používá) log. funkce, sekvenční logika, aritmetika, paměti,... Výsledek syntézy je ovlivněn 1 VHDL kódem (pragmas) 2 constraints 3 použitou technologií Optim. podle plochy vs. rychlosti (reálné vs. požadované zpoždění slack), aplikace transformací PicoCTRL WWW stránky!
Design flow vodopád nástrojů Specifikace system (systemova) algorithmic (algoritmicka) systémový návrh volba FPGA hotové RTL constraints netlist constraints konfigurace FPGA Návrh systému Kódování návrhu (Design Capture) Syntéza Rozmístení+propojení (Place & Route) RTL simulace Gate level simulace Statická casová analýza Urovne abstrakce RTL (register transfer level) gate level (hradlova) physical, transistor (fyzicka, tranzistorova)
Rozmístění a propojení Implementace netlistu v daném FPGA, 1 zobrazení na technologii (mapování) 2 rozmístění 3 propojení Mapování namapování logického netlistu na prvky na FPGA optimalizace logiky spojení FFs + LUTs do slices/clb př. kombinační logiku převede do LUT v CLB FPGA odstranění mrtvé logiky replikace registrů výstup technologicky závislý netlist
Implementace netlistu v daném FPGA, 1 zobrazení na technologii (mapování) 2 rozmístění 3 propojení Rozmístění na základě 1 hustoty vzájemných propojení bloků 2 požadovaných časových parametrů 3 constraint file (LOC, PAD) Rozmístění a propojení iterativní algoritmus (simulované žíhání) randomizovaný proces nelinerání proces, stačí malá změna v RTL kódu a prudce se změní parametry výsledného obvodu
Implementace netlistu v daném FPGA, 1 zobrazení na technologii (mapování) 2 rozmístění 3 propojení Propojení Rozmístění a propojení cíl: propojit jednotlivé rozmístěné bloky iterativní, randomizovaný algoritmus Shrnutí vlastností NP-těžká optimalizační úloha, ruční optimalizace výsledku velice obtížná raději nezaplňujte FPGA na víc jak cca 90%, při hodně zaplněném obvodu se budou prudce zhoršovat časové parametry návrhu
Implementace netlistu v daném FPGA, 1 zobrazení na technologii (mapování) 2 rozmístění 3 propojení Propojení Rozmístění a propojení cíl: propojit jednotlivé rozmístěné bloky iterativní, randomizovaný algoritmus Shrnutí vlastností NP-těžká optimalizační úloha, ruční optimalizace výsledku velice obtížná raději nezaplňujte FPGA na víc jak cca 90%, při hodně zaplněném obvodu se budou prudce zhoršovat časové parametry návrhu
Syntéza Nástroje pro syntézu se snaží výsledný obvod vždy optimalizovat. Optimalizace je prováděná podle více kritérií (snaha o dosažení minimální plochy, spotřeby, či maximální hodinové frekvence) a kriteria často jdou proti sobě" optimalizací podle jedhono parametru můžeme zhoršit vlastnosti obvodu z pohledu jiného parametru. Během syntézy je obvod optimalizován různými způsoby, některé z nich jsou předmětem následujících slíd.
Transformace pipelining cíl obvod který pracuje na f clk = 200MHz, realita běhá mi to na cca f clk = 66MHz, řešení vložení pipeline, ručně do obvodu vložím na konec" kombinační logiky registry úloha syntézy automatický posun připraveného registru (, reset) další efekty může snížit spotřebu a zvětšit plochu návrhu D Q Q 5ns 5ns 5ns D Q Q D Q Q D Q Q
Transformace register retiming realita kombinační obvod před pipeline registrem je o 3 ns pomalejší, než by měl být (omezuje max. dosažitelnou hodinovou frekvenci), kombinační obvod po registru o 4 ns rychlejší, než potřebujeme řešení posun registru vlevo", přesun části logiky z pomalejšího obvodu do rychlejšího úloha syntézy automatický posun normálního registru další efekty může snížit spotřebu a zvětšit plochu návrhu D Q Q 3ns D Q Q +4ns D Q Q D Q Q 3ns +3ns D Q +1ns Q D Q Q
Transformace register replication realita výstup některé buňky v obvodu má velkou zátěž je na něj zapojeno hodně vstupů dalších hradel, proto je pomalý velká kapacitní zátěž řešení znásobení buňky více paralelních kopií buzených stejnými signály a rozložení zátěže úloha syntézy automatická replikace další efekty může trošku zvětšit plochu návrhu 2ns D Q Q D Q Q +2ns D Q Q +1ns D Q Q D Q Q +1ns D Q Q D Q Q +1ns +1ns D Q Q D Q Q
Transformace opětovná syntéza realita logická funkce je z pohledu syntézy pomalá a existuje víc způsobů, jak ji implementovat řešení pokus o jinou realizaci úloha syntézy změna obsahu LUTů, spojů, apod. nástroj pro syntézu se pokusí funkci implementovat jinak
Syntéza 2 K tomu aby syntezátor mohl zvolit vhodnou optimalizační metodu, musí znát parametry obvodu velikost, zpoždění v obvodu. Zatímco velikost není velký problém odhadnout, odhad rychlosti logiky je velmi obtížný. Na rychlost obvodu má rozhodující vliv jak je rozmístěn a propojen na FPGA a tato informace není v době syntézy ještě známá. Ukažme si, k čemu to může vést.
Příklad odhadu f clk akumulátor,malé FPGA Jednoduchý akumulátor y = y + x
Příklad odhadu f clk akumulátor,malé FPGA Všimněte si: s rostoucí šířkou slova syntéza odhaduje lineární snížení hodinové frekvence (lineární zvýšení zpoždění ve sčítačce). Po rozmístění a propojení obvodu nicméně pro šířku slova vyšší než 14 bitů rapidně klesá dosažitelná hodinová frekvence pokles je nelineární. Umíte si to vysvětlit?
Příklad odhadu f clk akumulátor,malé FPGA Řešení je prosté. Pro sčítání jsou na FPGA dedikované kanály pro akceleraci přenosu, rozmístěné vertikálně modrý sloupec níže.
Příklad odhadu f clk akumulátor,malé FPGA Pro příliš široké slovo se sčítačka na výšku nevejde do FPGA a to, co se nevejde se umístí jinam. Výsledek je velké zpoždění na jednom jediném spoji, které sníží hodinovou frekvenci celého obvodu.
Fyzická syntéza Vidíme, že odhad zpoždění není jednoduchý. Pak ale ani optimalizace obvodu nemusí být správně vybrané. Řešení: syntezátor a rozmístění a propojení pracují v cyklech, po syntéze se provede předběžné" rozmístění a propojení a na jeho základě jsou určena zpoždění v obvodu. Potom se obvod optimalizuje a celé kolečko" se automaticky rozjede znovu. Proces se opakuje, dokud software není spokojen" s výsledkem. Toto nazýváme fyzická syntéza physical synthesis.
Syntéza řízení procesu Nástroje pro syntézu umožňují návrháři celý proces generování schématu z VHDL kódu jemně řídit a dolad ovat. Lze to dělat několika způsoby, viz následující slídy.
Pragmas VHDL code Pragmas" jsou komentáře ve VHDL kódu, které ovlivňují syntézní proces. Nejjednodušší jsou níže, nástroje typicky podporují významně širší škálu povelů. Pozor ale podporované pragmy" jsou závislé na konkrétním nástroji pro syntézu, níže uvedené jsou více-méně univerzální pragma synthesis_on pragma translate_on pragma synthesis_off pragma translate_off vše, co je v kódu mezi on a off pragmou" je syntézátorem ignorováno hodí se, pokud například chcete mít ve VHDL kódu kontrolu splnění nějaké podmínky pro simulaci (například kontrolu na přetečení akumulátoru a výpis chybového hlášení při simulaci)
Přepínače syntézy obecně Dále lze syntézu ovlivnit přepínači kterými každý nástroj pro syntézu disponuje. Obvykle lze zapnout optimalizaci na plochu optimalizaci na rychlost optimalizaci na spotřebu ovlivnit kódování stavů automatů (stavy kódované one-hot, binárně, v Grayově kódu, atd.) lze vynutit různé nastavení optimalizací pro dílčí bloky viz. PicoCTRL zpráva na WWW stránkách sekce publikace, je tam mnoho příkladů a srovnání Přepínače lze nastavit někdy v grafickém rozhraní nástroje, někdy pomocí například konfiguračního souboru či ve skriptu pro syntézu. Záleží na nástroji.
Design constraints Konečně lze celý proces implementace obvodu ovlivnit pomocí constraints". S těmi se na cvičení setkáme, definujeme je v tzv. constraint file", ovlivňují i rozmístění a propojení obvodu. Závislé na nástroji. nejtypičtější jsou definice mapování signálů na nožičky obvodu NET "clk" LOC="AA12"; připoj vstup CLK na pad AA12 FPGA obvodu NET "res_n" LOC="R2"; NET "cond_1" LOC="H1"; NET "cond_1" PULLUP/PULLDOWN; povol na vstupu pull up či pull down rezistor NET "cond_1" FAST/SLOW; pro výstup, nastavuje rychlost budiče na výstupu FPGA obvodu. FAST budič má vyšší rychlost přeběhu, ale současně generuje více rušení na napájecím napětí. TIMESPEC "TS_clk_raw" = PERIOD "clk" 100MHz HIGH 50%; specifikujeme, že na vstup clk budou
Něco o RTL popisu RTL popis není omezen jen na VHDL kód RTL je obecná úroveň abstrakce na které popisujeme integrovaný obvod. Formální definice RTL příkazu vypadá takto: K : (T, C)R d f(r S1,..., R Sn ), N, (1) kde jednotlivé symboly mají tento význam: K T C návěští příkazu, časování příkazu, logická podmínka podmiňující příkaz, R d cílový registr, f() funkce transformace obsahu zdrojových registrů, R S1,..., R Sn zdrojové registry operace, přenos dat, N skok na příkaz s návěštím N po vykonání operace, provede se vždy nezávisle na podmínce. Takhle to vypadá asi složitě, ve skutečnosti například akumulátor popsaný ve slidech o syntetizovatelném VHDL můžeme navrhnout" přibližně takto: checkreset : (0, res = 1)R y 0, acc, acc : (clk, res = 0)R y R x + R y, checkreset. Dále je nutno nadefinovat vlastnosti R y a + n bitový registr, unsigned formát a R x kopie vstupu obvodu, nemusí ani být registr, n bitů, unsigned formát, clk 1 perioda hodin. Celou problematiku jsme zde zjednodušili, ale hlavní myšlenka je snad stále zřejmá.