`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date:    11:16:27 08/26/2014 
// Design Name: 
// Module Name:    Encoder0_Read 
// Project Name: 
// Target Devices: 
// Tool versions: 
// Description: 
//
// Dependencies: 
//
// Revision: 
// Revision 0.01 - File Created
// Additional Comments: 
//
/////////////////////////////////////////////////////////////////////////////////
module Encoder_Read(
    input rotary_a,
    input rotary_b,
    input clk,
	 input reset,
//    output reg event_en,
//    output reg event_left,
//    output reg event_right,
	 output [31:0]enc_value,
	 output reg [1:0]dir
//	 input ResetOrigin,
//	 input ResetOrigin2
//	 output reg rotary_q1
    );
   reg[31:0]enc_value_r = 0;
	reg rotary_q1;
	reg delay_rotary_q1;
	reg rotary_q2;
	
	always@(posedge clk)begin
		if(reset == 1'b1)begin
			rotary_q1 <= 1'b0;
			rotary_q2 <= 1'b0;
		end else begin
			case({rotary_b,rotary_a})
				2'b00:begin
					rotary_q1 <= 1'b0;
					rotary_q2 <= rotary_q2;
				end
				
				2'b01:begin
					rotary_q1 <= rotary_q1;
					rotary_q2 <= 1'b0;
				end
				
				2'b10:begin
					rotary_q1 <= rotary_q1;
					rotary_q2 <= 1'b1;
				end
				
				2'b11:begin
					rotary_q1 <= 1'b1;
					rotary_q2 <= rotary_q2;
				end
				
				default:begin
					rotary_q1 <= rotary_q1;
					rotary_q2 <= rotary_q2;
				end
			endcase
		end
	end
//	always@(posedge clk)
//	begin
//		if(reset == 1'b1)
//		begin
//			delay_rotary_q1 <= 1'b0;
//			event_en <= 1'b0;
//			event_left <= 1'b0;
//			event_right <= 1'b0;
//		end 
//		else
//		begin
//		delay_rotary_q1 <= rotary_q1;
//		if(rotary_q1 == 1'b1 && delay_rotary_q1 == 1'b0)
//			begin
//				event_en <= 1'b1;
//				event_left <= rotary_q2;
//			end
//		else 
//			begin //right
//				event_en <= 1'b0;
//				event_left <= event_left;
//			end
//		end
//	end 
		
//	always@(posedge clk)begin
//		if(reset == 1'b1)
//		begin
//			delay_rotary_q1 = 1'b0;
//			event_en = 1'b0;
//			event_left = 1'b0;
//			event_right = 1'b0;
//		end 
//		else 
//			begin
//			if(rotary_q1 == 1'b1 && delay_rotary_q1 == 1'b0)begin
//				event_en = 1'b1;
//				if(rotary_q2 == 1'b0) begin	//Left
//					event_left = 1'b1;
//					event_right = 1'b0;
//				end 
//				else 
//				begin //right
//					event_left = 1'b0;
//					event_right = 1'b1;
//				end
//			 	delay_rotary_q1 = rotary_q1;
//			end else begin
//				event_en = 1'b0;
//				event_left = 1'b0;
//				event_right = 1'b0;
//				delay_rotary_q1 = rotary_q1;
//			end
//		end
//	end
	wire reset_enc_cnt; ///encoder value reset!
//	assign reset_enc_cnt = (ResetOrigin|ResetOrigin2)?1'b0:1'b1;
	reg [1:0]Old_EncoderAB=0; 
	always@(posedge clk or posedge reset_enc_cnt)
	begin
	if(reset == 1'b1||reset_enc_cnt == 1'b1)
		begin
			enc_value_r = 32'd0;	
			dir = 2'b00;
		end 
	else 
		begin
		 if
			(
			(Old_EncoderAB == 2'b00 && {rotary_q1,rotary_q2} == 2'b01) ||        // 00 -> 01 ·Î º¯ÇÑ°æ¿ì
			(Old_EncoderAB == 2'b01 && {rotary_q1,rotary_q2} == 2'b11) ||        // È¤Àº 01 -> 11 ·Î º¯ÇÑ°æ¿ì
			(Old_EncoderAB == 2'b11 && {rotary_q1,rotary_q2} == 2'b10) ||        // È¤Àº 11 -> 10 ·Î º¯ÇÑ°æ¿ì
			(Old_EncoderAB == 2'b10 && {rotary_q1,rotary_q2} == 2'b00)             // È¤Àº 10 -> 00 ·Î º¯ÇÑ°æ¿ì
			) 
		begin
			dir = 1'b1;	                                                         // »ó±â 4°¡Áö °æ¿ì´Â Á¤È¸ÀüÇÑ°æ¿ìÀÌ¹Ç·Î ¿£ÄÚ´õ°ª Áõ°¡
			enc_value_r = enc_value_r + 1'b1;
		end 
		else if
			(
			(Old_EncoderAB == 2'b00 && {rotary_q1,rotary_q2}  == 2'b10) ||        // 00 -> 10 ·Î º¯ÇÑ°æ¿ì
			(Old_EncoderAB == 2'b10 && {rotary_q1,rotary_q2}  == 2'b11) ||        // È¤Àº 10 -> 11 ·Î º¯ÇÑ°æ¿ì
			(Old_EncoderAB == 2'b11 && {rotary_q1,rotary_q2}  == 2'b01) ||        // È¤Àº 11 -> 01 ·Î º¯ÇÑ°æ¿ì
			(Old_EncoderAB == 2'b01 && {rotary_q1,rotary_q2}  == 2'b00)             // È¤Àº 01 -> 00 ·Î º¯ÇÑ°æ¿ì
			)
		 begin
			 dir = 2'b10;	                                      // »ó±â 4°¡Áö °æ¿ì´Â ¿ªÈ¸ÀüÇÑ°æ¿ìÀÌ¹Ç·Î ¿£ÄÚ´õ°ª °¨¼Ò
			 enc_value_r = enc_value_r - 1'b1;
		//	 enc_value =(enc_value[31]==1'b0)?enc_value[30:0]:((~enc_value[30:0])+1'b1); 
		 end 	 
			Old_EncoderAB = {rotary_q1,rotary_q2};
	end 
	end 
	
	assign enc_value = (enc_value_r[31]==1'b0)?enc_value_r[30:0]:((~enc_value_r[30:0])+1'b1); 
//	always@(posedge rotary_q1 or posedge reset_enc_cnt)
//	begin
//		if(enc_value ==32'd1000000000||reset_enc_cnt == 1'b1)
//		begin
//		enc_value <= 32'd0;	
//		end
//		else 
//		enc_value <= enc_value + 1'b1;
//	end 
//	always@(posedge rotary_a)
//	begin
//		if(rotary_b==1'b1)
//		begin
//		dir = 1'b1;	
//		end
//		else 
//		dir = 1'b0;	
//	end 

endmodule
