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

Generated on Fri Sep 24 10:39:12 CEST 2010
Home