module keyboard_hw_driver ( DRV_RESET, KBD_CLK_LINE, KBD_DATA_LINE, DRV_OUT, B); input KBD_DATA_LINE, KBD_CLK_LINE, DRV_RESET; output [7:0] DRV_OUT; // master register for storing keyboard data output B; wire KBD_CLK_EF; reg [7:0] DRV_OUT; reg [3:0] i; // initial value needs to be not equal to 0 through 7. set initial to 10. reg [7:0] L_SHIFT; reg [7:0] R_SHIFT; reg [7:0] CAPS; reg [7:0] BREAK; reg B; // This line is required by Xilinx for FPGA implementation. //assign KBD_CLK_EF=KBD_CLK_LINE; IBUF b1(KBD_CLK_EF, KBD_CLK_LINE); initial begin B = 0; end // This is the keyboard driver logic (fsm). always @ (negedge KBD_CLK_EF or posedge DRV_RESET) begin L_SHIFT = 8'b00010010; R_SHIFT = 8'b01011001; CAPS = 8'b01011000; BREAK = 8'b11110000; if(DRV_RESET) begin i=10; DRV_OUT=0; end else begin if ((i >= 0) && (i <= 7)) // If i is pointing to a bit of data let us keep it. begin DRV_OUT = {KBD_DATA_LINE, DRV_OUT[7:1]}; i = i + 1; end else if ((i == 8) || (i == 9)) // Otherwise if i is pointing to the parity bit or the stop bit let us ignore it. begin if ((DRV_OUT == L_SHIFT)||(DRV_OUT == R_SHIFT)||(DRV_OUT == CAPS) || (DRV_OUT == BREAK)) B = !B; i = i + 1; end else // Else we have a start bit begin i = 0; end end end endmodule