1 -------------------------------------------------------------------------
\r
3 -- Filename: ps2_keyboard_controller_beh.vhd
\r
6 -- Short Description:
\r
7 -- ==================
\r
8 -- Behavioral implementation of the PS/2 keyboard controller.
\r
10 -------------------------------------------------------------------------
\r
13 use ieee.std_logic_1164.all;
\r
14 use work.ps2_transceiver_pkg.all;
\r
16 architecture beh of ps2_keyboard_controller is
\r
17 type KEYBOARD_STATE_TYPE is
\r
19 INIT, INIT_WAIT_ACK, INIT_WAIT_BAT, SET_INDICATORS_CMD, SET_INDICATORS_CMD_WAIT_ACK, SET_INDICATORS_VALUE,
\r
20 SET_INDICATORS_VALUE_WAIT_ACK, ENABLE, ENABLE_WAIT_ACK, OPERATIONAL, NEW_DATA_AVAILABLE,
\r
23 signal keyboard_state, keyboard_state_next : KEYBOARD_STATE_TYPE;
\r
25 signal keyboard_data : std_logic_vector(7 downto 0);
\r
26 signal keyboard_new_data : std_logic;
\r
28 signal input_data : std_logic_vector(7 downto 0);
\r
29 signal input_data_send_ok, input_data_send_finished, send_request : std_logic;
\r
31 signal new_data_next : std_logic;
\r
32 signal data_next, data_internal : std_logic_vector(7 downto 0);
\r
34 ps2_transceiver_inst : ps2_transceiver
\r
37 CLK_FREQ => CLK_FREQ,
\r
38 SYNC_STAGES => SYNC_STAGES
\r
43 sys_res_n => sys_res_n,
\r
45 ps2_data => ps2_data,
\r
46 send_request => send_request,
\r
47 input_data => input_data,
\r
48 input_data_send_ok => input_data_send_ok,
\r
49 input_data_send_finished => input_data_send_finished,
\r
50 output_data => keyboard_data,
\r
51 new_data => keyboard_new_data
\r
54 process(keyboard_state, keyboard_new_data, keyboard_data, input_data_send_ok, input_data_send_finished)
\r
56 keyboard_state_next <= keyboard_state;
\r
58 case keyboard_state is
\r
60 if input_data_send_finished = '1' then
\r
61 if input_data_send_ok = '1' then
\r
62 keyboard_state_next <= INIT_WAIT_ACK;
\r
64 keyboard_state_next <= ERROR;
\r
68 when INIT_WAIT_ACK =>
\r
69 if keyboard_new_data = '1' then
\r
70 if keyboard_data = x"FA" then
\r
71 keyboard_state_next <= INIT_WAIT_BAT;
\r
73 keyboard_state_next <= ERROR;
\r
77 when INIT_WAIT_BAT =>
\r
78 if keyboard_new_data = '1' then
\r
79 if keyboard_data = x"AA" then
\r
80 keyboard_state_next <= SET_INDICATORS_CMD;
\r
82 keyboard_state_next <= ERROR;
\r
86 when SET_INDICATORS_CMD =>
\r
87 if input_data_send_finished = '1' then
\r
88 if input_data_send_ok = '1' then
\r
89 keyboard_state_next <= SET_INDICATORS_CMD_WAIT_ACK;
\r
91 keyboard_state_next <= ERROR;
\r
94 when SET_INDICATORS_CMD_WAIT_ACK =>
\r
95 if keyboard_new_data = '1' then
\r
96 if keyboard_data = x"FA" then
\r
97 keyboard_state_next <= SET_INDICATORS_VALUE;
\r
99 keyboard_state_next <= ERROR;
\r
102 when SET_INDICATORS_VALUE =>
\r
103 if input_data_send_finished = '1' then
\r
104 if input_data_send_ok = '1' then
\r
105 keyboard_state_next <= SET_INDICATORS_VALUE_WAIT_ACK;
\r
107 keyboard_state_next <= ERROR;
\r
110 when SET_INDICATORS_VALUE_WAIT_ACK =>
\r
111 if keyboard_new_data = '1' then
\r
112 if keyboard_data = x"FA" then
\r
113 keyboard_state_next <= ENABLE;
\r
115 keyboard_state_next <= ERROR;
\r
120 if input_data_send_finished = '1' then
\r
121 if input_data_send_ok = '1' then
\r
122 keyboard_state_next <= ENABLE_WAIT_ACK;
\r
124 keyboard_state_next <= ERROR;
\r
127 when ENABLE_WAIT_ACK =>
\r
128 if keyboard_new_data = '1' then
\r
129 if keyboard_data = x"FA" then
\r
130 keyboard_state_next <= OPERATIONAL;
\r
132 keyboard_state_next <= ERROR;
\r
136 when OPERATIONAL =>
\r
137 if keyboard_new_data = '1' then
\r
138 keyboard_state_next <= NEW_DATA_AVAILABLE;
\r
141 when NEW_DATA_AVAILABLE =>
\r
142 keyboard_state_next <= OPERATIONAL;
\r
149 process(keyboard_state, keyboard_data, data_internal)
\r
151 send_request <= '0';
\r
152 input_data <= x"00";
\r
153 new_data_next <= '0';
\r
154 data_next <= data_internal;
\r
156 case keyboard_state is
\r
158 send_request <= '1';
\r
159 input_data <= x"FF";
\r
160 when INIT_WAIT_ACK =>
\r
162 when INIT_WAIT_BAT =>
\r
164 when SET_INDICATORS_CMD =>
\r
165 send_request <= '1';
\r
166 input_data <= x"ED";
\r
167 when SET_INDICATORS_CMD_WAIT_ACK =>
\r
169 when SET_INDICATORS_VALUE =>
\r
170 send_request <= '1';
\r
171 input_data <= x"02";
\r
172 when SET_INDICATORS_VALUE_WAIT_ACK =>
\r
175 send_request <= '1';
\r
176 input_data <= x"F4";
\r
177 when ENABLE_WAIT_ACK =>
\r
179 when OPERATIONAL =>
\r
181 when NEW_DATA_AVAILABLE =>
\r
182 new_data_next <= '1';
\r
183 data_next <= keyboard_data;
\r
188 process(sys_clk, sys_res_n)
\r
190 if sys_res_n = '0' then
\r
191 keyboard_state <= INIT;
\r
193 data_internal <= (others => '0');
\r
194 elsif rising_edge(sys_clk) then
\r
195 keyboard_state <= keyboard_state_next;
\r
196 new_data <= new_data_next;
\r
197 data_internal <= data_next;
\r
200 data <= data_internal;
\r
201 end architecture beh;
\r