Projektowanie systemów cyfrowych z wykorzystaniem języka VHDL Układy sekwencyjne
Instrukcje sekwencyjne c.d. case-when – odpowiednik współbieżnej instrukcji with-select-when –należy wymienić wszystkie możliwe warunki (wyłączające się) –warunki są sprawdzane jednocześnie Składnia: case wyrazenie is when wybor => instrukcje sekwencyjne; when others => instrukcje sekwencyjne | null; end case; Przykład: case y is when „00” => x <= a; when „01” => x <= b; when „10” => x <= c; when others => x <= d; end case;
Instrukcje sekwencyjne c.d. for-loop – pętla wykonująca określoną liczbę iteracji na podstawie wartości kontrolnej i Składnia: for wartosc_kontrolna in zakres loop instrukcje sekwencyjne; end loop; Przykład: for i in 0 to 7 loop x(i) <= y(i); i := i + 1; end loop;
Instrukcje sekwencyjne c.d. while-loop – pętla kontynuująca wykonywanie określonej sekwencji instrukcji tak długo jak długo spełniony jest warunek kontrolny Składnia: while warunek_kontrolny loop instrukcje sekwencyjne; end loop; Przykład: while i < 7 loop Q(i) <= R(i) + ‘1’; i:=i+1; end loop;
Instrukcje sekwencyjne c.d. wait – instrukcja chwilowego wstrzymania procesu –wykorzystywana jeśli process nie ma określonej listy czułości Składnia: wait until warunek; -- czekaj dopóki wait on nazwa_sygnalu; -- czekaj na wait for odcinek_czasu; -- czekaj przez Przykład: wait until a = ‘1’; -- czekaj dopóki wait on a; -- czekaj na wait for 20 ns; -- czekaj przez
Instrukcje sekwencyjne c.d. exit – instrukcja wyjścia z pętli przy wykryciu odpowiedniego warunku Składnia: exit [etykieta_petli][when warunek]; -- wyjście warunkowe exit [etykieta_petli]; -- wyjście bezwarunkowe Przykład: Loop1: for i in a downto 0 loop if i > 10 then lub exit loop1 when i < 10; exit loop1;......
Instrukcje sekwencyjne c.d. next – instrukcja służąca do pomijania operacji wewnątrz pętli po spełnieniu określonego warunku Składnia: next [etykieta_petli][when warunek]; Przykład: while i < 7 loop if i = 4 then next; else x(i) <= y(i) xor z(i); end if; end loop;...
Atrybuty Atrybuty wprowadzają dodatkowe informacje o elementach: - interfejs - architektura - sygnał Atrybuty wartości dla typów skalarnych: ‘left -- odwołanie do skrajnej lewej wartości danego typu ‘right-- odwołanie do skrajnej prawej wartości danego typu ‘high-- największa wartość danego typu | prawej ‘low-- najmniejsza wartość danego typu | lewej ‘lenght-- określa liczbę elementów ograniczonej macierzy ‘event-- zwraca true jeśli atrybut zanotował w tym momencie zmianę ‘range-- określa zakres ograniczanego obiektu
Sygnał zegarowy Sposoby określenia sygnału zegarowego dla układu sekwencyjnego: clk = ’1’ -- sygnał zegarowy aktywny poziomem wysokim clk = ’0’ -- sygnał zegarowy aktywny poziomem niskim clk’event -- sygnał zegarowy aktywny przy zmianie stanu (reakcja na obu zboczach sygnału) clk’event and clk = ’1’ -- sygnał aktywny zboczem narastającym clk’event and clk = ’0’ -- sygnał aktywny zboczem opadającym Definicje sygnału zegarowego za pomocą funkcji zawartych w wykorzystywanej bibliotece (std_logic_1164): rising_edge(clk) -- sygnał aktywny zboczem narastającym falling_edge(clk) -- sygnał aktywny zboczem opadającym
Przerzutnik D entity ffd is port(D,clk,R : in bit; Q : out bit); end ffd; architecture ffd1 of ffd is begin process(clk) begin if clk′event and clk = ′1′ then Q <= D; end if; end process; end fdd1; entity ffd is port(D,clk,R : in bit; Q : out bit); end ffd; architecture ffd1 of ffd is begin process begin wait until (clk = ‘1’) Q <= D; end process; end fdd1;
Przerzutnik D Przerzutnik D z asynchronicznym resetem entity ffd is port(D,clk,R : in bit; Q : out bit); end ffd; architecture ffd2 of ffd is begin process(clk,R) begin if R = ′1′ then Q <= ′0′; elsif clk′event and clk = ′1′ then Q <= D; end if; end process; end fdd2;
Przerzutnik D Przerzutnik D z synchronicznym resetem entity ffd is port(D,clk,R : in bit; Q : out bit); end ffd; architecture ffd3 of ffd is begin process(clk) begin if clk′event and clk = ′1′ then if R = ′1′ then Q <= ′0′; else Q <= D; end if; end process; end fdd3;
Przerzutnik D Przerzutnik D z asynchronicznym resetem i setem entity ffd is port(D,clk,R,S : in bit; Q : out bit); end ffd; architecture ffd4 of ffd is begin process(clk,R,S) begin if R = ′1′ then Q <= ′0′; elsif S = ’1’ then Q <= ’1’; elsif clk′event and clk = ′1′ then Q <= D; end if; end process; end fdd4;
Zatrzask D entity ffd is port(D,clk : in bit; Q : out bit); end ffd; architecture ffd5 of ffd is begin process(clk, D) begin if clk = ′1′ then Q <= D; end if; end process; end fdd5;
Przerzutnik T architecture fft1 of fft is signal temp : std_logic; -- sygnal wewnetrzny begin process (clk,R) begin if R = ′1′ then temp <= ′0′; elsif clk′event and clk = ′1′ then temp <= temp xor T; -- przypisanie sekwencyjne end if; end process; Q <= temp; -- przypisanie wspolbiezne end fft1;
Przerzutnik T architecture fft2 of fft is begin process (clk,R) variable temp : std_logic; begin if R = ′1′ then temp := ′0′; elsif clk′event and clk = ′1′ and T = ′1′ then temp := not temp; end if; Q <= temp; end process; end fft2;
Licznik process (clk, reset) variable Qint : std_logic_vector (3 downto 0); begin if reset = '1' then Qint := "0000"; else if clk'event and clk = '1' then if Qint < 9 then Qint := Qint + 1; else Qint := "0000"; end if; Q <= Qint; end process;
Licznik rewersyjny process (clk, reset) begin if reset='1' then counter <= 0; elsif clk='1' and clk'event then if ce='1' then if dir='1' then if counter = 15 then counter <= 0; else counter <= counter + 1; end if; else if counter = 0 then counter <= 15; else counter <= counter - 1; end if; end process; count <= counter;