No Description
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

KeyboardControler.vhd 4.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. ----------------------------------------------------------------------------------
  2. -- Company: INSA-Toulouse
  3. -- Engineer: Paul Faure
  4. --
  5. -- Create Date: 01.07.2021 09:09:30
  6. -- Module Name: KeyboardControler - Behavioral
  7. -- Project Name: Processeur sécurisé
  8. -- Target Devices: Basys 3 ARTIX7
  9. -- Tool Versions: Vivado 2016.4
  10. --
  11. -- Description: ALU
  12. --
  13. -- Dependencies: Fait le lien avec le BUS PS2 du clavier, récupère la touche tapée et la renvoi
  14. --
  15. -- Comments : Il n'y a pas de bufferisation
  16. ----------------------------------------------------------------------------------
  17. library IEEE;
  18. use IEEE.STD_LOGIC_1164.ALL;
  19. entity KeyboardControler is
  20. Port (CLK : in STD_LOGIC;
  21. PS2Clk : in STD_LOGIC;
  22. PS2Data : in STD_LOGIC;
  23. Data_av : out STD_LOGIC;
  24. Data : out STD_LOGIC_VECTOR (0 to 7);
  25. alert : out STD_LOGIC);
  26. end KeyboardControler;
  27. architecture Behavioral of KeyboardControler is
  28. -- Compteur pour récupérer la trame PS2
  29. subtype compteur_T is Natural range 0 to 10;
  30. signal compteur : compteur_T := 0;
  31. -- Trame en cours de lecture
  32. signal current_data : STD_LOGIC_VECTOR (0 to 7) := (others => '0');
  33. -- Denière trame lue
  34. signal previous_data : STD_LOGIC_VECTOR (0 to 7) := (others => '0');
  35. -- Signaux pour controler le bit de parité de la trame
  36. signal parity : STD_LOGIC := '0';
  37. signal intern_alert : STD_LOGIC := '0';
  38. -- Signaux pour signaler qu'une touche a été préssée
  39. signal intern_Data_av : STD_LOGIC := '0';
  40. signal dejaSignale : boolean := false;
  41. begin
  42. -- process de récupération de la trame, synchronisé sur la CLK du bus PS2
  43. -- A chaque front montant on lit ce qu'il y a a lire et on avance le compteur
  44. process
  45. begin
  46. wait until PS2Clk'event and PS2Clk = '1';
  47. case compteur is
  48. when 0 =>
  49. -- Bit de start : on réinitialise tout
  50. parity <= '1';
  51. intern_alert <= '0';
  52. intern_Data_av <= '0';
  53. when 1 =>
  54. -- Lecture et MAJ de la parité
  55. current_data(7) <= PS2Data;
  56. parity <= parity XOR PS2Data;
  57. when 2 =>
  58. -- Lecture et MAJ de la parité
  59. current_data(6) <= PS2Data;
  60. parity <= parity XOR PS2Data;
  61. when 3 =>
  62. -- Lecture et MAJ de la parité
  63. current_data(5) <= PS2Data;
  64. parity <= parity XOR PS2Data;
  65. when 4 =>
  66. -- Lecture et MAJ de la parité
  67. current_data(4) <= PS2Data;
  68. parity <= parity XOR PS2Data;
  69. when 5 =>
  70. -- Lecture et MAJ de la parité
  71. current_data(3) <= PS2Data;
  72. parity <= parity XOR PS2Data;
  73. when 6 =>
  74. -- Lecture et MAJ de la parité
  75. current_data(2) <= PS2Data;
  76. parity <= parity XOR PS2Data;
  77. when 7 =>
  78. -- Lecture et MAJ de la parité
  79. current_data(1) <= PS2Data;
  80. parity <= parity XOR PS2Data;
  81. when 8 =>
  82. -- Lecture et MAJ de la parité
  83. current_data(0) <= PS2Data;
  84. parity <= parity XOR PS2Data;
  85. when 9 =>
  86. -- Check de la parité
  87. if (parity = PS2Data) then
  88. intern_alert <= '0';
  89. else
  90. intern_alert <= '1';
  91. end if;
  92. when 10 =>
  93. -- Envoi de la touche
  94. if (intern_alert = '0') then
  95. previous_data <= current_data;
  96. -- Elimination des touches non classiques
  97. if (not (previous_data = "11110000" or current_data = "11110000" or previous_data = "11100000")) then
  98. Data <= current_data;
  99. intern_Data_av <= '1';
  100. end if;
  101. end if;
  102. end case;
  103. compteur <= (compteur + 1) mod 11;
  104. end process;
  105. -- Gestion de l'avertissement de touche
  106. process
  107. begin
  108. wait until CLK'event and CLK = '1';
  109. if (intern_Data_av = '1' and not dejaSignale) then
  110. Data_av <= '1';
  111. dejaSignale <= true;
  112. else
  113. Data_av <= '0';
  114. end if;
  115. if (intern_Data_av = '0') then
  116. dejaSignale <= false;
  117. end if;
  118. end process;
  119. alert <= intern_alert;
  120. end Behavioral;