PS2.v.html 954 B

123456789101112131415161718192021222324252627282930313233
  1. `timescale 1ns / 1ps // NW 20.10.2012
  2. // PS2 receiver for keyboard, 8 bit data
  3. // clock is 25 MHz; 25000 / 1302 = 19.2 KHz
  4. module PS2(
  5. input clk, rst,
  6. input done, // "byte has been read"
  7. output rdy, // "byte is available"
  8. output shift, // shift in, tramsmitter
  9. output [7:0] data,
  10. input PS2C, // serial input
  11. input PS2D);
  12. reg Q0, Q1; // synchronizer and falling edge detector
  13. reg [10:0] shreg;
  14. reg [3:0] inptr, outptr;
  15. reg [7:0] fifo [15:0]; // 16 byte buffer
  16. wire endbit;
  17. assign endbit = ~shreg[0]; //start bit reached correct pos
  18. assign shift = Q1 & ~Q0;
  19. assign data = fifo[outptr];
  20. assign rdy = ~(inptr == outptr);
  21. always @ (posedge clk) begin
  22. Q0 <= PS2C; Q1 <= Q0;
  23. shreg <= (~rst | endbit) ? 11'h7FF :
  24. shift ? {PS2D, shreg[10:1]} : shreg;
  25. outptr <= ~rst ? 0 : rdy & done ? outptr+1 : outptr;
  26. inptr <= ~rst ? 0 : endbit ? inptr+1 : inptr;
  27. if (endbit) fifo[inptr] <= shreg[8:1];
  28. end
  29. endmodule