------------------------------------------------------- --Shiftet die PS/2-Datenbits nacheinander in "keyval"-- ------------------------------------------------------- key_recognition: PROCESS (keyclock, keydata, reset, enable) BEGIN IF reset = '0' THEN keyval <= "00000000000"; key_pressed <= x"00"; ELSIF sync_keyclock'EVENT AND sync_keyclock ='0' THEN IF enable = '1' THEN keyval <= sync_keydata & keyval (10 DOWNTO 1); key_pressed <= keyval (9 DOWNTO 2); END IF; END IF; END PROCESS; -------------------------------------------------------------------------------------------------- --Überprüft wann die Tastatureingabe abgeschlossen wurde, indem ein------------------------------- --Zähler nach der Break-Code-Analyse so lange zählt, bis die Übertragung abgeschlossen sein muss-- -------------------------------------------------------------------------------------------------- key_data_saving: PROCESS (reset, enable, keyclock, clk) VARIABLE cnt : NATURAL RANGE 0 TO ((50*10**6 / 2000) + 1):= 0; VARIABLE released : NATURAL RANGE 0 TO 1 := 0; BEGIN IF reset = '0' THEN data_keyboard <= x"00"; done_pressing <= '0'; ELSIF clk'EVENT AND clk = '1' THEN IF enable = '1' THEN --bei jedem LOW des PS/2-Taktsignals wird der Zähler "cnt" zurückgesetzt IF keyclock = '0' THEN cnt := 0; done_pressing <= '0'; ELSE --Überprüfen ob es sich um ein Loslassen der Taste handelt (Break-Code startet mit "F0") IF key_pressed = x"F0" OR released = 1 THEN released := 1; cnt := cnt + 1; --erst wen der Zähler seinen Endwert erreichen kann muss die Übertragung vollständig sein IF cnt = (50*10**6 / 2000) THEN data_keyboard <= key_pressed; done_pressing <= '1'; cnt := cnt + 1; ELSIF cnt >= (50*10**6 / 2000) THEN released := 0; END IF; END IF; END IF; ELSE data_keyboard <= x"00"; done_pressing <= '0'; END IF; END IF; END PROCESS; END structure;