1
0
mirror of https://github.com/Gehstock/Mist_FPGA.git synced 2026-02-04 15:33:06 +00:00
Files
Gehstock.Mist_FPGA/Computer_MiST/Interact_MiST/rtl/keyboard.sv
2021-09-02 21:08:25 +02:00

262 lines
9.5 KiB
Systemverilog

module keyboard
(
input clk_sys,
input rst_n,
input [10:0] ps2_key,
input [3:0] joystick_0,
input [3:0] joystick_1,
output reg [7:0] keys [7:0]
);
reg release_btn = 0;
reg [7:0] code;
reg shift = 0;
reg input_strobe = 0;
always @(posedge clk_sys or negedge rst_n) begin
if (!rst_n)
begin
keys[0] <= 8'b11111111;
keys[1] <= 8'b11111111;
keys[2] <= 8'b11111111;
keys[3] <= 8'b11111111;
keys[4] <= 8'b11111111;
keys[5] <= 8'b11111111;
keys[6] <= 8'b11111111;
keys[7] <= 8'b11111111;
end
else
begin
// unused or unmapped keys
keys[2][0] = 1'b1;
keys[3][2] = 1'b1;
keys[3][4] = 1'b1;
keys[3][6] = 1'b1;
keys[7][4] = 1'b1;
keys[7][5] = 1'b1;
keys[7][6] = 1'b1;
keys[7][7] = 1'b1;
if (input_strobe)
case(code)
// @ 3800H
8'h3e : // 8
if (shift == 1)
begin
keys[0][0] <= release_btn; // *
keys[0][7] <= 1'b1; // unshift
end
else
begin
keys[2][2] <= release_btn; // 8
keys[0][7] <= 1'b1; // unshift
end
8'h29 : keys[0][1] <= release_btn; // SPACE
8'h5a : keys[0][2] <= release_btn; // ENTER
8'h0d : keys[0][3] <= release_btn; // TAB
8'h66 : keys[0][4] <= release_btn; // BACKSPACE
8'h58 : keys[0][5] <= release_btn; // CAPS
8'h14 : keys[0][6] <= release_btn; // CONTROL
8'h12 :
begin
keys[0][7] <= release_btn; // Left shift
shift <= ~release_btn;
end
8'h59 :
begin
keys[0][7] <= release_btn; // Right shift
shift <= ~release_btn;
end
8'h1e : keys[1][0] <= release_btn; // 2
8'h52 : // "
if (shift == 1)
begin
keys[1][0] <= release_btn; // 2
keys[0][7] <= 1'b0; // shift
end
else
begin
keys[3][7] <= release_btn; // 3
keys[0][7] <= 1'b0; // shift
end
// @ 3801H
8'h16 : // 1
if (shift == 1)
begin // !
keys[2][4] <= release_btn; // 6
keys[0][7] <= 1'b0; // shift
end
else
begin
keys[1][1] <= release_btn; // 1
end
8'h45 : // 0
if (shift == 1)
begin
keys[2][1] <= release_btn; // 9
keys[0][7] <= 1'b0; // shift
end
else
begin
keys[1][2] <= release_btn; // 0
end
8'h4a : // /
if (shift == 1)
begin // ?
keys[3][3] <= release_btn; // ?
keys[0][7] <= 1'b1; // unshift
end
else
begin
keys[1][3] <= release_btn; // /
end
8'h49 : // .
if (shift == 1)
begin // >
keys[1][1] <= release_btn; // 1
keys[0][7] <= 1'b0; // shift
end
else
begin
keys[1][4] <= release_btn; // .
end
8'h4e : keys[1][5] <= release_btn; // -
8'h41 : // ,
if (shift == 1)
begin // <
keys[1][2] <= release_btn; // 0
keys[0][7] <= 1'b0; // shift
end
else
begin
keys[1][6] <= release_btn; // ,
end
8'h55 : // =
if (shift == 1)
begin
keys[1][7] <= release_btn; // +
keys[0][7] <= 1'b1; // unshift
end
else
begin
keys[3][5] <= release_btn; // =
end
// @ 3802H
8'h46 : // 9
if (shift == 1)
begin
keys[2][2] <= release_btn; // 8
keys[0][7] <= 1'b0; // shift
end
else
begin
keys[2][1] <= release_btn; // 9
end
8'h3d : keys[2][3] <= release_btn; // 7
8'h36 : // 6
if (shift == 1)
begin
keys[1][7] <= release_btn; // +
keys[0][7] <= 1'b0; // shift
end
else
begin
keys[2][4] <= release_btn; // 6
end
8'h2e : keys[2][5] <= release_btn; // 5
8'h25 : keys[2][6] <= release_btn; // 4
8'h26 : keys[2][7] <= release_btn; // 3
// @ 3803H
8'h32 : keys[3][0] <= release_btn; // B
8'h1c : keys[3][1] <= release_btn; // A
8'h4c : // ;
if (shift == 1)
begin
keys[2][3] <= release_btn; // :, shift-7
keys[0][7] <= 1'b1; // shift
end
else
begin
keys[3][7] <= release_btn; // ;
keys[0][7] <= 1'b1; // unshift
end
// @ 3804H
8'h3b : keys[4][0] <= release_btn; // J
8'h43 : keys[4][1] <= release_btn; // I
8'h33 : keys[4][2] <= release_btn; // H
8'h34 : keys[4][3] <= release_btn; // G
8'h2b : keys[4][4] <= release_btn; // F
8'h24 : keys[4][5] <= release_btn; // E
8'h23 : keys[4][6] <= release_btn; // D
8'h21 : keys[4][7] <= release_btn; // C
// @ 3805H
8'h2d : keys[5][0] <= release_btn; // R
8'h15 : keys[5][1] <= release_btn; // Q
8'h4d : keys[5][2] <= release_btn; // P
8'h44 : keys[5][3] <= release_btn; // O
8'h31 : keys[5][4] <= release_btn; // N
8'h3a : keys[5][5] <= release_btn; // M
8'h4b : keys[5][6] <= release_btn; // L
8'h42 : keys[5][7] <= release_btn; // K
// @ 3806H
8'h1a : keys[6][0] <= release_btn; // Z
8'h35 : keys[6][1] <= release_btn; // Y
8'h22 : keys[6][2] <= release_btn; // X
8'h1d : keys[6][3] <= release_btn; // W
8'h2a : keys[6][4] <= release_btn; // V
8'h3c : keys[6][5] <= release_btn; // U
8'h2c : keys[6][6] <= release_btn; // T
8'h1b : keys[6][7] <= release_btn; // S
default: ;
endcase
// @ 3807H
keys[7][0] <= ~joystick_0[1]; // left
keys[7][1] <= ~joystick_0[0]; // right
keys[7][2] <= ~joystick_0[3]; // up
keys[7][3] <= ~joystick_0[2]; // down
keys[7][4] <= ~joystick_1[1]; // left
keys[7][5] <= ~joystick_1[0]; // right
keys[7][6] <= ~joystick_1[3]; // up
keys[7][7] <= ~joystick_1[2]; // down
end
end
always @(posedge clk_sys) begin
reg old_state;
input_strobe <= 0;
old_state <= ps2_key[10];
if (old_state != ps2_key[10]) begin
release_btn <= ~ps2_key[9];
code <= ps2_key[7:0];
input_strobe <= 1;
end
end
endmodule