`timescale 1ns / 1ps
//
//Beolvassa a billentyűzetről a lenyomott billentyű kódját
//
//Beolvassa a billentyűzettől kapott 8bites kódot, és továbbítja a 
//ps2_dekoder-nek, ami kiszedi az F0-t, és a tényleges bill.-kódot adja kimenetnek

module ps2_receive(
		input wire clk, rst,
		input wire ps2_data, ps2_clk,
		output reg [7:0] data_out, //a bill-től kapott kód
		output reg ready_out //kész a 8bites kód
    );

//reg [7:0] data_out;
reg ps2d; //data
reg ps2c; //clock
//8 4 2 1
reg [3:0] state = 4'b0000; //1start + 8bit + 1 parity + 1stop	 
reg clk_enable = 1; //mivel a clk 16Mhz, a ps2clk meg 10-20kHz, ezért kell egy engedélyező vonal
// _|'|_|'|_	 

	always @(posedge clk)
	begin
		ps2d <= ps2_data;
		ps2c <= ps2_clk;
	end
	 
	always @(posedge clk)
	begin
		if(rst)
		begin
			state <= 0;
			clk_enable <= 1;
			data_out <= 8'd0;
			ready_out <= 0;
		end
		else if( (ps2c == 1'b0) && (clk_enable==1))//amikor 0 lesz, akkor egyszer fut le
		begin//ha a ps2c 1 lesz, akkor enable is 1 lesz
			clk_enable <= 1'b0;// lenullázzuk, mert ha 1 marad, akkor sokszor fut le a negedge és a posedge között
			
			case(state)
				0:
				begin
					ready_out <= 0;
					if(ps2d == 1'b0)//start bit
						state <= state + 1; 
				end
				1,2,3,4,5,6,7,8:
				begin
					 data_out <= {ps2d, data_out[7:1]};
					 state <= state+1;
				end
				
				9:
				begin//a 8 data bit + a paritás bit együtt páratlan számú 1esből áll
					state <= state + 1; //parity bit
					if((&data_out & ps2d) == 0)
							ready_out <= 1; //kész az adat
				end
				10:
				begin
					ready_out <= 0;
					state <= 0; //stop bit
				end
				default: ;
			endcase
		end //ps2c==1'b0-t zárja
		else
		begin
			ready_out <= 0;
			if(ps2c == 1'b1)
				clk_enable <= 1'b1; //felfutó ps2clock-nál engedélyezünk
		end

	end//always-t zárja
	
	
	
///// Version 2.0
//////
//
//WARNING:Place:414 - The input design contains local clock signal(s). 
//To get a better result, we recommend users run map with the "-timing" option set before 
//starting the placement.
//WARNING:Route:455 - CLK Net:ps2c may have excessive skew because     
//6 CLK pins and 0 NON_CLK pins failed to route using a CLK template.
//
//reg ps2d; //data
//reg ps2c; //clock
////8 4 2 1
//reg [3:0] state = 4'b0000; //1 start + 8bit + 1 parity + 1stop
//
//reg [7:0] data_out;
////reg ready_out;
//
//	always @(posedge clk)
//	begin
//		ps2d <= ps2_data;
//		ps2c <= ps2_clk;
//	end	
//	
//	always @(negedge ps2c) //lefutó élre kell vizsgálni
//	begin
//		case(state)
//			0: state <= 1; //start bit
//		
//			1,2,3,4,5,6,7,8: //8 adatbit
//			begin
//				data_out <= {ps2d, data_out[7:1]};
//				state <= state + 1;
//			end
//		
//			9: state <= state + 1; //paritas bit
//		
//			10: state <= 0; //stop bit
//			
//			default: ;
//		endcase
//	end
//
//assign led = data_out;
	
	
	
endmodule 

