mirror of
https://github.com/alangarf/apple-one.git
synced 2025-01-24 12:31:16 +00:00
Added ps/2 shift key support
This commit is contained in:
parent
25f08eeb1d
commit
5c87a46445
@ -49,9 +49,10 @@ module ps2keyboard (
|
||||
// keyboard translation signals
|
||||
reg [7:0] ascii; // ASCII code of received character
|
||||
reg ascii_rdy; // new ASCII character received
|
||||
reg shift; // state of the shift key
|
||||
reg [2:0] cur_state;
|
||||
reg [2:0] next_state;
|
||||
|
||||
|
||||
//
|
||||
// PS/2 data from a device changes when the clock
|
||||
// is low, so we latch when the clock transitions
|
||||
@ -119,6 +120,7 @@ begin
|
||||
rx <= 0;
|
||||
rx_rdy <= 0;
|
||||
ascii_rdy <= 0;
|
||||
shift <= 0;
|
||||
cur_state <= S_KEYNORMAL;
|
||||
end
|
||||
else
|
||||
@ -164,63 +166,130 @@ begin
|
||||
else
|
||||
begin
|
||||
ascii_rdy <= 1'b1; // new key has arrived!
|
||||
case(rx)
|
||||
8'h1C: ascii <= "A";
|
||||
8'h32: ascii <= "B";
|
||||
8'h21: ascii <= "C";
|
||||
8'h23: ascii <= "D";
|
||||
8'h24: ascii <= "E";
|
||||
8'h2B: ascii <= "F";
|
||||
8'h34: ascii <= "G";
|
||||
8'h33: ascii <= "H";
|
||||
8'h43: ascii <= "I";
|
||||
8'h3B: ascii <= "J";
|
||||
8'h42: ascii <= "K";
|
||||
8'h4B: ascii <= "L";
|
||||
8'h3A: ascii <= "M";
|
||||
8'h31: ascii <= "N";
|
||||
8'h44: ascii <= "O";
|
||||
8'h4D: ascii <= "P";
|
||||
8'h15: ascii <= "Q";
|
||||
8'h2D: ascii <= "R";
|
||||
8'h1B: ascii <= "S";
|
||||
8'h2C: ascii <= "T";
|
||||
8'h3C: ascii <= "U";
|
||||
8'h2A: ascii <= "V";
|
||||
8'h1D: ascii <= "W";
|
||||
8'h22: ascii <= "X";
|
||||
8'h35: ascii <= "Y";
|
||||
8'h1A: ascii <= "Z";
|
||||
if (!shift)
|
||||
case(rx)
|
||||
8'h1C: ascii <= "A";
|
||||
8'h32: ascii <= "B";
|
||||
8'h21: ascii <= "C";
|
||||
8'h23: ascii <= "D";
|
||||
8'h24: ascii <= "E";
|
||||
8'h2B: ascii <= "F";
|
||||
8'h34: ascii <= "G";
|
||||
8'h33: ascii <= "H";
|
||||
8'h43: ascii <= "I";
|
||||
8'h3B: ascii <= "J";
|
||||
8'h42: ascii <= "K";
|
||||
8'h4B: ascii <= "L";
|
||||
8'h3A: ascii <= "M";
|
||||
8'h31: ascii <= "N";
|
||||
8'h44: ascii <= "O";
|
||||
8'h4D: ascii <= "P";
|
||||
8'h15: ascii <= "Q";
|
||||
8'h2D: ascii <= "R";
|
||||
8'h1B: ascii <= "S";
|
||||
8'h2C: ascii <= "T";
|
||||
8'h3C: ascii <= "U";
|
||||
8'h2A: ascii <= "V";
|
||||
8'h1D: ascii <= "W";
|
||||
8'h22: ascii <= "X";
|
||||
8'h35: ascii <= "Y";
|
||||
8'h1A: ascii <= "Z";
|
||||
|
||||
8'h45: ascii <= "0";
|
||||
8'h16: ascii <= "1";
|
||||
8'h1E: ascii <= "2";
|
||||
8'h26: ascii <= "3";
|
||||
8'h25: ascii <= "4";
|
||||
8'h2E: ascii <= "5";
|
||||
8'h36: ascii <= "6";
|
||||
8'h3D: ascii <= "7";
|
||||
8'h3E: ascii <= "8";
|
||||
8'h46: ascii <= "9";
|
||||
8'h45: ascii <= "0";
|
||||
8'h16: ascii <= "1";
|
||||
8'h1E: ascii <= "2";
|
||||
8'h26: ascii <= "3";
|
||||
8'h25: ascii <= "4";
|
||||
8'h2E: ascii <= "5";
|
||||
8'h36: ascii <= "6";
|
||||
8'h3D: ascii <= "7";
|
||||
8'h3E: ascii <= "8";
|
||||
8'h46: ascii <= "9";
|
||||
|
||||
8'h4E: ascii <= "-";
|
||||
8'h55: ascii <= "=";
|
||||
8'h5D: ascii <= "\\ ";
|
||||
8'h66: ascii <= 8'd8; // backspace
|
||||
8'h29: ascii <= " ";
|
||||
8'h4E: ascii <= "-";
|
||||
8'h55: ascii <= "=";
|
||||
8'h5D: ascii <= "\\ ";
|
||||
8'h66: ascii <= 8'd8; // backspace
|
||||
8'h29: ascii <= " ";
|
||||
|
||||
8'h5A: ascii <= 8'd13; // enter
|
||||
8'h54: ascii <= "[";
|
||||
8'h5B: ascii <= "]";
|
||||
8'h52: ascii <= "'";
|
||||
8'h41: ascii <= ",";
|
||||
8'h49: ascii <= ".";
|
||||
8'h4A: ascii <= "/";
|
||||
endcase
|
||||
8'h5A: ascii <= 8'd13; // enter
|
||||
8'h54: ascii <= "[";
|
||||
8'h5B: ascii <= "]";
|
||||
8'h4C: ascii <= ";";
|
||||
8'h52: ascii <= "'";
|
||||
8'h41: ascii <= ",";
|
||||
8'h49: ascii <= ".";
|
||||
8'h4A: ascii <= "/";
|
||||
8'h59: shift <= 1'b1; // right shfit
|
||||
8'h12: shift <= 1'b1; // left shift
|
||||
endcase
|
||||
else
|
||||
case(rx)
|
||||
8'h1C: ascii <= "A";
|
||||
8'h32: ascii <= "B";
|
||||
8'h21: ascii <= "C";
|
||||
8'h23: ascii <= "D";
|
||||
8'h24: ascii <= "E";
|
||||
8'h2B: ascii <= "F";
|
||||
8'h34: ascii <= "G";
|
||||
8'h33: ascii <= "H";
|
||||
8'h43: ascii <= "I";
|
||||
8'h3B: ascii <= "J";
|
||||
8'h42: ascii <= "K";
|
||||
8'h4B: ascii <= "L";
|
||||
8'h3A: ascii <= "M";
|
||||
8'h31: ascii <= "N";
|
||||
8'h44: ascii <= "O";
|
||||
8'h4D: ascii <= "P";
|
||||
8'h15: ascii <= "Q";
|
||||
8'h2D: ascii <= "R";
|
||||
8'h1B: ascii <= "S";
|
||||
8'h2C: ascii <= "T";
|
||||
8'h3C: ascii <= "U";
|
||||
8'h2A: ascii <= "V";
|
||||
8'h1D: ascii <= "W";
|
||||
8'h22: ascii <= "X";
|
||||
8'h35: ascii <= "Y";
|
||||
8'h1A: ascii <= "Z";
|
||||
|
||||
8'h45: ascii <= ")";
|
||||
8'h16: ascii <= "!";
|
||||
8'h1E: ascii <= "@";
|
||||
8'h26: ascii <= "#";
|
||||
8'h25: ascii <= "$";
|
||||
8'h2E: ascii <= "%";
|
||||
8'h36: ascii <= "^";
|
||||
8'h3D: ascii <= "&";
|
||||
8'h3E: ascii <= "*";
|
||||
8'h46: ascii <= "(";
|
||||
|
||||
8'h4E: ascii <= "_";
|
||||
8'h55: ascii <= "+";
|
||||
8'h5D: ascii <= "|";
|
||||
8'h66: ascii <= 8'd8; // backspace
|
||||
8'h29: ascii <= " ";
|
||||
|
||||
8'h5A: ascii <= 8'd13; // enter
|
||||
8'h54: ascii <= "{";
|
||||
8'h5B: ascii <= "}";
|
||||
8'h4C: ascii <= ":";
|
||||
8'h52: ascii <= "\"";
|
||||
8'h41: ascii <= "<";
|
||||
8'h49: ascii <= ">";
|
||||
8'h4A: ascii <= "?";
|
||||
8'h59: shift <= 1'b1; // right shfit
|
||||
8'h12: shift <= 1'b1; // left shift
|
||||
endcase
|
||||
end
|
||||
end
|
||||
S_KEYF0:
|
||||
next_state = S_KEYNORMAL;
|
||||
// when we end up here, a 0xF0 byte was received
|
||||
// which usually means a key release event
|
||||
begin
|
||||
if ((rx == 8'h59) || (rx == 8'h12))
|
||||
shift <= 1'b0;
|
||||
next_state = S_KEYNORMAL;
|
||||
end
|
||||
S_KEYE0:
|
||||
begin
|
||||
if (rx == 8'hF0)
|
||||
|
Loading…
x
Reference in New Issue
Block a user