16 localparam state_idle = 5'b00001;
17 localparam state_keymap = 5'b00010;
18 localparam state_key_down = 5'b00100;
19 localparam state_key_up = 5'b01000;
20 localparam state_esc_char = 5'b10000;
22 localparam esc = 8'h1b;
24 localparam keycode_regular = 2'b0x;
27 localparam keycode_modifier = 2'b10;
28 localparam keycode_escaped = 2'b11;
32 reg [1:0] ps2_old_clks;
33 reg [10:0] ps2_raw_data;
37 reg ps2_break_keycode;
44 reg [5:0] modifier_pressed;
45 wire shift_pressed = modifier_pressed[5] || modifier_pressed[0];
46 wire control_pressed = modifier_pressed[4] || modifier_pressed[1];
47 wire meta_pressed = modifier_pressed[3] || modifier_pressed[2];
51 wire [10:0] keymap_address;
52 wire [7:0] keymap_data;
54 reg [7:0] special_data;
58 assign keymap_address = { ps2_long_keycode, caps_lock_active, shift_pressed, ps2_byte };
66 .addr(keymap_address),
72 always @(posedge clk) begin
80 ps2_old_clks <= 2'b00;
85 ps2_break_keycode <= 0;
86 ps2_long_keycode <= 0;
88 modifier_pressed = 6'h00;
89 caps_lock_active <= 0;
93 else if (valid && ready) begin
100 ps2_old_clks <= {ps2_old_clks[0], ps2_clk};
101 if(ps2_clk && ps2_old_clks == 2'b01) begin
103 if(ps2_count == 10) begin
106 ps2_byte <= ps2_raw_data[10:3];
109 if (ps2_raw_data[10:3] == 8'he0) begin
110 ps2_break_keycode <= 0;
111 ps2_long_keycode <= 1;
113 else if (ps2_raw_data[10:3] == 8'hf0) begin
114 ps2_break_keycode <= 1;
117 state <= state_keymap;
122 ps2_raw_data <= {ps2_data, ps2_raw_data[10:1]};
123 ps2_count <= ps2_count + 1;
129 state <= ps2_break_keycode? state_key_up : state_key_down;
133 ps2_break_keycode <= 0;
134 ps2_long_keycode <= 0;
136 if (keymap_data[7:6] == keycode_modifier) begin
139 modifier_pressed <= modifier_pressed & ~keymap_data[5:0];
142 state_key_down: begin
143 ps2_long_keycode <= 0;
144 if (keymap_data == 0) begin
149 casex (keymap_data[7:6])
150 keycode_regular: begin
154 if (meta_pressed) begin
157 state <= state_esc_char;
160 control_pressed? 2'b00 : keymap_data[6:5],
167 control_pressed? 2'b00 : keymap_data[6:5],
174 keycode_escaped: begin
179 state <= state_esc_char;
182 control_pressed? 2'b00 : keymap_data[6:5],
186 keycode_modifier: begin
189 modifier_pressed <= modifier_pressed | keymap_data[5:0];
190 caps_lock_active <= caps_lock_active ^ ~|keymap_data[5:0];
195 state_esc_char: begin
197 if (valid == 0) begin
201 control_pressed? 2'b00 : special_data[6:5],
module keymap_rom(input clk, input[10:0] addr, output[8] dout_)
Keymap ROM (2KB, maps keycodes to ASCII chars) This could be a RAM to allow keymap modifications,...
module keyboard(input clk, input reset, input ps2_data, input ps2_clk, output reg< 7:0 > data, output reg valid, input ready)