1 | library ieee;
|
2 | use ieee.std_logic_1164.all;
|
3 | use ieee.std_logic_unsigned.all;
|
4 |
|
5 | entity keyboard is
|
6 |
|
7 | port (
|
8 | clock : in std_logic; -- 50 MHZ Board
|
9 | Frequency
|
10 | reset_n : in std_logic; -- Active High
|
11 | Reset
|
12 | ps2clock_i : in std_logic; -- PS2 Clock
|
13 | Input
|
14 | ps2data_i : in std_logic; -- PS2 Data Input
|
15 | led_o : out std_logic_vector(8 downto 0)); -- Output to
|
16 | LED's
|
17 |
|
18 | end keyboard;
|
19 |
|
20 | architecture RTL of keyboard is
|
21 |
|
22 | signal ps2clock1 : std_logic;
|
23 | signal ps2clock2 : std_logic;
|
24 | signal ps2clock : std_logic;
|
25 | signal scancode : std_logic_vector(8 downto 0);
|
26 | signal bitcnt : std_logic_vector(2 downto 0);
|
27 |
|
28 | begin -- RTL
|
29 |
|
30 | P_SYNCRONIZER_FF : process (clock, reset_n)
|
31 | begin -- process P_SYNCRONIZER_FF
|
32 | if reset_n = '1' then -- asynchronous reset
|
33 | (active low)
|
34 | ps2clock1 <= '0';
|
35 | elsif clock'event and clock = '1' then -- rising clock edge
|
36 | ps2clock1 <= ps2clock_i;
|
37 | end if;
|
38 | end process P_SYNCRONIZER_FF;
|
39 |
|
40 | P_EDGEDETECT_I : process (clock, reset_n)
|
41 | begin -- process P_EDGEDETECT_I
|
42 | if reset_n = '1' then -- asynchronous reset
|
43 | (active low)
|
44 | ps2clock2 <= '0';
|
45 | elsif clock'event and clock = '1' then -- rising clock edge
|
46 | ps2clock2 <= ps2clock1;
|
47 | end if;
|
48 | end process P_EDGEDETECT_I;
|
49 |
|
50 |
|
51 | P_EDGEDETECT_II : process (clock, reset_n)
|
52 | begin -- process P_EDGEDETECT_II
|
53 | if reset_n = '1' then -- asynchronous reset
|
54 | (active low)
|
55 | ps2clock <= '0';
|
56 | elsif clock'event and clock = '1' then -- rising clock edge
|
57 | ps2clock <= ps2clock2 xor ps2clock1;
|
58 | end if;
|
59 | end process P_EDGEDETECT_II;
|
60 |
|
61 | S_READ_PS2DATA : process (clock, reset_n)
|
62 | begin -- process S_READ_PS2DATA
|
63 | if reset_n = '1' then -- asynchronous reset
|
64 | (active low)
|
65 | led_o <= (others => '0');
|
66 | bitcnt <= (others => '0');
|
67 | scancode <= (others => '0');
|
68 | elsif clock'event and clock = '1' then -- rising clock edge
|
69 | if ps2clock = '1' then
|
70 | if ps2clock1 = '0' then -- rising edge of PS2
|
71 | Clock
|
72 | scancode(CONV_INTEGER(bitcnt)) <= ps2data_i;
|
73 | bitcnt <= bitcnt + 1;
|
74 | if(bitcnt = "1000")then
|
75 | led_o <= scancode;
|
76 | bitcnt <= (others => '0');
|
77 | end if;
|
78 | end if;
|
79 | end if;
|
80 | end if;
|
81 | end process S_READ_PS2DATA;
|
82 |
|
83 | end RTL;
|