1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- ----------------------------------------------------------------------------------
- -- Company:
- -- Engineer:
- --
- -- Create Date: 13.07.2021 09:30:08
- -- Design Name:
- -- Module Name: KeyboardDriver - Behavioral
- -- Project Name:
- -- Target Devices:
- -- Tool Versions:
- -- Description:
- --
- -- Dependencies:
- --
- -- Revision:
- -- Revision 0.01 - File Created
- -- Additional Comments:
- --
- ----------------------------------------------------------------------------------
-
-
- library IEEE;
- use IEEE.STD_LOGIC_1164.ALL;
- use IEEE.STD_LOGIC_UNSIGNED.ALL;
- use IEEE.NUMERIC_STD.ALL;
-
- -- Uncomment the following library declaration if using
- -- arithmetic functions with Signed or Unsigned values
- --use IEEE.NUMERIC_STD.ALL;
-
- -- Uncomment the following library declaration if instantiating
- -- any Xilinx leaf cells in this code.
- --library UNISIM;
- --use UNISIM.VComponents.all;
-
- entity KeyboardDriver is
- Generic (Nb_Bits : Natural);
- Port (CLK : in STD_LOGIC;
- Data_read : out STD_LOGIC;
- Data_av : in STD_LOGIC;
- Data : in STD_LOGIC_VECTOR (0 to 6);
- STD_IN : out STD_LOGIC_VECTOR (Nb_Bits - 1 downto 0);
- STD_IN_Av : out STD_LOGIC;
- STD_IN_Request : in STD_LOGIC;
- STD_OUT : out STD_LOGIC_VECTOR (Nb_Bits - 1 downto 0);
- STD_OUT_Av : out STD_LOGIC);
- end KeyboardDriver;
-
- architecture Behavioral of KeyboardDriver is
-
- signal intern_value : Natural := 0;
- signal work_in_progress : BOOLEAN := false;
- signal Zeros : STD_LOGIC_Vector (Nb_bits - 1 downto 7) := (others => '0');
-
-
- begin
-
- process
- begin
- wait until CLK'event and CLK = '1';
- STD_IN_Av <= '0';
- STD_OUT_Av <= '0';
- if not(work_in_progress) then
- intern_value <= 0;
- end if;
- if STD_IN_Request = '1' then
- work_in_progress <= true;
- if Data_av = '1' then
- STD_OUT <= Zeros & Data;
- STD_OUT_Av <= '1';
- if (Data = "1111111") then
- intern_value <= intern_value / 10;
- elsif (Data = "0001101") then
- STD_IN <= std_logic_vector(to_unsigned(intern_value, Nb_bits));
- STD_IN_Av <= '1';
- work_in_progress <= false;
- elsif (Data >= "0110000" and Data <= "0111001") then
- intern_value <= intern_value * 10 + to_integer(unsigned(Data(3 to 6)));
- end if;
- end if;
- end if;
- end process;
-
- Data_read <= '0' when STD_IN_Request = '0' else Data_av;
-
- end Behavioral;
|