----------------------------------------------------------------------------------
-- 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;
----------------------------------------------------------------------------------