§ Тактирование
Такты приходят от клавиатуры. Модуль их только принимает.
§ 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