w06
Transkrypt
w06
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 © 2004 by Bryan Mealy (08-27-2004) PUE-w06 1 Słowa kluczowe (zastrzeżone) w VHDL access after alias all attribute block body buffer bus exit file for function generic group in is label mod new next null of on open out range PUE-w06 return while signal with shared then to type until use variable 2 Operatory w VHDL logiczne relacji przesunięć arytmetyczne konkatenacji not and = /= sll srl + - * / & or nand nor xor xnor < <= > >= sla sra rol ror mod rem ** abs PUE-w06 3 Operatory przesunięć w VHDL Operator simple Przykład Wynik ssl shift left wynik <= "110111" ssl 2 "011100" ssr shift right wynik <= "110111" ssr 3 "000110" sla shift left arithmetic wynik <= "110011" sla 2 "101100" sra shift right arithmetic wynik <= "110011" sra 3 "100010" rol rotate left wynik <= "101000" rol 2 "100010" ror rotate right wynik <= "101001" ror 2 "011010" arithmetic rotate Nazwa PUE-w06 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 0); wyliczeniowy type state_type is (ST0,ST1,ST2,ST3); boolean variable my_test : boolean := false; integer signal iter_cnt : integer := 0; PUE-w06 5 Deklaracje obiektów (danych) Obiekt sygnał Forma deklaracji 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 Obiekt sygnał := wartość_początkowa; Przykłady deklaracji signal sig_var1 : signal tmp_bus : signal tmp_int : signal my_int : std_logic := ‘0’; std_logic_vector( 3 downto 0) := "0011"; integer range -128 to 127 := 0; integer; zmienna variable my_var1, my_var2 : std_logic; variable index_a : integer range (0 to 255) := 0; variable index_b : integer := -34; stała constant sel_val : std_logic_vector(2 downto 0) := "001"; constant max_cnt : integer := 12; PUE-w06 6 Instrukcje współbieżne i sekwencyjne w VHDL Instrukcje współbieżne Współbieżne przypisanie sygnału Instrukcje sekwencyjne <-> Przypisanie sygnału sygnał <= wyrażenie sygnał <= wyrażenie DAT <= (D AND E) OR (F AND G); DAT <= (D AND E) OR (F AND G); Warunkowe przypisanie sygnału sygnał <= <-> Instrukcja if if warunek then instrukcje wyrazenie when warunek else elsif warunek then instrukcje wyrazenie when warunek else else instrukcje wyrazenie; end if; F3 <= if (S = "11") then F <= D(3); '1' when (L='0' AND M='0') else elsif (S = "10") then F <= D(2); '1' when (L='1' AND M='1') else elsif (S = "01") then F <= D(1); '0'; else F <= D(0); end if; PUE-w06 7 Instrukcje współbieżne i sekwencyjne w VHDL Instrukcje współbieżne Selektywne przypisanie sygnału Instrukcje sekwencyjne <-> Instrukcja case with (wybór ) select sygnał <= wyrażenie whenwartosci_wyboru, wyrażenie whenwartosci_wyboru; wyrażenie when others; case (wyrazenie ) is when wartosci_wyboru => {instrukcje sekwencyjne} when wartosci_wyboru => {instrukcje sekwencyjne} when others => -- (opcja) {instrukcje sekwencyjne} end case; with SEL select MX_OUT <= D3 when "11", D2 when "10", D1 when "01" | "00" , '0' when others; case (ABC) is when "100" => when "011" => when "111" => when others => end case; PUE-w06 F <= "10"; F <= "01"; F <= "11"; F <= "00"; 8 Instrukcje współbieżne i sekwencyjne w VHDL Instrukcje współbieżne Instrukcje sekwencyjne Instrukcja process <-> etykieta: process(lista_wrażliwości ) begin {instrukcje_sewencyjne } end process etykieta; proc1: process( A, B, C ) begin if ( A = '1' and B = '0' ) then F_OUT <= '1'; elsif (B = '1' and C = '1') then F_OUT <= '1'; else F_OUT <= '0'; end if; end process proc1; PUE-w06 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 0 to A'length -1 loop B(i) <= not A(i); end loop p1; variable suma : integer := 0; for licznik in 0 to 50 loop if (suma = 20) then exit; end if; suma := suma + 1; end loop; 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 := 0; while (suma < 300) loop exit when (suma = 20); suma := suma + 1; end loop; PUE-w06 10 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 0); -- D_OUT: out STD_LOGIC_VECTOR(7 downto 0); process (CLK,CS) begin if (CS = '1' and rising_edge(CLK)) then D_OUT <= D_IN; end if; end process; PUE-w06 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 0); -- COUNT : inout STD_LOGIC_VECTOR(7 downto 0); process (CLK, RESET) begin if (RESET = '1') elsif (rising_edge(CLK)) if (LOAD = '1') else if (UP = '1') else end if; end if; end if; then COUNT <= "00000000"; then then COUNT <= DIN; then COUNT <= COUNT + 1; COUNT <= COUNT - 1; end process; PUE-w06 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 0); -- D_OUT: out STD_LOGIC; signal REG_TMP: STD_LOGIC_VECTOR(7 downto 0); process (CLK) begin if (rising_edge(CLK)) then if (P_LOAD = '1') then REG_TMP <= P_LOAD_DATA; else REG_TMP <= REG_TMP(6 downto 0) & D_IN; end if; end if; D_OUT <= REG_TMP(3); end process; PUE-w06 13 Typowe bloki cyfrowe: komparator ----- Komparator 8-bitowy, zrealizowany sekwencyjnie (!) CLK: in STD_LOGIC; A_IN, B_IN : in STD_LOGIC_VECTOR(7 downto 0); ALB, AGB, AEB : out STD_LOGIC process(CLK) begin if (rising_edge(CLK)) then if ( else if ( else if ( else end if; end process; A_IN < ALB <= A_IN > AGB <= A_IN = AEB <= B_IN ) then ALB <= '1'; '0'; end if; B_IN ) then AGB <= '1'; '0'; end if; B_IN ) then AEB <= '1'; '0'; end if; PUE-w06 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 0); -- SSEG : out STD_LOGIC_VECTOR(6 downto 0); --a,b,c,..g with BCD_IN select SSEG <= "0000001" when "0000", -- 0 "1001111" when "0001", -- 1 a "0010010" when "0010", -- 2 "0000110" when "0011", -- 3 f g b "1001100" when "0100", -- 4 "0100100" when "0101", -- 5 "0100000" when "0110", -- 6 e d c "0001111" when "0111", -- 7 "0000000" when "1000", -- 8 "0000100" when "1001", -- 9 "0001000" when "1010", -- A "1100000" when "1011", -- b "0110001" when "1100", -- C "1000010" when "1101", -- d "0110000" when "1110", -- E "0111000" when "1111", -- F "1111111" when others; -- wylacza wszystkie LED PUE-w06 15 Typowe bloki cyfrowe: multiplekser ----- Multiplekser 4:1,implementacja z CASE (inne: w PUE_w4) SEL: in STD_LOGIC_VECTOR(1 downto 0); A, B, C, D : in STD_LOGIC; MUX_OUT : out STD_LOGIC; process (SEL, A, B, C, D) begin case SEL is when when when when when end case; end process; "00" => MUX_OUT "01" => MUX_OUT "10" => MUX_OUT "11" => MUX_OUT others => NULL; <= <= <= <= PUE-w06 A; B; C; D; 16 Typowe bloki cyfrowe: dekoder -- Dekoder 3/8 (implementacja z przypisaniem selektywnym) ---------------------------------------------------- D_IN: in STD_LOGIC_VECTOR (2 downto 0); -- FOUT: out STD_LOGIC_VECTOR(7 downto 0); --------------------------------------------------with D_IN select F_OUT <= "00000001" when "000", "00000010" when "001", "00000100" when "010", "00001000" when "011", "00010000" when "100", "00100000" when "101", "01000000" when "110", "10000000" when "111", "00000000" when others; PUE-w06 17 Projekt detektora ciągu bitów Zadanie: zaprojektować detektor ciągu bitów : 1,0,1,0 pojawiających się szeregowo na wejściu danych x. 1. "Czarna skrzynka" i opis jednostki w VHDL x clk reset det1010 y -------------------------------------------------- Projekt det1010: detektor ciagu bitow : 1,0,1,0 -- (przyklad z [1],L8.4) -library ieee; use ieee.std_logic_1164.all; entity det1010 is port ( x,clk,reset : in std_logic; y : out std_logic); end entity det1010; PUE-w06 18 Projekt detektora ciągu bitów (2) 2. Graf stanów detektora (automat Moore'a): stany: s0 - nie wystąpił pierwszy element ciągu; s1 - wystąpił pierwszy element ciągu; s2 - wystąpiły dwa elementy ciągu; y=0 y=0 y=0 s3 - wystąpiły trzyi elementy ciągu; s4 - wystąpił cały ciąg; y=0 y=1 reset 0 s0 0 1 1 1 s1 0 1 0 s2 0 0 1 s3 0 0 s4 1 0 PUE-w06 19 Projekt detektora ciągu bitów (3) 3. Architektura: - deklaracje stanów, - funkcja wyjścia 1 reset 0 s0 0 1 s1 0 1 0 s2 0 0 1 1 s3 0 0 s4 1 0 architecture det1010a1 of det1010 is type stan is (s0, s1, s2, s3, s4); signal s : stan; begin wyjscia: process( s ) begin case s is when s4 => y <= '1'; when others => y <= '0'; end case; end process wyjscia; --stany : process(clk, x, reset); -- na nastepnym slajdzie PUE-w06 20 Projekt detektora ciągu bitów (4) 4. Architektura - funkcje przejść stanów 1 reset 0 s0 0 1 s1 0 0 1 stany : process(clk, x, reset) begin if reset='1' then s <= s0; case s is when s0=> if x='1' then when s1=> if x='0' then when s2=> if x='1' then when s3=> if x='0' then when s4=> if x='1' then when others => s <= s0; end case; end process stany; end architecture det1010a1; s2 0 1 1 s3 0 0 0 s4 1 0 end if; s<=s1; else s<=s0; s<=s2; else s<=s1; s<=s3; else s<=s0; s<=s4; else s<=s1; s<=s1; else s<=s0; --(awaryjnie) PUE-w06 end end end end end if; if; if; if; if; 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 CL TC,TZ TC,TZ PC,PZ PUE-w06 CP 22 Projekt sygnalizatora świateł (2) -------------------------TC CL -- CzeZie: swiatla na CzeZie CP TZ -- przejsciu przez tory clk PC ------------------------(reset) PZ library ieee; 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 0); begin swiatla: process(s) -- wyjścia Moore'a begin if s=STZ then TZ<='1'; TC<='0'; PZ<='0'; PC<='1'; else TZ<='0'; TC<='1'; PZ<='1'; PC<='0'; end if; end process swiatla; PUE-w06 23 Projekt sygnalizatora świateł (3) CL,CP reset 10 (inne) STZ 1001 SPZ 0110 (inne) stan TZ,TC,PZ,PC 01 stany: process(clk, CL, CP, reset) begin if reset then s<= SPZ; end if; CLP <= CL & CP; case s is when SPZ => if CLP="10" then s<=STZ ; end if; when STZ => if CLP="01" then s<=SPZ; end if; end case; end process stany; end architecture CzeZieMin; PUE-w06 24