Elementy języka VHDL obiekty typy danych atrybuty pakiety i biblioteki instrukcje współbieżne instrukcje sekwencyjne PUE-w3 1
Obiekty (sygnały, zmienne, stałe, pliki) Obiekty służą do zapisu i pamiętania danych Sygnały (wejściowe, wejściowe i wewnętrzne) - są funkcjami czasu -- przykłady deklaracji sygnałów: signal zegar : bit; -- domyslna wartosc pocz. '0' signal reset : bit := '1'; -- inicjalizacja '1' signal x : integer; -- domyslna w.p. -2147483647 signal alfa : integer range 0 to 255; signal mi : bit_vector(9 downto 0):= (others => '1') -- operator => oznacza przyporzadkowanie -- (w.pocz. wszystkich elem. wektora bedzie '1') PUE-w3 2
Obiekty (sygnały, zmienne, stałe, pliki) Zmienne - nie są funkcjami czasu stosuje się tylko w obrębie procesu lub podprogramu wartość uzyskują w wyniku przypisania := (natychmiastowo) variable u : integer range 0 to 127 := 5; variable xx: integer range 500 downto 5 := 100; PUE-w3 3
Obiekty (sygnały, zmienne, stałe, pliki) constant Ucc : bit := '1'; constant tuzin : integer := 12; constant Vec : bit_vector(7 downto 0) := "10101001"; file mplik : text [open write_mode] is "dane.dat" -- nawiasy [ ] oznaczają opcjonalność -- tryby: read_mode, write_mode, append_mode PUE-w3 4
Typy danych: skalarne, złożone, wektorowo-skalarne Podstawowe typy danych są zdefiniowane w tzw. pakietach standardowych (plikach), objętych normą IEEE Std 1164-1993 i dalszych (IEEE Std 1076-2001,...) Dla każdego typu istnieją ściśle określone operatory (...) Są trzy rodzaje typów skalarnych: numeryczne (integer, std_logic,...) wyliczeniowe i fizyczne (time) Można tworzyć podtypy zawężając zakres wartości typu bazowego. Istnieją również podtypy standardowe, np.: subtype natural is integer range 0 to 2147483647 PUE-w3 5
Typy danych: skalarne, złożone, wektorowo-skalarne Liczby całkowite: integer (-2 31-1 to 2 31-1) (liczby rzeczywiste): real ( -1.0E+38 to 1.0E+38) Typ bitowy: bit ('0', '1') Typ boolowski: boolean (false, true) Typ znakowy: character (..,'0','1',..'A','B',..'a','b',...) Typ fizyczny czasowy: time (0 to 2147483647) jednostek (fs,ps,ns,us,ms,sec,min,hr) Typy wyliczeniowe, np.: type kolory is (niebieski, zielony, czerwony); PUE-w3 6
Tworzenie własnych podtypów (zalecane!) subtype bajtowy is integer range 0 to 255; subtype mlitery is character range 'a' to 'z'; subtype cyfry is character range '0' to '9'; type zakres256 is range 0 to 255; -- typ liczbowy type dekada is range 0 to 9; -- inny typ liczbowy subtype dekada is zakres256 range 0 to 9; zawężanie zakresu zwiększa efektywność obliczeń i redukuje złożoność logiczną projektu operacje można przeprowadzać tylko na danych tego samego typu! PUE-w3 7
Wielowartościowy, niejednoznaczny typ std_ulogic type std_ulogic is ( 'U', -- stan niezainicjowany 'X', -- wymusza stan nieznany '0', -- wymusza stan 0 '1', -- wymusza stan 1 'Z', -- stan wysokiej impedancji 'W', -- słaby stan nieznany (odczyt) 'L', -- słabe 0 (odczyt z R do masy) 'H', -- słabe 1 (odczyt Ucc przez R) '-'); -- stan dowolny (don't care) "metalogiczne" wartości 'U','X','W','-' służą do opisu modelu podczas symulacji, a nie realnego układu gdy przewód jest sterowany różnymi wartościami to wynik nie jest określony (unresolved) PUE-w3 8
Funkcja rozdzielcza resolved i typ std_logic funkcja resolved posługuje się poniższą tablicą "rozstrzygajacą": constant resolution_table : stdlogic_table := ( -- U X 0 1 Z W L H - ---------------------------------------------------- ( 'U', 'U', 'U', 'U', 'U', 'U', 'U', 'U', 'U'),-- U ( 'U', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X'),-- X ( 'U', 'X', '0', 'X', '0', '0', '0', '0', 'X'),-- 0 ( 'U', 'X', 'X', '1', '1', '1', '1', '1', 'X'),-- 1 ( 'U', 'X', '0', '1', 'Z', 'W', 'L', 'H', 'X'),-- Z ( 'U', 'X', '0', '1', 'W', 'W', 'W', 'w', 'X'),-- W ( 'U', 'X', '0', '1', 'L', 'W', 'L', 'W', 'X'),-- L ( 'U', 'X', '0', '1', 'H', 'W', 'W', 'H', 'X'),-- H ( 'U', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X'),-- - ); PUE-w3 9
Typy danych: skalarne, złożone, wektorowo-skalarne Są to indeksowane zbiory elementów jednego typu (array) lub różnych typów (record) type slowo16 is array(0 to 15) of bit; type memory16 is array(natural range <>) of slowo16; -- typ o nieokreslonej pojemnosci (range <>); -- zmienne tego typu musza ukonkretnic pojemnosc: variable mem : memory16(0 to 2**n-1); typy predefiniowane: string, bit_vector signal a : bit_vector(0 to 3); -- nie zalecane signal b : bit_vector(3 downto 0); -- zalecane PUE-w3 10
Typy danych: skalarne, złożone, wektorowo-skalarne Aby umożliwić operacje arytmetyczne na wektorach o elementach typu bit lub std_logic zdefiniowano typy signed oraz unsigned: type signed is array (natural range <>) of std_logic; --... use ieee.numeric_std.all; -- klauzula odn. do pakietu --... variable s : unsigned(7 downto 0); -- s moze miec wartosci od 255 do 0 PUE-w3 11
Atrybuty typów i obiektów atrybut związany jest z typem lub obiektem przez apostrof ' 'event zwraca true gdy zmienił się związany sygnał 'right, 'left, 'high, 'low zwr. granice typu type zakres is range 15 downto -5; variable P : integer := zakres'left; --P:=15 variable R : integer := zakres'right; --R:=-5 variable S : integer := zakres'high; --S:=15 variable T : integer := zakres'low; --T:=-5 PUE-w3 12
Pakiety i biblioteki (1) Obiekty, podprogramy i modele do wielokrotnego wykorzystywania umieszcza się w zbiorach zwanych pakietami (package). Są pakiety standardowe (ujęte w normach IEEE) i tworzone indywidualnie package moj_pakiet is -- deklaracje stalych, typow, funkcji end moj_pakiet package body moj_pakiet is -- cialo pakietu end moj_pakiet Skompilowane pakiety i projekty są umieszczane w zbiorach zwanych bibliotekami (library). Biblioteki std, work są domyślnie dostępne w każdym projekcie, korzystanie z innych wymaga klauzuli: PUE-w3 13
Pakiety i biblioteki (2) library nazwa_biblioteki; use nazwa_biblioteki.nazwa_pakietu.nazwa_elementu; -- lub: use nazwa_biblioteki.nazwa_pakietu.all; -- aby uzyc wielowartosciowych typow std_logic -- nalezy na poczatku projektu dopisac: library ieee; use ieee.std_logic_1164.all; PUE-w3 14
Instrukcje współbieżne Instrukcje współbieżne w VHDL to: przypisanie do sygnału (<=) instrukcja procesu process instrukcja łączenia komponentów port map instrukcja powielania generate instrukcja blokowa block instrukcja współbieżnego wykonania procedury Instrukcje współbieżne są wykonywane równocześnie (nie ma znaczenia kolejność ich wypisania); odwzorowują działanie układów cyfrowych o strukturze równoległej PUE-w3 15
Przypisanie warunkowe współbieżne when-else entity mux2_1 is port( a,b,s : in std_logic; y : out std_logic); end entity mux2_1; a b s mux2_1 y architecture a1 of mux2_1 is y <= a when s = '0' else b; end architecture a1; architecture a2 of mux2_1 is y <= a when s = '0' else b when s = '1' else 'X'; end architecture a2; PUE-w3 16
Przypisanie współbieżne selektywne: with-select entity mux8_4_1 is port (a,b,c,d : in std_logic_vector(7 downto 0); adr : in std_logic_vector(1 downto 0); y : in std_logic_vector(7 downto 0)); end entity mux8_4_1; architecture a1 of mux8_4_1 is begin with adr select y <= a when "00", b when "01", c when "10", d when "11", "XXXXXXXX" when others; end architecture a1; PUE-w3 17
Instrukcje sekwencyjne odwzorowują działanie sekwencyjnych układów cyfrowych stosuje się do opisu procesów oraz procedur i funkcji Lista instrukcji sekwencyjnych: przypisanie do zmiennej (:=) instrukcja warunkowa if-then-else, instrukcja wyboru case, instrukcja czekania wait instrukcja pętli loop, (oraz exit, next) instrukcja pusta null, instrukcja testowa assert PUE-w3 18
Instrukcja czekania na zdarzenie: wait on entity ffd is D port (D,C,R : in bit; Q : out bit); C end entity ffd; architecture a2 of ffd is begin process -- nie ma listy wrazliwosci! begin wait on (R,C); --czekaj na zmiane R,C if R = '1' then Q <= '0'; elsif (C'event and C='1') then Q <=D; end if; end process; end architecture a2; R Q PUE-w3 19
Instrukcja czekania wait for wait for 25 ns ; -- czekaj przez 25ns wait on a for 250 ns ; -- czekaj na zmiane a przez 250 ns wait on b = '0' for 150 ns; -- czekaj na spełnienie war. B = '0' przez 150 ns wait on a until d = '1' for 66 ns; -- czekaj na a dopóki nie spełni się warunek -- d = '1', przez 66 ns Proces bez listy wrażliwości wykonuje się od początku (begin) do instrukcji wait, zatrzymuje do spełnienia warunku, po czym wykonuje do end process a następnie rozpoczyna od nowa. PUE-w3 20
Instrukcja warunkowa (sekwencyjna): if-then-else entity fft is port (T,C,R : in bit; Q out bit); T Q end entity fft; C R architecture a1 of fft is begin process (C,R); -- lista wrazliwosci variable tq; -- zmienna lokalna begin -- poczatek procesu if R = '1' then tq := '0'; -- zerowanie elsif C'event and C = '1' and T = '1' then tq := not tq; -- zmiana stanu Q <= tq; -- przypisanie do sygn. wyj. end process; end architecture a1; ( w procesie nie można stosować when - else!) PUE-w3 21
Instrukcja pętli: loop -- petla wykonujaca sie okreslona ilosc razy: petla1: for i in 0 to A'length -1 loop B(i) <= not A(i); end loop petla1; -- wykonanie zalezne od warunku (flaga) process begin while flaga loop zegar <= not zegar; -- zegar dziala wait for okres_zegara/2; -- typ time end loop; end process; PUE-w3 22
Instrukcje sekwencyjne: exit, next, null, assert exit [etykieta_petli] [when warunek]; if warunek then exit; end if; -- wyjscie z petli next [etykieta_petli][when warunek]; -- przejscie do nastepnej iteracji w petli null; -- nie wykonuje sie zadne dzialanie -- poza przejsciem do nastepnej instrukcji -- do sprawdzania poprawnosci i alarmowania assert (t_setup < 2 ns) report "Za krotki czas ustalania!" severity Warning; --lub: Failure, Error, Note PUE-w3 23