library ieee;
use ieee.std_logic_1164.all;

entity DiceGame is 
   port (Rb, Reset, CLK: in std_logic;
         Sum: in integer range 2 to 12;
         Roll, Win, Lose: out std_logic);
end DiceGame;

architecture DiceBehave of DiceGame is
  type STATE_TYPE is (S0, S1, S2, S3, S4, S5);
  signal State, Nextstate: STATE_TYPE; 
  signal Point: integer range 2 to 12;
  signal Sp: std_logic;
begin
  process(Rb, Reset, Sum, State)
  begin
    Sp <= '0'; Roll <= '0'; Win <= '0'; Lose <= '0';
    case State is
      when S0 => if (Rb = '1') then 
	              Nextstate <= S1;  
                else
                  Nextstate <= S0;
                end if;
        when S1 => if Rb = '1' then 
                    Roll <= '1';
                    Nextstate <= S1;
                  elsif (Sum = 7 or Sum = 11) then 
                    Nextstate <= S2;
                  elsif (Sum = 2 or Sum = 3 or Sum = 12) then
                    Nextstate <= S3;
                  else 
                    Sp <= '1'; 
                    Nextstate <= S4;
                  end if;
        when S2 => Win <= '1';
                  if (Reset = '1') then 
                    Nextstate <= S0; 
                  else
                    Nextstate <= S2;
                  end if;
        when S3 => Lose <= '1';
                  if (Reset = '1') then 
                    Nextstate <= S0; 
                  else
                    Nextstate <= S3;
                  end if;
        when S4 => if (Rb = '1') then 
                    Nextstate <= S5; 
                  else
				    Nextstate <= S4;
                  end if;
        when S5 => if (Rb = '1') then 
                    Roll <= '1';
                    Nextstate <= S5;
                  elsif (Sum = Point) then 
                    Nextstate <= S2;
                  elsif Sum = 7 then 
                    Nextstate <= S3;
                  else
				    Nextstate <= S4;
          end if; 
      end case;
    end process;
    process(CLK)
    begin
      if (CLK'event and CLK = '1') then
         State <= Nextstate;
         if (Sp = '1') then 
           Point <= Sum; 
         end if;
      end if;
    end process;
end DiceBehave;		
