§ Тактирование


Такты приходят от клавиатуры. Модуль их только принимает.

§ TOP-модуль

Модуль можно тактировать на 25 Мгц, но можно и на более низких частотах. Даже до 1 Мгц.
1always @(posedge clock_25) if (keyb_ready) led <= {led[15:0], keyb_data};
2
3// Модуль клавиатуры
4keyboard KeyboardPS2
5(
6    .clock_25   (clock_25),
7    .PS2_CLK    (PS2_CLK),
8    .PS2_DAT    (PS2_DAT),
9    .keyb_ready (keyb_ready),
10    .keyb_data  (keyb_data)
11);

§ Модуль keyboard.v

1/*
2 * Модуль приема данных от клавиатуры PS/2
3 * При keyb_ready=1, на позитивном фронте clock_25 будут доступен keyb_data
4 */
5
6module keyboard
7(
8    input   wire        clock_25,
9    inout   wire        PS2_CLK,
10    inout   wire        PS2_DAT,
11    output  reg         keyb_ready,
12    output  reg [7:0]   keyb_data
13);
14
15// ---------------------------------------------------------------------
16// ОБЪЯВЛЕНИЯ
17// ---------------------------------------------------------------------
18
19reg         state;
20reg [ 9:0]  data;
21reg [ 3:0]  cnt;
22reg [ 1:0]  k;
23
24// ---------------------------------------------------------------------
25// ОСНОВНАЯ ЛОГИКА
26// ---------------------------------------------------------------------
27
28always @(negedge clock_25) begin
29
30    keyb_ready <= 1'b0;
31
32    case (state)
33
34    // Статус ожидания старта
35    0: if (k == 2'b10) begin state <= 1'b1; cnt <= 0; end
36
37    // На позитивном фронте CLK
38    1: if (k == 2'b01) begin
39
40        //     1   9..2    10       11
41        // Start | 8 bit | Parity | Stop
42        if (cnt == 10) begin
43
44            // В data[9] => Parity (проверить четность)
45            // В data[0] => Start (равен 0)
46
47            state       <= 1'b0;
48            keyb_ready  <= (PS2_DAT == 1'b1) && (data[0] == 1'b0);
49            keyb_data   <= data[8:1];
50
51        end
52
53        // LSB первым идет
54        data  <= {PS2_DAT, data[9:1]};
55        cnt   <= cnt + 1;
56
57    end
58
59    endcase
60
61    k <= {k[0], PS2_CLK};
62
63end
64
65endmodule