------------------------------------------------------------
-- 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 GFSM is
port (
ClkxCI : in std_logic;
RstxRBI : in std_logic;
EnxEI : in std_logic;
CntxDO : out unsigned(7 downto 0);
PQxSO : out std_logic;
SetOupxSO : out std_logic;
ModexSO : out std_logic;
NewMsgxSO : out std_logic;
OutputEnxSO : out std_logic);
end GFSM;
architecture rtl of GFSM is
type state is (idle, roundP, roundQ, inter, check, omegaP, omegaQ);
signal StatexDP, StatexDN : state;
signal TENcntxDP, TENcntxDN : unsigned(7 downto 0);
begin -- rtl
p_fsm : process (EnxEI, StatexDP, TENcntxDP)
begin -- process p_fsm
StatexDN <= StatexDP;
TENcntxDN <= (others => '0');
PQxSO <= '0';
SetOupxSO <= '0';
ModexSO <= '0';
NewMsgxSO <= '0';
OutputEnxSO <= '0';
CntxDO <= TENcntxDP;
case StatexDP is
-------------------------------------------------------------------------
when idle =>
if EnxEI = '1' then
StatexDN <= roundQ;
NewMsgxSO <= '1';
end if;
-------------------------------------------------------------------------
when roundP =>
TENcntxDN <= TENcntxDP;
StatexDN <= roundQ;
-------------------------------------------------------------------------
when roundQ =>
PQxSO <= '1';
if TENcntxDP = 9 then
TENcntxDN <= TENcntxDP;
StatexDN <= inter;
else
if TENcntxDP < 9 then
TENcntxDN <= TENcntxDP+1;
StatexDN <= roundP;
else
StatexDN <= idle;
end if;
end if;
-------------------------------------------------------------------------
when inter =>
SetOupxSO <= '1';
StatexDN <= check;
-------------------------------------------------------------------------
when check =>
if EnxEI = '1' then
StatexDN <= roundQ;
else
ModexSO <= '1';
StatexDN <= omegaQ;
end if;
-------------------------------------------------------------------------
when omegaP =>
ModexSO <= '1';
TENcntxDN <= TENcntxDP;
StatexDN <= omegaQ;
-------------------------------------------------------------------------
when omegaQ =>
ModexSO <= '1';
PQxSO <= '1';
if TENcntxDP = 9 then
SetOupxSO <= '1';
OutputEnxSO <= '1';
StatexDN <= idle;
else
if TENcntxDP < 9 then
TENcntxDN <= TENcntxDP+1;
end if;
StatexDN <= omegaP;
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;
TENcntxDP <= (others => '0');
elsif ClkxCI'event and ClkxCI = '1' then -- rising clock edge
StatexDP <= StatexDN;
TENcntxDP <= TENcntxDN;
end if;
end process p_mem;
end rtl;