Estoy intentando recibir datos de un teclado a través del puerto PS / 2 en Papilio One Arcade Megawing. Eventualmente, querré implementar esto desde cero, pero pensé que primero obtendría un código público que funcionara como una forma de prueba de humo.
Las tres fuentes con las que jugué eran
He modificado cada uno cambiando el archivo UCF a
NET "Clk" LOC="P89" | IOSTANDARD = LVCMOS25 | PERIOD=31.25ns;
NET "Reset" LOC="P67" | IOSTANDARD=LVTTL | PULLDOWN;
NET "PS2_Clk" LOC="P91" | IOSTANDARD=LVTTL | DRIVE=8 | SLEW=FAST | PULLUP;
NET "PS2_Data" LOC="P92" | IOSTANDARD=LVTTL | DRIVE=8 | SLEW=FAST | PULLUP;
NET "LED1" LOC="P57" | IOSTANDARD=LVTTL;
NET "LED2" LOC="P53" | IOSTANDARD=LVTTL;
NET "LED3" LOC="P40" | IOSTANDARD=LVTTL;
y estoy manejando LED1
directamente desde PS2_Clk
, LED2
desde PS2_Data
y LED3
desde un registro que debe ir de bajo a alto (y mantenerse alto) cuando se lee el primer scancode completo .
El problema es que, con las tres implementaciones, lo que obtengo es
-
LED1
yLED2
están continuamente en -
LED3
nunca se enciende
El teclado que estoy usando es un Microsoft Natural Keyboard 4000 a través de un dongle USB a PS / 2. El LED de bloqueo de teclas de función en el teclado se ilumina cuando lo conecto al Papilio, por lo que al menos sé que se está agotando.
Los volcados completos del proyecto ISE de Xilinx están disponibles en enlace
@Leor menciona a continuación que el puerto PS / 2 utiliza una frecuencia de reloj de 10 KHz. ¿No significa eso que debería ver un LED parpadeante (con una frecuencia de aproximadamente 1,6 segundos) con el siguiente código:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
entity main is
Port ( CLK : in STD_LOGIC;
PS2_CLK : in STD_LOGIC;
LED : out STD_LOGIC);
end main;
architecture Behavioral of main is
signal counter: unsigned(13 downto 0) := (others => '0');
signal PS2_CLK_PREV : std_logic := '1';
signal LED_clamped : std_logic := '0';
begin
LED <= LED_clamped;
process(CLK) is
begin
if rising_edge(CLK) then
if not (PS2_CLK = PS2_CLK_PREV) then
counter <= counter + 1;
end if;
if counter = 0 then
LED_clamped <= not LED_clamped;
end if;
PS2_CLK_PREV <= PS2_CLK;
end if;
end process;
end Behavioral;
Porque si lo intento, el LED sigue encendido.