LIBRARY IEEE;
USE IEEE. STD_LOGIC_1164. ALL;
ENTITY oneprocess_fsm IS 
	PORT (	ip,reset,clk	: IN	BIT;	--DECLARES THE INPUTS
			op				: OUT	BIT );	--DECLARES THE OUTPUT
END oneprocess_fsm; 
ARCHITECTURE operation_oneprocess_fsm OF oneprocess_fsm IS
TYPE statetype IS (S0, S1 ,S2 ,S3 ,S4 ,S5); --ENUMERATED DATA TYPE
SIGNAL state: statetype; 
BEGIN 
	PROCESS( ip, reset, clk )				--BEGINING OF PROCESS WITH SENSITIVITY LIST 
	BEGIN
	IF(reset='1') THEN 
		state<= S0;
	ELSIF(clk'event and clk='1') THEN		--ON CLK EVENT STATE IS LOADED
		CASE state IS						--CASE CHECKS FOR VARIOUS CONDITIONS DEPENDING ON THE STATES
			WHEN S0 => 
				IF(ip='1') THEN
					state <= S1;
				ELSE
					state <= S0;
				END IF;
			WHEN S1 => 
				IF(ip='0') THEN
					state <= S2;
				ELSE
					state <= S1;
				END IF;
			WHEN S2 =>
				IF(ip='0') THEN
					state <= S3;
				ELSE
					state <= S1;
				END IF;
			WHEN S3 =>
				IF(ip='1') THEN
					state <= S4;
				ELSE
					state <= S0;
				END IF;
			WHEN S4 =>
				IF(ip='1') THEN
					state <= S5;
				ELSE
					state <= S2;
				END IF;
			WHEN S5 =>
				IF(ip='1') THEN
					state <= S1;
				ELSE
					state <= S2;
				END IF;
		END CASE; --END CASE
	END IF;
	END PROCESS;
	WITH state SELECT			--USE OF WITH SELECT TO GIVE OUPUT BASED ON STATE CONDITION
		op <=	'0' WHEN S0, 
				'0' WHEN S1,
				'0' WHEN S2,
				'0' WHEN S3,
				'0' WHEN S4,
				'1' WHEN S5,
				'0' WHEN OTHERS;
END operation_oneprocess_fsm;


