§ Контроллер

Здесь приведен код универсального контроллера клавиатуры с выдачей 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 Прав тот кто прав