Podstawy Techniki Cyfrowej i Mikroprocesorowej 1
Transkrypt
Podstawy Techniki Cyfrowej i Mikroprocesorowej 1
Programowalne układy cyfrowe – Studia niestacjonarne II – Wykład 5 Podstawy języka VHDL Very high speed integrated Hardware Description Language dr inŜ. Sławomir Sambor [email protected] ITA, budynek C-5 pokój 708, Tel. 0 71 320 30 78 http://zstux.ita.pwr.wroc.pl/slawek/ przemysłowy standard języka HDL (IEEE Std 1076-1987, IEEE Std 1076-1993) VHDL jest językiem przenośnym moŜe być stosowany przez systemy róŜnych firm Powszechnie stosowany w specyfikacjach układów cyfrowego przetwarzania sygnałów 1 Jednostka projektowa Język VHDL DESIGN ENTITY JEDNOSTKA PROJEKTOWA ENTITY DECLARATION WEJŚCIE/WYJŚCIE Zawiera uŜyteczne konstrukcje semantyczne umoŜliwiające zwięzłą specyfikację złoŜonych układów cyfrowych Projekt moŜe być opisany hierarchicznie (na wielu poziomach) MoŜliwe jest korzystanie z biblioteki gotowych elementów i tworzenie podukładów (tzw. komponentów) PARAMETRY ARCHITECTURE BODY FUNKCJE I DZIAŁANIE entity HALFADD is port (A,B : in bit; SUM, CARRY : out bit); end HALFADD; architecture BEHAVIORAL of HALFADD is begin SUM <= A xor B; CARRY <= A and B; end BEHAVIORAL; Jednostka projektowa języka VHDL Najprostsza struktura pliku Słowo kluczowe Komunikacja z otoczeniem entity Key Word entity HALFADD is Deklaracje port (A,B : in bit; Sygnałów we/wy SUM, CARRY : out bit); end HALFADD; architecture architecture architecture architecture BEHAVIORAL of HALFADD is begin SUM <= A xor B; CARRY <= A and B; Działanie układu Podstawy Techniki Cyfrowej i Mikroprocesorowej end BEHAVIORAL; Sekcja opisu logicznego 1 Jednostka deklaracji Jednostka deklaracji entity HALFADD is port (A,B : in bit; SUM, CARRY : out bit); end HALFADD; entity HALFADD is Deklaracja sygnałów •in - wejściowy port (A,B : in bit; • nazwa •out - wyjściowy • tryb •inout - dwukierunkowy • typ danych •buffer - wyjściowy z moŜliwością odczytu SUM, CARRY : out bit); end HALFADD; Typy danych: bit, bit_vector, integer, Boolean Style specyfikacji - przykłady Blok architektury architecture Budowa_Sumatora1 of Sumator is signal S1, S2 : bit; begin Bramka_Not1 : entity Work.Gate_Not port map (wej1, S1); Bramka_Not2 : entity Work.Gate_Not port map (wej2, S2); Bramka_And1 : entity Work.Gate_And port map (S1, S2, wyj); end Budowa_Sumatora1; Architektura opisuje sposób działania jednostki (entity) lub jej budowę (strukturę). architecture BEHAVIORAL of HALFADD is begin SUM <= A xor B; Style specyfikacji CARRY <= A and B; • funkcjonalny (behavioralny) end BEHAVIORAL; architecture Budowa_Sumatora2 of Sumator is signal S1, S2 : bit; begin process (wej1, wej2) S1 <= not wej1 after 2 ns; S2 <= not wej2 after 2 ns; wyj <= S1 and S2 after 2 ns; end process; end Budowa_Sumatora2; • przepływ danych (dataflow) • strukturalny Blok architektury Elementy strukturalne języka VHDL architecture nazwa_arch of nazwa_jednostki is Definicje i deklaracje: (typów, podtypów, stałych, sygnałów, komponentów,konfiguracji) begin – instrukcje przypisania wartości do sygnałów – procesy – komponenty end nazwa_arch; Podstawy Techniki Cyfrowej i Mikroprocesorowej Słowa kluczowe Identyfikatory Obiekty danych Operatory Atrybuty Instrukcje 2 Słowa kluczowe Identyfikatory abs downto library postponed Srl access else linkage procedure Subtype after elsif literal process Then alias end loop pure To BEGIN, END.. all entity map range Transport and exit mod record Type IF, THEN, CASE... architecture file nand register Unaffected array for new reject Units AND, OR, NAND, XOR... assert function Next rem Until attribute generate Nor report Use SIGNAL, COMPONEN, IN, OUT begin generic Not return Variable block group Null rol Wait Identyfikatory mogą się składać z liter, cyfr i podkreślników Wielkość liter nie ma znaczenia Nazwa musi się rozpoczynać od litery Nazwa nie powinna być dłuŜsza niŜ 16 znaków Nazwa powinna być znacząca body guarded Of ror When buffer if On select While bus impure Open severity With case in Or signal Xnor component inertial Others shared Xor configuration inout Out sla Ta_Sama_Nazwa 16_bit_bus : integer; -- błędnie TA_SAMA_NAZWA _bus_16_bit_ : integer; -- błędnie ta_sama_nazwa bus_16_bit : integer; -- O.K. constant is Package sll disconnect label Port sra Obiekty danych Obiekty danych słuŜą do przechowywania wartości. WyróŜnia się trzy klasy obiektów: • sygnał – signal Pojęcie typu danych Język VHDL jest bardzo silnie zorientowany na typy danych. KaŜdy obiekt musi mieć zdefiniowany typ i moŜe przechowywać dane tylko tego typu. SIGNAL signal_name : type_name ; • zmienne – variable entity HALFADD is • stałe – constant port (A,B : in bit; Wartości zmiennych są przypisywane natychmiast, wartości sygnałów – z pewnym opóźnieniem. Odpowiednikiem sprzętowym sygnału jest ścieŜka w układzie scalonym. Zmienna nie ma odpowiednika sprzętowego i słuŜy do obliczeń na wyŜszym poziomie abstrakcji. SUM, CARRY : out bit); end HALFADD; Wartości dozwolone w sygnale typu bit: ‘0’, ‘1’ Przy operacji przyporządkowania sygnałów, typy danych po kaŜdej stronie operatora przyporządkowania muszą być zgodne Typy danych Predefiniowane typy danych WyróŜnia się 10 typów danych sygnału: STD_LOGIC, STD_LOGIC_VECTOR BIT, BIT_VECTOR, STD_LOGIC, STD_LOGIC_VECTOR, (STD_ULOGIC), SIGNED, UNSIGNED, INTEGER, LIBRARY IEEE; use IEEE.Std_Logic_1164.all; STD_LOGIC: 0, 1, Z, –, L, H, U, X, W STD_LOGIC_VECTOR jest tablicą obiektów z STD_LOGIC ENUMERATION, BOOLEAN Podstawy Techniki Cyfrowej i Mikroprocesorowej 3 Sygnały Sygnał moŜe być zdefiniowany w jednostce deklaracji oraz w części deklaracyjnej architektury lub pakietu. Sygnał posiada dwie cechy z nim skojarzone: Stałe typ wartość Składnia signal nazwa_syg: typ_syg[:=wart_pocz]; Stałe to takie obiekty danych, których wartości nie zmieniają się w trakcie symulacji Stałe mogą być zadeklarowane w jednostce projektowej, pakiecie, procesie, architekturze, funkcji i procedurze Składnia: constant nazwa : typ := wartość; np.: constant zero:STD_LOGIC_VECTOR(3 DOWNTO 0):=”0000”; np.: signal s1, s2 : bit; signal liczba : integer := 7; Typ wyliczeniowy Typ wyliczeniowy c.d. Typ wyliczeniowy (enumeration type) moŜe być definiowany przez uŜytkownika. Przykład: Typ wyliczeniowy jest kodowany na minimalnej type MY_STATE is (RESET, IDLE, RW_CYCLE, INT_CYCLE); liczbie bitów w zapisie wg NKB: ... RESET <= ”00” signal STATE : MY_STATE; IDLE <= ”01” signal TWO_BIT : bit_vector (0 to 1); RW_CYCLE <= ”10” ... INT_CYCLE <= ”11” STATE <= RESET; O.K. Ale do sygnału STATE nie moŜna przyporządkować kaŜdego 2-bitowego ciągu binarnego. STATE <= ”00” NIE STATE <= TWO_BIT NIE Tablice Tablice Typy BIT_VECTOR oraz STD_LOGIC_VECTOR są signal Z_BUS:bit_vector(3 downto 0); tablicami sygnałów typu BIT i STD_LOGIC signal C_BUS:bit_vector(1 to 4); Dane typu tablicowego mogą być definiowane przez uŜytkownika Z_BUS <= C_BUS; Zakres tablicy jest definiowany pod odpowiednią deklaracją za pomocą słów kluczowych: „to” „downto” Przyporządkowanie dla danych tego samego typu i zakresu Z_BUS(3) <= C_BUS(1); Z_BUS(2) <= C_BUS(2); Z_BUS(1) <= C_BUS(3); TYPE Byte IS ARRAY (7 DOWNTO 0) OF STD_LOGIC; Z_BUS(0) <= C_BUS(4); SIGNAL X : Byte; Z_BUS(3 downto 2) <= "00"; C_BUS(2 to 4) <= Z_BUS(3 downto 1); W przyporządkowaniu moŜna odwoływać się do fragmentów tablic Podstawy Techniki Cyfrowej i Mikroprocesorowej 4 Atrybuty Przykład (atrybuty) Dostarczają dodatkowych informacji o obiektach (np. sygnałach, zmiennych, typach lub komponentach) Pewna liczba atrybutów jest predefiniowana type count is integer range 0 to 127 type states is (st1, st2, st3, st4); Składnia obiekt’atrybut[(parametr)]; Przykładowe atrybuty count’left = 0 count’right = 127 states’left = st1 ‘EVENT – równy TRUE, gdy zachodzi zmiana wartości sygnału, ‘STABLE – równy TRUE, gdy nie zachodzi zmiana wartości sygnału ‘LEFT - zwraca lewą granicę zakresu ‘RIGHT - zwraca prawą granicę zakresu ‘RANGE - zwraca zakres typu states’high = st4 If Clock’event and Clock = ‘1’ then Q := D; Operatory - przykłady Operatory signal A_BUS, B_BUS, Z_BUS : library IEEE; use IEEE.Std_Logic_1164.all; std_logic_vector (3 downto 0); entity MVLS is Z_BUS <= A_BUS and B_BUS; port (A,B,C : in std_logic; Z_BUS(3) <= A_BUS(3) and B_BUS(3); Z : out std_logic); Z_BUS(2) <= A_BUS(2) and B_BUS(2); end MVLS ; Z_BUS(1) <= A_BUS(1) and B_BUS(1); architecture EX of MVLS is Z_BUS(0) <= A_BUS(0) and B_BUS(0); begin if A = B then Z <= A and not(B or C); end EX ; Z <= '1'; else Z <= '0'; end if; Instrukcje WspółbieŜne instrukcje przypisania sygnału WSPÓŁBIEśNE I SEKWENCYJNE WspółbieŜne (Concurrent assignment statement) (Concurrent Signal Assignment Statements) podstawowe przypisanie do sygnału (simple signal assignment statement) warunkowe przypisanie do sygnału (conditional signal assignmenet statement) selektywne przypisanie do sygnału (selected signal assignment statement) Sekwencyjne (Sequential assignment statement) WspółbieŜne: X <= A + B; Zachowanie układu jest niezaleŜne od kolejności Z <= C + X; instrukcji przyporządkowania sygnałów. Z <= C + X; Stosowane w specyfikacji typu „przepływ danych” X <= A + B; (dataflow description). Sekwencyjne: Instrukcje sekwencyjne są stosowane w specyfikacji behawioralnej (behavioral description). Przede wszystkim w tzw. procesach (process). Porządek zapisu instrukcji sekwencyjnych zmienia działanie układu. Podstawy Techniki Cyfrowej i Mikroprocesorowej – when –else – with –select 5 Instrukcja podstawowa Instrukcja podstawowa (przykład) Składnia: library ieee; signal_name <= expression; use ieee.std_logic_1164.all; signal_name <= expression after delay; entity mux is port ( Przykład: a, b, c, d : in std_logic ; ENTITY simpsig IS s: in std_logic_vector (1 downto 0) ; PORT (a, b: IN BIT; x: out std_logic ) ; c, d: OUT BIT) ; end mux; END simpsig; architecture archmux of mux is ARCHITECTURE arch1 OF simpsig IS begin BEGIN x <= (a and not(s(1)) and not(s(0))) c <= a AND b; or (b and not(s(1)) and (s(0)) d <= b; or (c and (s(1) and not(s(0))) END arch1; or (d and (s(1) and (s(0)); end archmux Instrukcja selektywna Instrukcja selektywna - with-select Składnia: with sel_sig select signal_name <= value_a when value1_of_sel_sig , value_b when value2_of_sel_sig , UŜywana wewnątrz architektury Podobieństwo do znanej instrukcji case MoŜna określać kilka wartości lub zakres Wartości nie mogą się powtarzać value_c when value3_of_sel_sig , ... value_x when last_value_of_sel_sig; Przykład: with INT_A select Z <= A when 0, B when 1 to 3, C when 4 | 6 | 8, D when others; Instrukcja warunkowa Instrukcja warunkowa - when-else Odpowiednik instrukcji if-then-else Składnia: signal_name <= value_a when condition1 else value_b when condition2 else Składnia sygnał <= wart1 when warunek1 else wart2 when warunek2 else value_c when condition3 else ... [...] value_x; wartN when warunekN; A <= In1 when war1=1 else In2 when war2=2 else In3; Podstawy Techniki Cyfrowej i Mikroprocesorowej 6 Proces Instrukcje sekwencyjne Instrukcje sekwencyjne są stosowane w specyfikacji behawioralnej (behavioral description) Name :PROCESS (sensitivity_list) Przede wszystkim w tzw. procesach (process) BEGIN Składnia: process ( ) begin .. end process Lista czułości Instrukcja sekwencyjna #1 Instrukcja sekwencyjna #2 Proces ....... Instrukcja IF Instrukcja sekwencyjna # N Instrukcja CASE END PROCESS name; Procesy c.d. Procesy Konstrukcja wykonywana równolegle Występuje wewnątrz architektury Zawiera opis zachowania Instrukcje wewnętrzne wykonywane są sekwencyjnie Zawiera: Instrukcje sekwencyjne są wykonywane kolejno jedna po drugiej listę czułości (ang. sensitivity list); jest to lista sygnałów, których zmiana powoduje aktywację procesu Procesy nie mogą być zagnieŜdŜane Wewnątrz architektury moŜe występować dowolna liczba procesów W części deklaracyjnej moŜna definiować: typy, podtypy, stałe, atrybuty i zmienne Nie moŜna deklarować sygnałów Składnia: [etykieta:] process [ ( lista_czułości ) ] [ is ] --definicje i deklaracje begin --instrukcje_sekwencyjne; end process [ etykieta ] ; Przykładowa organizacja procesu Instrukcja warunkowa if then else architecture A of E is begin -- concurrent statements P1 : process begin -- sequential statements end process P1; -- concurrent statements Jest to instrukcja sekwencyjna Część elsif moŜe wystąpić dowolną ilość razy Część else nie musi wystąpić Część elsif moŜe uŜywać wielokrotnie MoŜe być zagnieŜdŜana Składnia: if warunek then P2 : process begin sekwencja_instrukcji1 {elsif warunek then -- sequential statements end process P2; sekwencja_instrukcji2 } [else -- concurrent statements end A; Podstawy Techniki Cyfrowej i Mikroprocesorowej sekwencja_instrukcji3] end if ; 7 if then else Przykład (bramka ex-or) entity xor_gate is port ( a: in bit; b: in bit; y: out bit); end xor_gate; architecture xor_gate_arch1 of xor_gate is begin gate:process(a, b) begin if a=b then y<='0'; else y<='1'; end if; end process gate; end xor_gate_arch1; architecture xor_gate_arch2 of xor_gate is begin Y <= '0' when a=b else '1'; end xor_gate_arch2; Instrukcja wyboru - case Instrukcja sekwencyjna Podobna do instrukcji with select MoŜna określać kilka wartości lub zakres Wartości nie mogą się powtarzać Składnia (przykład): case zm_wielow is when wybór1 => sekwencja1_instrukcji ; when wybór2 => sekwencja2_instrukcji ; [when others => sekwencja3_instrukcji ; ] end case; Podstawy Techniki Cyfrowej i Mikroprocesorowej Przykłady case sterowanie is when "00" => sel := 1 when "01" => sel := 1; when "10" => sel := 2; when others => sel := 3; end case; case inp is when 0 => Y <= A; when 1 to 3 => Y <= B; when 4|6|8 => Y <= C; when others => Y <= 'X'; end case; entity mp is port ( instr : in instrukcja; addr : in integer; data : inout integer:=0); end mp; architecture opis of mp is type regtype is array (0 to 255) of integer; signal a, b : integer; signal reg : regtype; begin process(instr) begin case instr is when lda => a<= data; when ldb => b<= data; when add => a<= a + b; when sub => a<= a - b; when sta => reg(addr)<=a; when stb => reg(addr)<=b; when outa => data<= a; when xfr => a <= b; end case; end process; end opis; 8