uaveiro-leci/1ano/2semestre/lsd/pratica08/Chronometer/ControlUnit.vhd

82 lines
1.5 KiB
VHDL

library IEEE;
use IEEE.STD_LOGIC_1164.all;
entity ControlUnit is
port(reset : in std_logic;
clk : in std_logic;
statop : in std_logic;
laprst : in std_logic;
cntRst : out std_logic;
cntEnb : out std_logic;
regEnb : out std_logic);
end ControlUnit;
architecture Behavioral of ControlUnit is
type TState is (CLEARED, STARTED, STOPPED, LAPVIEW);
signal s_currentState, s_nextState : TState;
begin
sync_proc : process(clk)
begin
if (rising_edge(clk)) then
if (reset = '1') then
s_currentState <= CLEARED;
else
s_currentState <= s_nextState;
end if;
end if;
end process;
comb_proc : process(s_currentState, statop, laprst)
begin
case (s_currentState) is
when CLEARED =>
cntRst <= '1';
cntEnb <= '1';
regEnb <= '1';
if (statop = '1') then
s_nextState <= STARTED;
else
s_nextState <= CLEARED;
end if;
when STARTED =>
cntRst <= '0';
cntEnb <= '1';
regEnb <= '1';
if (laprst = '1') then
s_nextState <= LAPVIEW;
elsif (statop = '1') then
s_nextState <= STOPPED;
else
s_nextState <= STARTED;
end if;
when STOPPED =>
cntRst <= '0';
cntEnb <= '0';
regEnb <= '1';
if (statop = '1') then
s_nextState <= STARTED;
elsif (laprst = '1') then
s_nextState <= CLEARED;
else
s_nextState <= STOPPED;
end if;
when LAPVIEW =>
cntRst <= '0';
cntEnb <= '1';
regEnb <= '0';
if (laprst = '1') then
s_nextState <= STARTED;
else
s_nextState <= LAPVIEW;
end if;
end case;
end process;
end Behavioral;