OpenCores
URL https://opencores.org/ocsvn/aoocs/aoocs/trunk

Subversion Repositories aoocs

[/] [aoocs/] [trunk/] [tests/] [ps2_keyboard_test/] [ps2_keyboard.v] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 alfik
module ps2_keyboard(
2
        input clk_50,
3
        input reset_ext_n,
4
 
5
        inout ps2_kbclk,
6
        inout ps2_kbdat,
7
 
8
        output [7:0] leds
9
);
10
 
11
assign leds = {pressed, amiga_keycode[7], 2'b00, amiga_avail };
12
 
13
wire clk_30;
14
wire pll_locked;
15
 
16
altpll pll_inst(
17
    .inclk( {1'b0, clk_50} ),
18
    .clk( clk_30 ), //{5'b0, clk_30} ),
19
    .locked(pll_locked)
20
);
21
defparam    pll_inst.clk0_divide_by = 5,
22
            pll_inst.clk0_duty_cycle = 50,
23
            pll_inst.clk0_multiply_by = 3,
24
            pll_inst.clk0_phase_shift = "0",
25
            pll_inst.compensate_clock = "CLK0",
26
            pll_inst.gate_lock_counter = 1048575,
27
            pll_inst.gate_lock_signal = "YES",
28
            pll_inst.inclk0_input_frequency = 20000,
29
            pll_inst.intended_device_family = "Cyclone II",
30
            pll_inst.invalid_lock_multiplier = 5,
31
            pll_inst.lpm_hint = "CBX_MODULE_PREFIX=pll30",
32
            pll_inst.lpm_type = "altpll",
33
            pll_inst.operation_mode = "NORMAL",
34
            pll_inst.valid_lock_multiplier = 1;
35
 
36
wire reset_n;
37
assign reset_n = pll_locked & reset_ext_n;
38
 
39
assign ps2_kbclk = 1'bZ;
40
assign ps2_kbdat = 1'bZ;
41
 
42
reg [15:0] mv;
43
reg mv_wait;
44
reg was_ps2_kbclk;
45
always @(posedge clk_30 or negedge reset_n) begin
46
    if(reset_n == 1'b0) begin
47
        mv              <= 16'd0;
48
        mv_wait         <= 1'b0;
49
        was_ps2_kbclk   <= 1'b0;
50
    end
51
    else begin
52
        mv <= { mv[14:0], ps2_kbclk };
53
 
54
        if(mv_wait == 1'b0 && mv[15:12] == 4'b1111 && mv[3:0] == 4'b0000) begin
55
            was_ps2_kbclk <= 1'b1;
56
            mv_wait <= 1'b1;
57
        end
58
        else if(mv_wait == 1'b1 && mv[15:0] == 16'h0000) begin
59
            mv_wait <= 1'b0;
60
            was_ps2_kbclk <= 1'b0;
61
        end
62
        else begin
63
            was_ps2_kbclk <= 1'b0;
64
        end
65
    end
66
end
67
 
68
/* mouse
69
reg [12:0] send_counter;
70
reg [9:0] send_shift;
71
 
72
always @(posedge CLK_I or negedge reset_n) begin
73
    if(reset_n == 1'b0) begin
74
        send_counter    <= 13'd0;
75
        send_shift      <= 10'd0;
76
    end
77
    else if(send_start == 1'b1) begin
78
        send_counter <= 13'd1;
79
        send_shift <= send_contents;
80
    end
81
    else if(send_counter > 13'd0 && send_counter < 13'd8100) begin
82
        send_counter <= send_counter + 13'd1;
83
    end
84
    else if(send_counter >= 13'd8100 && send_counter <= 13'd8109 && was_ps2_kbclk == 1'b1) begin
85
        send_counter <= send_counter + 13'd1;
86
        if(send_counter <= 13'd8107) begin
87
            send_shift <= { send_shift[9] ^ send_shift[0], 1'b0, send_shift[8:1] };
88
        end
89
        else if(send_counter == 13'd8108) begin
90
            send_shift <= { 9'd0, send_shift[9] ^ send_shift[0] };
91
        end
92
    end
93
    else if(send_counter == 13'd8110 && was_ps2_kbclk == 1'b1) begin
94
        if(ps2_kbdat == 1'b0) send_counter <= send_counter + 13'd1;
95
    end
96
    else if(send_counter == 13'd8111 && ps2_kbclk == 1'b1 && ps2_kbdat == 1'b1) begin
97
        send_counter <= 13'd0;
98
    end
99
end
100
 
101
reg send_start;
102
reg [9:0] send_contents;
103
reg [23:0] ctrl_counter;
104
 
105
always @(posedge CLK_I or negedge reset_n) begin
106
    if(reset_n == 1'b0) begin
107
        send_start      <= 1'b0;
108
        send_contents   <= 10'd0;
109
        ctrl_counter    <= 24'd0;
110
    end
111
    else if(ctrl_counter == 24'hFFFFFC) begin
112
        send_start <= 1'b1;
113
        ctrl_counter <= ctrl_counter + 16'd1;
114
        send_contents <= { 1'b0, 8'hF4, 1'b0 };
115
    end
116
    else if(ctrl_counter == 24'hFFFFFD) begin
117
        send_start <= 1'b0;
118
        ctrl_counter <= ctrl_counter + 16'd1;
119
    end
120
    else if(ctrl_counter == 24'hFFFFFE) begin
121
        if(send_counter == 13'd0) ctrl_counter <= ctrl_counter + 16'd1;
122
    end
123
    else if(ctrl_counter < 24'hFFFFFC) begin
124
        ctrl_counter <= ctrl_counter + 16'd1;
125
    end
126
end
127
*/
128
 
129
wire new_ps2;
130
assign new_ps2 = (was_ps2_kbclk == 1'b1 && kbdat_counter == 4'd10 && kbdat[0] == 1'b0 && ps2_kbdat == 1'b1 && kbdat_parity == 1'b1);
131
 
132
reg [9:0] kbdat;
133
reg [3:0] kbdat_counter;
134
reg [23:0] timeout;
135
reg kbdat_parity;
136
 
137
always @(posedge clk_30 or negedge reset_n) begin
138
    if(reset_n == 1'b0) begin
139
        kbdat           <= 10'd0;
140
        kbdat_counter   <= 4'd0;
141
        kbdat_parity    <= 1'b0;
142
        timeout         <= 24'd0;
143
    end
144
    else begin
145
 
146
        if(kbdat_counter != 4'd0 && timeout != 24'hFFFFFF)  timeout <= timeout + 24'd1;
147
        else if(kbdat_counter == 4'd0)                      timeout <= 24'd0;
148
 
149
        if(was_ps2_kbclk == 1'b1) begin
150
            kbdat <= { ps2_kbdat, kbdat[9:1] };
151
 
152
            if(kbdat_counter == 4'd10) begin
153
                kbdat_counter <= 4'd0;
154
            end
155
            else begin
156
                kbdat_counter <= kbdat_counter + 4'd1;
157
                if(kbdat_counter == 4'd0)   kbdat_parity <= 1'b0;
158
                else if(ps2_kbdat == 1'b1)  kbdat_parity <= !kbdat_parity;
159
            end
160
        end
161
        else if(timeout == 24'hFFFFFF) begin
162
            kbdat_counter <= 4'd0;
163
        end
164
    end
165
end
166
/*
167
reg [9:0] debug_addr;
168
always @(posedge clk_30) if(new_ps2 == 1'b1) debug_addr <= debug_addr + 10'd1;
169
 
170
altsyncram debug_ram_inst(
171
    .clock0(clk_30),
172
    .wren_a(new_ps2 == 1'b1),
173
    .address_a(debug_addr),
174
    .data_a(kbdat[8:1])
175
);
176
defparam debug_ram_inst.operation_mode = "SINGLE_PORT";
177
defparam debug_ram_inst.width_a = 8;
178
defparam debug_ram_inst.widthad_a = 10;
179
defparam debug_ram_inst.lpm_hint = "ENABLE_RUNTIME_MOD=YES,INSTANCE_NAME=kb";
180
*/
181
 
182
reg [3:0] debug_addr2;
183
always @(posedge clk_30) if(last_amiga_new == 1'b1) debug_addr2 <= debug_addr2 + 4'd1;
184
reg last_amiga_new;
185
always @(posedge clk_30) last_amiga_new <= amiga_new;
186
 
187
altsyncram debug_ram_inst(
188
    .clock0(clk_30),
189
    .wren_a(last_amiga_new == 1'b1),
190
    .address_a(debug_addr2),
191
    .data_a(amiga_keycodes)
192
);
193
defparam debug_ram_inst.operation_mode = "SINGLE_PORT";
194
defparam debug_ram_inst.width_a = 96;
195
defparam debug_ram_inst.widthad_a = 4;
196
defparam debug_ram_inst.lpm_hint = "ENABLE_RUNTIME_MOD=YES,INSTANCE_NAME=kb";
197
 
198
 
199
 
200
 
201
wire pressed;
202
altsyncram pressed_code_inst(
203
    .clock0(clk_30),
204
 
205
    .address_a(amiga_keycode[6:0]),
206
    .wren_a(new_ps2 == 1'b0 && amiga_new == 1'b1 && delay == 1'b1),
207
    .data_a(amiga_keycode[7] == 1'b0),
208
    .q_a(pressed)
209
);
210
defparam
211
    pressed_code_inst.operation_mode = "SINGLE_PORT",
212
    pressed_code_inst.width_a = 1,
213
    pressed_code_inst.lpm_hint = "ENABLE_RUNTIME_MOD=YES,INSTANCE_NAME=kbpress",
214
    pressed_code_inst.widthad_a = 7;
215
 
216
 
217
reg [95:0]  amiga_keycodes;
218
reg [3:0]   amiga_avail;
219
reg [7:0]   amiga_keycode;
220
reg         amiga_new;
221
reg         caps_lock;
222
reg         delay;
223
 
224
reg [2:0]   state;
225
parameter [2:0]
226
    S_FIRST             = 3'd0,
227
    S_E0                = 3'd1,
228
    S_E0_12             = 3'd2,
229
    S_E0_12_E0          = 3'd3,
230
    S_E0_F0_7C          = 3'd4,
231
    S_E0_F0_7C_E0       = 3'd5,
232
    S_E0_F0_7C_E0_F0    = 3'd6;
233
 
234
always @(posedge clk_30 or negedge reset_n) begin
235
    if(reset_n == 1'b0) begin
236
        amiga_keycodes      <= { 8'hFD, 8'hFE, 80'h0 };
237
        amiga_avail         <= 4'd2;
238
 
239
        amiga_new           <= 1'b0;
240
        amiga_keycode       <= 8'd0;
241
        caps_lock           <= 1'b0;
242
        delay               <= 1'b0;
243
        state               <= S_FIRST;
244
    end
245
    else begin
246
 
247
        if(new_ps2 == 1'b1) begin
248
            delay <= 1'b0;
249
 
250
            if(state == S_FIRST) begin
251
                if(kbdat[8:1] == 8'hF0 && amiga_keycode[7] == 1'b0) begin
252
                    amiga_keycode[7] <= 1'b1;
253
                end
254
                else if(kbdat[8:1] == 8'hE0) begin
255
                    state <= S_E0;
256
                end
257
                else if(kbdat[8:1] == 8'h58) begin
258
                    { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_CAPS };
259
 
260
                    if(caps_lock == 1'b0 && amiga_keycode[7] == 1'b1) begin
261
                        amiga_keycode[7] <= 1'b0;
262
                        caps_lock <= 1'b1;
263
                    end
264
                    else if(caps_lock == 1'b1 && amiga_keycode[7] == 1'b0) begin
265
                        amiga_keycode[7] <= 1'b1;
266
                    end
267
                    else if(caps_lock == 1'b1 && amiga_keycode[7] == 1'b1) begin
268
                        caps_lock <= 1'b0;
269
                    end
270
                end
271
                else begin
272
                    case(kbdat[8:1])
273
                        8'h76:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_ESC };
274
                        8'h05:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_F1 };
275
                        8'h06:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_F2 };
276
                        8'h04:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_F3 };
277
                        8'h0C:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_F4 };
278
                        8'h03:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_F5 };
279
                        8'h0B:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_F6 };
280
                        8'h83:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_F7 };
281
                        8'h0A:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_F8 };
282
                        8'h01:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_F9 };
283
                        8'h09:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_F10 };
284
                        8'h78:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_LAMIGA }; //F11
285
                        8'h07:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_RAMIGA }; //F12
286
                        8'h0E:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_APO };
287
                        8'h16:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_1 };
288
                        8'h1E:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_2 };
289
                        8'h26:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_3 };
290
                        8'h25:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_4 };
291
                        8'h2E:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_5 };
292
                        8'h36:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_6 };
293
                        8'h3D:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_7 };
294
                        8'h3E:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_8 };
295
                        8'h46:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_9 };
296
                        8'h45:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_0 };
297
                        8'h4E:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_MIN };
298
                        8'h55:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_EQL };
299
                        8'h5D:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_BSLA };
300
                        8'h66:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_BACK };
301
                        8'h0D:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_TAB };
302
                        8'h15:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_Q };
303
                        8'h1D:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_W };
304
                        8'h24:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_E };
305
                        8'h2D:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_R };
306
                        8'h2C:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_T };
307
                        8'h35:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_Y };
308
                        8'h3C:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_U };
309
                        8'h43:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_I };
310
                        8'h44:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_O };
311
                        8'h4D:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_P };
312
                        8'h54:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_SBRAL };
313
                        8'h5B:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_SBRAR };
314
                        8'h5A:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_ENTER };
315
                        8'h14:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_CTRL };
316
                        8'h1C:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_A };
317
                        8'h1B:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_S };
318
                        8'h23:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_D };
319
                        8'h2B:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_F };
320
                        8'h34:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_G };
321
                        8'h33:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_H };
322
                        8'h3B:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_J };
323
                        8'h42:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_K };
324
                        8'h4B:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_L };
325
                        8'h4C:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_SEMIC };
326
                        8'h52:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_SQUO };
327
                        8'h12:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_LSHIFT };
328
                        8'h1A:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_Z };
329
                        8'h22:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_X };
330
                        8'h21:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_C };
331
                        8'h2A:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_V };
332
                        8'h32:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_B };
333
                        8'h31:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_N };
334
                        8'h3A:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_M };
335
                        8'h41:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_COMMA };
336
                        8'h49:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_DOT };
337
                        8'h4A:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_SLA };
338
                        8'h59:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_RSHIFT };
339
                        8'h11:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_LALT };
340
                        8'h7C:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_NUM_MULT };
341
                        8'h6C:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_NUM_7 };
342
                        8'h75:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_NUM_8 };
343
                        8'h7D:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_NUM_9 };
344
                        8'h7B:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_NUM_MIN };
345
                        8'h6B:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_NUM_4 };
346
                        8'h73:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_NUM_5 };
347
                        8'h74:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_NUM_6 };
348
                        8'h79:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_NUM_PLUS };
349
                        8'h69:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_NUM_1 };
350
                        8'h72:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_NUM_2 };
351
                        8'h7A:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_NUM_3 };
352
                        8'h29:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_SPACE };
353
                        8'h70:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_NUM_0 };
354
                        8'h71:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_NUM_DOT };
355
                        default: begin
356
                            { amiga_new, amiga_keycode[7] } <= 2'b00;
357
                            state <= S_FIRST;
358
                        end
359
                    endcase
360
                end
361
            end
362
            else if(state == S_E0) begin
363
                if(kbdat[8:1] == 8'hF0 && amiga_keycode[7] == 1'b0) begin
364
                    amiga_keycode[7] <= 1'b1;
365
                end
366
                else if(kbdat[8:1] == 8'h12 && amiga_keycode[7] == 1'b0) begin
367
                    state <= S_E0_12;
368
                end
369
                else if(kbdat[8:1] == 8'h7C && amiga_keycode[7] == 1'b1) begin
370
                    state <= S_E0_F0_7C;
371
                end
372
                else begin
373
                    case(kbdat[8:1])
374
                        8'h11:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_RALT };
375
                        8'h5B:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_LAMIGA }; //left Windows
376
                        8'h5C:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_RAMIGA }; //right Windows
377
                        8'h71:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_DEL };
378
                        8'h75:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_UP };
379
                        8'h6B:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_LEFT };
380
                        8'h72:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_DOWN };
381
                        8'h74:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_RIGHT };
382
                        8'h7D:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_NUM_LBRA }; // pageUp
383
                        8'h7A:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_NUM_RBRA }; // pageDown
384
                        8'h4A:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_NUM_SLA };
385
                        8'h5A:  { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_NUM_ENTER };
386
                        default: begin
387
                            { amiga_new, amiga_keycode[7] } <= 2'b00;
388
                            state <= S_FIRST;
389
                        end
390
                    endcase
391
                end
392
            end
393
            else if(state == S_E0_12) begin
394
                if(kbdat[8:1] == 8'hE0) begin
395
                    state <= S_E0_12_E0;
396
                end
397
                else begin
398
                    { amiga_new, amiga_keycode[7] } <= 2'b00;
399
                    state <= S_FIRST;
400
                end
401
            end
402
            else if(state == S_E0_12_E0) begin
403
                if(kbdat[8:1] == 8'h7C) begin
404
                    { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_HELP }; // make PrintScreen
405
                end
406
                else begin
407
                    { amiga_new, amiga_keycode[7] } <= 2'b00;
408
                    state <= S_FIRST;
409
                end
410
            end
411
 
412
            else if(state == S_E0_F0_7C) begin
413
                if(kbdat[8:1] == 8'hE0) begin
414
                    state <= S_E0_F0_7C_E0;
415
                end
416
                else begin
417
                    { amiga_new, amiga_keycode[7] } <= 2'b00;
418
                    state <= S_FIRST;
419
                end
420
            end
421
            else if(state == S_E0_F0_7C_E0) begin
422
                if(kbdat[8:1] == 8'hF0) begin
423
                    state <= S_E0_F0_7C_E0_F0;
424
                end
425
                else begin
426
                    { amiga_new, amiga_keycode[7] } <= 2'b00;
427
                    state <= S_FIRST;
428
                end
429
            end
430
            else if(state == S_E0_F0_7C_E0_F0) begin
431
                if(kbdat[8:1] == 8'h12) begin
432
                    { amiga_new, amiga_keycode[6:0] } <= { 1'b1, AKC_HELP }; // break PrintScreen
433
                end
434
                else begin
435
                    { amiga_new, amiga_keycode[7] } <= 2'b00;
436
                    state <= S_FIRST;
437
                end
438
            end
439
        end
440
        else if(amiga_new == 1'b1 && delay == 1'b0) begin
441
            delay <= 1'b1;
442
            state <= S_FIRST;
443
        end
444
        else if(amiga_new == 1'b1 && delay == 1'b1) begin
445
            amiga_new <= 1'b0;
446
            amiga_keycode <= 8'd0;
447
            delay <= 1'b0;
448
 
449
            if(pressed == 1'b0 || amiga_keycode[7] == 1'b1) begin
450
 
451
                if(amiga_avail >= 4'd0 && amiga_avail <= 4'd11)  amiga_avail <= amiga_avail + 4'd1;
452
 
453
                case(amiga_avail)
454
                    4'd0:   amiga_keycodes[95:88]   <= amiga_keycode;
455
                    4'd1:   amiga_keycodes[87:80]   <= amiga_keycode;
456
                    4'd2:   amiga_keycodes[79:72]   <= amiga_keycode;
457
                    4'd3:   amiga_keycodes[71:64]   <= amiga_keycode;
458
                    4'd4:   amiga_keycodes[63:56]   <= amiga_keycode;
459
                    4'd5:   amiga_keycodes[55:48]   <= amiga_keycode;
460
                    4'd6:   amiga_keycodes[47:40]   <= amiga_keycode;
461
                    4'd7:   amiga_keycodes[39:32]   <= amiga_keycode;
462
                    4'd8:   amiga_keycodes[31:24]   <= amiga_keycode;
463
                    4'd9:   amiga_keycodes[23:16]   <= amiga_keycode;
464
                    4'd10:  amiga_keycodes[15:8]    <= amiga_keycode;
465
                    4'd11:  amiga_keycodes[7:0]     <= 8'hFA;
466
                endcase
467
            end
468
        end
469
        //else if(cnt_counter == 5'd0 && amiga_avail > 4'd0) begin
470
        //    amiga_avail <= amiga_avail - 4'd1;
471
        //    amiga_keycodes <= { amiga_keycodes[87:0], 8'd0 };
472
        //end
473
    end
474
end
475
 
476
parameter [6:0]
477
    AKC_ESC         = 7'h45,
478
    AKC_F1          = 7'h50,
479
    AKC_F2          = 7'h51,
480
    AKC_F3          = 7'h52,
481
    AKC_F4          = 7'h53,
482
    AKC_F5          = 7'h54,
483
    AKC_F6          = 7'h55,
484
    AKC_F7          = 7'h56,
485
    AKC_F8          = 7'h57,
486
    AKC_F9          = 7'h58,
487
    AKC_F10         = 7'h59,
488
    AKC_APO         = 7'h00, //`
489
    AKC_BACK        = 7'h41,
490
    AKC_1           = 7'h01,
491
    AKC_2           = 7'h02,
492
    AKC_3           = 7'h03,
493
    AKC_4           = 7'h04,
494
    AKC_5           = 7'h05,
495
    AKC_6           = 7'h06,
496
    AKC_7           = 7'h07,
497
    AKC_8           = 7'h08,
498
    AKC_9           = 7'h09,
499
    AKC_0           = 7'h0A,
500
    AKC_MIN         = 7'h0B, //-
501
    AKC_EQL         = 7'h0C, //=
502
    AKC_BSLA        = 7'h0D, //\\
503
    AKC_TAB         = 7'h42,
504
    AKC_Q           = 7'h10,
505
    AKC_W           = 7'h11,
506
    AKC_E           = 7'h12,
507
    AKC_R           = 7'h13,
508
    AKC_T           = 7'h14,
509
    AKC_Y           = 7'h15,
510
    AKC_U           = 7'h16,
511
    AKC_I           = 7'h17,
512
    AKC_O           = 7'h18,
513
    AKC_P           = 7'h19,
514
    AKC_SBRAL       = 7'h1A, //[
515
    AKC_SBRAR       = 7'h1B, //]
516
    AKC_ENTER       = 7'h44,
517
    AKC_CTRL        = 7'h63,
518
    AKC_CAPS        = 7'h62,
519
    AKC_A           = 7'h20,
520
    AKC_S           = 7'h21,
521
    AKC_D           = 7'h22,
522
    AKC_F           = 7'h23,
523
    AKC_G           = 7'h24,
524
    AKC_H           = 7'h25,
525
    AKC_J           = 7'h26,
526
    AKC_K           = 7'h27,
527
    AKC_L           = 7'h28,
528
    AKC_SEMIC       = 7'h29, //;
529
    AKC_SQUO        = 7'h2A, //'
530
    AKC_LSHIFT      = 7'h60,
531
    AKC_Z           = 7'h31,
532
    AKC_X           = 7'h32,
533
    AKC_C           = 7'h33,
534
    AKC_V           = 7'h34,
535
    AKC_B           = 7'h35,
536
    AKC_N           = 7'h36,
537
    AKC_M           = 7'h37,
538
    AKC_COMMA       = 7'h38, //,
539
    AKC_DOT         = 7'h39, //.
540
    AKC_SLA         = 7'h3A, ///
541
    AKC_RSHIFT      = 7'h61,
542
    AKC_LALT        = 7'h64,
543
    AKC_LAMIGA      = 7'h66,
544
    AKC_SPACE       = 7'h40,
545
    AKC_RAMIGA      = 7'h67,
546
    AKC_RALT        = 7'h65,
547
    AKC_DEL         = 7'h46,
548
    AKC_HELP        = 7'h5F,
549
    AKC_UP          = 7'h4C,
550
    AKC_LEFT        = 7'h4F,
551
    AKC_DOWN        = 7'h4D,
552
    AKC_RIGHT       = 7'h4E,
553
    AKC_NUM_LBRA    = 7'h5A, //(
554
    AKC_NUM_RBRA    = 7'h5B, //)
555
    AKC_NUM_SLA     = 7'h5C, ///
556
    AKC_NUM_MULT    = 7'h5D, //*
557
    AKC_NUM_7       = 7'h3D,
558
    AKC_NUM_8       = 7'h3E,
559
    AKC_NUM_9       = 7'h3F,
560
    AKC_NUM_MIN     = 7'h4A, //-
561
    AKC_NUM_4       = 7'h4D,
562
    AKC_NUM_5       = 7'h4E,
563
    AKC_NUM_6       = 7'h4F,
564
    AKC_NUM_PLUS    = 7'h5E, //+
565
    AKC_NUM_1       = 7'h1D,
566
    AKC_NUM_2       = 7'h1E,
567
    AKC_NUM_3       = 7'h1F,
568
    AKC_NUM_ENTER   = 7'h43,
569
    AKC_NUM_0       = 7'h0F,
570
    AKC_NUM_DOT     = 7'h3C; //.
571
 
572
endmodule

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.