gpio_debouncer.v 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. `timescale 1 ns / 1 ps
  2. module gpio_debouncer #
  3. (
  4. parameter integer DATA_WIDTH = 8,
  5. parameter integer CNTR_WIDTH = 22
  6. )
  7. (
  8. input wire aclk,
  9. inout wire [DATA_WIDTH-1:0] gpio_data,
  10. output wire [DATA_WIDTH-1:0] deb_data,
  11. output wire [DATA_WIDTH-1:0] raw_data
  12. );
  13. reg [DATA_WIDTH-1:0] int_data_reg [2:0];
  14. reg [CNTR_WIDTH-1:0] int_cntr_reg [DATA_WIDTH-1:0];
  15. wire [DATA_WIDTH-1:0] int_data_wire;
  16. genvar j;
  17. generate
  18. for(j = 0; j < DATA_WIDTH; j = j + 1)
  19. begin : GPIO
  20. IOBUF gpio_iobuf (.O(int_data_wire[j]), .IO(gpio_data[j]), .I(1'b0), .T(1'b1));
  21. always @(posedge aclk)
  22. begin
  23. if(int_data_reg[2][j] == int_data_reg[1][j])
  24. begin
  25. int_cntr_reg[j] <= {(CNTR_WIDTH){1'b0}};
  26. end
  27. else
  28. begin
  29. int_cntr_reg[j] <= int_cntr_reg[j] + 1'b1;
  30. if(&int_cntr_reg[j]) int_data_reg[2][j] <= ~int_data_reg[2][j];
  31. end
  32. end
  33. end
  34. endgenerate
  35. always @(posedge aclk)
  36. begin
  37. int_data_reg[0] <= int_data_wire;
  38. int_data_reg[1] <= int_data_reg[0];
  39. end
  40. assign deb_data = int_data_reg[2];
  41. assign raw_data = int_data_reg[1];
  42. endmodule