+module PS2Button(
+ input inclk,
+ input indata,
+ input rst,
+ output outclk,
+ output outdata,
+ output reg [7:0] buttons
+ );
+
+ assign outdata = 1'b1;
+ assign outclk = 1'b1;
+
+ reg bitcount [3:0] = 0;
+ reg [7:0] key;
+ reg keyarrow, keyup, parity;
+ reg key_a,key_b,key_st,key_sel,key_up,key_dn,key_l,key_r;
+
+ assign buttons = {key_st,key_sel,key_b,key_a,key_dn,key_up,key_l,key_r};
+
+ always @ (negedge inclk) begin
+ if(bitcount == 10) begin
+ bitcount <= 0;
+ if(parity == (^ key)) begin
+ if(keyarrow) begin
+ keyarrow <= 0;
+ case(key)
+ 8'hF0: keyup <= 1;
+ 8'h75: key_up <= 1;
+ 8'h74: key_r <= 1;
+ 8'h72: key_dn <= 1;
+ 8'h6B: key_l <= 1;
+ endcase
+ end
+ else begin
+ if(keyup) begin
+ keyup <= 0;
+ case(key)
+ 8'h75: key_up <= 0;
+ 8'h74: key_r <= 0;
+ 8'h72: key_dn <= 0;
+ 8'h6B: key_l <= 0;
+ 8'h1C: key_a <= 0;
+ 8'h1B: key_b <= 0;
+ 8'h5A: key_st <= 0;
+ 8'h59: key_sel <= 0;
+ endcase
+ end
+ else begin
+ case(key)
+ 8'hE0: keyarrow <= 1;
+ 8'hF0: keyup <= 1;
+ 8'h1C: key_a <= 1;
+ 8'h1B: key_b <= 1;
+ 8'h5A: key_st <= 1;
+ 8'h59: key_sel <= 1;
+ endcase
+ end
+ end
+ end
+ else begin
+ keyarrow <= 0;
+ keyup <= 0;
+ {key_a,key_b,key_st,key_sel,key_up,key_dn,key_l,key_r} <= 8'b0;
+ end
+ end else
+ bitcount <= bitcount + 1;
+
+ case(bitcount)
+ 1: key[0] <= indata;
+ 2: key[1] <= indata;
+ 3: key[2] <= indata;
+ 4: key[3] <= indata;
+ 5: key[4] <= indata;
+ 6: key[5] <= indata;
+ 7: key[6] <= indata;
+ 8: key[7] <= indata;
+ 9: parity <= indata;
+ endcase
+ end
+
+endmodule