module keyboard ( input wire PS2CLK, input wire PS2DAT, output reg dav, output reg [7:0] ascii, output reg parity); reg [3:0] count = 0; reg [7:0] kbddata; always @(negedge PS2CLK) // read keyboard data begin count = count + 1; case (count) 1: dav = PS2DAT; 2: kbddata[0] = PS2DAT; 3: kbddata[1] = PS2DAT; 4: kbddata[2] = PS2DAT; 5: kbddata[3] = PS2DAT; 6: kbddata[4] = PS2DAT; 7: kbddata[5] = PS2DAT; 8: kbddata[6] = PS2DAT; 9: kbddata[7] = PS2DAT; 10: parity = PS2DAT; 11: begin count = 0; dav = PS2DAT; end endcase end always @(*) begin case (kbddata) 8'h05: ascii <= 8'ha1; // F1 8'h06: ascii <= 8'ha2; // F2 8'h04: ascii <= 8'ha3; // F3 8'h0C: ascii <= 8'ha4; // F4 8'h03: ascii <= 8'ha5; // F5 8'h0B: ascii <= 8'ha6; // F6 8'h83: ascii <= 8'hA7; // F7 8'h0A: ascii <= 8'hA8; // F8 8'h01: ascii <= 8'hA9; // F9 8'h09: ascii <= 8'hAA; // F10 8'h78: ascii <= 8'hAB; // F11 8'h07: ascii <= 8'hAC; // F12 8'h0d: ascii <= 8'h09; // tab 8'h0e: ascii <= 8'h60; // ` 8'h15: ascii <= 8'h51; // Q 8'h16: ascii <= 8'h31; // 1 8'h1a: ascii <= 8'h5a; // Z 8'h1b: ascii <= 8'h53; // S 8'h1c: ascii <= 8'h41; // A 8'h1d: ascii <= 8'h57; // W 8'h1e: ascii <= 8'h32; // 2 8'h21: ascii <= 8'h43; // C 8'h22: ascii <= 8'h58; // X 8'h23: ascii <= 8'h44; // D 8'h24: ascii <= 8'h45; // E 8'h25: ascii <= 8'h34; // 4 8'h26: ascii <= 8'h33; // 3 8'h29: ascii <= 8'h20; // space 8'h2a: ascii <= 8'h56; // V 8'h2b: ascii <= 8'h46; // F 8'h2c: ascii <= 8'h54; // T 8'h2d: ascii <= 8'h52; // R 8'h2e: ascii <= 8'h35; // 5 8'h31: ascii <= 8'h4e; // N 8'h32: ascii <= 8'h42; // B 8'h33: ascii <= 8'h48; // H 8'h34: ascii <= 8'h47; // G 8'h35: ascii <= 8'h59; // Y 8'h36: ascii <= 8'h36; // 6 8'h3a: ascii <= 8'h4d; // M 8'h3b: ascii <= 8'h4a; // J 8'h3c: ascii <= 8'h55; // U 8'h3d: ascii <= 8'h37; // 7 8'h3e: ascii <= 8'h38; // 8 8'h41: ascii <= 8'h2c; // , 8'h42: ascii <= 8'h4b; // K 8'h43: ascii <= 8'h49; // I 8'h44: ascii <= 8'h4f; // O 8'h45: ascii <= 8'h30; // 0 8'h46: ascii <= 8'h39; // 9 8'h49: ascii <= 8'h2e; // . 8'h4a: ascii <= 8'h2f; // / 8'h4b: ascii <= 8'h4c; // L 8'h4c: ascii <= 8'h3b; // ; 8'h4d: ascii <= 8'h50; // P 8'h4e: ascii <= 8'h2d; // - 8'h52: ascii <= 8'h27; // ' 8'h54: ascii <= 8'h5b; // [ 8'h55: ascii <= 8'h3d; // = 8'h58: ascii <= 8'hAD; // CAPS lock 8'h7E: ascii <= 8'hAE; // Scroll lock 8'h77: ascii <= 8'hAF; // Num lock 8'h5a: ascii <= 8'h0d; // carriage return 8'h5b: ascii <= 8'h5d; // ] 8'h5d: ascii <= 8'h5c; // \ 8'h66: ascii <= 8'h08; // backspace 8'h69: ascii <= 8'h95; // end 8'h6b: ascii <= 8'h93; // left 8'h6c: ascii <= 8'h94; // home 8'h70: ascii <= 8'h98; // insert 8'h71: ascii <= 8'h7f; // del 8'h72: ascii <= 8'h92; // down 8'h74: ascii <= 8'h91; // right 8'h75: ascii <= 8'h90; // up 8'h76: ascii <= 8'h1b; // escape 8'h7a: ascii <= 8'h97; // pg down 8'h7d: ascii <= 8'h96; // pg up 8'hFA: ascii <= 8'hFA; // keyboard ACK code default: ascii <= 8'h2e; // '.' used for unlisted characters. endcase end endmodule