LIBRARY IEEE;
|
LIBRARY IEEE;
|
USE IEEE.STD_LOGIC_1164.all;
|
USE IEEE.STD_LOGIC_1164.all;
|
USE IEEE.STD_LOGIC_ARITH.all;
|
USE IEEE.STD_LOGIC_ARITH.all;
|
USE IEEE.STD_LOGIC_UNSIGNED.all;
|
USE IEEE.STD_LOGIC_UNSIGNED.all;
|
|
|
ENTITY keyboard IS
|
ENTITY keyboard IS
|
PORT( keyboard_clk, keyboard_data, clock ,
|
PORT( keyboard_clk, keyboard_data, clock ,
|
reset, read : IN STD_LOGIC;
|
reset, read : IN STD_LOGIC;
|
scan_code : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
|
scan_code : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
|
scan_ready : OUT STD_LOGIC);
|
scan_ready : OUT STD_LOGIC);
|
END keyboard;
|
END keyboard;
|
|
|
ARCHITECTURE a OF keyboard IS
|
ARCHITECTURE a OF keyboard IS
|
SIGNAL INCNT : std_logic_vector(3 downto 0);
|
SIGNAL INCNT : std_logic_vector(3 downto 0);
|
SIGNAL SHIFTIN : std_logic_vector(8 downto 0);
|
SIGNAL SHIFTIN : std_logic_vector(8 downto 0);
|
SIGNAL READ_CHAR, clock_enable : std_logic;
|
SIGNAL READ_CHAR, clock_enable : std_logic;
|
SIGNAL INFLAG, ready_set : std_logic;
|
SIGNAL INFLAG, ready_set : std_logic;
|
SIGNAL keyboard_clk_filtered : std_logic;
|
SIGNAL keyboard_clk_filtered : std_logic;
|
SIGNAL filter : std_logic_vector(7 downto 0);
|
SIGNAL filter : std_logic_vector(7 downto 0);
|
BEGIN
|
BEGIN
|
|
|
PROCESS (read, ready_set)
|
PROCESS (read, ready_set)
|
BEGIN
|
BEGIN
|
IF read = '1' THEN scan_ready <= '0';
|
IF read = '1' THEN scan_ready <= '0';
|
ELSIF ready_set'EVENT and ready_set = '1' THEN
|
ELSIF ready_set'EVENT and ready_set = '1' THEN
|
scan_ready <= '1';
|
scan_ready <= '1';
|
END IF;
|
END IF;
|
END PROCESS;
|
END PROCESS;
|
|
|
|
|
--This process filters the raw clock signal coming from the keyboard using a shift register and two AND gates
|
--This process filters the raw clock signal coming from the keyboard using a shift register and two AND gates
|
Clock_filter: PROCESS
|
Clock_filter: PROCESS
|
BEGIN
|
BEGIN
|
WAIT UNTIL clock'EVENT AND clock= '1';
|
WAIT UNTIL clock'EVENT AND clock= '1';
|
clock_enable <= NOT clock_enable;
|
clock_enable <= NOT clock_enable;
|
IF clock_enable = '1' THEN
|
IF clock_enable = '1' THEN
|
filter (6 DOWNTO 0) <= filter(7 DOWNTO 1) ;
|
filter (6 DOWNTO 0) <= filter(7 DOWNTO 1) ;
|
filter(7) <= keyboard_clk;
|
filter(7) <= keyboard_clk;
|
IF filter = "11111111" THEN keyboard_clk_filtered <= '1';
|
IF filter = "11111111" THEN keyboard_clk_filtered <= '1';
|
ELSIF filter= "00000000" THEN keyboard_clk_filtered <= '0';
|
ELSIF filter= "00000000" THEN keyboard_clk_filtered <= '0';
|
END IF;
|
END IF;
|
END IF;
|
END IF;
|
END PROCESS Clock_filter;
|
END PROCESS Clock_filter;
|
|
|
|
|
--This process reads in serial data coming from the terminal
|
--This process reads in serial data coming from the terminal
|
PROCESS
|
PROCESS
|
BEGIN
|
BEGIN
|
WAIT UNTIL (KEYBOARD_CLK_filtered'EVENT AND KEYBOARD_CLK_filtered='1');
|
WAIT UNTIL (KEYBOARD_CLK_filtered'EVENT AND KEYBOARD_CLK_filtered='1');
|
IF RESET='0' THEN
|
IF RESET='0' THEN
|
INCNT <= "0000";
|
INCNT <= "0000";
|
READ_CHAR <= '0';
|
READ_CHAR <= '0';
|
ready_set<= '0';
|
ready_set<= '0';
|
ELSE
|
ELSE
|
IF KEYBOARD_DATA='0' AND READ_CHAR='0' THEN
|
IF KEYBOARD_DATA='0' AND READ_CHAR='0' THEN
|
READ_CHAR<= '1';
|
READ_CHAR<= '1';
|
ready_set<= '0';
|
ready_set<= '0';
|
ELSE
|
ELSE
|
-- Shift in next 8 data bits to assemble a scan code
|
-- Shift in next 8 data bits to assemble a scan code
|
IF READ_CHAR = '1' THEN
|
IF READ_CHAR = '1' THEN
|
IF INCNT < "1001" THEN
|
IF INCNT < "1001" THEN
|
INCNT <= INCNT + 1;
|
INCNT <= INCNT + 1;
|
SHIFTIN(7 DOWNTO 0) <= SHIFTIN(8 DOWNTO 1);
|
SHIFTIN(7 DOWNTO 0) <= SHIFTIN(8 DOWNTO 1);
|
SHIFTIN(8) <= KEYBOARD_DATA;
|
SHIFTIN(8) <= KEYBOARD_DATA;
|
-- End of scan code character, so set flags and exit loop
|
-- End of scan code character, so set flags and exit loop
|
ELSE
|
ELSE
|
scan_code <= SHIFTIN(7 DOWNTO 0);
|
scan_code <= SHIFTIN(7 DOWNTO 0);
|
READ_CHAR <= '0';
|
READ_CHAR <= '0';
|
ready_set <= '1';
|
ready_set <= '1';
|
INCNT <= "0000";
|
INCNT <= "0000";
|
END IF;
|
END IF;
|
END IF;
|
END IF;
|
END IF;
|
END IF;
|
END IF;
|
END IF;
|
END PROCESS;
|
END PROCESS;
|
END a;
|
END a;
|
|
|
|
|
|
|