Modelowanie złożonych układów cyfrowych () funkcje i procedury przykłady (przerzutniki, rejestry) style programowania kombinacyjne bloki funkcjonalne bufory trójstanowe multipleksery kodery priorytetowe PUEw4
Funkcje i procedury (podprogramy) funkcja zwraca pojedynczą wartość, procedura może więcej VHDL traktuje funkcję jak wyrażenie a procedurę jak instrukcję można w nich stosować wyłącznie instrukcje sekwencyjne dozwolone są jedynie zmienne lokalne a nie sygnały wewnętrzne, zmienne lokalne w podprogramach nie mogą być wykorzystane do "pamiętania" stanów (inaczej niż w procesach) argumentami funkcji mogą być stałe i sygnały wynik funkcji to wartość wyrażenia za instrukcją return w obrębie funkcji nie można stosować instrukcji wait PUEw4 2
Funkcje i procedury (podprogramy) przyklad funkcja porownujaca 3 bity function komp3(a,b,c : std_logic) return boolean is if((a xor b) nor (a xor c)) = '' then return true ; else return false; end if; end function komp3; PUEw4 3
Funkcje i procedury (podprogramy) p2. konwersja wektora std_logic na liczbe function vec_int(a : std_logic_vector) return integer is variable p : integer; p := ; for i in a'range loop p := p * 2; case a(i) is when '' 'H'; => p := p +; when others => null; end case; end loop; return p; end function vec_int; L(B)=((..((b3*2+b2)*2+b)*2+b PUEw4 4
Funkcje i procedury (podprogramy) niektore funkcje zdefiniowane w pakiecie standardowym std_logic_64 function rising_edge( signal s : std_ulogic) return boolean; function falling_edge( signal s : std_ulogic) return boolean; zamiast pisac: if zegar'event and (zegar = '') then... wystarczy: if rising_edge(zegar) then... PUEw4 5
Funkcje i procedury (podprogramy) funkcja NAND o dowolnej liczbie argumentow function fnand(signal a: std_logic_vector) return std_logic is variable p : std_logic; p := ''; for i in a'range loop p := p and a(i); end loop; return not p; end fnand; funkcje mozna wywolac tylko w procesie, np....process... if fnand(s) = '' then...;... end process; PUEw4 6
Funkcje i procedury (podprogramy) P = '' gdy liczba jedynek w A jest parzysta procedure test_par( signal A : in std_logic_vector; signal P,N : out std_logic) is variable t : std_logic; t := '' ; for i in A'range loop t := t xor A(i); end loop; P <= t; N <= not t; end test_par; procedura moze byc wywolana w ciele architektury jako wspolbiezna, wykonywana gdy zmienia sie A; jako sekwencyjna w procesie PUEw4 7
Procedura (JK z asynchronicznym zerow.i ustaw.) procedure FFJK( signal C,J,K,R,S : in std_logic; signal Q : inout std_logic; signal QN: out std_logic) is variable JK : std_logic_vector( to ); variable re : boolean; JK := J & K; re := rising_edge(c); if R = '' then Q <= ''; elsif S = '' then Q <= ''; elsif re then case JK is when "" => Q <= ''; when "" => Q <= ''; when "" => Q := not Q; when others => null; end case; end if; QN <= not Q; end FFJK; PUEw4 8
Procedura (JK z asynchronicznym zerow.i ustaw.) procedure FFJK2( signal C,J,K,R,S : in std_logic; signal Q : inout std_logic; signal QN: out std_logic) is variable re : boolean; re := rising_edge(c); if R = '' then Q <= ''; elsif S = '' then Q <= ''; elsif re then Q <= (J and not Q) or (not K and Q); end if; QN <= not Q; end FFJK2; przykladowe wywolania: FFJK(zegar,a,b,reset,set,Q4,Q4not); FFJK2(C=>zegar,J=>a,K=>b,R=>reset,S=>set,Q=>Q4, QN=>Q4not); PUEw4 9
Rejestr równoległy (n przerzutników D) procedure reg( signal C,R : in std_logic; signal D : in std_logic_vector; signal Q : out std_logic_vector ) is if R = '' then Q <= (Q'range => ''); zerowanie wektora o dowolnej dlugosci elsif rising_edge(c) then Q <= D; end if; end procedure reg; PUEw4
Trzy style opisu architektury w VHDL styl przepływowy, z użyciem instrukcji współbieżnych, (na poziomie RTL: register transfer logic) styl behawioralny z użyciem instrukcji procesu styl strukturalny, z wcześniejszym zdefiniowaniem komponentów następnie zestawianych z użyciem listy połączeń PUEw4
Bufor trójstanowy library ieee; use ieee.std_logic_64.all; entity buf3s is port(a, en : in std_logic; z : out std_logic); en a buf3s z end entity buf3s; architecture when_else of three_state is z <= a when en = '' else 'Z'; end architecture when_else; EN PUEw4 2
Multiplekser 2 na entity mux2_ is port( a,b,s : in std_logic; y : out std_logic); end entity mux2_; architecture a of mux2_ is y <= a when s = '' else b; end architecture a; s a b G y architecture a2 of mux2_ is y <= a when s = '' else b when s = '' else 'X'; end architecture a2; PUEw4 3
Koder priorytetowy 4 na 2 Wejścia Wyjścia A 4 koder4_2 2 y valid A3 A2 A A y y2 Valid library ieee; use ieee.std_logic_64.all; entity koder4_2 is port (a: in std_ulogic_vector(3 downto ); y: out std_ulogic_vector( downto ); valid: out std_ulogic); end entity koder4_2; PUEw4 4
Koder priorytetowy 4 na 2 (2) architecture DontCare of koder4_2 is Wejścia with a select A3 A2 A A y y <="" when "", "" when "", "" when "", "" when "", "" when others; valid <= '' when a()='' or a()='' or a(2)='' or a(3)='' else ''; end architecture DontCare; Wyjścia y2 Valid!to nie jest opis realnego ukladu, ze wzgl. na PUEw4 5
Koder priorytetowy 4 na 2 (3) architecture Ordered of koder4_2 is Wejścia A3 A2 A A y <="" when a(3)='' else "" when a(2)='' else "" when a()='' else "" when a()='' else "" ; valid <= '' when a()='' or a()='' or a(2)='' or a(3)='' else ''; end architecture Ordered; y Wyjścia y2 Val PUEw4 6
Koder priorytetowy 4 na 2 (4) library ieee; use ieee.numeric_std.all; architecture Match of koder4_2 is y <="" when std_match(a,"") else "" when std_match(a,"") else "" when std_match(a,"") else "" when std_match(a,"") else "" ; valid <= '' when a()='' or a()='' or a(2)='' or a(3)='' else ''; end architecture Match; funkcja std_match traktuje wartości nieistotne jak rzeczywiście nieistotne warunki wady: pokrywajace sie instukcje przypisania A3 Wejścia A2 A A y Wyjścia y2 Val PUEw4 7
Koder priorytetowy 4 na 2 (5) architecture Sequential of koder4_2 is proces(a) is if a(3)='' then y <= ""; valid <= ''; elsif a(2)='' then y <= ""; valid <= ''; elsif a()='' then y <= ""; valid <= ''; elsif a()='' then y <= ""; valid <= ''; else y <= ""; valid <= ''; end if; end process; end architecture Sequential; styl sekwencyjny dla ukladu kombinacyjnego! zasada: jesli przypisanie do y w jednej sciezce procesu, to rowniez w kazdej innej; w przeciwnym razie kompilator wstawi przerzutnik (zatrzask) A3 Wejścia A2 A A y Wyjścia y2 Val PUEw4 8
Koder priorytetowy 4 na 2 (6) architecture Sequential2 of koder4_2 is proces(a) is valid <= ''; if a(3)='' then y <= ""; elsif a(2)='' then y <= ""; elsif a()='' then y <= ""; elsif a()='' then y <= ""; else y <= ""; valid <= ''; end if; end process; end architecture Sequential2; przy instrukcjach wspolbieznych byly by 2 sterowniki dla tego samego sygnalu valid w procesie sekwencyjnym nie ma konfliktu A3 Wejścia A2 PUEw4 9 A A y Wyjścia y2 Val
Układ cyfrowy złożony z bramek i rejestru () entity kompleks is port (C,RA,RS : in std_logic; D: in std_logic_vector(4 downto ); Q: out std_logic_vector(3 downto ); end entity kompleks; PUEw4 2
Układ cyfrowy złożony z bramek i rejestru () architecture ar of kompleks is p: process if RA = '' then Q() <= ''; else wait until rising_edge(c); Q() <= D() xor D(); end if; end process p; p: process(c,ra) if RA = '' then Q() <= ''; elsif rising_edge(c) then Q()<= D(2) and not D(3); end if; end process p;... PUEw4 2
Układ cyfrowy złożony z bramek i rejestru () p2: process wait until rising_edge(c); Q(2) <= not D() or not D(4) or not RS; end process p2; p3: process(c) if rising_edge(c) then if RS='' then Q(3)<= ''; else Q(3) <= D(2) and D(4); end if; end if; end process p3; end architecture ar; PUEw4 22