Projektowanie w VHDL powtórka wiadomości o języku VHDL słowa zastrzeżone typy danych, deklaracje obiektów instrukcje współbieżne i sekwencyjne pętle for, while typowe bloki układów cyfrowych przykłady syntezy układów cyfrowych Wykorzystano przykłady z: The Low-Carb VHDL Tutorial 24 by Bryan Mealy (8-27-24) PUE-w6 1
Słowa kluczowe (zastrzeżone) w VHDL access exit mod return while after file new signal with alias for next shared all function null then attribute generic of to block group on type body in open until buffer is out use bus label range variable PUE-w6 2
Operatory w VHDL logiczne not and or nand nor xor xnor relacji = /= < <= > >= przesunięć sll srl sla sra rol ror arytmetyczne + - * / mod rem ** abs konkatenacji & PUE-w6 3
Operatory przesunięć w VHDL Operator Nazwa Przykład Wynik simple ssl shift left wynik <= "11111" ssl 2 "111" arithmetic ssr shift right wynik <= "11111" ssr 3 "11" sla sra shift left arithmetic shift right arithmetic wynik <= "1111" sla 2 "111" wynik <= "1111" sra 3 "11" rotate rol rotate left wynik <= "11" rol 2 "11" ror rotate right wynik <= "111" ror 2 "111" PUE-w6 4
Często używane typy danych Typ Przykład std_logic signal my_sig : std_logic; std_logic_vector signal busa : std_logic_vector(3 downto ); wyliczeniowy type state_type is (ST,ST1,ST2,ST3); boolean variable my_test : boolean := false; integer signal iter_cnt : integer := ; PUE-w6 5
Deklaracje obiektów (danych) Obiekt Forma deklaracji sygnał signal nazwa_sygnału : typ_sygnału := wartość_początkowa; zmienna variable nazwa_zmiennej : typ_zmiennej := wartość_początkowa; stała constant nazwa_stałej : typ_stałej := wartość_początkowa; Obiekt Przykłady deklaracji sygnał signal sig_var1 : std_logic := ; signal tmp_bus : std_logic_vector( 3 downto ) := "11"; signal tmp_int : integer range -128 to 127 := ; signal my_int : integer; zmienna variable my_var1, my_var2 : std_logic; variable index_a : integer range ( to 255) := ; variable index_b : integer := -34; stała constant sel_val : std_logic_vector(2 downto ) := "1"; constant max_cnt : integer := 12; PUE-w6 6
Instrukcje współbieżne i sekwencyjne w VHDL Instrukcje współbieżne Współbieżne przypisanie sygnału sygnał <= wyrażenie DAT <= (D AND E) OR (F AND G); Warunkowe przypisanie sygnału sygnał <= wyrazenie when warunek else wyrazenie when warunek else wyrazenie; F3 <= '1' when (L='' AND M='') else '1' when (L='1' AND M='1') else ''; <-> <-> Instrukcje sekwencyjne Przypisanie sygnału sygnał <= wyrażenie DAT <= (D AND E) OR (F AND G); Instrukcja if if warunek then instrukcje elsif warunek then instrukcje else instrukcje end if; if (S = "11") then F <= D(3); elsif (S = "1") then F <= D(2); elsif (S = "1") then F <= D(1); else F <= D(); end if; PUE-w6 7
Instrukcje współbieżne i sekwencyjne w VHDL Instrukcje współbieżne Selektywne przypisanie sygnału with (wybór ) select sygnał <= wyrażenie whenwartosci_wyboru, wyrażenie whenwartosci_wyboru; wyrażenie when others; with SEL select MX_OUT <= D3 when "11", D2 when "1", D1 when "1" "", '' when others; <-> Instrukcje sekwencyjne Instrukcja case case (wyrazenie ) is when wartosci_wyboru => {instrukcje sekwencyjne} when wartosci_wyboru => {instrukcje sekwencyjne} when others => -- (opcja) {instrukcje sekwencyjne} end case; case (ABC) is when "1" => F <= "1"; when "11" => F <= "1"; when "111" => F <= "11"; when others => F <= ""; end case; PUE-w6 8
Instrukcje współbieżne i sekwencyjne w VHDL Instrukcje współbieżne Instrukcje sekwencyjne Instrukcja process <-> etykieta: process(lista_wrażliwości ) {instrukcje_sewencyjne } end process etykieta; proc1: process( A, B, C ) if ( A = '1' and B = '' ) then F_OUT <= '1'; elsif (B = '1' and C = '1') then F_OUT <= '1'; else F_OUT <= ''; end if; end process proc1; PUE-w6 9
Pętle for, while ; instrukcja exit Pętla for etykieta: for index in zakres loop instrukcje sekwencyjne... end loop etykieta; p1: for i in to A'length -1 loop end loop p1; B(i) <= not A(i); variable suma : integer := ; for licznik in to 5 loop end loop; if (suma = 2) then exit; end if; suma := suma + 1; Pętla while etykieta: while (warunek) loop instrukcje sekwencyjne... end loop etykieta; zegar: while flaga loop zegar <= not zegar; wait for okres_zegara/2; end loop zegar; variable suma : integer := ; while (suma < 3) loop exit when (suma = 2); suma := suma + 1; end loop; PUE-w6 1
Typowe bloki cyfrowe: rejestr równoległy -- Rejestr 8-bitowy, z sygnałem ChipSelect (CS) -- sygnały: -- CLK,CS: in STD_LOGIC; -- D_IN: in STD_LOGIC_VECTOR(7 downto ); -- D_OUT: out STD_LOGIC_VECTOR(7 downto ); process (CLK,CS) if (CS = '1' and rising_edge(clk)) then D_OUT <= D_IN; end if; end process; PUE-w6 11
Typowe bloki cyfrowe: licznik -- Licznik synchroniczny 2-kierunkowy z asynchronicznym -- zerowaniem i synchronicznym ładowaniem równoległym. -- CLK, RESET, LOAD, UP: in STD_LOGIC; -- DIN : in STD_LOGIC_VECTOR(7 downto ); -- COUNT : inout STD_LOGIC_VECTOR(7 downto ); process (CLK, RESET) if (RESET = '1') then COUNT <= ""; elsif (rising_edge(clk)) then if (LOAD = '1') then COUNT <= DIN; else if (UP = '1') then COUNT <= COUNT + 1; end if; end if; end process; else COUNT <= COUNT - 1; end if; PUE-w6 12
Typowe bloki cyfrowe: rejestr przesuwny -- Jednokierunkowy rejestr przesuwny z synchronicznym -- ładowaniem równoległym -- CLK, D_IN, P_LOAD: in STD_LOGIC; -- P_LOAD_DATA: in STD_LOGIC_VECTOR(7 downto ); -- D_OUT: out STD_LOGIC; signal REG_TMP: STD_LOGIC_VECTOR(7 downto ); process (CLK) if (rising_edge(clk)) then if (P_LOAD = '1') then else end if; end if; REG_TMP <= P_LOAD_DATA; REG_TMP <= REG_TMP(6 downto ) & D_IN; D_OUT <= REG_TMP(3); end process; PUE-w6 13
Typowe bloki cyfrowe: komparator -- Komparator 8-bitowy, zrealizowany sekwencyjnie (!) -- CLK: in STD_LOGIC; -- A_IN, B_IN : in STD_LOGIC_VECTOR(7 downto ); -- ALB, AGB, AEB : out STD_LOGIC process(clk) if (rising_edge(clk)) then if ( A_IN < B_IN ) then ALB <= '1'; else ALB <= ''; end if; if ( A_IN > B_IN ) then AGB <= '1'; else AGB <= ''; end if; if ( A_IN = B_IN ) then AEB <= '1'; else AEB <= ''; end if; end if; end process; PUE-w6 14
Typowe bloki cyfrowe: dekoder BCD na 7seg. -- Dekoder BCD na 7-segmentowy (implementacja kombinacyjna) -- Wyjscia aktyne stanem niskim; -- BCD_IN : in STD_LOGIC_VECTOR(3 downto ); -- SSEG : out STD_LOGIC_VECTOR(6 downto ); --a,b,c,..g with BCD_IN select SSEG <= "1" when "", -- "11111" when "1", -- 1 a "11" when "1", -- 2 "11" when "11", -- 3 "111" when "1", -- 4 f g b "11" when "11", -- 5 "1" when "11", -- 6 "1111" when "111", -- 7 "" when "1", -- 8 "1" when "11", -- 9 "1" when "11", -- A "11" when "111", -- b "111" when "11", -- C "11" when "111", -- d "11" when "111", -- E "111" when "1111", -- F e d c "1111111" when others; -- wylacza wszystkie LED PUE-w6 15
Typowe bloki cyfrowe: multiplekser -- Multiplekser 4:1,implementacja z CASE (inne: w PUE_w4) -- SEL: in STD_LOGIC_VECTOR(1 downto ); -- A, B, C, D : in STD_LOGIC; -- MUX_OUT : out STD_LOGIC; process (SEL, A, B, C, D) case SEL is when "" => MUX_OUT <= A; when "1" => MUX_OUT <= B; when "1" => MUX_OUT <= C; when "11" => MUX_OUT <= D; when others => NULL; end case; end process; PUE-w6 16
Typowe bloki cyfrowe: dekoder -- Dekoder 3/8 (implementacja z przypisaniem selektywnym) --------------------------------------------------- -- D_IN: in STD_LOGIC_VECTOR (2 downto ); -- FOUT: out STD_LOGIC_VECTOR(7 downto ); --------------------------------------------------- with D_IN select F_OUT <= "1" when "", "1" when "1", "1" when "1", "1" when "11", "1" when "1", "1" when "11", "1" when "11", "1" when "111", "" when others; PUE-w6 17
Projekt detektora ciągu bitów Zadanie: zaprojektować detektor ciągu bitów : 1,,1, pojawiających się szeregowo na wejściu danych x. 1. "Czarna skrzynka" i opis jednostki w VHDL x clk reset det11 y ------------------------------------------------- -- Projekt det11: detektor ciagu bitow : 1,,1, -- (przyklad z [1],L8.4) -- library ieee; use ieee.std_logic_1164.all; entity det11 is port ( x,clk,reset : in std_logic; y : out std_logic); end entity det11; PUE-w6 18
Projekt detektora ciągu bitów (2) 2. Graf stanów detektora (automat Moore'a): stany: s - nie wystąpił pierwszy element ciągu; y= s1 - wystąpił pierwszy element ciągu; y= s2 - wystąpiły dwa elementy ciągu; y= s3 - wystąpiły trzyi elementy ciągu; y= s4 - wystąpił cały ciąg; y=1 reset 1 1 s 1 s1 s2 1 s3 s4 1 1 PUE-w6 19
Projekt detektora ciągu bitów (3) 3. Architektura: - deklaracje stanów, - funkcja wyjścia reset s 1 1 1 s1 s2 1 s3 s4 1 1 architecture det11a1 of det11 is type stan is (s, s1, s2, s3, s4); signal s : stan; wyjscia: process( s ) case s is when s4 => y <= '1'; when others => y <= ''; end case; end process wyjscia; --stany : process(clk, x, reset); -- na nastepnym slajdzie PUE-w6 2
Projekt detektora ciągu bitów (4) 4. Architektura - funkcje przejść stanów reset s 1 1 1 s1 s2 1 s3 s4 1 1 stany : process(clk, x, reset) if reset='1' then s <= s; end if; case s is when s=> if x='1' then s<=s1; else s<=s; end if; when s1=> if x='' then s<=s2; else s<=s1; end if; when s2=> if x='1' then s<=s3; else s<=s; end if; when s3=> if x='' then s<=s4; else s<=s1; end if; when s4=> if x='1' then s<=s1; else s<=s; end if; when others => s <= s; --(awaryjnie) end case; end process stany; end architecture det11a1; PUE-w6 21
Projekt sygnalizatora świateł (1) Zadanie: Zaprojektować (uproszczony) system sygnalizatora świateł na skrzyżowaniu tramwaju z przejściem dla pieszych. Każdy sygnalizator ma dwa światła: czerwone (TC, PC) i zielone (TZ, PZ). Normalnie piesi mają światło zielone (PZ), tramwaj czerwone (TC). Gdy tramwaj zbliża się do przejścia, światła zmieniają się na przeciwne i pozostają tak, aż tramwaj nie opuści skrzyżowania po przeciwnej stronie. W podtorzu, w odpowiedniej odległości po obu stronach przejścia umieszczone są czujniki CL, CP sygnalizujące stanem wysokim obecność tramwaju. Założyć, że tramwaj może nadjechać tylko z lewej strony. Rozszerzenia: 1. Uwzględnić możliwość ruchu dwukierunkowego tramwajów 2. Uwzględnić stan awaryjny (wszystkie światła wyłączone) PC,PZ TC,TZ CL TC,TZ PC,PZ CP PUE-w6 22
Projekt sygnalizatora świateł (2) -------------------------- -- CzeZie: swiatla na CL TC CzeZie -- przejsciu przez tory CP TZ ------------------------- clk PC library ieee; (reset) PZ use ieee.std_logic_1164.all; entity CzeZie is port ( CL,CP,clk,reset : in std_logic; TZ,TC,PZ,PC : out std_logic); end entity CzeZie; architecture CzeZieMin of CzeZie is type stan is ( STZ, SPZ ) ; --StanTramwajZielone, signal s : stan; signal CLP : std_logic_vector(1 downto ); swiatla: process(s) -- wyjścia Moore'a if s=stz then TZ<='1'; TC<=''; PZ<=''; PC<='1'; else TZ<=''; TC<='1'; PZ<='1'; PC<=''; end if; end process swiatla; PUE-w6 23
Projekt sygnalizatora świateł (3) CL,CP reset 1 (inne) SPZ 11 STZ 11 (inne) stan TZ,TC,PZ,PC 1 stany: process(clk, CL, CP, reset) if reset then s<= SPZ; end if; CLP <= CL & CP; case s is when SPZ => if CLP="1" then s<=stz ; end if; when STZ => if CLP="1" then s<=spz; end if; end case; end process stany; end architecture CzeZieMin; PUE-w6 24