------------------------------------------------------------
-- Copyright: 2010 Integrated Sytems Laboratory, ETH Zurich
-- http://www.iis.ee.ethz.ch/~sha3
------------------------------------------------------------
library ieee;
use ieee.numeric_std.all;
use ieee.std_logic_1164.all;
entity controller is
port (
ClkxCI : in std_logic;
RstxRBI : in std_logic;
InEnxEI : in std_logic;
FinxSI : in std_logic;
IfMajxSO : out std_logic;
IxDO : out unsigned(5 downto 0);
IPxDO : out unsigned(5 downto 0);
StartxSO : out std_logic;
SavexSO : out std_logic;
OutEnxEO : out std_logic);
end controller;
architecture rtl of controller is
type state is (idle, fround, round, fin);
signal StatexDP, StatexDN : state;
signal IxDP, IxDN : unsigned(5 downto 0);
begin -- rtl
IxDO <= IxDP;
IfMajxSO <= IxDP(2);
IPxDO <= IxDN when IxDN < 32 else (others => '0');
p_fsm: process (INENxEI, IxDP, StatexDP)
begin -- process p_fsm
StatexDN <= StatexDP;
IxDN <= (others => '0');
OutEnxEO <= '0';
StartxSO <= '0';
SavexSO <= '0';
case StatexDP is
-------------------------------------------------------------------------
when idle =>
if INENxEI = '1' then
StatexDN <= fround;
end if;
-------------------------------------------------------------------------
when fround =>
if IxDP = 35 then
StartxSO <= '1';
SavexSO <= '1';
StatexDN <= round;
else
IxDN <= IxDP + 1;
end if;
-------------------------------------------------------------------------
when round =>
if IxDP = 35 then
SavexSO <= '1';
if INENxEI = '0' then
StatexDN <= fin;
end if;
else
IxDN <= IxDP + 1;
end if;
-------------------------------------------------------------------------
when fin =>
if IxDP = 35 then
OutEnxEO <= '1';
StatexDN <= idle;
else
IxDN <= IxDP + 1;
end if;
-------------------------------------------------------------------------
when others => StatexDN <= idle;
end case;
end process p_fsm;
p_mem : process (ClkxCI, RstxRBI)
begin -- process p_mem
if RstxRBI = '0' then -- asynchronous reset (active low)
StatexDP <= idle;
IxDP <= (others => '0');
elsif ClkxCI'event and ClkxCI = '1' then -- rising clock edge
StatexDP <= StatexDN;
IxDP <= IxDN;
end if;
end process p_mem;
end rtl;