123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 |
- ----------------------------------------------------------------------------------
- -- Company: INSA-Toulouse
- -- Engineer: Paul Faure
- --
- -- Create Date: 01.07.2021 09:09:30
- -- Module Name: KeyboardControler - Behavioral
- -- Project Name: Processeur sécurisé
- -- Target Devices: Basys 3 ARTIX7
- -- Tool Versions: Vivado 2016.4
- --
- -- Description: ALU
- --
- -- Dependencies: Fait le lien avec le BUS PS2 du clavier, récupère la touche tapée et la renvoi
- --
- -- Comments : Il n'y a pas de bufferisation
- ----------------------------------------------------------------------------------
-
-
- library IEEE;
- use IEEE.STD_LOGIC_1164.ALL;
-
- entity KeyboardControler is
- Port (CLK : in STD_LOGIC;
-
- PS2Clk : in STD_LOGIC;
- PS2Data : in STD_LOGIC;
-
- Data_av : out STD_LOGIC;
- Data : out STD_LOGIC_VECTOR (0 to 7);
-
- alert : out STD_LOGIC);
- end KeyboardControler;
-
- architecture Behavioral of KeyboardControler is
-
- -- Compteur pour récupérer la trame PS2
- subtype compteur_T is Natural range 0 to 10;
- signal compteur : compteur_T := 0;
-
- -- Trame en cours de lecture
- signal current_data : STD_LOGIC_VECTOR (0 to 7) := (others => '0');
- -- Denière trame lue
- signal previous_data : STD_LOGIC_VECTOR (0 to 7) := (others => '0');
-
- -- Signaux pour controler le bit de parité de la trame
- signal parity : STD_LOGIC := '0';
- signal intern_alert : STD_LOGIC := '0';
-
- -- Signaux pour signaler qu'une touche a été préssée
- signal intern_Data_av : STD_LOGIC := '0';
- signal dejaSignale : boolean := false;
-
- begin
-
- -- process de récupération de la trame, synchronisé sur la CLK du bus PS2
- -- A chaque front montant on lit ce qu'il y a a lire et on avance le compteur
- process
- begin
- wait until PS2Clk'event and PS2Clk = '1';
- case compteur is
- when 0 =>
- -- Bit de start : on réinitialise tout
- parity <= '1';
- intern_alert <= '0';
- intern_Data_av <= '0';
- when 1 =>
- -- Lecture et MAJ de la parité
- current_data(7) <= PS2Data;
- parity <= parity XOR PS2Data;
- when 2 =>
- -- Lecture et MAJ de la parité
- current_data(6) <= PS2Data;
- parity <= parity XOR PS2Data;
- when 3 =>
- -- Lecture et MAJ de la parité
- current_data(5) <= PS2Data;
- parity <= parity XOR PS2Data;
- when 4 =>
- -- Lecture et MAJ de la parité
- current_data(4) <= PS2Data;
- parity <= parity XOR PS2Data;
- when 5 =>
- -- Lecture et MAJ de la parité
- current_data(3) <= PS2Data;
- parity <= parity XOR PS2Data;
- when 6 =>
- -- Lecture et MAJ de la parité
- current_data(2) <= PS2Data;
- parity <= parity XOR PS2Data;
- when 7 =>
- -- Lecture et MAJ de la parité
- current_data(1) <= PS2Data;
- parity <= parity XOR PS2Data;
- when 8 =>
- -- Lecture et MAJ de la parité
- current_data(0) <= PS2Data;
- parity <= parity XOR PS2Data;
- when 9 =>
- -- Check de la parité
- if (parity = PS2Data) then
- intern_alert <= '0';
- else
- intern_alert <= '1';
- end if;
- when 10 =>
- -- Envoi de la touche
- if (intern_alert = '0') then
- previous_data <= current_data;
- -- Elimination des touches non classiques
- if (not (previous_data = "11110000" or current_data = "11110000" or previous_data = "11100000")) then
- Data <= current_data;
- intern_Data_av <= '1';
- end if;
- end if;
- end case;
-
- compteur <= (compteur + 1) mod 11;
- end process;
-
-
- -- Gestion de l'avertissement de touche
- process
- begin
- wait until CLK'event and CLK = '1';
- if (intern_Data_av = '1' and not dejaSignale) then
- Data_av <= '1';
- dejaSignale <= true;
- else
- Data_av <= '0';
- end if;
- if (intern_Data_av = '0') then
- dejaSignale <= false;
- end if;
- end process;
-
- alert <= intern_alert;
-
- end Behavioral;
|