

module kbd_transl( shift, incode, outcode);
   input	shift;
   input[7:0] incode;
   output [6:0] outcode;
   reg [6:0] ascii;
   wire [8:0] shift_key_plus_code;

   assign outcode = ascii;
   assign shift_key_plus_code = { shift, incode};

	

  // This part translates the scan code into an ASCII value...
  // Only the ASCII codes which I considered important have been included.
  // if you want more, just add the appropriate case statement lines...
  // (You will need to know the keyboard scan codes you wish to assign.)
  // The entries are listed in ascending order of ASCII value.
  always @(shift_key_plus_code) begin
    case(shift_key_plus_code)
    9'H066 : begin
      ascii <= 7'H08;
      // Backspace ("backspace" key)
    end
    9'H166 : begin
      ascii <= 7'H08;
      // Backspace ("backspace" key)
    end
    9'H00d : begin
      ascii <= 7'H09;
      // Horizontal Tab
    end
    9'H10d : begin
      ascii <= 7'H09;
      // Horizontal Tab
    end
    9'H05a : begin
      ascii <= 7'H0d;
      // Carriage return ("enter" key)
    end
    9'H15a : begin
      ascii <= 7'H0d;
      // Carriage return ("enter" key)
    end
    9'H076 : begin
      ascii <= 7'H1b;
      // Escape ("esc" key)
    end
    9'H176 : begin
      ascii <= 7'H1b;
      // Escape ("esc" key)
    end
    9'H029 : begin
      ascii <= 7'H20;
      // Space
    end
    9'H129 : begin
      ascii <= 7'H20;
      // Space
    end
    9'H116 : begin
      ascii <= 7'H21;
      // !
    end
    9'H152 : begin
      ascii <= 7'H22;
      // "
    end
    9'H126 : begin
      ascii <= 7'H23;
      // #
    end
    9'H125 : begin
      ascii <= 7'H24;
      // $
    end
    9'H12e : begin
      ascii <= 7'H25;
      //
    end
    9'H13d : begin
      ascii <= 7'H26;
      //
    end
    9'H052 : begin
      ascii <= 7'H27;
      //
    end
    9'H146 : begin
      ascii <= 7'H28;
      //
    end
    9'H145 : begin
      ascii <= 7'H29;
      //
    end
    9'H13e : begin
      ascii <= 7'H2a;
      // *
    end
    9'H155 : begin
      ascii <= 7'H2b;
      // +
    end
    9'H041 : begin
      ascii <= 7'H2c;
      // ,
    end
    9'H04e : begin
      ascii <= 7'H2d;
      // -
    end
    9'H049 : begin
      ascii <= 7'H2e;
      // .
    end
    9'H04a : begin
      ascii <= 7'H2f;
      // /
    end
    9'H045 : begin
      ascii <= 7'H30;
      // 0
    end
    9'H016 : begin
      ascii <= 7'H31;
      // 1
    end
    9'H01e : begin
      ascii <= 7'H32;
      // 2
    end
    9'H026 : begin
      ascii <= 7'H33;
      // 3
    end
    9'H025 : begin
      ascii <= 7'H34;
      // 4
    end
    9'H02e : begin
      ascii <= 7'H35;
      // 5
    end
    9'H036 : begin
      ascii <= 7'H36;
      // 6
    end
    9'H03d : begin
      ascii <= 7'H37;
      // 7
    end
    9'H03e : begin
      ascii <= 7'H38;
      // 8
    end
    9'H046 : begin
      ascii <= 7'H39;
      // 9
    end
    9'H14c : begin
      ascii <= 7'H3a;
      // :
    end
    9'H04c : begin
      ascii <= 7'H3b;
      // ;
    end
    9'H141 : begin
      ascii <= 7'H3c;
      // <
    end
    9'H055 : begin
      ascii <= 7'H3d;
      // =
    end
    9'H149 : begin
      ascii <= 7'H3e;
      // >
    end
    9'H14a : begin
      ascii <= 7'H3f;
      // ?
    end
    9'H11e : begin
      ascii <= 7'H40;
      // @
    end
    9'H11c : begin
      ascii <= 7'H41;
      // A
    end
    9'H132 : begin
      ascii <= 7'H42;
      // B
    end
    9'H121 : begin
      ascii <= 7'H43;
      // C
    end
    9'H123 : begin
      ascii <= 7'H44;
      // D
    end
    9'H124 : begin
      ascii <= 7'H45;
      // E
    end
    9'H12b : begin
      ascii <= 7'H46;
      // F
    end
    9'H134 : begin
      ascii <= 7'H47;
      // G
    end
    9'H133 : begin
      ascii <= 7'H48;
      // H
    end
    9'H143 : begin
      ascii <= 7'H49;
      // I
    end
    9'H13b : begin
      ascii <= 7'H4a;
      // J
    end
    9'H142 : begin
      ascii <= 7'H4b;
      // K
    end
    9'H14b : begin
      ascii <= 7'H4c;
      // L
    end
    9'H13a : begin
      ascii <= 7'H4d;
      // M
    end
    9'H131 : begin
      ascii <= 7'H4e;
      // N
    end
    9'H144 : begin
      ascii <= 7'H4f;
      // O
    end
    9'H14d : begin
      ascii <= 7'H50;
      // P
    end
    9'H115 : begin
      ascii <= 7'H51;
      // Q
    end
    9'H12d : begin
      ascii <= 7'H52;
      // R
    end
    9'H11b : begin
      ascii <= 7'H53;
      // S
    end
    9'H12c : begin
      ascii <= 7'H54;
      // T
    end
    9'H13c : begin
      ascii <= 7'H55;
      // U
    end
    9'H12a : begin
      ascii <= 7'H56;
      // V
    end
    9'H11d : begin
      ascii <= 7'H57;
      // W
    end
    9'H122 : begin
      ascii <= 7'H58;
      // X
    end
    9'H135 : begin
      ascii <= 7'H59;
      // Y
    end
    9'H11a : begin
      ascii <= 7'H5a;
      // Z
    end
    9'H054 : begin
      ascii <= 7'H5b;
      // [
    end
    9'H05d : begin
      ascii <= 7'H5c;
      // \
    end
    9'H05b : begin
      ascii <= 7'H5d;
      // ]
    end
    9'H136 : begin
      ascii <= 7'H5e;
      // ^
    end
    9'H14e : begin
      ascii <= 7'H5f;
      // _    
    end
    9'H00e : begin
      ascii <= 7'H60;
      // `
    end
    9'H01c : begin
      ascii <= 7'H61;
      // a
    end
    9'H032 : begin
      ascii <= 7'H62;
      // b
    end
    9'H021 : begin
      ascii <= 7'H63;
      // c
    end
    9'H023 : begin
      ascii <= 7'H64;
      // d
    end
    9'H024 : begin
      ascii <= 7'H65;
      // e
    end
    9'H02b : begin
      ascii <= 7'H66;
      // f
    end
    9'H034 : begin
      ascii <= 7'H67;
      // g
    end
    9'H033 : begin
      ascii <= 7'H68;
      // h
    end
    9'H043 : begin
      ascii <= 7'H69;
      // i
    end
    9'H03b : begin
      ascii <= 7'H6a;
      // j
    end
    9'H042 : begin
      ascii <= 7'H6b;
      // k
    end
    9'H04b : begin
      ascii <= 7'H6c;
      // l
    end
    9'H03a : begin
      ascii <= 7'H6d;
      // m
    end
    9'H031 : begin
      ascii <= 7'H6e;
      // n
    end
    9'H044 : begin
      ascii <= 7'H6f;
      // o
    end
    9'H04d : begin
      ascii <= 7'H70;
      // p
    end
    9'H015 : begin
      ascii <= 7'H71;
      // q
    end
    9'H02d : begin
      ascii <= 7'H72;
      // r
    end
    9'H01b : begin
      ascii <= 7'H73;
      // s
    end
    9'H02c : begin
      ascii <= 7'H74;
      // t
    end
    9'H03c : begin
      ascii <= 7'H75;
      // u
    end
    9'H02a : begin
      ascii <= 7'H76;
      // v
    end
    9'H01d : begin
      ascii <= 7'H77;
      // w
    end
    9'H022 : begin
      ascii <= 7'H78;
      // x
    end
    9'H035 : begin
      ascii <= 7'H79;
      // y
    end
    9'H01a : begin
      ascii <= 7'H7a;
      // z
    end
    9'H154 : begin
      ascii <= 7'H7b;
      // {
    end
    9'H15d : begin
      ascii <= 7'H7c;
      // |
    end
    9'H15b : begin
      ascii <= 7'H7d;
      // }
    end
    9'H10e : begin
      ascii <= 7'H7e;
      // ~
    end
    9'H071 : begin
      ascii <= 7'H7f;
      // (Delete OR DEL on numeric keypad)
    end
    9'H074 : begin
      ascii <= 7'H15;
      // right arrow (cntrl U)
    end
    9'H06b : begin
      ascii <= 7'H08;
      // left arrow (BS)
    end
    9'H075 : begin
      ascii <= 7'H0B;
      // (up arrow)
    end
    9'H072 : begin
      ascii <= 7'H0A;
      // (down arrow, ^J, LF)
    end
    9'H171 : begin
      ascii <= 7'H7f;
      // (Delete OR DEL on numeric keypad)
    end

    default : begin
      ascii <= 7'H00;
      // 0x00 used for unlisted characters.
    end
    endcase
  end


endmodule
