zxuno-git/cores/Spectrum/ps2mouse_to_kmouse.v

83 lines
2.3 KiB
Verilog

`timescale 1ns / 1ps
`default_nettype none
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 18:52:22 06/30/2015
// Design Name:
// Module Name: ps2mouse_to_kmouse
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module ps2mouse_to_kmouse (
input wire clk,
input wire rst_n,
input wire [7:0] data,
input wire data_valid,
output reg [7:0] kmouse_x,
output reg [7:0] kmouse_y,
output reg [7:0] kmouse_buttons
);
parameter FIRST_FRAME = 2'd0,
SECOND_FRAME = 2'd1,
THIRD_FRAME = 2'd2,
CALCULATE_NEWXY = 2'd3;
initial begin
kmouse_x = 8'h00;
kmouse_y = 8'h00;
kmouse_buttons = 8'hFF;
end
reg [7:0] deltax, deltay;
reg [1:0] state = FIRST_FRAME;
always @(posedge clk) begin
if (rst_n == 1'b0) begin
kmouse_x <= 8'h00;
kmouse_y <= 8'h00;
kmouse_buttons <= 8'hFF;
state <= FIRST_FRAME;
end
else begin
case (state)
FIRST_FRAME:
if (data_valid == 1'b1) begin
if (data[3] == 1'b1) begin
kmouse_buttons <= {5'b11111,~data[2],~data[0],~data[1]};
state <= SECOND_FRAME;
end
end
SECOND_FRAME:
if (data_valid == 1'b1) begin
deltax <= data;
state <= THIRD_FRAME;
end
THIRD_FRAME:
if (data_valid == 1'b1) begin
deltay <= data;
state <= CALCULATE_NEWXY;
end
CALCULATE_NEWXY:
begin
kmouse_x <= kmouse_x + deltax;
kmouse_y <= kmouse_y + deltay;
state <= FIRST_FRAME;
end
endcase
end
end
endmodule