module PS2Button(
+ input clk,
input inclk,
input indata,
- input rst,
- output outclk,
- output outdata,
- output reg [7:0] buttons
+ output wire [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;
+ reg [3:0] bitcount = 0;
+ reg [7:0] key = 0;
+ reg keyarrow = 0, keyup = 0, parity = 0;
+ reg key_a = 0,key_b = 0,key_st = 0,key_sel = 0,key_up = 0,key_dn = 0,key_l = 0,key_r = 0;
assign buttons = {key_st,key_sel,key_b,key_a,key_dn,key_up,key_l,key_r};
+
+ /* Clock debouncing */
+ reg lastinclk = 0;
+ reg [5:0] debounce = 0;
+ reg fixedclk = 0;
+ reg [9:0] resetcountdown = 0;
+
+ always @(posedge clk) begin
+ if (inclk != lastinclk) begin
+ lastinclk <= inclk;
+ debounce <= 1;
+ resetcountdown <= 10'b1111111111;
+ end else if (debounce == 0) begin
+ fixedclk <= inclk;
+ resetcountdown <= resetcountdown - 1;
+ end else
+ debounce <= debounce + 1;
+ end
- always @ (negedge inclk) begin
- if(bitcount == 10) begin
+ always @(negedge fixedclk) begin
+ if (resetcountdown == 0)
+ bitcount <= 0;
+ else if (bitcount == 10) begin
bitcount <= 0;
- if(parity == (^ key)) begin
+ if(parity != (^ key)) begin
if(keyarrow) begin
keyarrow <= 0;
case(key)