§ Контроллер
Здесь приведен код универсального контроллера клавиатуры с выдачей ASCII-символов.
reg [7:0] kb;
kb KBD
(
.clock (clock_25),
.ps_clock (PS2_CLK),
.ps_data (PS2_DAT),
.done (kb_done),
.data (kb_data)
);
always @(posedge clock_25) if (kb_done) begin kb <= kb_data; end§ Код
Дата редакции: 16 янв 2024
module kb
(
input clock,
input ps_clock,
input ps_data,
output reg done,
output reg [7:0] data
);
reg [1:0] klatch = 2'b00;
reg [3:0] kcount = 1'b0;
reg [9:0] kin = 1'b0;
reg [19:0] kout = 1'b0;
reg kbusy, kdone, released, shift, extended;
initial begin
data = 8'h00;
shift = 1'b0;
kbusy = 1'b0;
kdone = 1'b0;
done = 1'b0;
shift = 1'b0;
released = 1'b0;
extended = 1'b0;
end
always @(negedge clock) done <= kdone;
always @(posedge clock) begin
kdone <= 1'b0;
if (kbusy) begin
if (klatch == 2'b01) begin
if (kcount == 4'hA) begin
kbusy <= 1'b0;
data <= 1'b0;
if (^kin[9:1]) begin
if (kin[8:1] == 8'hF0) begin released <= 1'b1; end
else if (kin[8:1] == 8'hE0) begin extended <= 1'b1; end
else begin
kdone <= ~released;
case ({extended, kin[8:1]})
8'h12, 8'h59: begin shift <= ~released; kdone <= 1'b0; end
8'h1C: data <= shift ? 8'h41 : 8'h61;
8'h32: data <= shift ? 8'h42 : 8'h62;
8'h21: data <= shift ? 8'h43 : 8'h63;
8'h23: data <= shift ? 8'h44 : 8'h64;
8'h24: data <= shift ? 8'h45 : 8'h65;
8'h2B: data <= shift ? 8'h46 : 8'h66;
8'h34: data <= shift ? 8'h47 : 8'h67;
8'h33: data <= shift ? 8'h48 : 8'h68;
8'h43: data <= shift ? 8'h49 : 8'h69;
8'h3B: data <= shift ? 8'h4A : 8'h6A;
8'h42: data <= shift ? 8'h4B : 8'h6B;
8'h4B: data <= shift ? 8'h4C : 8'h6C;
8'h3A: data <= shift ? 8'h4D : 8'h6D;
8'h31: data <= shift ? 8'h4E : 8'h6E;
8'h44: data <= shift ? 8'h4F : 8'h6F;
8'h4D: data <= shift ? 8'h50 : 8'h70;
8'h15: data <= shift ? 8'h51 : 8'h71;
8'h2D: data <= shift ? 8'h52 : 8'h72;
8'h1B: data <= shift ? 8'h53 : 8'h73;
8'h2C: data <= shift ? 8'h54 : 8'h74;
8'h3C: data <= shift ? 8'h55 : 8'h75;
8'h2A: data <= shift ? 8'h56 : 8'h76;
8'h1D: data <= shift ? 8'h57 : 8'h77;
8'h22: data <= shift ? 8'h58 : 8'h78;
8'h35: data <= shift ? 8'h59 : 8'h79;
8'h1A: data <= shift ? 8'h5A : 8'h7A;
8'h45: data <= shift ? 8'h29 : 8'h30;
8'h16: data <= shift ? 8'h21 : 8'h31;
8'h1E: data <= shift ? 8'h40 : 8'h32;
8'h26: data <= shift ? 8'h23 : 8'h33;
8'h25: data <= shift ? 8'h24 : 8'h34;
8'h2E: data <= shift ? 8'h25 : 8'h35;
8'h36: data <= shift ? 8'h5E : 8'h36;
8'h3D: data <= shift ? 8'h26 : 8'h37;
8'h3E: data <= shift ? 8'h2A : 8'h38;
8'h46: data <= shift ? 8'h28 : 8'h39;
8'h0E: data <= shift ? 8'h7E : 8'h60;
8'h4E: data <= shift ? 8'h5F : 8'h2D;
8'h55: data <= shift ? 8'h2B : 8'h3D;
8'h5D: data <= shift ? 8'h7C : 8'h5C;
8'h54: data <= shift ? 8'h7B : 8'h5B;
8'h5B: data <= shift ? 8'h7D : 8'h5D;
8'h4C: data <= shift ? 8'h3A : 8'h3B;
8'h52: data <= shift ? 8'h22 : 8'h27;
8'h41: data <= shift ? 8'h3C : 8'h2C;
8'h49: data <= shift ? 8'h3E : 8'h2E;
8'h4A: data <= shift ? 8'h3F : 8'h2F;
8'h66: data <= 8'h08;
8'h0D: data <= 8'h09;
8'h5A: data <= 8'h0A;
8'h76: data <= 8'h1B;
8'h29: data <= 8'h20;
9'h17D: data <= 8'h01;
9'h17A: data <= 8'h02;
9'h175: data <= 8'h03;
9'h174: data <= 8'h04;
9'h172: data <= 8'h05;
9'h16B: data <= 8'h06;
9'h171: data <= 8'h07;
9'h16C: data <= 8'h0B;
9'h170: data <= 8'h0C;
9'h169: data <= 8'h0D;
default: kdone <= 1'b0;
endcase
released <= 1'b0;
extended <= 1'b0;
end
end
end
kcount <= kcount + 1'b1;
kin <= {ps_data, kin[9:1]};
end
kout <= ps_clock ? kout + 1 : 1'b0;
if (kout > 25000*20) kbusy <= 1'b0;
end else begin
if (klatch == 2'b10) begin
kbusy <= 1'b1;
kcount <= 1'b0;
kout <= 1'b0;
end
end
klatch <= {klatch[0], ps_clock};
end
endmodule