Cómo escribir un programa VHDL para enviar comandos al dispositivo PS2 [cerrado]

0

Estoy utilizando Quartus II 13.0sp1, la placa DE1 para pruebas y el Cyclone II FPGA EP2C20F484C7N. Necesito escribir un programa en VHDL que envíe el comando al dispositivo. Ya he creado la entidad y la arquitectura que usé con éxito para recibir las teclas del teclado. Ahora necesito una entidad que envíe el comando al mouse, ya que el mouse espera que yo envíe los comandos para iniciar el modo de transmisión.

Mi mayor problema es que no sé cómo DECLARAR Y UTILIZAR los pines ps2_clk y ps2_dat para enviar comandos al mouse y recibir datos del mouse (usando los mismos pines para la comunicación en ambos sentidos). Justo después de enviar 11 bits al mouse, necesito recibir un bit usando el mismo pin (ps2_dat), y después de ese receptor, el byte ACK del mouse usa ese mismo pin. También, antes de enviar el comando, necesito desplegar la línea del reloj baja, durante un período de 100 microsegundos, y luego necesito liberar la línea del reloj para que el mouse pueda generar el reloj.

No tengo idea de cómo implementar esto. ¿O tal vez entendí mal el protocolo?

    
pregunta user36382

1 respuesta

1

El reloj PS2 y las líneas de datos se implementan como drenaje abierto con resistencias pullup. Así lo tratas de forma similar a i2c. Entonces, en tu entidad, podrías hacer:

Port (
   ....
   io_ps2_dat : inout std_logic;
   io_ps2_clk : inout std_logic;
   ....
);

Tenga en cuenta que para un drenaje abierto debe hacer el pin '0' o 'Z'. ¡No '1'! Nunca conduzca un '1' en un bus de drenaje abierto, ya que puede freír el mouse. Si pones una 'Z', el pin leerá una, tirada a lo alto por la resistencia.

io_ps2_dat <= '0';
....
io_ps2_dat <= 'Z';

¿Esto te ayuda a empezar?

Editar: agregaré un poco más sobre comunicaciones en las comunicaciones de host a dispositivo.

El ratón PS / 2 siempre genera la señal de reloj. Si el host desea enviar, debe ir al estado "Solicitar envío":

  • Tirando del reloj hacia abajo durante al menos 100 microsegundos (inhibir comunicaciones). Puede hacer esto simplemente poniendo '0' en la línea io_ps2_clk. Debido a que está abierto, esto es perfectamente seguro y el mouse lo notará.
  • Ingrese en el modo de solicitud de envío al bajar los datos, luego suelte el reloj.

Cuando el mouse detecte este estado, comenzará a generar señales de reloj y leerá 8 bits de datos y un bit de parada cuando el reloj esté alto. Esto usted (el anfitrión) puede cambiar la línea de datos solo cuando la línea del reloj está baja.

Una vez que se recibe el bit de parada, el mouse reconocerá el byte recibido al poner la línea de datos a nivel bajo y generar un último impulso de reloj. (ACK # - es muy I2Cish).

    
respondido por el carveone

Lea otras preguntas en las etiquetas