1
0
mirror of https://github.com/Gehstock/Mist_FPGA.git synced 2026-02-13 19:34:09 +00:00
Files
Gehstock.Mist_FPGA/Computer_MiST/OricInFPGA_MiST/rtl/keyboard.sv
2019-07-23 22:51:10 +02:00

305 lines
8.6 KiB
Systemverilog

// Dave Wood 2019
module keyboard
(
input clk_24,
input clk,
input reset,
// input [10:0] ps2_key,
input key_pressed, // 1-make (pressed), 0-break (released)
input key_extended, // extended code
input key_strobe, // strobe
input [7:0] key_code, // key scan code
input [2:0] col,
input [7:0] row,
output [7:0] ROWbit,
output swrst
);
reg sw0 = 1'b0;
reg sw1 = 1'b0;
reg sw2 = 1'b0;
reg sw3 = 1'b0;
reg sw4 = 1'b0;
reg sw5 = 1'b0;
reg sw6 = 1'b0;
reg sw7 = 1'b0;
reg sw8 = 1'b0;
reg sw9 = 1'b0;
reg swa = 1'b0;
reg swb = 1'b0;
reg swc = 1'b0;
reg swd = 1'b0;
reg swe = 1'b0;
reg swf = 1'b0;
reg swg = 1'b0;
reg swh = 1'b0;
reg swi = 1'b0;
reg swj = 1'b0;
reg swk = 1'b0;
reg swl = 1'b0;
reg swm = 1'b0;
reg swn = 1'b0;
reg swo = 1'b0;
reg swp = 1'b0;
reg swq = 1'b0;
reg swr = 1'b0;
reg sws = 1'b0;
reg swt = 1'b0;
reg swu = 1'b0;
reg swv = 1'b0;
reg sww = 1'b0;
reg swx = 1'b0;
reg swy = 1'b0;
reg swz = 1'b0;
reg swU = 1'b0; // up
reg swD = 1'b0; // down
reg swL = 1'b0; // left
reg swR = 1'b0; // right
reg swrs = 1'b0; // right shift
reg swls = 1'b0; // left shift
reg swsp = 1'b0; // space
reg swcom = 1'b0; // ,
reg swdot = 1'b0; // .
reg swret = 1'b0; // return
reg swfs = 1'b0; // forward slash
reg sweq = 1'b0; // =
reg swfcn = 1'b0; // FCN - ALT
reg swdel = 1'b0; // delete
reg swrsb = 1'b0; // ]
reg swlsb = 1'b0; // [
reg swbs = 1'b0; // back slash
reg swdsh = 1'b0; // -
reg swsq = 1'b0; // '
reg swsc = 1'b0; // ;
reg swesc = 1'b0; // escape
reg swctl = 1'b0; // left ctrl
//reg swrst = 0;
reg swf1 = 1'b0;
reg swf2 = 1'b0;
reg swf3 = 1'b0;
reg swf4 = 1'b0;
reg swf5 = 1'b0;
reg swf6 = 1'b0;
always @(posedge clk_24) begin
reg old_state;
old_state <= key_strobe;
if(old_state != key_strobe) begin
casex(key_code)
'h045: sw0 <= key_pressed; // 0
'h016: sw1 <= key_pressed; // 1
'h01e: sw2 <= key_pressed; // 2
'h026: sw3 <= key_pressed; // 3
'h025: sw4 <= key_pressed; // 4
'h02e: sw5 <= key_pressed; // 5
'h036: sw6 <= key_pressed; // 6
'h03d: sw7 <= key_pressed; // 7
'h03e: sw8 <= key_pressed; // 8
'h046: sw9 <= key_pressed; // 9
'h01c: swa <= key_pressed; // a
'h032: swb <= key_pressed; // b
'h021: swc <= key_pressed; // c
'h023: swd <= key_pressed; // d
'h024: swe <= key_pressed; // e
'h02b: swf <= key_pressed; // f
'h034: swg <= key_pressed; // g
'h033: swh <= key_pressed; // h
'h043: swi <= key_pressed; // i
'h03b: swj <= key_pressed; // j
'h042: swk <= key_pressed; // k
'h04b: swl <= key_pressed; // l
'h03a: swm <= key_pressed; // m
'h031: swn <= key_pressed; // n
'h044: swo <= key_pressed; // o
'h04d: swp <= key_pressed; // p
'h015: swq <= key_pressed; // q
'h02d: swr <= key_pressed; // r
'h01b: sws <= key_pressed; // s
'h02c: swt <= key_pressed; // t
'h03c: swu <= key_pressed; // u
'h02a: swv <= key_pressed; // v
'h01d: sww <= key_pressed; // w
'h022: swx <= key_pressed; // x
'h035: swy <= key_pressed; // y
'h01a: swz <= key_pressed; // z
'hX75: swU <= key_pressed; // up
'hX72: swD <= key_pressed; // down
'hx6b: swL <= key_pressed; // left
'hx74: swR <= key_pressed; // right
'h059: swrs <= key_pressed; // right shift
'h012: swls <= key_pressed; // left shift
'h029: swsp <= key_pressed; // space
'h041: swcom <= key_pressed; // comma
'h049: swdot <= key_pressed; // full stop
'h05a: swret <= key_pressed; // return
'h04a: swfs <= key_pressed; // forward slash
'h055: sweq <= key_pressed; // equals
'h011: swfcn <= key_pressed; // ALT
'hx71: swdel <= key_pressed; // delete
'h05b: swrsb <= key_pressed; // right sq bracket
'h054: swlsb <= key_pressed; // left sq bracket
'h05d: swbs <= key_pressed; // back slash h05d
'h04e: swdsh <= key_pressed; // dash
'h052: swsq <= key_pressed; // single quote
'h04c: swsc <= key_pressed; // semi colon
'h076: swesc <= key_pressed; // escape
'h014: swctl <= key_pressed; // left control
'h009: swrst <= key_pressed; // F10 break
'h005: swf1 <= key_pressed; // f1
'h006: swf2 <= key_pressed; // f2
'h004: swf3 <= key_pressed; // f3
'h00c: swf4 <= key_pressed; // f4
'h003: swf5 <= key_pressed; // f5
'h00b: swf6 <= key_pressed; // f6
endcase
end
end
wire no_key = (~sw0 & ~sw1 & ~sw2 & ~sw3 & ~sw4 & ~sw5 & ~sw6 & ~sw7 & ~sw8 & ~sw9 & ~swa & ~swb & ~swc & ~swd & ~swe & ~swf &
~swg & ~swh & ~ swi & ~swj & ~ swk & ~swl & ~swm & ~swn & ~swo & ~swp & ~swq & ~swr & ~sws & ~swt & ~swu & ~swv &
~sww & ~swx & ~swy & ~swz & ~swU & ~swD & ~swR & ~swL & ~swrs & ~swls & ~swsp & ~swcom & ~swdot & ~swret & ~swfs &
~sweq & ~swfcn & ~swdel & ~swrsb & ~swlsb & ~swbs & ~swdsh & ~swsq & ~swsc & ~swesc & ~swctl & ~swf1 & ~swf2 &
~swf3 & ~swf4 & ~swf5 & ~swf6);
//wire sp_key = ( swls | swrs | swctl | swfcn );
always @(posedge clk) begin
if (no_key) ROWbit <= 8'b11111111;
else if (col == 3'b111) begin
ROWbit <= 8'b11111111;
if (sweq) ROWbit <= 8'b01111111;
if (swf1) ROWbit <= 8'b10111111;
if (swret) ROWbit <= 8'b11011111;
if (swrs) ROWbit <= 8'b11101111;
if (sweq & swrs) ROWbit <= 8'b01101111;
if (swfs) ROWbit <= 8'b11110111;
if (swfs & swrs) ROWbit <= 8'b11100111;
if (sw0) ROWbit <= 8'b11111011;
if (sw0 & swrs) ROWbit <= 8'b11101011;
if (swl) ROWbit <= 8'b11111101;
if (swl & swrs) ROWbit <= 8'b11101101;
if (sw8) ROWbit <= 8'b11111110;
if (sw8 & swrs) ROWbit <= 8'b11101110;
end
else if (col == 3'b110) begin
ROWbit <= 8'b11111111;
if (sww) ROWbit <= 8'b01111111;
if (sws) ROWbit <= 8'b10111111;
if (swa) ROWbit <= 8'b11011111;
if (swf2) ROWbit <= 8'b11101111;
if (swe) ROWbit <= 8'b11110111;
if (swg) ROWbit <= 8'b11111011;
if (swh) ROWbit <= 8'b11111101;
if (swy) ROWbit <= 8'b11111110;
end
else if (col == 3'b101) begin
ROWbit <= 8'b11111111;
if (swlsb) ROWbit <= 8'b01111111;
if (swrsb) ROWbit <= 8'b10111111;
if (swdel) ROWbit <= 8'b11011111;
if (swfcn) ROWbit <= 8'b11101111;
if (swp) ROWbit <= 8'b11110111;
if (swo) ROWbit <= 8'b11111011;
if (swi) ROWbit <= 8'b11111101;
if (swu) ROWbit <= 8'b11111110;
end
else if (col == 3'b100) begin
ROWbit <= 8'b11111111;
if (swR) ROWbit <= 8'b01111111;
if (swD) ROWbit <= 8'b10111111;
if (swL) ROWbit <= 8'b11011111;
if (swls) ROWbit <= 8'b11101111;
if (swU) ROWbit <= 8'b11110111;
if (swdot) ROWbit <= 8'b11111011;
if (swdot & swls) ROWbit <= 8'b11101011;
if (swcom) ROWbit <= 8'b11111101;
if (swcom & swls) ROWbit <= 8'b11101101;
if (swsp) ROWbit <= 8'b11111110;
end
else if (col == 3'b011) begin
ROWbit <= 8'b11111111;
if (swsq) ROWbit <= 8'b01111111;
if (swbs) ROWbit <= 8'b10111111;
if (swf3) ROWbit <= 8'b11011111;
if (swf4) ROWbit <= 8'b11101111;
if (swdsh) ROWbit <= 8'b11110111;
if (swsc) ROWbit <= 8'b11111011;
if (sw9) ROWbit <= 8'b11111101;
if (swk) ROWbit <= 8'b11111110;
end
else if (col == 3'b010) begin
ROWbit <= 8'b11111111;
if (swctl) ROWbit <= 8'b11101111;
if (swc) ROWbit <= 8'b01111111;
if (swc & swctl) ROWbit <= 8'b01101111;
if (sw2) ROWbit <= 8'b10111111;
if (sw2 & swctl) ROWbit <= 8'b10101111;
if (swz) ROWbit <= 8'b11011111;
if (swz & swctl) ROWbit <= 8'b11001111;
if (sw4) ROWbit <= 8'b11110111;
if (sw4 & swctl) ROWbit <= 8'b11100111;
if (swb) ROWbit <= 8'b11111011;
if (swb & swctl) ROWbit <= 8'b11101011;
if (sw6) ROWbit <= 8'b11111101;
if (sw6 & swctl) ROWbit <= 8'b11101101;
if (swm) ROWbit <= 8'b11111110;
if (swm & swctl) ROWbit <= 8'b11101110;
end
else if (col == 3'b001) begin
ROWbit <= 8'b11111111;
if (swd) ROWbit <= 8'b01111111;
if (swq) ROWbit <= 8'b10111111;
if (swesc) ROWbit <= 8'b11011111;
if (swf5) ROWbit <= 8'b11101111;
if (swf) ROWbit <= 8'b11110111;
if (swr) ROWbit <= 8'b11111011;
if (swt) ROWbit <= 8'b11111101;
if (swj) ROWbit <= 8'b11111110;
end
else if (col == 3'b000) begin
ROWbit <= 8'b11111111;
if (sw3) ROWbit <= 8'b01111111;
if (swx) ROWbit <= 8'b10111111;
if (sw1) ROWbit <= 8'b11011111;
if (swf6) ROWbit <= 8'b11101111;
if (swv) ROWbit <= 8'b11110111;
if (sw5) ROWbit <= 8'b11111011;
if (swn) ROWbit <= 8'b11111101;
if (sw7) ROWbit <= 8'b11111110;
end
end
endmodule