---------------------------------------------------------------------------------- -- Dane wejściowe: Paweł Soja -- -- Zakodowana tabela przejść / wyjść automatu A1: -- |-----+-----+-----+-----| -- | q | x=0 | x=1 | y | -- |-----+-----+-----+-----| -- | 000 | 100 | 010 | 1 | -- | 001 | 100 | 011 | 1 | -- | 010 | 011 | 010 | 1 | -- | 011 | 000 | 001 | 0 | -- | 100 | 000 | 001 | 0 | -- |-----+-----+-----+-----| ---------------------------------------------------------------------------------- library IEEE; use IEEE.STD_LOGIC_1164.all; ---------------------------------------------------------------------- entity cw10z1 is port (clr, clk, x : in std_logic; y : out std_logic; q : inout std_logic_vector(1 to 3)); end cw10z1; ---------------------------------------------------------------------- -- architektura beh1 (behawioralna) -- opis za pomocą tablicy (tabela przejść/wyjść automatu A1) -- z wykorzystaniem instrukcji "case" architecture beh1 of cw10z1 is signal d : std_logic_vector(1 to 3); begin ------------------------------------------------------------------- uk1: process(q, x) -- funkcja przejść: p begin case q is when "000" => if x='0' then d <= "100"; -- p(000,0) = 100 else d <= "010"; -- p(000,1) = 010 end if; when "001" => if x='0' then d <= "100"; -- p(001,0) = 100 else d <= "011"; -- p(001,1) = 011 end if; when "010" => if x='0' then d <= "011"; -- p(010,0) = 011 else d <= "010"; -- p(010,1) = 010 end if; when "011" => if x='0' then d <= "000"; -- p(011,0) = 000 else d <= "001"; -- p(011,1) = 001 end if; when "100" => if x='0' then d <= "000"; -- p(100,0) = 000 else d <= "001"; -- p(100,1) = 001 end if; when others => d <= "XXX"; end case; end process uk1; ------------------------------------------------------------------- uk2: process(q) -- funkcja wyjść: w begin case q is when "000" => y <= '1'; -- w(000) = 1 when "001" => y <= '1'; -- w(001) = 1 when "010" => y <= '1'; -- w(010) = 1 when "011" => y <= '0'; -- w(011) = 0 when "100" => y <= '0'; -- w(100) = 0 when others => y <= 'X'; end case; end process uk2; ------------------------------------------------------------------- rej: process(clk, clr) -- rejestr równoległy (3 przerzutniki D) begin if clr = '1' then -- zerowanie asynchroniczne q <= "000"; elsif rising_edge(clk) then -- na narastającym zboczu sygnału clk q <= d; -- zmiana stanu zgodnie z funkcją przejść end if; end process rej; ------------------------------------------------------------------- end beh1; ----------------------------------------------------------------------------------