§ Описание и зависимости
Код контроллера требует наличия модуля
kb.v.
Модуль принимает на вход данные от контроллера клавиатуры, так как использует тот же протокол передачи. При запуске, мыши отсылается код
F4
через PS/2, активируя ее работу, и принимает пакеты по 3 байта, формируя
(x,y)
координаты. С помощью
(xmax,ymax)
можно задать правую и нижнюю границу, за которую указатель мыши выйти не может. Если их опустить, то по умолчанию будет принято значение
(640,480)
в качестве размера окна.
§ TOP-модуль
wire [11:0] x, y;
wire [ 2:0] btn;
wire recv;
mouse M1
(
.clock (clock_25),
.reset_n (reset_n),
.xmax (640),
.ymax (480),
.x (x),
.y (y),
.ps_clk (PS2_CLK2),
.cmd (kb_cmd),
.dat (kb_dat),
.ready (kb_ready),
.hit (kb_hit),
.kbd (kb_kbd),
.btn (btn),
.recv (recv)
);
§ Код
module mouse
(
input clock,
input reset_n,
inout ps_clk,
output reg cmd,
output reg [ 7:0] dat,
input ready,
input hit,
input [ 7:0] kbd,
output reg [11:0] x,
output reg [11:0] y,
output reg [ 2:0] btn,
output reg recv,
input [11:0] xmax,
input [11:0] ymax
);
reg [ 1:0] t;
reg [ 1:0] rc;
reg [23:0] sr;
reg [15:0] tm;
wire [11:0] xm = xmax ? xmax - 1 : 639;
wire [11:0] ym = ymax ? ymax - 1 : 479;
wire [23:0] isr = {kbd, sr[23:8]};
wire [11:0] xnext = x + {{4{isr[4]}}, isr[15:8]};
wire [11:0] ynext = y - {{4{isr[5]}}, isr[23:16]};
always @(posedge clock)
if (reset_n) begin
recv <= 0;
case (t)
0: begin t <= ready ? 1 : 0; end
1: begin cmd <= 1; t <= 2; dat <= 8'hF4; end
2: begin cmd <= 0; end
endcase
if (tm == 16'hFFFE) rc <= 0;
tm <= ps_clk ? (&tm ? tm : tm + 1) : 0;
if (hit) begin
if (rc == 2) begin
x <= xnext[11] ? 0 : (xnext > xm ? xm : xnext);
y <= ynext[11] ? 0 : (ynext > ym ? ym : ynext);
btn <= isr[2:0];
recv <= 1;
end
sr <= isr;
rc <= rc == 2 ? 0 : rc + 1;
end
end else begin
t <= 0;
rc <= 0;
x <= (xmax >> 1);
y <= (ymax >> 1);
end
endmodule