§ Контроллер
Здесь приведен код универсального контроллера клавиатуры с выдачей ASCII-символов.wire [7:0] ps2data; wire ps2hit; reg [7:0] inreg = 8'h00; reg shift = 1'b0; reg released = 1'b0; keyboard keyb ( .CLOCK_50 (clock_50), // Тактовый генератор на 50 Мгц .PS2_CLK (PS2_CLK), // Таймингс PS/2 .PS2_DAT (PS2_DAT), // Данные с PS/2 .received_data (ps2data), // Принятые данные .received_data_en (ps2hit), // Нажата клавиша ); // Прием символа (пример) always @(posedge clock_50) begin if (ps2hit) begin // Клавиша отпущена if (ps2data == 8'hF0) begin released <= 1'b1; end // Другие клавиши else begin case (ps2data) // Левый и правый шифт равнозначны /* SH */ 8'h12, 8'h59: shift <= ~released; // Цифробуквенная клавиатура /* A */ 8'h1C: inreg <= shift ? 8'h41 : 8'h61; /* B */ 8'h32: inreg <= shift ? 8'h42 : 8'h62; /* C */ 8'h21: inreg <= shift ? 8'h43 : 8'h63; /* D */ 8'h23: inreg <= shift ? 8'h44 : 8'h64; /* E */ 8'h24: inreg <= shift ? 8'h45 : 8'h65; /* F */ 8'h2B: inreg <= shift ? 8'h46 : 8'h66; /* G */ 8'h34: inreg <= shift ? 8'h47 : 8'h67; /* H */ 8'h33: inreg <= shift ? 8'h48 : 8'h68; /* I */ 8'h43: inreg <= shift ? 8'h49 : 8'h69; /* J */ 8'h3B: inreg <= shift ? 8'h4A : 8'h6A; /* K */ 8'h42: inreg <= shift ? 8'h4B : 8'h6B; /* L */ 8'h4B: inreg <= shift ? 8'h4C : 8'h6C; /* M */ 8'h3A: inreg <= shift ? 8'h4D : 8'h6D; /* N */ 8'h31: inreg <= shift ? 8'h4E : 8'h6E; /* O */ 8'h44: inreg <= shift ? 8'h4F : 8'h6F; /* P */ 8'h4D: inreg <= shift ? 8'h50 : 8'h70; /* Q */ 8'h15: inreg <= shift ? 8'h51 : 8'h71; /* R */ 8'h2D: inreg <= shift ? 8'h52 : 8'h72; /* S */ 8'h1B: inreg <= shift ? 8'h53 : 8'h73; /* T */ 8'h2C: inreg <= shift ? 8'h54 : 8'h74; /* U */ 8'h3C: inreg <= shift ? 8'h55 : 8'h75; /* V */ 8'h2A: inreg <= shift ? 8'h56 : 8'h76; /* W */ 8'h1D: inreg <= shift ? 8'h57 : 8'h77; /* X */ 8'h22: inreg <= shift ? 8'h58 : 8'h78; /* Y */ 8'h35: inreg <= shift ? 8'h59 : 8'h79; /* Z */ 8'h1A: inreg <= shift ? 8'h5A : 8'h7A; /* 0) */ 8'h45: inreg <= shift ? 8'h29 : 8'h30; /* 1! */ 8'h16: inreg <= shift ? 8'h21 : 8'h31; /* 2@ */ 8'h1E: inreg <= shift ? 8'h40 : 8'h32; /* 3# */ 8'h26: inreg <= shift ? 8'h23 : 8'h33; /* 4$ */ 8'h25: inreg <= shift ? 8'h24 : 8'h34; /* 5% */ 8'h2E: inreg <= shift ? 8'h25 : 8'h35; /* 6^ */ 8'h36: inreg <= shift ? 8'h5E : 8'h36; /* 7& */ 8'h3D: inreg <= shift ? 8'h26 : 8'h37; /* 8* */ 8'h3E: inreg <= shift ? 8'h2A : 8'h38; /* 9( */ 8'h46: inreg <= shift ? 8'h28 : 8'h39; // Спецсимволы /* `~ */ 8'h0E: inreg <= shift ? 8'h7E : 8'h60; /* -_ */ 8'h4E: inreg <= shift ? 8'h5F : 8'h2D; /* =+ */ 8'h55: inreg <= shift ? 8'h2B : 8'h3D; /* \| */ 8'h5D: inreg <= shift ? 8'h7C : 8'h5C; /* [{ */ 8'h54: inreg <= shift ? 8'h7B : 8'h5B; /* ]} */ 8'h5B: inreg <= shift ? 8'h7D : 8'h5D; /* ;: */ 8'h4C: inreg <= shift ? 8'h3A : 8'h3B; /* '" */ 8'h52: inreg <= shift ? 8'h22 : 8'h27; /* ,< */ 8'h41: inreg <= shift ? 8'h3C : 8'h2C; /* .> */ 8'h49: inreg <= shift ? 8'h3E : 8'h2E; /* /? */ 8'h4A: inreg <= shift ? 8'h3F : 8'h2F; // Разные клавиши /* SP */ 8'h29: inreg <= 8'h20; /* TB */ 8'h0D: inreg <= 8'h09; /* EN */ 8'h5A: inreg <= 8'h0A; /* BS */ 8'h66: inreg <= 8'h7F; /* ES */ 8'h76: inreg <= 8'h1B; endcase // В бите 7 признак "нажато" (0) или "отпущено" (1) inreg[7] <= released; released <= 1'b0; end end end
28 дек, 2020
© 2007-2023 Прав тот кто прав