uart_rx: ein prozessmodell. spart weitere 3 logic elements :P
[hwmod.git] / src / ps2 / ps2_keyboard_controller_beh.vhd
1 -------------------------------------------------------------------------\r
2 --\r
3 -- Filename: ps2_keyboard_controller_beh.vhd\r
4 -- =========\r
5 --\r
6 -- Short Description:\r
7 -- ==================\r
8 --   Behavioral implementation of the PS/2 keyboard controller.\r
9 --\r
10 -------------------------------------------------------------------------\r
11 \r
12 library ieee;\r
13 use ieee.std_logic_1164.all;\r
14 use work.ps2_transceiver_pkg.all;\r
15 \r
16 architecture beh of ps2_keyboard_controller is\r
17   type KEYBOARD_STATE_TYPE is\r
18   (\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
21     ERROR\r
22   );\r
23   signal keyboard_state, keyboard_state_next : KEYBOARD_STATE_TYPE;  \r
24   \r
25   signal keyboard_data : std_logic_vector(7 downto 0);\r
26   signal keyboard_new_data : std_logic;\r
27   \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
30   \r
31   signal new_data_next : std_logic;\r
32   signal data_next, data_internal : std_logic_vector(7 downto 0);\r
33 begin\r
34   ps2_transceiver_inst : ps2_transceiver\r
35     generic map\r
36     (\r
37       CLK_FREQ => CLK_FREQ,\r
38       SYNC_STAGES => SYNC_STAGES\r
39     )\r
40     port map\r
41     (\r
42       sys_clk => sys_clk,\r
43       sys_res_n => sys_res_n,\r
44       ps2_clk => ps2_clk,\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
52     );\r
53 \r
54   process(keyboard_state, keyboard_new_data, keyboard_data, input_data_send_ok, input_data_send_finished)\r
55   begin\r
56     keyboard_state_next <= keyboard_state;\r
57     \r
58     case keyboard_state is\r
59       when INIT =>\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
63           else\r
64             keyboard_state_next <= ERROR;\r
65           end if;\r
66         end if;\r
67 \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
72           else\r
73             keyboard_state_next <= ERROR;\r
74           end if;\r
75         end if;\r
76 \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
81           else\r
82             keyboard_state_next <= ERROR;\r
83           end if;\r
84         end if;\r
85         \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
90           else\r
91             keyboard_state_next <= ERROR;\r
92           end if;\r
93         end if;\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
98           else\r
99             keyboard_state_next <= ERROR;\r
100           end if;          \r
101         end if;\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
106           else\r
107             keyboard_state_next <= ERROR;\r
108           end if;\r
109         end if;\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
114           else\r
115             keyboard_state_next <= ERROR;\r
116           end if;\r
117         end if;\r
118         \r
119       when ENABLE =>\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
123           else\r
124             keyboard_state_next <= ERROR;\r
125           end if;\r
126         end if;\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
131           else\r
132             keyboard_state_next <= ERROR;\r
133           end if;\r
134         end if;        \r
135 \r
136       when OPERATIONAL =>\r
137         if keyboard_new_data = '1' then\r
138           keyboard_state_next <= NEW_DATA_AVAILABLE;\r
139         end if;\r
140         \r
141       when NEW_DATA_AVAILABLE =>\r
142         keyboard_state_next <= OPERATIONAL;\r
143         \r
144       when ERROR =>\r
145         null;\r
146     end case;\r
147   end process;\r
148   \r
149   process(keyboard_state, keyboard_data, data_internal)\r
150   begin\r
151     send_request <= '0';\r
152     input_data <= x"00";\r
153     new_data_next <= '0';\r
154     data_next <= data_internal;\r
155     \r
156     case keyboard_state is\r
157       when INIT =>\r
158         send_request <= '1';\r
159         input_data <= x"FF";\r
160       when INIT_WAIT_ACK =>\r
161         null;\r
162       when INIT_WAIT_BAT =>\r
163         null;\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
168         null;\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
173         null;\r
174       when ENABLE =>\r
175         send_request <= '1';\r
176         input_data <= x"F4";\r
177       when ENABLE_WAIT_ACK =>\r
178         null;\r
179       when OPERATIONAL =>\r
180         null;\r
181       when NEW_DATA_AVAILABLE =>\r
182         new_data_next <= '1';\r
183         data_next <= keyboard_data;\r
184       when ERROR =>\r
185     end case;\r
186   end process;\r
187 \r
188   process(sys_clk, sys_res_n)\r
189   begin\r
190     if sys_res_n = '0' then\r
191       keyboard_state <= INIT;\r
192       new_data <= '0';\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
198     end if;\r
199   end process;\r
200   data <= data_internal;\r
201 end architecture beh;\r