OpenCores
URL https://opencores.org/ocsvn/tcp_ip_core_w_dhcp/tcp_ip_core_w_dhcp/trunk

Subversion Repositories tcp_ip_core_w_dhcp

[/] [tcp_ip_core_w_dhcp/] [trunk/] [user_input_handler.vhd] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 craighaywo
----------------------------------------------------------------------------------
2
-- Company: 
3
-- Engineer: 
4
-- 
5
-- Create Date:    10:39:01 10/19/2014 
6
-- Design Name: 
7
-- Module Name:    user_input_handler - Behavioral 
8
-- Project Name: 
9
-- Target Devices: 
10
-- Tool versions: 
11
-- Description: 
12
--
13
-- Dependencies: 
14
--
15
-- Revision: 
16
-- Revision 0.01 - File Created
17
-- Additional Comments: 
18
--
19
----------------------------------------------------------------------------------
20
library IEEE;
21
use IEEE.STD_LOGIC_1164.ALL;
22
use IEEE.NUMERIC_STD.ALL;
23
 
24
-- Uncomment the following library declaration if instantiating
25
-- any Xilinx primitives in this code.
26
--library UNISIM;
27
--use UNISIM.VComponents.all;
28
 
29
entity user_input_handler is
30
    Port ( CLK_IN                               : in  STD_LOGIC;
31
           RX_IN                                        : in  STD_LOGIC;
32
           TX_OUT                               : out  STD_LOGIC;
33
 
34
                          TEXT_ADDR_IN          : in  STD_LOGIC_VECTOR (11 downto 0);
35
           TEXT_DATA_OUT                : out STD_LOGIC_VECTOR (7 downto 0);
36
           FONT_ADDR_IN                 : in  STD_LOGIC_VECTOR (11 downto 0);
37
           FONT_DATA_OUT                : out STD_LOGIC_VECTOR (7 downto 0);
38
           CURSORPOS_X_OUT      : out STD_LOGIC_VECTOR (7 downto 0);
39
           CURSORPOS_Y_OUT      : out STD_LOGIC_VECTOR (7 downto 0);
40
 
41
                          ADDR_OUT                              : out STD_LOGIC_VECTOR(7 downto 0);
42
                          DATA_IN                               : in STD_LOGIC_VECTOR(7 downto 0);
43
 
44
                          ETH_COMMAND_OUT                       : out STD_LOGIC_VECTOR(3 downto 0);
45
                          ETH_COMMAND_EN_OUT            : out STD_LOGIC;
46
                          ETH_COMMAND_CMPLT_IN  : in STD_LOGIC;
47
                          ETH_COMMAND_ERR_IN            : in STD_LOGIC_VECTOR(7 downto 0);
48
 
49
                          CLK_1HZ_IN    : in STD_LOGIC
50
 
51
--                        DEBUG_OUT                             : out STD_LOGIC_VECTOR(7 downto 0);
52
--                        DEBUG_OUT2                    : out STD_LOGIC_VECTOR(7 downto 0)
53
                          );
54
end user_input_handler;
55
 
56
architecture Behavioral of user_input_handler is
57
 
58
        COMPONENT uart
59
        Generic (
60
                CLK_FREQ        : integer := 50;                -- Main frequency (MHz)
61
                SER_FREQ        : integer := 9600               -- Baud rate (bps)
62
        );
63
        Port (
64
                -- Control
65
                clk                     : in    std_logic;                                                      -- Main clock
66
                rst                     : in    std_logic;                                                      -- Main reset
67
                -- External Interface
68
                rx                      : in    std_logic;                                                              -- RS232 received serial data
69
                tx                      : out   std_logic;                                                              -- RS232 transmitted serial data
70
                -- RS232/UART Configuration
71
                par_en          : in    std_logic;                                                      -- Parity bit enable
72
                -- uPC Interface
73
                tx_req          : in    std_logic;                                                      -- Request SEND of data
74
                tx_end          : out   std_logic;                                                      -- Data SENDED
75
                tx_data         : in    std_logic_vector(7 downto 0);    -- Data to transmit
76
                rx_ready                : out   std_logic;                                                      -- Received data ready to uPC read
77
                rx_data         : out   std_logic_vector(7 downto 0)     -- Received data 
78
        );
79
        END COMPONENT;
80
 
81
        COMPONENT TDP_RAM
82
                Generic (G_DATA_A_SIZE  :natural :=32;
83
                                        G_ADDR_A_SIZE   :natural :=9;
84
                                        G_RELATION              :natural :=3;
85
                                        G_INIT_ZERO             :boolean := true;
86
                                        G_INIT_FILE             :string :="");--log2(SIZE_A/SIZE_B)
87
                Port ( CLK_A_IN         : in  STD_LOGIC;
88
                                 WE_A_IN        : in  STD_LOGIC;
89
                                 ADDR_A_IN      : in  STD_LOGIC_VECTOR (G_ADDR_A_SIZE-1 downto 0);
90
                                 DATA_A_IN      : in  STD_LOGIC_VECTOR (G_DATA_A_SIZE-1 downto 0);
91
                                 DATA_A_OUT     : out  STD_LOGIC_VECTOR (G_DATA_A_SIZE-1 downto 0);
92
                                 CLK_B_IN       : in  STD_LOGIC;
93
                                 WE_B_IN        : in  STD_LOGIC;
94
                                 ADDR_B_IN      : in  STD_LOGIC_VECTOR (G_ADDR_A_SIZE+G_RELATION-1 downto 0);
95
                                 DATA_B_IN      : in  STD_LOGIC_VECTOR (G_DATA_A_SIZE/(2**G_RELATION)-1 downto 0);
96
                                 DATA_B_OUT : out STD_LOGIC_VECTOR (G_DATA_A_SIZE/(2**G_RELATION)-1 downto 0));
97
        END COMPONENT;
98
 
99
        COMPONENT FONT_MEM
100
          PORT (
101
                 clka : IN STD_LOGIC;
102
                 wea : IN STD_LOGIC_VECTOR(0 DOWNTO 0);
103
                 addra : IN STD_LOGIC_VECTOR(11 DOWNTO 0);
104
                 dina : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
105
                 douta : OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
106
        END COMPONENT;
107
 
108
        COMPONENT hex_to_ascii is
109
    Port ( CLK_IN                       : in  STD_LOGIC;
110
           CONV_IN                      : in  STD_LOGIC;
111
           HEX_IN                       : in  STD_LOGIC_VECTOR (3 downto 0);
112
           ASCII_OUT            : out  STD_LOGIC_VECTOR (7 downto 0);
113
           CONV_DONE_OUT        : out  STD_LOGIC);
114
        END COMPONENT;
115
 
116
        COMPONENT bin_to_bcd
117
    Port ( CLK_IN                       : in  STD_LOGIC;
118
           CONV_IN                      : in  STD_LOGIC;
119
           BIN_IN                       : in  STD_LOGIC_VECTOR (7 downto 0);
120
           BCD_OUT                      : out  STD_LOGIC_VECTOR (11 downto 0);
121
           CONV_DONE_OUT        : out  STD_LOGIC);
122
        END COMPONENT;
123
 
124
subtype slv is std_logic_vector;
125
 
126
constant C_backspace_cmnd       : std_logic_vector(7 downto 0) := X"80";
127
constant C_esc_cmnd                     : std_logic_vector(7 downto 0) := X"81";
128
constant C_enter_cmnd           : std_logic_vector(7 downto 0) := X"82";
129
constant C_new_line_cmnd        : std_logic_vector(7 downto 0) := X"83";
130
constant C_clear_cmnd           : std_logic_vector(7 downto 0) := X"84";
131
constant C_no_op_cmnd           : std_logic_vector(7 downto 0) := X"FF";
132
 
133
constant C_space_char : std_logic_vector(7 downto 0) := X"20";
134
 
135
constant C_max_char                     : std_logic_vector(11 downto 0)  := X"C2F"; -- 3119 (zero indexed)
136
constant C_page_height          : std_logic_vector(7 downto 0)   := X"26"; -- 39 (zero indexed)
137
constant C_page_width           : std_logic_vector(7 downto 0)   := X"4F"; -- 80 (zero indexed)
138
constant C_page_width_p1        : std_logic_vector(7 downto 0)   := X"50"; -- 80
139
 
140
constant C_clear_command                                                : std_logic_vector(15 downto 0)  := X"18B0";
141
constant C_show_network_all_command             : std_logic_vector(15 downto 0)  := X"A653";
142
constant C_show_network_enabled_command         : std_logic_vector(15 downto 0)  := X"D9A2";
143
constant C_show_mac_command                                     : std_logic_vector(15 downto 0)  := X"D952";
144
constant C_show_ip_setting_command                      : std_logic_vector(15 downto 0)  := X"E2BA";
145
constant C_show_ip_command                                      : std_logic_vector(15 downto 0)  := X"6C54";
146
constant C_show_cloud_ip_command                        : std_logic_vector(15 downto 0)  := X"413F";
147
constant C_show_tcp_port_command                        : std_logic_vector(15 downto 0)  := X"46C3";
148
constant C_show_ping_enabled_command            : std_logic_vector(15 downto 0)  := X"95B0";
149
constant C_set_network_init_command             : std_logic_vector(15 downto 0)  := X"1853";
150
constant C_connect_local_command                        : std_logic_vector(15 downto 0)  := X"00FE";
151
constant C_connect_cloud_command                        : std_logic_vector(15 downto 0)  := X"004C";
152
 
153
signal C_net_enabled_message_addr       : std_logic_vector(8 downto 0) := '0'&X"00";
154
signal C_mac_message_addr                               : std_logic_vector(8 downto 0) := '0'&X"16";
155
signal C_show_ip_setting_addr                   : std_logic_vector(8 downto 0) := '0'&X"25";
156
signal C_show_ip_addr                                   : std_logic_vector(8 downto 0) := '0'&X"33";
157
signal C_show_cloud_ip_addr                     : std_logic_vector(8 downto 0) := '0'&X"41";
158
signal C_local_connect_addr                     : std_logic_vector(8 downto 0) := '0'&X"8B";
159
signal C_cloud_connect_addr                     : std_logic_vector(8 downto 0) := '0'&X"9C";
160
signal C_unknown_messge_addr                    : std_logic_vector(8 downto 0) := '1'&X"00";
161
signal C_true_message_addr                      : std_logic_vector(8 downto 0) := '1'&X"14";
162
signal C_false_message_addr                     : std_logic_vector(8 downto 0) := '1'&X"19";
163
signal C_success_message_addr           : std_logic_vector(8 downto 0) := '1'&X"1F";
164
signal C_failed_message_addr                    : std_logic_vector(8 downto 0) := '1'&X"27";
165
signal C_dynamic_addr                                   : std_logic_vector(8 downto 0) := '1'&X"2E";
166
signal C_static_addr                                    : std_logic_vector(8 downto 0) := '1'&X"36";
167
 
168
signal C_end_of_message_char : std_logic_vector(7 downto 0) := X"FF";
169
 
170
type SLV_BYTE_ARRAY16 is array (0 to 15) of std_logic_vector(7 downto 0);
171
constant prompt_array_inst : SLV_BYTE_ARRAY16 := ( X"20", X"76", X"61", X"75", X"6C", X"74", X"7E", X"24",
172
                                                                                                                                         X"20", X"20", X"20", X"20", X"20", X"20", X"20", X"20");
173
constant C_prompt_array_length : std_logic_vector(3 downto 0) := "1001";
174
signal prompt_ram_index : unsigned(3 downto 0) := (others => '0');
175
 
176
signal startup_count : unsigned(27 downto 0) := X"17D7840"; -- 1 sec @ 25 MHz
177
 
178
signal char_buf_wr, char_cmd_wr : std_logic := '0';
179
signal char_buf_wr_addr : unsigned(11 downto 0) := (others => '0');
180
signal char_buf_wr_data : std_logic_vector(7 downto 0) := (others => '0');
181
signal ocrx, ocry : unsigned(7 downto 0) := (others => '0');
182
signal char_buf_x_coord : unsigned(7 downto 0);
183
signal debug2 : unsigned(7 downto 0) := (others => '0');
184
signal show_ip_start_addr : std_logic_vector(7 downto 0) := (others => '0');
185
 
186
signal keyboard_data, keyboard_data_buf : std_logic_vector(7 downto 0) := (others => '0');
187
signal keyboard_rd, handle_backspace, handle_enter : std_logic := '0';
188
 
189
type SLV_BYTE_ARRAY32 is array (0 to 31) of std_logic_vector(7 downto 0);
190
signal command_ram_inst : SLV_BYTE_ARRAY32 := (others => (others => '0'));
191
signal command_ram_index, command_ram_index_max : unsigned(4 downto 0) := (others => '0');
192
signal command_hash : unsigned(15 downto 0) := (others => '0');
193
 
194
signal screen_wr_buf_byte, screen_rd_buf_byte : std_logic_vector(7 downto 0);
195
signal screen_wr_buffer_index : unsigned(4 downto 0) := (others => '0');
196
signal screen_buf_we : std_logic := '0';
197
signal screen_rd_buffer_index : unsigned(4 downto 0) := (others => '0');
198
signal screen_msg_addr : unsigned(8 downto 0) := (others => '0');
199
signal screen_msg_char : std_logic_vector(7 downto 0);
200
 
201
signal networking_enabled, dhcp_enabled : std_logic := '0';
202
 
203
signal eth_command : std_logic_vector(3 downto 0) := X"0";
204
signal eth_command_en, eth_command_cmplt : std_logic := '0';
205
signal eth_command_err : std_logic_vector(7 downto 0);
206
 
207
signal hex_conv, hex_conv_done : std_logic := '0';
208
signal hex_val : std_logic_vector(3 downto 0) := X"0";
209
signal ascii_val : std_logic_vector(7 downto 0) := X"00";
210
signal addr : unsigned(7 downto 0);
211
 
212
signal bcd_conv, bcd_conv_done : std_logic := '0';
213
signal bin_val : std_logic_vector(7 downto 0) := (others => '0');
214
signal bcd_val : std_logic_vector(11 downto 0) := (others => '0');
215
 
216
signal clk_1hz : std_logic := '0';
217
signal dhcp_second_count, tcp_second_count : unsigned(3 downto 0);
218
 
219
type HANDLE_KEYBOARD_ST is (    STARTUP_DELAY,
220
                                                                                PRINT_COMMAND_PROMPT0,
221
                                                                                PRINT_COMMAND_PROMPT1,
222
                                                                                PRINT_COMMAND_PROMPT2,
223
                                                                                IDLE,
224
                                                                                PARSE_KEY_PRESSED,
225
                                                                                HANDLE_KEY_PRESSED0,
226
                                                                                HANDLE_KEY_PRESSED1,
227
                                                                                HANDLE_COMMAND,
228
                                                                                HANDLE_BACKSPACE0,
229
                                                                                HANDLE_BACKSPACE1,
230
                                                                                HANDLE_BACKSPACE2,
231
                                                                                HANDLE_BACKSPACE3,
232
                                                                                HANDLE_BACKSPACE4,
233
                                                                                HANDLE_COMMAND_SUBMIT0,
234
                                                                                HANDLE_COMMAND_SUBMIT1,
235
                                                                                HANDLE_COMMAND_SUBMIT2,
236
                                                                                HANDLE_COMMAND_SUBMIT3,
237
                                                                                HANDLE_COMMAND_SUBMIT4,
238
                                                                                NEW_LINE_W_NEW_PROMPT0,
239
                                                                                NEW_LINE_W_NEW_PROMPT1,
240
                                                                                REPORT_UNKNOWN_COMMAND1,
241
                                                                                REPORT_UNKNOWN_COMMAND2,
242
                                                                                REPORT_UNKNOWN_COMMAND3,
243
                                                                                REPORT_UNKNOWN_COMMAND4,
244
                                                                                HANDLE_CLEAR_COMMAND0,
245
                                                                                HANDLE_CLEAR_COMMAND1,
246
                                                                                HANDLE_NETWORK_INIT_COMMAND0,
247
                                                                                HANDLE_NETWORK_INIT_COMMAND1,
248
                                                                                HANDLE_NETWORK_ENABLED_COMMAND0,
249
                                                                                HANDLE_NETWORK_ENABLED_COMMAND1,
250
                                                                                HANDLE_NETWORK_ENABLED_COMMAND2,
251
                                                                                HANDLE_NETWORK_ENABLED_COMMAND3,
252
                                                                                HANDLE_NETWORK_ENABLED_COMMAND4,
253
                                                                                HANDLE_NETWORK_ENABLED_COMMAND5,
254
                                                                                HANDLE_SHOW_MAC_COMMAND0,
255
                                                                                HANDLE_SHOW_MAC_COMMAND1,
256
                                                                                HANDLE_SHOW_MAC_COMMAND2,
257
                                                                                HANDLE_SHOW_MAC_COMMAND3,
258
                                                                                HANDLE_SHOW_MAC_COMMAND4,
259
                                                                                HANDLE_SHOW_MAC_COMMAND5,
260
                                                                                HANDLE_SHOW_MAC_COMMAND6,
261
                                                                                HANDLE_SHOW_MAC_COMMAND7,
262
                                                                                HANDLE_SHOW_MAC_COMMAND8,
263
                                                                                HANDLE_SHOW_MY_IP_COMMAND,
264
                                                                                HANDLE_SHOW_CLOUD_IP_COMMAND,
265
                                                                                HANDLE_SHOW_IP_COMMAND0,
266
                                                                                HANDLE_SHOW_IP_COMMAND1,
267
                                                                                HANDLE_SHOW_IP_COMMAND2,
268
                                                                                HANDLE_SHOW_IP_COMMAND3,
269
                                                                                HANDLE_SHOW_IP_COMMAND4,
270
                                                                                HANDLE_SHOW_IP_COMMAND5,
271
                                                                                HANDLE_SHOW_IP_COMMAND6,
272
                                                                                HANDLE_SHOW_IP_COMMAND7,
273
                                                                                HANDLE_SHOW_IP_COMMAND8,
274
                                                                                HANDLE_SHOW_IP_COMMAND9,
275
                                                                                HANDLE_SHOW_IP_SETTING_COMMAND0,
276
                                                                                HANDLE_SHOW_IP_SETTING_COMMAND1,
277
                                                                                HANDLE_SHOW_IP_SETTING_COMMAND2,
278
                                                                                HANDLE_SHOW_IP_SETTING_COMMAND3,
279
                                                                                HANDLE_SHOW_IP_SETTING_COMMAND4,
280
                                                                                HANDLE_SHOW_IP_SETTING_COMMAND5,
281
                                                                                HANDLE_CONNECT_LOCAL0,
282
                                                                                HANDLE_CONNECT_LOCAL1,
283
                                                                                HANDLE_CONNECT_LOCAL2,
284
                                                                                HANDLE_CONNECT_LOCAL3,
285
                                                                                HANDLE_CONNECT_CLOUD_COMMAND0,
286
                                                                                HANDLE_CONNECT_CLOUD_COMMAND1,
287
                                                                                HANDLE_CONNECT_CLOUD_COMMAND2,
288
                                                                                HANDLE_CONNECT_CLOUD_COMMAND3,
289
                                                                                HANDLE_CONNECT_CLOUD_COMMAND4,
290
                                                                                HANDLE_CONNECT_CLOUD_COMMAND5,
291
                                                                                CONNECT_DHCP_COMMAND0,
292
                                                                                CONNECT_DHCP_COMMAND1,
293
                                                                                CONNECT_DHCP_COMMAND2,
294
                                                                                CONNECT_DHCP_COMMAND3,
295
                                                                                CONNECT_DHCP_COMMAND4,
296
                                                                                CONNECT_DHCP_COMMAND5,
297
                                                                                CONNECT_DHCP_COMMAND6,
298
                                                                                CONNECT_DHCP_COMMAND7,
299
                                                                                CANCEL_DHCP_CONNECT0,
300
                                                                                CONNECT_STATIC_COMMAND0,
301
                                                                                CONNECT_STATIC_COMMAND1,
302
                                                                                PRINT_COMMAND_RESULT0,
303
                                                                                PRINT_COMMAND_RESULT1);
304
 
305
signal hk_state, hk_next_state, hk_prev_state, hk_cached_state : HANDLE_KEYBOARD_ST := STARTUP_DELAY;
306
 
307
type SCREEN_BUF_ST is (         SB_IDLE,
308
                                                                        SB_PARSE_NEW_BYTE,
309
                                                                        SB_HANDLE_CHARACTER0,
310
                                                                        SB_HANDLE_CHARACTER1,
311
                                                                        SB_HANDLE_COMMAND,
312
                                                                        SB_HANDLE_BACKSPACE,
313
                                                                        SB_HANDLE_NEW_LINE,
314
                                                                        SB_HANDLE_CLEAR);
315
 
316
signal sb_state, sb_next_state : SCREEN_BUF_ST := SB_IDLE;
317
 
318
begin
319
 
320
        clk_1hz <= CLK_1HZ_IN;
321
 
322
--      DEBUG_OUT <= slv(command_hash(15 downto 8));
323
--      DEBUG_OUT2 <= slv(command_hash(7 downto 0));
324
 
325
        ---- CONVERT UART DATA TO KEYBOARD DATA ----
326
 
327
        uart_inst : uart
328
        GENERIC MAP (
329
                CLK_FREQ        => 25,
330
                SER_FREQ        => 9600)
331
        Port Map (
332
                clk             => CLK_IN,
333
                rst             => '0',
334
                rx                      => RX_IN,
335
                tx                      => TX_OUT,
336
                par_en  => '1',
337
                tx_req  => '0',
338
                tx_end  => open,
339
                tx_data => (others => '0'),
340
                rx_ready        => keyboard_rd,
341
                rx_data => keyboard_data);
342
 
343
        ---- HANDLE KEYBOARD DATA ----
344
 
345
   HK_SYNC_PROC: process(CLK_IN)
346
   begin
347
      if rising_edge(CLK_IN) then
348
                        hk_state <= hk_next_state;
349
                        hk_prev_state <= hk_state;
350
                        startup_count <= startup_count - 1;
351
      end if;
352
   end process;
353
 
354
        HK_NEXT_STATE_DECODE: process (hk_state, startup_count, handle_backspace, keyboard_rd, prompt_ram_index, keyboard_data,
355
                                                                                                command_ram_index, command_ram_index_max, command_hash, DATA_IN, dhcp_enabled, clk_1hz, dhcp_second_count,
356
                                                                                                        tcp_second_count, bcd_conv_done, addr, hex_conv_done, networking_enabled, screen_msg_char, C_end_of_message_char,
357
                                                                                                                hk_cached_state)
358
   begin
359
      hk_next_state <= hk_state;  --default is to stay in current state
360
      case (hk_state) is
361
                        when STARTUP_DELAY =>
362
                                if startup_count = X"00000000" then
363
                                        hk_next_state <= PRINT_COMMAND_PROMPT0;
364
                                end if;
365
                        when PRINT_COMMAND_PROMPT0 =>
366
                                hk_next_state <= PRINT_COMMAND_PROMPT1;
367
                        when PRINT_COMMAND_PROMPT1 =>
368
                                hk_next_state <= PRINT_COMMAND_PROMPT2;
369
                        when PRINT_COMMAND_PROMPT2 =>
370
                                if prompt_ram_index = unsigned(C_prompt_array_length) then
371
                                        hk_next_state <= IDLE;
372
                                else
373
                                        hk_next_state <= PRINT_COMMAND_PROMPT1;
374
                                end if;
375
 
376
                        when IDLE =>
377
                                if keyboard_rd = '1' then
378
                                        hk_next_state <= PARSE_KEY_PRESSED;
379
                                end if;
380
                        when PARSE_KEY_PRESSED =>
381
                                if keyboard_data(7) = '0' then
382
                                        hk_next_state <= HANDLE_KEY_PRESSED0;
383
                                else
384
                                        hk_next_state <= HANDLE_COMMAND;
385
                                end if;
386
 
387
                        when HANDLE_KEY_PRESSED0 =>
388
                                hk_next_state <= HANDLE_KEY_PRESSED1;
389
                        when HANDLE_KEY_PRESSED1 =>
390
                                hk_next_state <= IDLE;
391
 
392
                        when HANDLE_COMMAND =>
393
                                if keyboard_data = C_backspace_cmnd then
394
                                        hk_next_state <= HANDLE_BACKSPACE0;
395
                                elsif keyboard_data = C_enter_cmnd then
396
                                        if command_ram_index = "00000" then
397
                                                hk_next_state <= NEW_LINE_W_NEW_PROMPT0;
398
                                        else
399
                                                hk_next_state <= HANDLE_COMMAND_SUBMIT0;
400
                                        end if;
401
                                else
402
                                        hk_next_state <= IDLE;
403
                                end if;
404
 
405
                        when HANDLE_BACKSPACE0 =>
406
                                if command_ram_index = "00000" then
407
                                        hk_next_state <= IDLE;
408
                                else
409
                                        hk_next_state <= HANDLE_BACKSPACE1;
410
                                end if;
411
                        when HANDLE_BACKSPACE1 =>
412
                                hk_next_state <= HANDLE_BACKSPACE2;
413
                        when HANDLE_BACKSPACE2 =>
414
                                hk_next_state <= HANDLE_BACKSPACE3;
415
                        when HANDLE_BACKSPACE3 =>
416
                                hk_next_state <= HANDLE_BACKSPACE4;
417
                        when HANDLE_BACKSPACE4 =>
418
                                hk_next_state <= IDLE;
419
 
420
                        when HANDLE_COMMAND_SUBMIT0 =>
421
                                hk_next_state <= HANDLE_COMMAND_SUBMIT1;
422
                        when HANDLE_COMMAND_SUBMIT1 =>
423
                                hk_next_state <= HANDLE_COMMAND_SUBMIT2;
424
                        when HANDLE_COMMAND_SUBMIT2 =>
425
                                if command_ram_index = command_ram_index_max then
426
                                        hk_next_state <= HANDLE_COMMAND_SUBMIT3;
427
                                else
428
                                        hk_next_state <= HANDLE_COMMAND_SUBMIT1;
429
                                end if;
430
                        when HANDLE_COMMAND_SUBMIT3 =>
431
                                hk_next_state <= HANDLE_COMMAND_SUBMIT4;
432
                        when HANDLE_COMMAND_SUBMIT4 =>
433
                                if command_hash = unsigned(C_clear_command) then
434
                                        hk_next_state <= HANDLE_CLEAR_COMMAND0;
435
                                elsif command_hash = unsigned(C_show_network_enabled_command) then
436
                                        hk_next_state <= HANDLE_NETWORK_ENABLED_COMMAND0;
437
                                elsif command_hash = unsigned(C_set_network_init_command) then
438
                                        hk_next_state <= HANDLE_NETWORK_INIT_COMMAND0;
439
                                elsif command_hash = unsigned(C_show_mac_command) then
440
                                        hk_next_state <= HANDLE_SHOW_MAC_COMMAND0;
441
                                elsif command_hash = unsigned(C_connect_local_command) then
442
                                        hk_next_state <= HANDLE_CONNECT_LOCAL0;
443
                                elsif command_hash = unsigned(C_show_ip_command) then
444
                                        hk_next_state <= HANDLE_SHOW_MY_IP_COMMAND;
445
                                elsif command_hash = unsigned(C_show_ip_setting_command) then
446
                                        hk_next_state <= HANDLE_SHOW_IP_SETTING_COMMAND0;
447
                                elsif command_hash = unsigned(C_show_cloud_ip_command) then
448
                                        hk_next_state <= HANDLE_SHOW_CLOUD_IP_COMMAND;
449
                                elsif command_hash = unsigned(C_connect_cloud_command) then
450
                                        hk_next_state <= HANDLE_CONNECT_CLOUD_COMMAND0;
451
                                else
452
                                        hk_next_state <= REPORT_UNKNOWN_COMMAND1;
453
                                end if;
454
 
455
                        when HANDLE_SHOW_IP_SETTING_COMMAND0 =>
456
                                hk_next_state <= PRINT_COMMAND_RESULT0; -- cache HANDLE_SHOW_IP_SETTING_COMMAND1
457
                        when HANDLE_SHOW_IP_SETTING_COMMAND1 =>
458
                                hk_next_state <= HANDLE_SHOW_IP_SETTING_COMMAND2;
459
                        when HANDLE_SHOW_IP_SETTING_COMMAND2 =>
460
                                hk_next_state <= HANDLE_SHOW_IP_SETTING_COMMAND3;
461
                        when HANDLE_SHOW_IP_SETTING_COMMAND3 =>
462
                                if DATA_IN(0) = '1' then
463
                                        hk_next_state <= HANDLE_SHOW_IP_SETTING_COMMAND4;
464
                                else
465
                                        hk_next_state <= HANDLE_SHOW_IP_SETTING_COMMAND5;
466
                                end if;
467
                        when HANDLE_SHOW_IP_SETTING_COMMAND4 =>
468
                                hk_next_state <= PRINT_COMMAND_RESULT0; -- cache NEW_LINE_W_NEW_PROMPT0
469
                        when HANDLE_SHOW_IP_SETTING_COMMAND5 =>
470
                                hk_next_state <= PRINT_COMMAND_RESULT0; -- cache NEW_LINE_W_NEW_PROMPT0
471
 
472
                        when HANDLE_CONNECT_LOCAL0 =>
473
                                hk_next_state <= HANDLE_CONNECT_LOCAL1;
474
                        when HANDLE_CONNECT_LOCAL1 =>
475
                                hk_next_state <= HANDLE_CONNECT_LOCAL2;
476
                        when HANDLE_CONNECT_LOCAL2 =>
477
                                hk_next_state <= HANDLE_CONNECT_LOCAL3;
478
                        when HANDLE_CONNECT_LOCAL3 =>
479
                                if dhcp_enabled = '1' then
480
                                        hk_next_state <= CONNECT_DHCP_COMMAND0;
481
                                else
482
                                        hk_next_state <= CONNECT_STATIC_COMMAND0;
483
                                end if;
484
 
485
                        when CONNECT_DHCP_COMMAND0 =>
486
                                hk_next_state <= CONNECT_DHCP_COMMAND1;
487
                        when CONNECT_DHCP_COMMAND1 =>
488
                                hk_next_state <= PRINT_COMMAND_RESULT0; -- cache CONNECT_DHCP_COMMAND2
489
 
490
                        when CONNECT_DHCP_COMMAND2 => -- TODO RENAME!
491
                                if clk_1hz = '1' then
492
                                        hk_next_state <= CONNECT_DHCP_COMMAND3;
493
                                end if;
494
                        when CONNECT_DHCP_COMMAND3 =>
495
                                hk_next_state <= CONNECT_DHCP_COMMAND4;
496
                        when CONNECT_DHCP_COMMAND4 =>
497
                                hk_next_state <= CONNECT_DHCP_COMMAND5;
498
                        when CONNECT_DHCP_COMMAND5 =>
499
                                if DATA_IN(0) = '1' or DATA_IN(1) = '1' then
500
                                        hk_next_state <= CONNECT_DHCP_COMMAND6;
501
                                elsif dhcp_second_count > X"9" then
502
                                        hk_next_state <= CANCEL_DHCP_CONNECT0;
503
                                else
504
                                        hk_next_state <= CONNECT_DHCP_COMMAND2;
505
                                end if;
506
                        when CONNECT_DHCP_COMMAND6 => -- RENAME TO "PRINT SUCCESS"
507
                                hk_next_state <= PRINT_COMMAND_RESULT0; -- cache NEW_LINE_W_NEW_PROMPT0
508
                        when CONNECT_DHCP_COMMAND7 => -- RENAME TO "PRINT FAILED"
509
                                hk_next_state <= PRINT_COMMAND_RESULT0; -- cache NEW_LINE_W_NEW_PROMPT0
510
 
511
                        when CANCEL_DHCP_CONNECT0 =>
512
                                hk_next_state <= CONNECT_DHCP_COMMAND7;
513
 
514
                        when CONNECT_STATIC_COMMAND0 =>
515
                                hk_next_state <= CONNECT_STATIC_COMMAND1; -- TODO REMOVE REDUNDANT STATE?
516
                        when CONNECT_STATIC_COMMAND1 =>
517
                                hk_next_state <= PRINT_COMMAND_RESULT0; -- cache CONNECT_DHCP_COMMAND2
518
 
519
                        when HANDLE_CONNECT_CLOUD_COMMAND0 =>
520
                                hk_next_state <= PRINT_COMMAND_RESULT0; -- cache HANDLE_CONNECT_CLOUD_COMMAND1;
521
                        when HANDLE_CONNECT_CLOUD_COMMAND1 =>
522
                                if clk_1hz = '1' then
523
                                        hk_next_state <= HANDLE_CONNECT_CLOUD_COMMAND2;
524
                                end if;
525
                        when HANDLE_CONNECT_CLOUD_COMMAND2 =>
526
                                hk_next_state <= HANDLE_CONNECT_CLOUD_COMMAND3;
527
                        when HANDLE_CONNECT_CLOUD_COMMAND3 =>
528
                                hk_next_state <= HANDLE_CONNECT_CLOUD_COMMAND4;
529
                        when HANDLE_CONNECT_CLOUD_COMMAND4 =>
530
                                if DATA_IN(0) = '1' then
531
                                        hk_next_state <= CONNECT_DHCP_COMMAND6;
532
                                elsif tcp_second_count > X"9" then
533
                                        hk_next_state <= HANDLE_CONNECT_CLOUD_COMMAND5;
534
                                else
535
                                        hk_next_state <= HANDLE_CONNECT_CLOUD_COMMAND1;
536
                                end if;
537
                        when HANDLE_CONNECT_CLOUD_COMMAND5 =>
538
                                hk_next_state <= CONNECT_DHCP_COMMAND7;
539
 
540
                        when HANDLE_SHOW_CLOUD_IP_COMMAND =>
541
                                hk_next_state <= HANDLE_SHOW_IP_COMMAND0;
542
                        when HANDLE_SHOW_MY_IP_COMMAND =>
543
                                hk_next_state <= HANDLE_SHOW_IP_COMMAND0;
544
 
545
                        when HANDLE_SHOW_IP_COMMAND0 =>
546
                                hk_next_state <= PRINT_COMMAND_RESULT0; -- cache HANDLE_SHOW_IP_COMMAND1
547
                        when HANDLE_SHOW_IP_COMMAND1 =>
548
                                hk_next_state <= HANDLE_SHOW_IP_COMMAND2;
549
                        when HANDLE_SHOW_IP_COMMAND2 =>
550
                                hk_next_state <= HANDLE_SHOW_IP_COMMAND3;
551
                        when HANDLE_SHOW_IP_COMMAND3 =>
552
                                hk_next_state <= HANDLE_SHOW_IP_COMMAND4;
553
                        when HANDLE_SHOW_IP_COMMAND4 =>
554
                                if bcd_conv_done = '1' then
555
                                        hk_next_state <= HANDLE_SHOW_IP_COMMAND5;
556
                                end if;
557
                        when HANDLE_SHOW_IP_COMMAND5 =>
558
                                hk_next_state <= HANDLE_SHOW_IP_COMMAND6;
559
                        when HANDLE_SHOW_IP_COMMAND6 =>
560
                                hk_next_state <= HANDLE_SHOW_IP_COMMAND7;
561
                        when HANDLE_SHOW_IP_COMMAND7 =>
562
                                hk_next_state <= HANDLE_SHOW_IP_COMMAND8;
563
                        when HANDLE_SHOW_IP_COMMAND8 =>
564
                                if addr = X"0C" or addr = X"10" then
565
                                        hk_next_state <= NEW_LINE_W_NEW_PROMPT0;
566
                                else
567
                                        hk_next_state <= HANDLE_SHOW_IP_COMMAND9;
568
                                end if;
569
                        when HANDLE_SHOW_IP_COMMAND9 =>
570
                                hk_next_state <= HANDLE_SHOW_IP_COMMAND2;
571
 
572
                        when HANDLE_CLEAR_COMMAND0 =>
573
                                hk_next_state <= HANDLE_CLEAR_COMMAND1;
574
                        when HANDLE_CLEAR_COMMAND1 =>
575
                                hk_next_state <= PRINT_COMMAND_PROMPT0;
576
 
577
                        when HANDLE_NETWORK_INIT_COMMAND0 =>
578
                                hk_next_state <= HANDLE_NETWORK_INIT_COMMAND1;
579
                        when HANDLE_NETWORK_INIT_COMMAND1 =>
580
                                hk_next_state <= PRINT_COMMAND_PROMPT0;
581
 
582
                        when HANDLE_SHOW_MAC_COMMAND0 =>
583
                                hk_next_state <= PRINT_COMMAND_RESULT0; -- cache HANDLE_SHOW_MAC_COMMAND1
584
                        when HANDLE_SHOW_MAC_COMMAND1 =>
585
                                hk_next_state <= HANDLE_SHOW_MAC_COMMAND2;
586
                        when HANDLE_SHOW_MAC_COMMAND2 =>
587
                                hk_next_state <= HANDLE_SHOW_MAC_COMMAND3;
588
                        when HANDLE_SHOW_MAC_COMMAND3 =>
589
                                hk_next_state <= HANDLE_SHOW_MAC_COMMAND4;
590
                        when HANDLE_SHOW_MAC_COMMAND4 =>
591
                                if hex_conv_done = '1' then
592
                                        hk_next_state <= HANDLE_SHOW_MAC_COMMAND5;
593
                                end if;
594
                        when HANDLE_SHOW_MAC_COMMAND5 =>
595
                                hk_next_state <= HANDLE_SHOW_MAC_COMMAND6;
596
                        when HANDLE_SHOW_MAC_COMMAND6 =>
597
                                if hex_conv_done = '1' then
598
                                        hk_next_state <= HANDLE_SHOW_MAC_COMMAND7;
599
                                end if;
600
                        when HANDLE_SHOW_MAC_COMMAND7 =>
601
                                if addr > X"05" then
602
                                        hk_next_state <= NEW_LINE_W_NEW_PROMPT0;
603
                                else
604
                                        hk_next_state <= HANDLE_SHOW_MAC_COMMAND8;
605
                                end if;
606
                        when HANDLE_SHOW_MAC_COMMAND8 =>
607
                                hk_next_state <= HANDLE_SHOW_MAC_COMMAND2;
608
 
609
                        when HANDLE_NETWORK_ENABLED_COMMAND0 =>
610
                                hk_next_state <= HANDLE_NETWORK_ENABLED_COMMAND1;
611
                        when HANDLE_NETWORK_ENABLED_COMMAND1 =>
612
                                hk_next_state <= HANDLE_NETWORK_ENABLED_COMMAND2;
613
                        when HANDLE_NETWORK_ENABLED_COMMAND2 =>
614
                                hk_next_state <= PRINT_COMMAND_RESULT0; -- cache HANDLE_NETWORK_ENABLED_COMMAND3
615
                        when HANDLE_NETWORK_ENABLED_COMMAND3 =>
616
                                if networking_enabled = '1' then
617
                                        hk_next_state <= HANDLE_NETWORK_ENABLED_COMMAND4;
618
                                else
619
                                        hk_next_state <= HANDLE_NETWORK_ENABLED_COMMAND5;
620
                                end if;
621
                        when HANDLE_NETWORK_ENABLED_COMMAND4 =>
622
                                hk_next_state <= PRINT_COMMAND_RESULT0;
623
                        when HANDLE_NETWORK_ENABLED_COMMAND5 =>
624
                                hk_next_state <= PRINT_COMMAND_RESULT0;
625
 
626
                        when NEW_LINE_W_NEW_PROMPT0 =>
627
                                hk_next_state <= NEW_LINE_W_NEW_PROMPT1;
628
                        when NEW_LINE_W_NEW_PROMPT1 =>
629
                                hk_next_state <= PRINT_COMMAND_PROMPT0;
630
 
631
                        when REPORT_UNKNOWN_COMMAND1 =>
632
                                hk_next_state <= REPORT_UNKNOWN_COMMAND2;
633
                        when REPORT_UNKNOWN_COMMAND2 =>
634
                                hk_next_state <= REPORT_UNKNOWN_COMMAND3;
635
                        when REPORT_UNKNOWN_COMMAND3 =>
636
                                if command_ram_index = command_ram_index_max then
637
                                        hk_next_state <= REPORT_UNKNOWN_COMMAND4;
638
                                else
639
                                        hk_next_state <= REPORT_UNKNOWN_COMMAND2;
640
                                end if;
641
                        when REPORT_UNKNOWN_COMMAND4 =>
642
                                hk_next_state <= PRINT_COMMAND_RESULT0;
643
 
644
                        when PRINT_COMMAND_RESULT0 =>
645
                                hk_next_state <= PRINT_COMMAND_RESULT1;
646
                        when PRINT_COMMAND_RESULT1 =>
647
                                if screen_msg_char = C_end_of_message_char then
648
                                        hk_next_state <= hk_cached_state;
649
                                else
650
                                        hk_next_state <= PRINT_COMMAND_RESULT1;
651
                                end if;
652
 
653
                end case;
654
        end process;
655
 
656
        process(CLK_IN)
657
   begin
658
      if rising_edge(CLK_IN) then
659
                        if hk_state = PRINT_COMMAND_PROMPT0 then
660
                                prompt_ram_index <= X"0";
661
                        elsif hk_state = PRINT_COMMAND_PROMPT1 then
662
                                prompt_ram_index <= prompt_ram_index + 1;
663
                        end if;
664
                end if;
665
        end process;
666
 
667
        process(CLK_IN)
668
   begin
669
      if rising_edge(CLK_IN) then
670
                        if hk_state = PRINT_COMMAND_PROMPT1 then
671
                                screen_wr_buf_byte <= prompt_array_inst(to_integer(prompt_ram_index));
672
                        elsif hk_state = HANDLE_KEY_PRESSED0 then
673
                                screen_wr_buf_byte <= keyboard_data;
674
                        elsif hk_state = HANDLE_BACKSPACE1 then
675
                                screen_wr_buf_byte <= C_backspace_cmnd;
676
                        elsif hk_state = HANDLE_BACKSPACE2 then
677
                                screen_wr_buf_byte <= X"20";
678
                        elsif hk_state = HANDLE_BACKSPACE3 then
679
                                screen_wr_buf_byte <= C_backspace_cmnd;
680
                        elsif hk_state = NEW_LINE_W_NEW_PROMPT0 then
681
                                screen_wr_buf_byte <= C_new_line_cmnd;
682
                        elsif hk_state = HANDLE_COMMAND_SUBMIT3 then
683
                                screen_wr_buf_byte <= C_new_line_cmnd;
684
                        elsif hk_state = REPORT_UNKNOWN_COMMAND2 then
685
                                screen_wr_buf_byte <= command_ram_inst(to_integer(command_ram_index));
686
                        elsif hk_state = PRINT_COMMAND_RESULT1 then
687
                                screen_wr_buf_byte <= screen_msg_char;
688
                        elsif hk_state = HANDLE_CLEAR_COMMAND0 then
689
                                screen_wr_buf_byte <= C_clear_cmnd;
690
                        elsif hk_state = HANDLE_SHOW_MAC_COMMAND5 then
691
                                screen_wr_buf_byte <= ascii_val;
692
                        elsif hk_state = HANDLE_SHOW_MAC_COMMAND7 then
693
                                screen_wr_buf_byte <= ascii_val;
694
                        elsif hk_state = HANDLE_SHOW_MAC_COMMAND8 then
695
                                screen_wr_buf_byte <= X"3A";
696
                        elsif hk_state = CONNECT_DHCP_COMMAND3 then
697
                                screen_wr_buf_byte <= X"2E";
698
                        elsif hk_state = HANDLE_SHOW_IP_COMMAND5 then
699
                                screen_wr_buf_byte <= X"3"&bcd_val(11 downto 8);
700
                        elsif hk_state = HANDLE_SHOW_IP_COMMAND6 then
701
                                screen_wr_buf_byte <= X"3"&bcd_val(7 downto 4);
702
                        elsif hk_state = HANDLE_SHOW_IP_COMMAND7 then
703
                                screen_wr_buf_byte <= X"3"&bcd_val(3 downto 0);
704
                        elsif hk_state = HANDLE_SHOW_IP_COMMAND9 then
705
                                screen_wr_buf_byte <= X"2E";
706
                        elsif hk_state = HANDLE_CONNECT_CLOUD_COMMAND2 then
707
                                screen_wr_buf_byte <= X"2E";
708
                        end if;
709
                        if hk_prev_state = PRINT_COMMAND_PROMPT1 then
710
                                screen_wr_buffer_index <= screen_wr_buffer_index + 1;
711
                        elsif hk_prev_state = HANDLE_KEY_PRESSED0 then
712
                                screen_wr_buffer_index <= screen_wr_buffer_index + 1;
713
                        elsif hk_prev_state = HANDLE_BACKSPACE1 then
714
                                screen_wr_buffer_index <= screen_wr_buffer_index + 1;
715
                        elsif hk_prev_state = HANDLE_BACKSPACE2 then
716
                                screen_wr_buffer_index <= screen_wr_buffer_index + 1;
717
                        elsif hk_prev_state = HANDLE_BACKSPACE3 then
718
                                screen_wr_buffer_index <= screen_wr_buffer_index + 1;
719
                        elsif hk_prev_state = NEW_LINE_W_NEW_PROMPT0 then
720
                                screen_wr_buffer_index <= screen_wr_buffer_index + 1;
721
                        elsif hk_prev_state = HANDLE_COMMAND_SUBMIT3 then
722
                                screen_wr_buffer_index <= screen_wr_buffer_index + 1;
723
                        elsif hk_prev_state = REPORT_UNKNOWN_COMMAND2 then
724
                                screen_wr_buffer_index <= screen_wr_buffer_index + 1;
725
                        elsif hk_prev_state = PRINT_COMMAND_RESULT1 then
726
                                screen_wr_buffer_index <= screen_wr_buffer_index + 1;
727
                        elsif hk_prev_state = HANDLE_CLEAR_COMMAND0 then
728
                                screen_wr_buffer_index <= screen_wr_buffer_index + 1;
729
                        elsif hk_prev_state = HANDLE_SHOW_MAC_COMMAND5 then
730
                                screen_wr_buffer_index <= screen_wr_buffer_index + 1;
731
                        elsif hk_prev_state = HANDLE_SHOW_MAC_COMMAND7 then
732
                                screen_wr_buffer_index <= screen_wr_buffer_index + 1;
733
                        elsif hk_prev_state = HANDLE_SHOW_MAC_COMMAND8 then
734
                                screen_wr_buffer_index <= screen_wr_buffer_index + 1;
735
                        elsif hk_prev_state = CONNECT_DHCP_COMMAND3 then
736
                                screen_wr_buffer_index <= screen_wr_buffer_index + 1;
737
                        elsif hk_prev_state = HANDLE_SHOW_IP_COMMAND5 then
738
                                screen_wr_buffer_index <= screen_wr_buffer_index + 1;
739
                        elsif hk_prev_state = HANDLE_SHOW_IP_COMMAND6 then
740
                                screen_wr_buffer_index <= screen_wr_buffer_index + 1;
741
                        elsif hk_prev_state = HANDLE_SHOW_IP_COMMAND7 then
742
                                screen_wr_buffer_index <= screen_wr_buffer_index + 1;
743
                        elsif hk_prev_state = HANDLE_SHOW_IP_COMMAND9 then
744
                                screen_wr_buffer_index <= screen_wr_buffer_index + 1;
745
                        elsif hk_prev_state = HANDLE_CONNECT_CLOUD_COMMAND2 then
746
                                screen_wr_buffer_index <= screen_wr_buffer_index + 1;
747
                        end if;
748
                        if hk_state = PRINT_COMMAND_PROMPT1 then
749
                                screen_buf_we <= '1';
750
                        elsif hk_state = HANDLE_KEY_PRESSED0 then
751
                                screen_buf_we <= '1';
752
                        elsif hk_state = HANDLE_BACKSPACE1 then
753
                                screen_buf_we <= '1';
754
                        elsif hk_state = HANDLE_BACKSPACE2 then
755
                                screen_buf_we <= '1';
756
                        elsif hk_state = HANDLE_BACKSPACE3 then
757
                                screen_buf_we <= '1';
758
                        elsif hk_state = NEW_LINE_W_NEW_PROMPT0 then
759
                                screen_buf_we <= '1';
760
                        elsif hk_state = HANDLE_COMMAND_SUBMIT3 then
761
                                screen_buf_we <= '1';
762
                        elsif hk_state = REPORT_UNKNOWN_COMMAND2 then
763
                                screen_buf_we <= '1';
764
                        elsif hk_state = PRINT_COMMAND_RESULT1 then
765
                                screen_buf_we <= '1';
766
                        elsif hk_state = HANDLE_CLEAR_COMMAND0 then
767
                                screen_buf_we <= '1';
768
                        elsif hk_state = HANDLE_SHOW_MAC_COMMAND5 then
769
                                screen_buf_we <= '1';
770
                        elsif hk_state = HANDLE_SHOW_MAC_COMMAND7 then
771
                                screen_buf_we <= '1';
772
                        elsif hk_state = HANDLE_SHOW_MAC_COMMAND8 then
773
                                screen_buf_we <= '1';
774
                        elsif hk_state = CONNECT_DHCP_COMMAND3 then
775
                                screen_buf_we <= '1';
776
                        elsif hk_state = HANDLE_SHOW_IP_COMMAND5 then
777
                                screen_buf_we <= '1';
778
                        elsif hk_state = HANDLE_SHOW_IP_COMMAND6 then
779
                                screen_buf_we <= '1';
780
                        elsif hk_state = HANDLE_SHOW_IP_COMMAND7 then
781
                                screen_buf_we <= '1';
782
                        elsif hk_state = HANDLE_SHOW_IP_COMMAND9 then
783
                                screen_buf_we <= '1';
784
                        elsif hk_state = HANDLE_CONNECT_CLOUD_COMMAND2 then
785
                                screen_buf_we <= '1';
786
                        else
787
                                screen_buf_we <= '0';
788
                        end if;
789
                end if;
790
        end process;
791
 
792
        process(CLK_IN)
793
   begin
794
      if rising_edge(CLK_IN) then
795
                        if hk_state = HANDLE_KEY_PRESSED0 then
796
                                command_ram_inst(to_integer(command_ram_index)) <= keyboard_data;
797
                        end if;
798
                        if hk_state = HANDLE_KEY_PRESSED0 then
799
                                command_ram_index <= command_ram_index + 1;
800
                        elsif hk_state = HANDLE_BACKSPACE1 then
801
                                command_ram_index <= command_ram_index - 1;
802
                        elsif hk_state = HANDLE_COMMAND_SUBMIT0 then
803
                                command_ram_index <= "00000";
804
                        elsif hk_state = HANDLE_COMMAND_SUBMIT1 then
805
                                command_ram_index <= command_ram_index + 1;
806
                        elsif hk_state = HANDLE_COMMAND_SUBMIT3 then
807
                                command_ram_index <= "00000";
808
                        elsif hk_state = REPORT_UNKNOWN_COMMAND1 then
809
                                command_ram_index <= "00000";
810
                        elsif hk_state = REPORT_UNKNOWN_COMMAND2 then
811
                                command_ram_index <= command_ram_index + 1;
812
                        elsif hk_state = REPORT_UNKNOWN_COMMAND4 then
813
                                command_ram_index <= "00000";
814
                        end if;
815
                        if hk_state = HANDLE_COMMAND_SUBMIT0 then
816
                                command_ram_index_max <= command_ram_index;
817
                        end if;
818
                        if hk_state = HANDLE_COMMAND_SUBMIT0 then
819
                                command_hash <= (others => '0');
820
                        elsif hk_state = HANDLE_COMMAND_SUBMIT1 then
821
                                command_hash <= command_hash + RESIZE(unsigned(command_ram_inst(to_integer(command_ram_index))), 16);
822
                        elsif hk_state = HANDLE_COMMAND_SUBMIT2 then
823
                                command_hash(15 downto 1) <= command_hash(14 downto 0);
824
                                command_hash(0) <= command_hash(15);
825
                        end if;
826
                end if;
827
        end process;
828
 
829
        screen_buffer : TDP_RAM
830
        Generic Map ( G_DATA_A_SIZE     => screen_wr_buf_byte'length,
831
                                          G_ADDR_A_SIZE => screen_wr_buffer_index'length,
832
                                          G_RELATION            => 0, --log2(SIZE_A/SIZE_B)
833
                                          G_INIT_ZERO           => false,
834
                                          G_INIT_FILE           => "./coe_dir/ascii_space.coe")
835
   Port Map ( CLK_A_IN          => CLK_IN,
836
                                  WE_A_IN               => screen_buf_we,
837
                                  ADDR_A_IN     => slv(screen_wr_buffer_index),
838
                                  DATA_A_IN             => screen_wr_buf_byte,
839
                                  DATA_A_OUT    => open,
840
                                  CLK_B_IN              => CLK_IN,
841
                                  WE_B_IN               => '0',
842
                                  ADDR_B_IN     => slv(screen_rd_buffer_index),
843
                                  DATA_B_IN     => X"00",
844
                                  DATA_B_OUT    => screen_rd_buf_byte);
845
 
846
        ---- SCREEN MEMORY ----
847
 
848
   SB_SYNC_PROC: process(CLK_IN)
849
   begin
850
      if rising_edge(CLK_IN) then
851
                        sb_state <= sb_next_state;
852
      end if;
853
   end process;
854
 
855
   SB_NEXT_STATE_DECODE: process (sb_state, screen_rd_buffer_index, screen_wr_buffer_index, screen_rd_buf_byte, char_buf_wr_addr)
856
   begin
857
      sb_next_state <= sb_state;  --default is to stay in current state
858
      case (sb_state) is
859
         when SB_IDLE =>
860
            if screen_rd_buffer_index /= screen_wr_buffer_index then
861
                                        sb_next_state <= SB_PARSE_NEW_BYTE;
862
                                end if;
863
 
864
                        when SB_PARSE_NEW_BYTE =>
865
                                if screen_rd_buf_byte(7) = '0' then
866
                                        sb_next_state <= SB_HANDLE_CHARACTER0;
867
                                else
868
                                        sb_next_state <= SB_HANDLE_COMMAND;
869
                                end if;
870
 
871
                        when SB_HANDLE_CHARACTER0 =>
872
            sb_next_state <= SB_HANDLE_CHARACTER1;
873
                        when SB_HANDLE_CHARACTER1 =>
874
            sb_next_state <= SB_IDLE;
875
 
876
         when SB_HANDLE_COMMAND =>
877
                                if screen_rd_buf_byte = C_backspace_cmnd then
878
                                        sb_next_state <= SB_HANDLE_BACKSPACE;
879
                                elsif screen_rd_buf_byte = C_new_line_cmnd then
880
                                        sb_next_state <= SB_HANDLE_NEW_LINE;
881
                                elsif screen_rd_buf_byte = C_clear_cmnd then
882
                                        sb_next_state <= SB_HANDLE_CLEAR;
883
                                else
884
                                        sb_next_state <= SB_IDLE;
885
                                end if;
886
 
887
                        when SB_HANDLE_BACKSPACE =>
888
                                sb_next_state <= SB_IDLE;
889
         when SB_HANDLE_NEW_LINE =>
890
                                sb_next_state <= SB_IDLE;
891
                        when SB_HANDLE_CLEAR =>
892
                                if char_buf_wr_addr = X"001" then
893
                                        sb_next_state <= SB_IDLE;
894
                                end if;
895
 
896
      end case;
897
   end process;
898
 
899
        process(CLK_IN)
900
        begin
901
                if rising_edge(CLK_IN) then
902
                        if sb_state = SB_HANDLE_CHARACTER0 then
903
                                char_buf_wr <= '1';
904
                        elsif sb_state = SB_HANDLE_CLEAR then
905
                                char_buf_wr <= '1';
906
                        else
907
                                char_buf_wr <= '0';
908
                        end if;
909
                        if sb_state = SB_HANDLE_CHARACTER0 then
910
                                char_buf_wr_data <= screen_rd_buf_byte;
911
                        elsif sb_state = SB_HANDLE_CLEAR then
912
                                char_buf_wr_data <= X"20";
913
                        end if;
914
                        if sb_state = SB_HANDLE_CHARACTER0 then
915
                                screen_rd_buffer_index <= screen_rd_buffer_index + 1;
916
                        elsif sb_state = SB_HANDLE_COMMAND then
917
                                screen_rd_buffer_index <= screen_rd_buffer_index + 1;
918
                        end if;
919
                        char_buf_x_coord <= unsigned(C_page_width_p1) - unsigned(ocrx);
920
                        if sb_state = SB_HANDLE_CHARACTER1 then
921
                                char_buf_wr_addr <= char_buf_wr_addr + 1;
922
                        elsif sb_state = SB_HANDLE_BACKSPACE then
923
                                char_buf_wr_addr <= char_buf_wr_addr - 1;
924
                        elsif sb_state = SB_HANDLE_CLEAR then
925
                                char_buf_wr_addr <= char_buf_wr_addr - 1;
926
                        elsif sb_state = SB_HANDLE_NEW_LINE then
927
                                char_buf_wr_addr <= char_buf_wr_addr + RESIZE(char_buf_x_coord, 12);
928
                        end if;
929
                end if;
930
        end process;
931
 
932
        char_buf : TDP_RAM
933
        Generic Map ( G_DATA_A_SIZE     => TEXT_DATA_OUT'length,
934
                                          G_ADDR_A_SIZE => TEXT_ADDR_IN'length,
935
                                          G_RELATION            => 0, --log2(SIZE_A/SIZE_B)
936
                                          G_INIT_ZERO           => false,
937
                                          G_INIT_FILE           => "./coe_dir/ascii_space.coe")
938
   Port Map ( CLK_A_IN          => CLK_IN,
939
                                  WE_A_IN               => '0',
940
                                  ADDR_A_IN     => TEXT_ADDR_IN,
941
                                  DATA_A_IN             => X"00",
942
                                  DATA_A_OUT    => TEXT_DATA_OUT,
943
                                  CLK_B_IN              => CLK_IN,
944
                                  WE_B_IN               => char_buf_wr,
945
                                  ADDR_B_IN     => slv(char_buf_wr_addr),
946
                                  DATA_B_IN     => char_buf_wr_data,
947
                                  DATA_B_OUT    => open);
948
 
949
 
950
        ---- HANDLE CURSOR POSITION ----        
951
 
952
        CURSORPOS_X_OUT <= slv(ocrx);
953
        CURSORPOS_Y_OUT <= slv(ocry);
954
 
955
        process(CLK_IN)
956
        begin
957
                if rising_edge(CLK_IN) then
958
                        if sb_state = SB_HANDLE_CHARACTER1 then
959
                                if slv(ocrx) = C_page_width and slv(ocry) /= C_page_height then
960
                                        ocrx <= X"00";
961
                                else
962
                                        ocrx <= ocrx + 1;
963
                                end if;
964
                                if slv(ocrx) = C_page_width then
965
                                        if slv(ocry) /= C_page_height then
966
                                                ocry <= ocry + 1;
967
                                        end if;
968
                                end if;
969
                        elsif sb_state = SB_HANDLE_BACKSPACE then
970
                                if slv(ocrx) = X"00" and slv(ocry) /= X"00" then
971
                                        ocrx <= unsigned(C_page_width);
972
                                else
973
                                        ocrx <= ocrx - 1;
974
                                end if;
975
                                if slv(ocrx) = X"00" then
976
                                        if ocry /= X"00" then
977
                                                ocry <= ocry - 1;
978
                                        end if;
979
                                end if;
980
                        elsif sb_state = SB_HANDLE_NEW_LINE then
981
                                ocrx <= X"00";
982
                                ocry <= ocry + 1;
983
                        elsif sb_state = SB_HANDLE_CLEAR then
984
                                ocrx <= X"00";
985
                                ocry <= X"00";
986
                        end if;
987
                end if;
988
        end process;
989
 
990
        --- Font/Character Pixel Map --
991
 
992
        Font_Mem_inst : FONT_MEM
993
          PORT MAP (
994
                 clka   => CLK_IN,
995
                 wea            => "0",
996
                 addra  => FONT_ADDR_IN,
997
                 dina   => (others => '0'),
998
                 douta  => FONT_DATA_OUT);
999
 
1000
        --- Screen Messages Ram ---
1001
 
1002
        process(CLK_IN)
1003
        begin
1004
                if rising_edge(CLK_IN) then
1005
                        if hk_state = REPORT_UNKNOWN_COMMAND4 then
1006
                                screen_msg_addr <= unsigned(C_unknown_messge_addr);
1007
                        elsif hk_state = HANDLE_NETWORK_ENABLED_COMMAND2 then
1008
                                screen_msg_addr <= unsigned(C_net_enabled_message_addr);
1009
                        elsif hk_state = HANDLE_NETWORK_ENABLED_COMMAND4 then
1010
                                screen_msg_addr <= unsigned(C_true_message_addr);
1011
                        elsif hk_state = HANDLE_NETWORK_ENABLED_COMMAND5 then
1012
                                screen_msg_addr <= unsigned(C_false_message_addr);
1013
                        elsif hk_state = HANDLE_SHOW_MAC_COMMAND0 then
1014
                                screen_msg_addr <= unsigned(C_mac_message_addr);
1015
                        elsif hk_state = CONNECT_DHCP_COMMAND1 then
1016
                                screen_msg_addr <= unsigned(C_local_connect_addr);
1017
                        elsif hk_state = CONNECT_STATIC_COMMAND1 then
1018
                                screen_msg_addr <= unsigned(C_local_connect_addr);
1019
                        elsif hk_state = CONNECT_DHCP_COMMAND6 then
1020
                                screen_msg_addr <= unsigned(C_success_message_addr);
1021
                        elsif hk_state = CONNECT_DHCP_COMMAND7 then
1022
                                screen_msg_addr <= unsigned(C_failed_message_addr);
1023
                        elsif hk_state = HANDLE_SHOW_MY_IP_COMMAND then
1024
                                screen_msg_addr <= unsigned(C_show_ip_addr);
1025
                        elsif hk_state = HANDLE_SHOW_CLOUD_IP_COMMAND then
1026
                                screen_msg_addr <= unsigned(C_show_cloud_ip_addr);
1027
                        elsif hk_state = HANDLE_SHOW_IP_SETTING_COMMAND0 then
1028
                                screen_msg_addr <= unsigned(C_show_ip_setting_addr);
1029
                        elsif hk_state = HANDLE_SHOW_IP_SETTING_COMMAND4 then
1030
                                screen_msg_addr <= unsigned(C_dynamic_addr);
1031
                        elsif hk_state = HANDLE_SHOW_IP_SETTING_COMMAND5 then
1032
                                screen_msg_addr <= unsigned(C_static_addr);
1033
                        elsif hk_state = HANDLE_CONNECT_CLOUD_COMMAND0 then
1034
                                screen_msg_addr <= unsigned(C_cloud_connect_addr);
1035
                        else
1036
                                screen_msg_addr <= screen_msg_addr + 1;
1037
                        end if;
1038
                        if hk_state = REPORT_UNKNOWN_COMMAND4 then
1039
                                hk_cached_state <= NEW_LINE_W_NEW_PROMPT0;
1040
                        elsif hk_state = HANDLE_NETWORK_ENABLED_COMMAND2 then
1041
                                hk_cached_state <= HANDLE_NETWORK_ENABLED_COMMAND3;
1042
                        elsif hk_state = HANDLE_NETWORK_ENABLED_COMMAND4 then
1043
                                hk_cached_state <= NEW_LINE_W_NEW_PROMPT0;
1044
                        elsif hk_state = HANDLE_NETWORK_ENABLED_COMMAND5 then
1045
                                hk_cached_state <= NEW_LINE_W_NEW_PROMPT0;
1046
                        elsif hk_state = HANDLE_SHOW_MAC_COMMAND0 then
1047
                                hk_cached_state <= HANDLE_SHOW_MAC_COMMAND1;
1048
                        elsif hk_state = CONNECT_DHCP_COMMAND1 then
1049
                                hk_cached_state <= CONNECT_DHCP_COMMAND2;
1050
                        elsif hk_state = CONNECT_STATIC_COMMAND1 then
1051
                                hk_cached_state <= CONNECT_DHCP_COMMAND2;
1052
                        elsif hk_state = CONNECT_DHCP_COMMAND6 then
1053
                                hk_cached_state <= NEW_LINE_W_NEW_PROMPT0;
1054
                        elsif hk_state = CONNECT_DHCP_COMMAND7 then
1055
                                hk_cached_state <= NEW_LINE_W_NEW_PROMPT0;
1056
                        elsif hk_state = HANDLE_SHOW_IP_COMMAND0 then
1057
                                hk_cached_state <= HANDLE_SHOW_IP_COMMAND1;
1058
                        elsif hk_state = HANDLE_SHOW_IP_SETTING_COMMAND0 then
1059
                                hk_cached_state <= HANDLE_SHOW_IP_SETTING_COMMAND1;
1060
                        elsif hk_state = HANDLE_SHOW_IP_SETTING_COMMAND4 then
1061
                                hk_cached_state <= NEW_LINE_W_NEW_PROMPT0;
1062
                        elsif hk_state = HANDLE_SHOW_IP_SETTING_COMMAND5 then
1063
                                hk_cached_state <= NEW_LINE_W_NEW_PROMPT0;
1064
                        elsif hk_state = HANDLE_CONNECT_CLOUD_COMMAND0 then
1065
                                hk_cached_state <= HANDLE_CONNECT_CLOUD_COMMAND1;
1066
                        end if;
1067
                end if;
1068
        end process;
1069
 
1070
        screen_msg : TDP_RAM
1071
        Generic Map ( G_DATA_A_SIZE     => screen_msg_char'length,
1072
                                          G_ADDR_A_SIZE => screen_msg_addr'length,
1073
                                          G_RELATION            => 0, --log2(SIZE_A/SIZE_B)
1074
                                          G_INIT_ZERO           => false,
1075
                                          G_INIT_FILE           => "./coe_dir/screen_msg.coe")
1076
   Port Map ( CLK_A_IN          => CLK_IN,
1077
                                  WE_A_IN               => '0',
1078
                                  ADDR_A_IN     => slv(screen_msg_addr),
1079
                                  DATA_A_IN             => X"00",
1080
                                  DATA_A_OUT    => screen_msg_char,
1081
                                  CLK_B_IN              => CLK_IN,
1082
                                  WE_B_IN               => '0',
1083
                                  ADDR_B_IN     => '0'&X"00",
1084
                                  DATA_B_IN     => X"00",
1085
                                  DATA_B_OUT    => open);
1086
 
1087
        process(CLK_IN)
1088
        begin
1089
                if rising_edge(CLK_IN) then
1090
                        if hk_state = HANDLE_SHOW_MAC_COMMAND3 then
1091
                                hex_val <= DATA_IN(7 downto 4);
1092
                        elsif hk_state = HANDLE_SHOW_MAC_COMMAND5 then
1093
                                hex_val <= DATA_IN(3 downto 0);
1094
                        end if;
1095
                        if hk_state = HANDLE_SHOW_MAC_COMMAND3 then
1096
                                hex_conv <= '1';
1097
                        elsif hk_state = HANDLE_SHOW_MAC_COMMAND5 then
1098
                                hex_conv <= '1';
1099
                        else
1100
                                hex_conv <= '0';
1101
                        end if;
1102
                end if;
1103
        end process;
1104
 
1105
        hex_to_ascii_inst : hex_to_ascii
1106
    Port Map ( CLK_IN                   => CLK_IN,
1107
                                        CONV_IN                         => hex_conv,
1108
                                        HEX_IN                  => hex_val,
1109
                                        ASCII_OUT               => ascii_val,
1110
                                        CONV_DONE_OUT   => hex_conv_done);
1111
 
1112
        process(CLK_IN)
1113
        begin
1114
                if rising_edge(CLK_IN) then
1115
                        if hk_state = HANDLE_SHOW_IP_COMMAND3 then
1116
                                bin_val <= DATA_IN(7 downto 0);
1117
                        end if;
1118
                        if hk_state = HANDLE_SHOW_IP_COMMAND3 then
1119
                                bcd_conv <= '1';
1120
                        else
1121
                                bcd_conv <= '0';
1122
                        end if;
1123
                end if;
1124
        end process;
1125
 
1126
        bin_to_bcd_inst : bin_to_bcd
1127
    Port Map ( CLK_IN                   => CLK_IN,
1128
                                        CONV_IN                         => bcd_conv,
1129
                                        BIN_IN                  => bin_val,
1130
                                        BCD_OUT                         => bcd_val,
1131
                                        CONV_DONE_OUT   => bcd_conv_done);
1132
 
1133
        --- Bus DATA/ADDR Handling --
1134
 
1135
        ETH_COMMAND_EN_OUT <= eth_command_en;
1136
        ETH_COMMAND_OUT <= eth_command;
1137
        eth_command_cmplt <= ETH_COMMAND_CMPLT_IN;
1138
        eth_command_err <= ETH_COMMAND_ERR_IN;
1139
 
1140
        process(CLK_IN)
1141
        begin
1142
                if rising_edge(CLK_IN) then
1143
                        if hk_state = HANDLE_NETWORK_INIT_COMMAND0 then
1144
                                eth_command <= X"3";
1145
                        elsif hk_state = CONNECT_DHCP_COMMAND0 then
1146
                                eth_command <= X"4";
1147
                        elsif hk_state = CONNECT_STATIC_COMMAND0 then
1148
                                eth_command <= X"5";
1149
                        elsif hk_state = HANDLE_CONNECT_CLOUD_COMMAND0 then
1150
                                eth_command <= X"6";
1151
                        elsif hk_state = CANCEL_DHCP_CONNECT0 then
1152
                                eth_command <= X"7";
1153
                        elsif hk_state = HANDLE_CONNECT_CLOUD_COMMAND5 then
1154
                                eth_command <= X"9";
1155
                        end if;
1156
                        if hk_state = HANDLE_NETWORK_INIT_COMMAND0 then
1157
                                eth_command_en <= '1';
1158
                        elsif hk_state = CONNECT_DHCP_COMMAND0 then
1159
                                eth_command_en <= '1';
1160
                        elsif hk_state = CONNECT_STATIC_COMMAND0 then
1161
                                eth_command_en <= '1';
1162
                        elsif hk_state = HANDLE_CONNECT_CLOUD_COMMAND0 then
1163
                                eth_command_en <= '1';
1164
                        elsif hk_state = CANCEL_DHCP_CONNECT0 then
1165
                                eth_command_en <= '1';
1166
                        elsif hk_state = HANDLE_CONNECT_CLOUD_COMMAND5 then
1167
                                eth_command_en <= '1';
1168
                        else
1169
                                eth_command_en <= '0';
1170
                        end if;
1171
                        if hk_state = CONNECT_DHCP_COMMAND0 or hk_state = CONNECT_STATIC_COMMAND0 then
1172
                                dhcp_second_count <= X"0";
1173
                        elsif hk_state = CONNECT_DHCP_COMMAND3 then
1174
                                dhcp_second_count <= dhcp_second_count + 1;
1175
                        end if;
1176
                        if hk_state = HANDLE_CONNECT_CLOUD_COMMAND0 then
1177
                                tcp_second_count <= X"0";
1178
                        elsif hk_state = HANDLE_CONNECT_CLOUD_COMMAND3 then
1179
                                tcp_second_count <= tcp_second_count + 1;
1180
                        end if;
1181
                end if;
1182
        end process;
1183
 
1184
        ADDR_OUT <= slv(addr);
1185
 
1186
        process(CLK_IN)
1187
        begin
1188
                if rising_edge(CLK_IN) then
1189
                        if hk_state = HANDLE_NETWORK_ENABLED_COMMAND0 then
1190
                                addr <= X"00";
1191
                        elsif hk_state = HANDLE_SHOW_MAC_COMMAND1 then
1192
                                addr <= X"01";
1193
                        elsif hk_state = HANDLE_SHOW_MAC_COMMAND7 then
1194
                                addr <= addr + 1;
1195
                        elsif hk_state = HANDLE_CONNECT_LOCAL0 then
1196
                                addr <= X"07";
1197
                        elsif hk_state = HANDLE_SHOW_IP_SETTING_COMMAND1 then
1198
                                addr <= X"07";
1199
                        elsif hk_state = CONNECT_DHCP_COMMAND3 then
1200
                                addr <= X"08";
1201
                        elsif hk_state = HANDLE_SHOW_IP_COMMAND1 then
1202
                                addr <= unsigned(show_ip_start_addr);
1203
                        elsif hk_state = HANDLE_SHOW_IP_COMMAND8 then
1204
                                addr <= addr + 1;
1205
                        elsif hk_state = HANDLE_CONNECT_CLOUD_COMMAND2 then
1206
                                addr <= X"11";
1207
                        end if;
1208
                        if hk_state = HANDLE_NETWORK_ENABLED_COMMAND2 then
1209
                                networking_enabled <= DATA_IN(0);
1210
                        end if;
1211
                        if hk_state = HANDLE_CONNECT_LOCAL2 then
1212
                                dhcp_enabled <= DATA_IN(0);
1213
                        end if;
1214
                        if hk_state = HANDLE_SHOW_MY_IP_COMMAND then
1215
                                show_ip_start_addr <= X"09";
1216
                        elsif hk_state = HANDLE_SHOW_CLOUD_IP_COMMAND then
1217
                                show_ip_start_addr <= X"0D";
1218
                        end if;
1219
                end if;
1220
        end process;
1221
 
1222
end Behavioral;
1223
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.