82 lines
1.5 KiB
VHDL
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;
|