`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// A ps2_receive-től megkapja a bill kódját, 
// kiszedi az F0-t és az utána következő ismétlő bill-kódot
// Kimenet: a leütött billentyű kódja, illetve egy reg, hogy meddig tartottuk nyomva,
// vagyis hányszor ismétlődik a bill-kódja (1C 1C ... 1C F0 1C)
//////////////////////////////////////////////////////////////////////////////////
//// Az első lenyomott bill kód : X X 1C --- "A" esetén - a többi az jó 
//
// Figyeli az engedélyező space-t is -- mert a billentyűzetről csak akkor irányíthatunk, ha nyomunk egy indító space-t
//
module ps2_decoder(
		input wire clk, rst,
		input wire data_ready,
		input wire [7:0] data,
		output reg [7:0] bill_kod = 8'd0,
		output reg [1:0] start_stop = 2'd3, //1 2
		//2'd0 - tiltás
		//2'd1 - engedélyezés
		//2'd2 - köztes
		//2'd3 - induló állapot
		
		//output wire [7:0] bill_ism, //meddig tartottuk nyomva
		output reg clk_d //decoder clk, ha van érvényes adat 1-re vált, különben 0	
    );
// Példa: 
// A4 C1 29  1C F0 1C .... - legelső billnyomás, ilyenkor csak a harmadik bill_kod lesz 29, ezért a cnt számlálóval figyeljük, h hanyadik kódnál tartunk
// ilyenkor  if(data_ready && (data == 8'h29) && (cnt <= 3) && start_stop == 2'd3))	, akkor start_stop <= 2'd1, vagyis engedélyezünk
// ha viszont több gombot is lenyomtunk, mielőtt a space-el engedélyeztük volna az irányítást, akkor
// Példa:
// 70 C1 1C  29 F0 29 ...
// ilyenkor if(data_ready && (data == 8'h29) && (cnt > 3) && (start_stop == 2'd3 || 2'd0) ), akkor start_stop <= 2'd2, köztes állapot
// és ha megint if(data_ready && (data == 8'h29) && (cnt > 3) && start_stop == 2'd2), akkor start_stop <= 2'd1
// így kihagyjuk az F0-t középről, és a 29 F1 29 sorozat is kezelve van

//reg [1:0] start_stop = 2'd3; //2 1

reg bill_ready = 1'b0;
	 
reg [7:0] before_data = 8'd0; //az adatot megelőző adat / F0 1C
//reg [7:0] b_ism = 8'd0; //temp - bill_ism
//reg [7:0] b_ism2 = 8'd0; //temp - bill_ism

reg [2:0] cnt = 3'd1;//4 2 1
	always @(posedge clk)
	begin
		if(data_ready)
		begin
			if(cnt<=3) //ez az if csak 3x fut le, utána az else if-ek mennek
				cnt <= cnt + 1;
			else if(cnt == 7)
				cnt <= 4;
			else
				cnt <= cnt + 1; 
		end
	end

	always @(posedge clk)
	begin
		if(rst)
		begin
			bill_kod <= 8'd0;
			//b_ism <= 8'd0;
			start_stop <= 2'd0;
		end
		////////////////////////
		// START - Engedélyezés
		///////////////////////
		else if((data_ready) && (data == 8'h29) && (cnt <= 3) && (start_stop == 2'd3))
			start_stop <= 2'd1;
		
		else if((data_ready) && (data == 8'h29) && (cnt >  3) && (start_stop == 2'd3 || start_stop == 2'd0))
			start_stop <= 2'd2;
		else if((data_ready) && (data == 8'h29) && (cnt >  3) && (start_stop == 2'd2))
			start_stop <= 2'd1;
			
		else if(data_ready && start_stop==2'd1)//engedélyezzük a billentyűzetet, kiszedjük az F0-t
		begin
			if(data == 8'hF0) //F0
			begin
				//b_ism <= 0;
				before_data <= 8'hF0;
			end
			else if((data != 8'hF0) && (before_data == 8'hF0))//F0 1C
			begin
				//b_ism <= 0;
				before_data <= data;
			end
			else if((data != 8'hF0) && (before_data != 8'hF0))//F0 1C-b_data 2B-data
			begin
				bill_kod <= data;
				//b_ism <= b_ism + 1;
			end
		end//else if(data_ready && start_stop==3'd1) - ezt zárja
	end//always-t zárja
	
	
	always @(posedge clk)
		if(rst)
			bill_ready <= 0;
		else if( (data_ready) && (start_stop == 2'd1) && (data != 8'hF0) && (before_data != 8'hF0) )
			bill_ready <= 1;
		else
			bill_ready <= 0;
			
	always @(posedge clk)
		case(bill_ready)
		1: clk_d <= 1;
		0: clk_d <= 0;
		endcase
		
//	always @(posedge clk)
//		if(rst)
//			b_ism2 <= 8'd0;
//		else if(b_ism!=0)
//			b_ism2 <= b_ism;

//assign bill_ism = (b_ism==0) ? b_ism2 : b_ism;


endmodule
