Interfaz “IBM Personal System/2 (PS/2)” IBM 1987 Wolfgang Freund Abril 2007 Características Generales z Permite conectar periféricos teclado y mouse z Protocolo de comunicación serial bidireccional z Para teclados se garantiza el conjunto 2 de los scan codes. z Responden a todos los comandos enviados, sin embargo no actúan en todos ellos. Socket y Pinout z z z z z z Pin 1: Data Pin 2: Reservado Pin 3: Ground Pin 4: Vcc (+5V) Pin 5: Clock Pin 6: Reservado Comunicación Bidreccional z Estado z Data z Estado z Data z Estado z Data IDLE: y Clock en alto INHIBIT: en alto y Clock en bajo REQUEST TO SEND: en bajo y Clock en alto PS/2 Frame (1) z1 bit de partida: siempre es 0. z 8 bits de datos: se comienza por el menos significativo. z 1 bit de paridad: se utiliza paridad impar z 1 bit de parada: siempre es 1. z 1 bit de confirmación: sólo para comunicación desde el host al dispositivo. PS/2 Frame (2) Scan Code (1) varios tipos de scan codes, el más popular (por omisión) es el número 2 z Cada tecla tiene asociado un scan code compuesto por: z Hay z make code, que se emite al presionar una tecla z Breake code, que se emite al soltar la tecla Scan Code (2): Ejemplos Key Make Break ASCII A 1C F0,1C 41 B 32 F0,32 42 C 21 F0,21 43 D 23 F0,23 44 E 24 F0,24 45 F 2B F0,2B 46 G 34 F0,34 47 H 33 F0,33 48 I 43 F0,43 49 PS/2 Driver Verilog (1) kd ShiftRegSig1 ShiftRegSig2 kc 10 0 kbs 0 value xxxxxxxx 10 1 PS/2 Driver Verilog (1) kd kc ShiftRegSig1 ShiftRegSig2 0 x x x x x x x x x x x x x x x x x x x x 10 10 0 kbs 0 value xxxxxxxx 1 PS/2 Driver Verilog (1) kd kc ShiftRegSig1 ShiftRegSig2 0 0 x x x x x x x x x x x x x x x x x x x 10 10 0 kbs 0 value xxxxxxxx 1 PS/2 Driver Verilog (1) kd kc ShiftRegSig1 ShiftRegSig2 0 0 0 0 x x x x x x x x x x x x x x x x x 10 10 0 kbs 0 value xxxxxxxx 1 PS/2 Driver Verilog (1) kd kc ShiftRegSig1 ShiftRegSig2 0 0 0 0 0 x x x x x x x x x x x x x x x x 10 10 0 kbs 0 value xxxxxxxx 1 PS/2 Driver Verilog (1) kd kc ShiftRegSig1 ShiftRegSig2 1 0 0 0 0 0 x x x x x x x x x x x x x x x 10 10 0 kbs 0 value xxxxxxxx 1 PS/2 Driver Verilog (1) kd kc ShiftRegSig1 ShiftRegSig2 1 1 0 0 0 0 0 x x x x x x x x x x x x x x 10 10 0 kbs 0 value xxxxxxxx 1 PS/2 Driver Verilog (1) kd kc ShiftRegSig1 ShiftRegSig2 1 1 1 0 0 0 0 0 x x x x x x x x x x x x x 10 10 0 kbs 0 value xxxxxxxx 1 PS/2 Driver Verilog (1) kd kc ShiftRegSig1 ShiftRegSig2 1 1 1 1 0 0 0 0 0 x x x x x x x x x x x x 10 10 0 kbs 0 value xxxxxxxx 1 PS/2 Driver Verilog (1) kd kc ShiftRegSig1 ShiftRegSig2 1 1 1 1 1 0 0 0 0 0 x x x x x x x x x x x 10 10 0 kbs 0 value xxxxxxxx 1 PS/2 Driver Verilog (1) kd kc ShiftRegSig1 ShiftRegSig2 1 1 1 1 1 1 0 0 0 0 0 x x x x x x x x x x 10 10 0 kbs 0 value xxxxxxxx 1 PS/2 Driver Verilog (1) kd kc ShiftRegSig1 ShiftRegSig2 0 1 1 1 1 1 1 0 0 0 0 0 x x x x x x x x x 10 10 0 kbs 0 value xxxxxxxx 1 PS/2 Driver Verilog (1) kd kc ShiftRegSig1 ShiftRegSig2 0 0 1 1 1 1 1 1 0 0 0 0 0 x x x x x x x x 10 10 0 kbs 0 value xxxxxxxx 1 PS/2 Driver Verilog (1) kd kc ShiftRegSig1 ShiftRegSig2 0 0 0 1 1 1 1 1 1 0 0 0 0 0 x x x x x x x 10 10 0 kbs 0 value xxxxxxxx 1 PS/2 Driver Verilog (1) kd kc ShiftRegSig1 ShiftRegSig2 1 0 0 0 1 1 1 1 1 1 0 0 0 0 0 x x x x x x 10 10 0 kbs 0 value xxxxxxxx 1 PS/2 Driver Verilog (1) kd kc ShiftRegSig1 ShiftRegSig2 1 1 0 0 0 1 1 1 1 1 1 0 0 0 0 0 x x x x x 10 10 0 kbs 0 value xxxxxxxx 1 PS/2 Driver Verilog (1) kd kc ShiftRegSig1 ShiftRegSig2 1 1 1 0 0 0 1 1 1 1 1 1 0 0 0 0 0 x x x x 10 10 0 kbs 0 value xxxxxxxx 1 PS/2 Driver Verilog (1) kd kc ShiftRegSig1 ShiftRegSig2 0 1 1 1 0 0 0 1 1 1 1 1 1 0 0 0 0 0 x x x 10 10 0 kbs 0 value xxxxxxxx 1 PS/2 Driver Verilog (1) kd kc ShiftRegSig1 ShiftRegSig2 0 0 1 1 1 0 0 0 1 1 1 1 1 1 0 0 0 0 0 x x 10 10 0 kbs 0 value xxxxxxxx 1 PS/2 Driver Verilog (1) kd kc ShiftRegSig1 ShiftRegSig2 0 0 0 1 1 1 0 0 0 1 1 1 1 1 1 0 0 0 0 0 x 10 10 0 kbs 0 value xxxxxxxx 1 PS/2 Driver Verilog (1) kd kc ShiftRegSig1 ShiftRegSig2 0 0 0 0 1 1 1 0 0 0 1 1 1 1 1 1 0 0 0 0 0 10 10 0 kbs 1 value xxxxxxxx 1 PS/2 Driver Verilog (1) kd kc ShiftRegSig1 ShiftRegSig2 1 0 0 0 0 1 1 1 0 0 0 1 1 1 1 1 1 0 0 0 0 10 10 0 kbs 0 value 1C 1 PS/2 Driver Verilog (2a) `timescale 1ns / 1ps //////////////////////////////////////////////////////////////////////////////// // kbd.v -- basic keyboard function // // Author: W. Freund, UTFSM, Valparaiso, Chile // (based on Keyboard.vhd from Ken Nelson, Digilent, Inc.) // 04/04/06 //////////////////////////////////////////////////////////////////////////////// module kbd(rst, clk, kd, kc, kbs, value); input rst, clk, kd, kc; // reset, clock, k-data, k-clock output reg kbs; // keyboard stroke (negedge) output reg [7:0] value; // scan code // // // ------------------------------------------------------------------------- Signal Declarations -----------------------------------------------------------------------reg kdi, kci; reg dff1, dff2; reg [10:0] ShiftRegSig1; reg [10:1] ShiftRegSig2; reg kbs_tmp; PS/2 Driver Verilog (2b) // -----------------------------------------------------------------------// -- Module Implementation // -----------------------------------------------------------------------// --Flip Flops used to condition signals coming from PS2-always @ (posedge clk or posedge rst) begin if (rst == 1) begin dff1 <= 0; dff2 <= 0; kdi <= 0; kci <= 0; end else begin dff1 <= kd; kdi <= dff1; dff2 <= kc; kci <= dff2; end end PS/2 Driver Verilog (2c) // --Shift Registers used to clock in scan codes from PS2-always @(negedge kci or posedge rst) begin if (rst == 1) begin ShiftRegSig1 <= 11'b00000000000; ShiftRegSig2 <= 10'b0000000000; end else begin ShiftRegSig1[10:0] <= {kdi, ShiftRegSig1[10:1]}; ShiftRegSig2[10:1] <= {ShiftRegSig1[0], ShiftRegSig2[10:2]}; end end PS/2 Driver Verilog (2d) // --Wait for scan code always @(posedge rst or posedge kci) begin if(rst == 1) begin value <= 8'b00000000; kbs_tmp <= 0; end else if (ShiftRegSig2[9:2] == 8'b11110000) begin value <= value; kbs_tmp <= 1; end else if (ShiftRegSig2[8:1] == 8'b11110000) begin value <= ShiftRegSig1[8:1]; kbs_tmp <= 0; end end always @(negedge clk) kbs <= kbs_tmp; endmodule