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/] [eth_mod.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:    21:09:04 12/10/2014 
6
-- Design Name: 
7
-- Module Name:    eth_mod - 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
-- TODO: Have 'G_ENABLE_DHCP' Generic and comment all statements that rely on dhcp with '#ifdef end'
20
-- TODO: Get correct version of 'sf.conf' and add it to repository
21
--
22
----------------------------------------------------------------------------------
23
 
24
library IEEE;
25
use IEEE.STD_LOGIC_1164.ALL;
26
use IEEE.NUMERIC_STD.ALL;
27
 
28
-- Uncomment the following library declaration if instantiating
29
-- any Xilinx primitives in this code.
30
--library UNISIM;
31
--use UNISIM.VComponents.all;
32
 
33
entity eth_mod is
34
        Generic ( G_FUNCTION    :string :="client" );
35
    Port (
36
                        CLK_IN          : in STD_LOGIC;
37
                        CLK_1HZ_IN      : in STD_LOGIC;
38
 
39
                        -- Command interface
40
                        INIT_ENC28J60   : in    STD_LOGIC;
41
                        DHCP_CONNECT    : in    STD_LOGIC;
42
                        ERROR_OUT               : out  STD_LOGIC_VECTOR (7 downto 0);
43
 
44
                        -- Debug Interface
45
                        DEBUG_IN                : in    STD_LOGIC_VECTOR(2 downto 0);
46
                        DEBUG_OUT               : out  STD_LOGIC_VECTOR (15 downto 0);
47
 
48
                        -- TCP Connection Interface
49
                        TCP_CONNECTION_ACTIVE_OUT       : out STD_LOGIC;
50
                        TCP_RD_DATA_AVAIL_OUT           : out STD_LOGIC;
51
                        TCP_RD_DATA_EN_IN                       : in STD_LOGIC;
52
                        TCP_RD_DATA_OUT                         : out STD_LOGIC_VECTOR (7 downto 0);
53
                        TCP_WR_DATA_POSSIBLE_OUT        : out STD_LOGIC;
54
                        TCP_WR_DATA_EN_IN                       : in STD_LOGIC;
55
                        TCP_WR_DATA_FLUSH_IN            : in STD_LOGIC;
56
                        TCP_WR_DATA_IN                          : in STD_LOGIC_VECTOR (7 downto 0);
57
 
58
                        -- Eth SPI interface
59
                        SDI_OUT         : out  STD_LOGIC;
60
                        SDO_IN          : in  STD_LOGIC;
61
                        SCLK_OUT        : out  STD_LOGIC;
62
                        CS_OUT          : out  STD_LOGIC );
63
end eth_mod;
64
 
65
architecture Behavioral of eth_mod is
66
 
67
        COMPONENT spi_mod
68
                Port (  CLK_IN                          : in  STD_LOGIC;
69
                                        RST_IN                          : in  STD_LOGIC;
70
 
71
                                        WR_CONTINUOUS_IN        : in  STD_LOGIC;
72
                                        WE_IN                           : in  STD_LOGIC;
73
                                        WR_ADDR_IN                      : in    STD_LOGIC_VECTOR (7 downto 0);
74
                                        WR_DATA_IN                      : in  STD_LOGIC_VECTOR (7 downto 0);
75
                                        WR_DATA_CMPLT_OUT       : out STD_LOGIC;
76
 
77
                                        RD_CONTINUOUS_IN                                : in  STD_LOGIC;
78
                                        RD_IN                                   : in    STD_LOGIC;
79
                                        RD_WIDTH_IN             : in  STD_LOGIC;
80
                                        RD_ADDR_IN                      : in  STD_LOGIC_VECTOR (7 downto 0);
81
                                        RD_DATA_OUT             : out STD_LOGIC_VECTOR (7 downto 0);
82
                                        RD_DATA_CMPLT_OUT       : out STD_LOGIC;
83
 
84
                                        SLOW_CS_EN_IN                     : in STD_LOGIC;
85
                                        OPER_CMPLT_POST_CS_OUT : out STD_LOGIC;
86
 
87
                                        SDI_OUT                         : out STD_LOGIC;
88
                                        SDO_IN                          : in    STD_LOGIC;
89
                                        SCLK_OUT                                : out STD_LOGIC;
90
                                        CS_OUT                          : out STD_LOGIC);
91
        END COMPONENT;
92
 
93
        COMPONENT checksum_calc
94
    Port ( CLK_IN                                               : in  STD_LOGIC;
95
           RST_IN                                               : in  STD_LOGIC;
96
           CHECKSUM_CALC_IN                     : in  STD_LOGIC;
97
           START_ADDR_IN                                : in  STD_LOGIC_VECTOR (10 downto 0);
98
           COUNT_IN                                             : in  STD_LOGIC_VECTOR (10 downto 0);
99
           VALUE_IN                                             : in  STD_LOGIC_VECTOR (7 downto 0);
100
           VALUE_ADDR_OUT                               : out  STD_LOGIC_VECTOR (10 downto 0);
101
                          CHECKSUM_INIT_IN                      : in  STD_LOGIC_VECTOR (15 downto 0);
102
                          CHECKSUM_SET_INIT_IN          : in  STD_LOGIC;
103
                          CHECKSUM_ODD_LENGTH_IN        : in  STD_LOGIC;
104
           CHECKSUM_OUT                                 : out STD_LOGIC_VECTOR (15 downto 0);
105
           CHECKSUM_DONE_OUT                    : out STD_LOGIC);
106
        END COMPONENT;
107
 
108
        COMPONENT TCP_FIFO
109
          PORT (
110
                 clk                            : IN STD_LOGIC;
111
                 din                            : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
112
                 wr_en                  : IN STD_LOGIC;
113
                 rd_en                  : IN STD_LOGIC;
114
                 dout                   : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
115
                 full                   : OUT STD_LOGIC;
116
                 almost_full    : OUT STD_LOGIC;
117
                 empty                  : OUT STD_LOGIC;
118
                 data_count     : OUT STD_LOGIC_VECTOR(11 DOWNTO 0));
119
        END COMPONENT;
120
 
121
        COMPONENT lfsr32_mod
122
                 Port ( CLK_IN          : in  STD_LOGIC;
123
                                  SEED_IN               : in  STD_LOGIC_VECTOR(31 downto 0);
124
                                  SEED_EN_IN    : in  STD_LOGIC;
125
                                  VAL_OUT               : out STD_LOGIC_VECTOR(31 downto 0));
126
        END COMPONENT;
127
 
128
        COMPONENT TDP_RAM
129
                Generic (G_DATA_A_SIZE  :natural :=32;
130
                                        G_ADDR_A_SIZE   :natural :=9;
131
                                        G_RELATION              :natural :=3;
132
                                        G_INIT_ZERO             :boolean := true;
133
                                        G_INIT_FILE             :string :="");--log2(SIZE_A/SIZE_B)
134
                Port ( CLK_A_IN         : in  STD_LOGIC;
135
                                 WE_A_IN        : in  STD_LOGIC;
136
                                 ADDR_A_IN      : in  STD_LOGIC_VECTOR (G_ADDR_A_SIZE-1 downto 0);
137
                                 DATA_A_IN      : in  STD_LOGIC_VECTOR (G_DATA_A_SIZE-1 downto 0);
138
                                 DATA_A_OUT     : out  STD_LOGIC_VECTOR (G_DATA_A_SIZE-1 downto 0);
139
                                 CLK_B_IN       : in  STD_LOGIC;
140
                                 WE_B_IN        : in  STD_LOGIC;
141
                                 ADDR_B_IN      : in  STD_LOGIC_VECTOR (G_ADDR_A_SIZE+G_RELATION-1 downto 0);
142
                                 DATA_B_IN      : in  STD_LOGIC_VECTOR (G_DATA_A_SIZE/(2**G_RELATION)-1 downto 0);
143
                                 DATA_B_OUT : out STD_LOGIC_VECTOR (G_DATA_A_SIZE/(2**G_RELATION)-1 downto 0));
144
        END COMPONENT;
145
 
146
        COMPONENT Packet_Definition
147
          PORT (
148
                 clka   : IN STD_LOGIC;
149
                 addra  : IN STD_LOGIC_VECTOR(10 DOWNTO 0);
150
                 douta  : OUT STD_LOGIC_VECTOR(15 DOWNTO 0));
151
        END COMPONENT;
152
 
153
subtype slv is std_logic_vector;
154
 
155
constant C_250us        : unsigned(15 downto 0) := X"61A8";
156
constant C_200ms        : unsigned(24 downto 0) := '1'&X"312D00";
157
constant C_100ms        : unsigned(23 downto 0) := X"989680";
158
constant C_20ms         : unsigned(20 downto 0) := '1'&X"E8480";
159
 
160
constant C_init_cmnds_start_addr        : std_logic_vector(7 downto 0) := X"01";
161
constant C_init_cmnds_max_addr          : std_logic_vector(7 downto 0) := X"7F";
162
 
163
constant C_arp_reply_frame_addr                         : std_logic_vector(10 downto 0) := "000"&X"80";
164
constant C_icmp_reply_frame_addr                : std_logic_vector(10 downto 0) := "000"&X"AB";
165
constant C_dhcp_discover_frame_addr     : std_logic_vector(10 downto 0) := "001"&X"24";
166
constant C_dhcp_request_frame_addr              : std_logic_vector(10 downto 0) := "010"&X"86";
167
constant C_arp_request_frame_addr               : std_logic_vector(10 downto 0) := "100"&X"67";
168
constant C_tcp_packet_frame_addr                : std_logic_vector(10 downto 0) := "100"&X"92";
169
constant C_tcp_tx_packet_frame_addr     : std_logic_vector(10 downto 0) := "100"&X"F4";
170
 
171
constant C_arp_reply_length             : std_logic_vector(15 downto 0) := X"002A";
172
constant C_icmp_reply_length            : std_logic_vector(15 downto 0) := X"0062";
173
constant C_dhcp_discover_length         : std_logic_vector(15 downto 0) := X"0156";
174
constant C_dhcp_request_length  : std_logic_vector(15 downto 0) := X"015C";
175
constant C_arp_request_length   : std_logic_vector(15 downto 0) := X"002A";
176
constant C_tcp_packet_length            : std_logic_vector(15 downto 0) := X"0042";
177
 
178
constant C_ARP_Packet_Type              : std_logic_vector(15 downto 0) := X"0806";
179
constant C_IP_Packet_Type                       : std_logic_vector(15 downto 0) := X"0800";
180
constant C_ICMP_Protocol_Number : std_logic_vector(7 downto 0) := X"01";
181
constant C_UDP_Protocol_Number  : std_logic_vector(7 downto 0) := X"11";
182
constant C_TCP_Protocol_Number  : std_logic_vector(7 downto 0) := X"06";
183
constant C_IPV4_Protocol_Number : std_logic_vector(3 downto 0) := X"4";
184
constant C_DHCP_Source_Port             : std_logic_vector(15 downto 0) := X"0043";
185
constant C_DHCP_Dest_Port                       : std_logic_vector(15 downto 0) := X"0044";
186
constant C_dhcp_magic_cookie            : std_logic_vector(31 downto 0) := X"63825363";
187
 
188
constant C_tcp_syn_ack_flags    : std_logic_vector(7 downto 0) := X"12";
189
constant C_tcp_syn_flags                        : std_logic_vector(7 downto 0) := X"02";
190
 
191
constant C_tcp_ack_flags                        : std_logic_vector(7 downto 0) := X"10";
192
constant C_tcp_fin_ack_flags            : std_logic_vector(7 downto 0) := X"11";
193
constant C_tcp_psh_ack_flags            : std_logic_vector(7 downto 0) := X"18";
194
 
195
constant C_ICMP_Ping_Length             : std_logic_vector(15 downto 0) := X"0054";
196
constant C_ARP_Request                          : std_logic_vector(7 downto 0) := X"01";
197
constant C_ARP_Reply                                    : std_logic_vector(7 downto 0) := X"02";
198
 
199
constant C_rx_pointer_min : unsigned(15 downto 0) := X"0000";
200
constant C_rx_pointer_max : unsigned(15 downto 0) := X"0FFF";
201
constant C_tx_base_addr1  : unsigned(15 downto 0) := X"1000";
202
constant C_tx_base_addr2  : unsigned(15 downto 0) := X"1800";
203
 
204
signal spi_we, spi_wr_continuous, spi_wr_cmplt, spi_rd_continuous : std_logic := '0';
205
signal spi_rd, spi_rd_width, spi_rd_cmplt, spi_oper_cmplt : std_logic := '0';
206
signal spi_wr_addr, spi_wr_data, spi_rd_addr, spi_data_rd : std_logic_vector(7 downto 0) := (others => '0');
207
 
208
signal frame_addr : std_logic_vector(10 downto 0);
209
signal frame_data : std_logic_vector(15 downto 0);
210
signal frame_data_rd, frame_rd_cmplt, slow_cs_en : std_logic := '0';
211
signal network_interface_enabled : std_logic := '0';
212
 
213
signal command_cmplt, command_trig, command_en_in_p     : std_logic := '0';
214
signal init_cmnd_addr   : unsigned(7 downto 0);
215
 
216
signal interrupt_counter                        : unsigned(15 downto 0) := (others => '0');
217
signal next_packet_pointer                      : std_logic_vector(15 downto 0) := (others => '0');
218
signal previous_packet_pointer  : unsigned(15 downto 0) := (others => '0');
219
signal eir_register                                     : std_logic_vector(7 downto 0) := (others => '0');
220
 
221
signal rx_packet_ram_we, handle_rx_packet, rx_packet_handled : std_logic := '0';
222
signal debug_rx_flag, debug_rx_flag1, debug_rx_flag2  : std_logic := '0';
223
signal rx_packet_ram_we_addr, rx_packet_ram_we_addr_buf : unsigned(10 downto 0) := (others => '0');
224
signal rx_packet_ram_rd_addr : unsigned(10 downto 0) := (others => '0');
225
signal rx_packet_rd2_addr : unsigned(10 downto 0) := (others => '0');
226
signal rx_packet_rd_data, rx_packet_rd_data2 : std_logic_vector(7 downto 0);
227
signal rx_packet_status_vector, arp_target_ip_addr, arp_source_ip_addr : std_logic_vector(31 downto 0);
228
signal rx_packet_type                   : std_logic_vector(15 downto 0);
229
signal rx_packet_source_mac     : std_logic_vector(47 downto 0);
230
signal send_arp_reply, send_arp_request : std_logic := '0';
231
signal send_icmp_reply, send_dhcp_discover, send_dhcp_request : std_logic := '0';
232
signal arp_opcode : std_logic_vector(7 downto 0);
233
 
234
signal tx_packet_ram_we, tx_packet_config_cmplt : std_logic := '0';
235
signal tx_packet_ram_we_addr, tx_packet_ram_rd_addr : unsigned(10 downto 0) := (others => '0');
236
signal tx_packet_ram_we_addr_buf : unsigned(10 downto 0) := (others => '0');
237
signal tx_packet_rd_data, tx_packet_ram_data : std_logic_vector(7 downto 0);
238
signal tx_packet_rd_data2 : std_logic_vector(7 downto 0);
239
signal handle_tx_packet : std_logic := '0';
240
 
241
signal ip_addr                          : std_logic_vector(31 downto 0) := X"C0A80166";          -- 192.168.1.102
242
signal mac_addr                         : std_logic_vector(47 downto 0) := X"8066F23D547A";
243
signal ip_identification        : std_logic_vector(15 downto 0);
244
signal ping_enable                      : std_logic := '1';
245
signal dhcp_enable                      : std_logic := '0';
246
signal dhcp_addr_locked, static_addr_locked     : std_logic := '0';
247
 
248
signal client_ip_addr : std_logic_vector(31 downto 0) := X"C0A80100";    -- 192.168.1.0 should be set dynamically upon TCP connection ??
249
signal client_mac_addr : std_logic_vector(47 downto 0) := X"000000000000";
250
 
251
--signal cloud_ip_addr : std_logic_vector(31 downto 0) := X"76D2707C"; -- 118.210.112.124
252
signal cloud_ip_addr : std_logic_vector(31 downto 0) := X"C0A80100"; -- 192.168.1.0
253
 
254
signal tx_packet_frame_addr :unsigned(10 downto 0);
255
signal tx_packet_length, tx_packet_length_counter, tx_packet_end_pointer :unsigned(15 downto 0);
256
signal prev_tx_packet_end_pointer :unsigned(15 downto 0);
257
signal doing_tx_packet_config, tx_packet_frame_data_rd : std_logic := '0';
258
signal packet_instruction, packet_data : std_logic_vector(7 downto 0);
259
signal tx_packet_ready_for_transmission : std_logic := '0';
260
signal send_prev_packet_waiting, trigger_send_prev_packet : std_logic := '0';
261
signal trigger_close_connection, wait_for_tcp_window_size_update : std_logic := '0';
262
signal tx_base_addr, tx_base_addr_prev : unsigned(15 downto 0);
263
signal tx_base_addr_select : std_logic := '0';
264
 
265
signal ip_packet_version                        : std_logic_vector(3 downto 0);
266
signal ip_packet_protocol                       : std_logic_vector(7 downto 0);
267
signal ip_packet_header_length  : std_logic_vector(7 downto 0);
268
signal ip_packet_destination_ip         : std_logic_vector(31 downto 0);
269
signal ip_packet_length, ip_packet_length_debug                         : std_logic_vector(15 downto 0); -- TODO remove debug
270
signal total_packet_length              : unsigned(15 downto 0);
271
 
272
signal lfsr_val : std_logic_vector(31 downto 0);
273
signal calc_checksum, checksum_calc_done : std_logic := '0';
274
signal checksum_start_addr, checksum_addr, checksum_wr_addr : std_logic_vector(10 downto 0);
275
signal checksum_count : unsigned(10 downto 0);
276
signal checksum : std_logic_vector(15 downto 0);
277
signal checksum_initial_value : std_logic_vector(15 downto 0);
278
signal checksum_set_initial_value, checksum_odd_length : std_logic;
279
 
280
signal command : std_logic_vector(3 downto 0);
281
signal poll_interrupt_reg, command_waiting : std_logic;
282
signal poll_counter : unsigned(3 downto 0) := (others => '1');
283
 
284
signal dhcp_transaction_id : std_logic_vector(31 downto 0) := X"CA805562";
285
signal transaction_id_rd : std_logic_vector(31 downto 0) := X"00000000";
286
 
287
signal udp_source_port, udp_dest_port : std_logic_vector(15 downto 0);
288
signal dhcp_your_ip_addr, dhcp_server_ip_addr, dhcp_magic_cookie : std_logic_vector(31 downto 0);
289
 
290
signal expecting_dhcp_offer, expecting_dhcp_ack, expecting_arp_reply : std_logic := '0';
291
signal expecting_syn_ack, ack_required, trigger_ack : std_logic := '0';
292
signal dhcp_option_addr : unsigned(10 downto 0);
293
signal dhcp_option, dhcp_option_length, dhcp_message_type : std_logic_vector(7 downto 0);
294
 
295
signal packet_definition_addr : std_logic_vector(10 downto 0);
296
signal packet_definition_data : std_logic_vector(15 downto 0);
297
 
298
signal client_port      : std_logic_vector(15 downto 0) := (others => '0');
299
signal listen_port      : std_logic_vector(15 downto 0) := X"0DA2";
300
signal tcp_sequence_number, tcp_acknowledge_number : unsigned(31 downto 0) := (others => '0');
301
signal tcp_sequence_number_previous_ack, tcp_ack_number_previous_ack : unsigned(31 downto 0) := (others => '0');
302
signal tcp_ack_number_previous_ack1, tcp_ack_number_previous_ack2, tcp_ack_number_previous_ack3 : unsigned(31 downto 0) := (others => '0');
303
signal tcp_ack_number_previous_ack4, tcp_ack_number_previous_ack5, tcp_ack_number_previous_ack6 : unsigned(31 downto 0) := (others => '0');
304
signal tcp_sequence_number_p1 : unsigned(31 downto 0) := (others => '0');
305
signal tcp_flags : std_logic_vector(7 downto 0) := (others => '0');
306
signal window_size : unsigned(11 downto 0) := X"E00";
307
signal requested_data_size : unsigned(11 downto 0);
308
signal send_tcp_ack_packet, cancel_dhcp_connect : std_logic := '0';
309
signal send_tcp_tx_packet : std_logic := '0';
310
signal tcp_connection_active, close_tcp_connection, cancel_tcp_connection : std_logic := '0';
311
signal tcp_ip_identification : unsigned(15 downto 0);
312
 
313
signal rx_tcp_source_port, rx_tcp_dest_port : std_logic_vector(15 downto 0) := (others => '0');
314
signal rx_tcp_seq_number, rx_tcp_ack_number : std_logic_vector(31 downto 0) := (others => '0');
315
signal rx_tcp_window_size_shifted : std_logic_vector(31 downto 0) := (others => '0');
316
signal rx_tcp_window_size, rx_tcp_checksum : std_logic_vector(15 downto 0) := (others => '0');
317
signal rx_tcp_flags, rx_tcp_option, rx_tcp_header_length : std_logic_vector(7 downto 0) := (others => '0');
318
signal rx_tcp_option_length : unsigned(7 downto 0);
319
signal rx_tcp_window_shift : std_logic_vector(3 downto 0);
320
signal tcp_option_addr, next_protocol_start_addr : unsigned(10 downto 0);
321
signal rx_data_length, prev_rx_data_length : unsigned(15 downto 0);
322
signal rx_data_start_addr : unsigned(10 downto 0);
323
signal resend_ack_packet, fin_received, syn_ack_packet : std_logic := '0';
324
signal sent_syn_ack : std_logic := '0';
325
signal fin_received_p, trigger_fin_ack : std_logic := '0';
326
 
327
signal tcp_rx_data_we, tcp_rd_data_available, tcp_data_rd_en : std_logic := '0';
328
signal tcp_rx_ram_almost_full : std_logic := '0';
329
signal tcp_rd_data_count, tcp_wr_data_count     : std_logic_vector(11 downto 0) := (others => '0');
330
signal tcp_rx_data                                                                      : unsigned(7 downto 0) := (others => '0');
331
signal tcp_rx_data_rd_data                                              : std_logic_vector(7 downto 0) := (others => '0');
332
 
333
signal tcp_wr_data_possible, tcp_wr_data_en, tcp_tx_data_rd : std_logic := '0';
334
signal tcp_wr_data_flush, tcp_data_flush_waiting : std_logic := '0';
335
signal large_tx_packet_waiting : std_logic := '0';
336
signal tcp_wr_data, tcp_tx_data : std_logic_vector(7 downto 0) := (others => '0');
337
signal tx_bytes_to_send, tx_total_packet_length, tx_packet_data_counter : unsigned(11 downto 0) := (others => '0');
338
signal tx_total_packet_length_inc_mac, tx_total_packet_length_checksum  : unsigned(11 downto 0) := (others => '0');
339
signal tx_packet_no_ack_timeout : unsigned(23 downto 0) := C_100ms;
340
signal tx_packet_timeout_counter, tx_packet_timeout_counter_prev : unsigned(7 downto 0) := X"00";
341
signal tx_timeout_counter : unsigned(20 downto 0);
342
signal tx_packets_no_ack : unsigned(3 downto 0) := X"0";
343
 
344
signal clk_1hz, clk_1hz_prev : std_logic := '0';
345
signal init_enc28j60_waiting, dhcp_connect_waiting, tcp_connect_waiting : std_logic := '0';
346
signal rx_kbytes_sec, tx_kbytes_sec : unsigned(11 downto 0);
347
signal rx_bytes_counter, tx_bytes_counter : unsigned(21 downto 0);
348
 
349
signal ack_countdown : unsigned(15 downto 0);
350
signal num_packets : std_logic_vector(7 downto 0) := (others => '0');
351
 
352
type ETH_ST is (        IDLE,
353
                                                TRIGGER_DHCP_DISCOVER,
354
                                                TRIGGER_ARP_REQUEST,
355
                                                TRIGGER_CANCEL_DHCP_CONNECT,
356
                                                TRIGGER_CLOSE_TCP_CONNECTION,
357
                                                TRIGGER_CANCEL_TCP_CONNECTION,
358
                                                HANDLE_INIT_CMND0,
359
                                                HANDLE_INIT_CMND1,
360
                                                HANDLE_INIT_CMND2,
361
                                                HANDLE_INIT_CMND3,
362
                                                HANDLE_INIT_CMND4,
363
                                                HANDLE_INIT_CMND5,
364
                                                HANDLE_INIT_CMND6,
365
                                                SERVICE_INTERRUPT0,
366
                                                SERVICE_INTERRUPT1,
367
                                                SERVICE_INTERRUPT2,
368
                                                SERVICE_INTERRUPT3,
369
                                                SERVICE_INTERRUPT4,
370
                                                SERVICE_INTERRUPT5,
371
                                                SERVICE_INTERRUPT6,
372
                                                SERVICE_INTERRUPT7,
373
                                                SERVICE_INTERRUPT8,
374
                                                HANDLE_TX_INTERRUPT0,
375
                                                HANDLE_TX_INTERRUPT1,
376
                                                HANDLE_TX_INTERRUPT2,
377
                                                HANDLE_RX_INTERRUPT0,
378
                                                HANDLE_RX_INTERRUPT1,
379
                                                HANDLE_RX_INTERRUPT2,
380
                                                HANDLE_RX_INTERRUPT3,
381
                                                HANDLE_RX_INTERRUPT4,
382
                                                HANDLE_RX_INTERRUPT5,
383
                                                HANDLE_RX_INTERRUPT6,
384
                                                HANDLE_RX_INTERRUPT7,
385
                                                HANDLE_RX_INTERRUPT8,
386
                                                HANDLE_RX_INTERRUPT9,
387
                                                HANDLE_RX_INTERRUPT10,
388
                                                HANDLE_RX_INTERRUPT11,
389
                                                HANDLE_RX_INTERRUPT12,
390
                                                HANDLE_RX_INTERRUPT13,
391
                                                HANDLE_RX_INTERRUPT14,
392
                                                HANDLE_RX_INTERRUPT15,
393
                                                HANDLE_RX_INTERRUPT16,
394
                                                HANDLE_RX_INTERRUPT17,
395
                                                CHECK_IF_ACK_WAITING,
396
                                                TRIGGER_ACK_PACKET,
397
                                                TRIGGER_TCP_TX0,
398
                                                TRIGGER_TCP_TX1,
399
                                                TRIGGER_TCP_TX2,
400
                                                COPY_RX_PACKET_TO_BUF0,
401
                                                COPY_RX_PACKET_TO_BUF1,
402
                                                COPY_RX_PACKET_TO_BUF2,
403
                                                COPY_RX_PACKET_TO_BUF3,
404
                                                COPY_RX_PACKET_TO_BUF4,
405
                                                COPY_RX_PACKET_TO_BUF5,
406
                                                COPY_RX_PACKET_TO_BUF6,
407
                                                PRE_TX_TRANSMIT0,
408
                                                PRE_TX_TRANSMIT1,
409
                                                PRE_TX_TRANSMIT2,
410
                                                PRE_TX_TRANSMIT3,
411
                                                PRE_TX_TRANSMIT4,
412
                                                PRE_TX_TRANSMIT5,
413
                                                HANDLE_TX_TRANSMIT0,
414
                                                HANDLE_TX_TRANSMIT1,
415
                                                HANDLE_TX_TRANSMIT2,
416
                                                HANDLE_TX_TRANSMIT3,
417
                                                HANDLE_TX_TRANSMIT4,
418
                                                HANDLE_TX_TRANSMIT5,
419
                                                HANDLE_TX_TRANSMIT6,
420
                                                HANDLE_TX_TRANSMIT7,
421
                                                HANDLE_TX_TRANSMIT8,
422
                                                HANDLE_TX_TRANSMIT9,
423
                                                HANDLE_TX_TRANSMIT10,
424
                                                HANDLE_TX_TRANSMIT_PRE11,
425
                                                HANDLE_TX_TRANSMIT11,
426
                                                HANDLE_TX_TRANSMIT12,
427
                                                HANDLE_TX_TRANSMIT13,
428
                                                HANDLE_TX_TRANSMIT14,
429
                                                HANDLE_TX_TRANSMIT15,
430
                                                HANDLE_TX_TRANSMIT16,
431
                                                HANDLE_TX_TRANSMIT17,
432
                                                HANDLE_TX_TRANSMIT18,
433
                                                HANDLE_TX_TRANSMIT19,
434
                                                HANDLE_TX_TRANSMIT20,
435
                                                HANDLE_TX_TRANSMIT21,
436
                                                HANDLE_TX_TRANSMIT22,
437
                                                HANDLE_TX_TRANSMIT_PREV0,
438
                                                HANDLE_TX_TRANSMIT_PREV1,
439
                                                HANDLE_TX_TRANSMIT_PREV2,
440
                                                HANDLE_TX_TRANSMIT_PREV3,
441
                                                HANDLE_TX_TRANSMIT_PREV4,
442
                                                HANDLE_TX_TRANSMIT_PREV5,
443
                                                HANDLE_TX_TRANSMIT_PREV6,
444
                                                HANDLE_TX_TRANSMIT_PREV7,
445
                                                HANDLE_TX_TRANSMIT_PREV8,
446
                                                HANDLE_TX_TRANSMIT_PREV9,
447
                                                HANDLE_TX_TRANSMIT_PREV10,
448
                                                HANDLE_TX_TRANSMIT_PREV11,
449
                                                HANDLE_TX_TRANSMIT_PREV12,
450
                                                HANDLE_TX_TRANSMIT_PREV13,
451
                                                HANDLE_TX_TRANSMIT_PREV14,
452
                                                HANDLE_TX_TRANSMIT_PREV15,
453
                                                HANDLE_TX_TRANSMIT_PREV16,
454
                                                WAIT_FOR_TRANSMIT_CMPLT,
455
                                                RESEND_ACK_IN_BUFFER);
456
 
457
signal eth_state, eth_next_state : ETH_ST := IDLE;
458
signal state_debug_sig : unsigned(7 downto 0);
459
 
460
type PACKET_HANDLER_ST is (     IDLE,
461
                                                                                PARSE_SOURCE_MAC0,
462
                                                                                PARSE_SOURCE_MAC1,
463
                                                                                PARSE_SOURCE_MAC2,
464
                                                                                PARSE_SOURCE_MAC3,
465
                                                                                PARSE_SOURCE_MAC4,
466
                                                                                PARSE_SOURCE_MAC5,
467
                                                                                PARSE_SOURCE_MAC6,
468
                                                                                PARSE_SOURCE_MAC7,
469
                                                                                PARSE_PACKET_TYPE0,
470
                                                                                PARSE_PACKET_TYPE1,
471
                                                                                PARSE_PACKET_TYPE2,
472
                                                                                PARSE_PACKET_TYPE3,
473
                                                                                PARSE_PACKET_TYPE4,
474
                                                                                HANDLE_ARP_PACKET0,
475
                                                                                HANDLE_ARP_PACKET1,
476
                                                                                HANDLE_ARP_PACKET2,
477
                                                                                HANDLE_ARP_PACKET3,
478
                                                                                HANDLE_ARP_REQUEST0,
479
                                                                                HANDLE_ARP_REQUEST1,
480
                                                                                HANDLE_ARP_REQUEST2,
481
                                                                                HANDLE_ARP_REQUEST3,
482
                                                                                HANDLE_ARP_REQUEST4,
483
                                                                                HANDLE_ARP_REQUEST5,
484
                                                                                HANDLE_ARP_REQUEST6,
485
                                                                                HANDLE_ARP_REQUEST7,
486
                                                                                HANDLE_ARP_REQUEST8,
487
                                                                                HANDLE_ARP_REQUEST9,
488
                                                                                HANDLE_ARP_REQUEST10,
489
                                                                                HANDLE_ARP_REQUEST11,
490
                                                                                HANDLE_ARP_REQUEST12,
491
                                                                                HANDLE_ARP_REQUEST13,
492
                                                                                HANDLE_ARP_REPLY0,
493
                                                                                HANDLE_ARP_REPLY1,
494
                                                                                HANDLE_ARP_REPLY2,
495
                                                                                HANDLE_ARP_REPLY3,
496
                                                                                HANDLE_ARP_REPLY4,
497
                                                                                HANDLE_ARP_REPLY5,
498
                                                                                HANDLE_ARP_REPLY6,
499
                                                                                HANDLE_ARP_REPLY7,
500
                                                                                TRIGGER_ARP_REPLY,
501
                                                                                HANDLE_IP_PACKET0,
502
                                                                                HANDLE_IP_PACKET1,
503
                                                                                HANDLE_IP_PACKET2,
504
                                                                                HANDLE_IP_PACKET3,
505
                                                                                HANDLE_IP_PACKET4,
506
                                                                                HANDLE_IP_PACKET5,
507
                                                                                HANDLE_IP_PACKET6,
508
                                                                                HANDLE_IP_PACKET7,
509
                                                                                HANDLE_IP_PACKET8,
510
                                                                                HANDLE_IP_PACKET9,
511
                                                                                HANDLE_IP_PACKET10,
512
                                                                                HANDLE_IP_PACKET11,
513
                                                                                HANDLE_IP_PACKET12,
514
                                                                                PRE_ICMP_PACKET_REPLY,
515
                                                                                TRIGGER_ICMP_PACKET_REPLY,
516
                                                                                PARSE_UDP_PACKET0,
517
                                                                                PARSE_UDP_PACKET1,
518
                                                                                PARSE_UDP_PACKET2,
519
                                                                                PARSE_UDP_PACKET3,
520
                                                                                PARSE_UDP_PACKET4,
521
                                                                                PARSE_UDP_PACKET5,
522
                                                                                PARSE_UDP_PACKET_TYPE0,
523
                                                                                PARSE_UDP_PACKET_TYPE1,
524
                                                                                PARSE_DHCP_PACKET0,
525
                                                                                PARSE_DHCP_PACKET1,
526
                                                                                PARSE_DHCP_PACKET2,
527
                                                                                PARSE_DHCP_PACKET3,
528
                                                                                PARSE_DHCP_PACKET4,
529
                                                                                PARSE_DHCP_PACKET5,
530
                                                                                PARSE_DHCP_PACKET6,
531
                                                                                PARSE_DHCP_PACKET7,
532
                                                                                PARSE_DHCP_PACKET8,
533
                                                                                PARSE_DHCP_PACKET9,
534
                                                                                PARSE_DHCP_PACKET10,
535
                                                                                PARSE_DHCP_PACKET11,
536
                                                                                PARSE_DHCP_PACKET12,
537
                                                                                PARSE_DHCP_PACKET13,
538
                                                                                PARSE_DHCP_PACKET14,
539
                                                                                PARSE_DHCP_PACKET15,
540
                                                                                PARSE_DHCP_PACKET16,
541
                                                                                PARSE_DHCP_PACKET17,
542
                                                                                PARSE_DHCP_PACKET18,
543
                                                                                PARSE_DHCP_PACKET19,
544
                                                                                PARSE_DHCP_PACKET20,
545
                                                                                PARSE_DHCP_PACKET21,
546
                                                                                PARSE_DHCP_PACKET22,
547
                                                                                PARSE_DHCP_PACKET23,
548
                                                                                PARSE_DHCP_PACKET24,
549
                                                                                CHECK_OFFER_EXPECTED,
550
                                                                                TRIGGER_DHCP_REQUEST,
551
                                                                                HANDLE_DHCP_ACK0,
552
                                                                                HANDLE_DHCP_ACK1,
553
                                                                                HANDLE_DHCP_ACK2,
554
                                                                                HANDLE_DHCP_ACK3,
555
                                                                                HANDLE_DHCP_ACK4,
556
                                                                                HANDLE_DHCP_ACK5,
557
                                                                                HANDLE_DHCP_ACK6,
558
                                                                                HANDLE_DHCP_ACK7,
559
                                                                                HANDLE_DHCP_ACK8,
560
                                                                                PARSE_TCP_PACKET0,
561
                                                                                PARSE_TCP_PACKET1,
562
                                                                                PARSE_TCP_PACKET2,
563
                                                                                PARSE_TCP_PACKET3,
564
                                                                                PARSE_TCP_PACKET4,
565
                                                                                PARSE_TCP_PACKET5,
566
                                                                                PARSE_TCP_PACKET6,
567
                                                                                PARSE_TCP_PACKET7,
568
                                                                                PARSE_TCP_PACKET8,
569
                                                                                PARSE_TCP_PACKET9,
570
                                                                                PARSE_TCP_PACKET10,
571
                                                                                PARSE_TCP_PACKET11,
572
                                                                                PARSE_TCP_PACKET12,
573
                                                                                PARSE_TCP_PACKET13,
574
                                                                                PARSE_TCP_PACKET14,
575
                                                                                PARSE_TCP_PACKET15,
576
                                                                                PARSE_TCP_PACKET16,
577
                                                                                PARSE_TCP_PACKET17,
578
                                                                                PARSE_TCP_PACKET18,
579
                                                                                PARSE_TCP_PACKET19,
580
                                                                                PARSE_TCP_PACKET20,
581
                                                                                PARSE_TCP_PACKET21,
582
                                                                                PARSE_TCP_PACKET22,
583
                                                                                PARSE_TCP_PACKET23,
584
                                                                                PARSE_TCP_PACKET24,
585
                                                                                PARSE_TCP_PACKET25,
586
                                                                                PARSE_TCP_PACKET26,
587
                                                                                PARSE_TCP_PACKET27,
588
                                                                                CHECK_TCP_SYN_PACKET0,
589
                                                                                CHECK_TCP_SYN_PACKET1,
590
                                                                                CHECK_TCP_SYN_PACKET2,
591
                                                                                CHECK_TCP_SYN_PACKET3,
592
                                                                                CHECK_TCP_SYN_PACKET4,
593
                                                                                CHECK_TCP_SYN_PACKET5,
594
                                                                                CHECK_TCP_PSH_ACK_PACKET0,
595
                                                                                CHECK_TCP_PSH_ACK_PACKET1,
596
                                                                                CHECK_TCP_PSH_ACK_PACKET2,
597
                                                                                CHECK_TCP_PSH_ACK_PACKET3,
598
                                                                                READ_TCP_RX_DATA,
599
                                                                                TRIGGER_TCP_ACK0,
600
                                                                                TRIGGER_TCP_ACK1,
601
                                                                                TRIGGER_TCP_ACK2,
602
                                                                                TRIGGER_TCP_ACK3,
603
                                                                                RESEND_ACK,
604
                                                                                CHECK_IF_DATA_TO_SEND,
605
                                                                                TRIGGER_TCP_PSH_ACK0,
606
                                                                                TRIGGER_TCP_PSH_ACK1,
607
                                                                                CHECK_TCP_WINDOW_SIZE,
608
                                                                                RX_TCP_WINDOW_TOO_SMALL,
609
                                                                                TRIGGER_TCP_PSH_ACK2,
610
                                                                                TRIGGER_TCP_PSH_ACK3,
611
                                                                                COMPLETE
612
                                                                        );
613
 
614
signal packet_handler_state, packet_handler_next_state : PACKET_HANDLER_ST := IDLE;
615
 
616
type TX_PACKET_CONFIG_ST is (   IDLE,
617
                                                                                INIT_ARP_REPLY_METADATA,
618
                                                                                INIT_ARP_REQUEST_METADATA,
619
                                                                                INIT_ICMP_REPLY_METADATA,
620
                                                                                INIT_DHCP_DISCOVER_METADATA,
621
                                                                                INIT_DHCP_REQUEST_METADATA,
622
                                                                                INIT_TCP_PACKET_METADATA,
623
                                                                                INIT_TCP_TX_PACKET_METADATA,
624
                                                                                CANCEL_DHCP_CONNECT_ST,
625
                                                                                TCP_CONNECTION_CLOSED,
626
                                                                                CANCEL_TCP_CONNECTION_ST,
627
                                                                                READ_PACKET_BYTE0,
628
                                                                                READ_PACKET_BYTE1,
629
                                                                                HANDLE_PACKET_INSTRUCTION0,
630
                                                                                HANDLE_PACKET_INSTRUCTION1,
631
                                                                                SET_RX_PACKET_ADDR_LOWER_BYTE,
632
                                                                                SET_RX_PACKET_ADDR_UPPER_BYTE,
633
                                                                                SET_CHECKSUM_LENGTH_LSB,
634
                                                                                SET_CHECKSUM_LENGTH_MSB,
635
                                                                                SET_CHECKSUM_LENGTH_TX_PACKET_LENGTH0,
636
                                                                                SET_CHECKSUM_LENGTH_TX_PACKET_LENGTH1,
637
                                                                                SET_CHECKSUM_START_ADDR_LSB,
638
                                                                                SET_CHECKSUM_START_ADDR_MSB,
639
                                                                                SET_CHECKSUM_WR_ADDR_LSB,
640
                                                                                SET_CHECKSUM_WR_ADDR_MSB,
641
                                                                                MOVE_TX_PACKET_WR_ADDR,
642
                                                                                SET_NEW_TRANSACTION_ID,
643
                                                                                SET_CHECKSUM_START_VAL_LSB,
644
                                                                                SET_CHECKSUM_START_VAL_MSB,
645
                                                                                SET_CHECKSUM_INITIAL_VALUE_TX_PACKET,
646
                                                                                TRIGGER_CHECKSUM_LOAD_INITIAL_VALUE,
647
                                                                                TRIG_CHECKSUM_CALC,
648
                                                                                WAIT_FOR_CHECKSUM_CMPLT,
649
                                                                                INIT_LOAD_TX_PACKET_DATA,
650
                                                                                LOAD_TX_PACKET_DATA,
651
                                                                                COMPLETE
652
                                                                        );
653
 
654
signal tx_packet_state, tx_packet_next_state : TX_PACKET_CONFIG_ST := IDLE;
655
 
656
begin
657
 
658
        --DEBUG_OUT(15 downto 8) <= X"00";
659
        --DEBUG_OUT(15 downto 4) <= X"000";
660
        --DEBUG_OUT(15 downto 12) <= (others => '0');
661
        --DEBUG_OUT(15 downto 12) <= slv(interrupt_counter(3 downto 0));
662
        --DEBUG_OUT <= slv(rx_data_length);
663
        --DEBUG_OUT <= udp_source_port when DEBUG_IN = '0' else udp_dest_port;
664
        --DEBUG_OUT <= rx_tcp_source_port when DEBUG_IN = '0' else rx_tcp_dest_port;
665
        --DEBUG_OUT <= rx_tcp_window_size when DEBUG_IN(0) = '0' else X"000"&rx_tcp_window_shift;
666
        --DEBUG_OUT <= rx_tcp_window_size_shifted(31 downto 16) when DEBUG_IN(0) = '0' else rx_tcp_window_size_shifted(15 downto 0);
667
        --DEBUG_OUT(11 downto 0) <= slv(window_size);
668
        --DEBUG_OUT(7 downto 0) <= slv(rx_tcp_option_length);
669
        --DEBUG_OUT <= "00000"&slv(tcp_option_addr);
670
        --DEBUG_OUT(7 downto 4) <= X"0";
671
        --DEBUG_OUT(15 downto 8) <= ip_packet_protocol;
672
        --DEBUG_OUT(15 downto 8) <= rx_tcp_option;
673
        --DEBUG_OUT <= X"00" & slv(rx_tcp_option) when DEBUG_IN = '0' else rx_tcp_window_shift & slv(rx_tcp_option_length);
674
        --DEBUG_OUT <= dhcp_option & dhcp_option_length;
675
        --DEBUG_OUT(7 downto 0) <= slv(init_cmnd_addr);
676
        --DEBUG_OUT(7 downto 0) <= slv(state_debug_sig);
677
        --DEBUG_OUT(7 downto 0) <= slv(eir_register);
678
        --DEBUG_OUT <= spi_wr_addr & spi_wr_data;
679
        --DEBUG_OUT <= next_packet_pointer;
680
        --DEBUG_OUT <= rx_packet_status_vector(15 downto 0) when DEBUG_IN = '0' else rx_packet_status_vector(31 downto 16);
681
        --DEBUG_OUT <= rx_packet_source_mac(15 downto 0) when DEBUG_IN = '0' else rx_packet_source_mac(31 downto 16);
682
        --DEBUG_OUT <= arp_target_ip_addr(15 downto 0) when DEBUG_IN = '0' else arp_target_ip_addr(31 downto 16);
683
        --DEBUG_OUT <= arp_source_ip_addr(15 downto 0) when DEBUG_IN = '0' else arp_source_ip_addr(31 downto 16);
684
        --DEBUG_OUT <= dhcp_your_ip_addr(15 downto 0) when DEBUG_IN = '0' else dhcp_your_ip_addr(31 downto 16);
685
        --DEBUG_OUT <= slv(tcp_acknowledge_number(15 downto 0)) when DEBUG_IN(1) = '0' else slv(tcp_acknowledge_number(31 downto 16));
686
        --DEBUG_OUT <= slv(tcp_ack_number_previous_ack(15 downto 0)) when DEBUG_IN = '0' else slv(tcp_ack_number_previous_ack(31 downto 16));
687
        --DEBUG_OUT(11 downto 0) <= slv(requested_data_size);
688
        --DEBUG_OUT(7 downto 0) <= tx_packet_rd_data;
689
        --DEBUG_OUT <= rx_packet_type;
690
        --DEBUG_OUT <= slv(tx_packet_end_pointer);
691
        --DEBUG_OUT(3 downto 0) <= ip_packet_version;
692
        --DEBUG_OUT(7 downto 0) <= X"0"&"0"&debug_rx_flag2&debug_rx_flag1&debug_rx_flag;
693
        --DEBUG_OUT(7 downto 0) <= slv(num_packets);
694
        --DEBUG_OUT(7 downto 0) <= slv(tcp_tx_data);
695
        --DEBUG_OUT(3 downto 0) <= slv(tx_packet_ack_timeout_occur);
696
        --DEBUG_OUT(11 downto 0) <= slv(rx_kbytes_sec);
697
        DEBUG_OUT(15 downto 0) <= slv(interrupt_counter);
698
        --DEBUG_OUT(15 downto 0) <= slv(tx_base_addr);
699
        --DEBUG_OUT(15 downto 0) <= slv(checksum);
700
        --DEBUG_OUT(15 downto 0) <= slv(checksum_initial_value);
701
        --DEBUG_OUT(10 downto 0) <= slv(rx_data_start_addr);
702
        --DEBUG_OUT(11 downto 0) <= slv(tcp_wr_data_count);
703
 
704
        packet_definition_addr <= frame_addr when doing_tx_packet_config = '0' else slv(tx_packet_frame_addr);
705
        frame_data <= packet_definition_data;
706
        frame_rd_cmplt <= '1';
707
 
708
        clk_1hz <= CLK_1HZ_IN;
709
 
710
        ---- HANDLE COMMANDS ----
711
 
712
        INT_PROC: process(CLK_IN)
713
   begin
714
      if rising_edge(CLK_IN) then
715
                        if packet_handler_state = CHECK_TCP_SYN_PACKET0 then
716
                                interrupt_counter <= interrupt_counter + 1;
717
                        end if;
718
                end if;
719
        end process;
720
 
721
   SYNC_PROC: process(CLK_IN)
722
   begin
723
      if rising_edge(CLK_IN) then
724
                        eth_state <= eth_next_state;
725
      end if;
726
   end process;
727
 
728
        NEXT_STATE_DECODE: process (eth_state, command, command_waiting, init_cmnd_addr, poll_interrupt_reg,
729
                                                                                        frame_data, tx_packet_ready_for_transmission, spi_oper_cmplt,
730
                                                                                                eir_register, previous_packet_pointer, next_packet_pointer, rx_packet_handled,
731
                                                                                                        tx_packet_length_counter, spi_rd_cmplt, spi_wr_cmplt)
732
   begin
733
      eth_next_state <= eth_state;  --default is to stay in current state
734
      case (eth_state) is
735
         when IDLE =>
736
                                if init_enc28j60_waiting = '1' then
737
                                        eth_next_state <= HANDLE_INIT_CMND0;
738
                                elsif dhcp_connect_waiting = '1' then
739
                                        eth_next_state <= TRIGGER_DHCP_DISCOVER;
740
                                elsif send_prev_packet_waiting = '1' then
741
                                        eth_next_state <= HANDLE_TX_TRANSMIT_PREV0;
742
                                elsif resend_ack_packet = '1' then
743
                                        eth_next_state <= RESEND_ACK_IN_BUFFER;
744
                                elsif tx_packet_ready_for_transmission = '1' then
745
                                        eth_next_state <= PRE_TX_TRANSMIT0;
746
                                elsif tcp_data_flush_waiting = '1' then
747
                                        eth_next_state <= TRIGGER_TCP_TX0;
748
                                elsif large_tx_packet_waiting = '1' then
749
                                        eth_next_state <= TRIGGER_TCP_TX0;
750
                                else
751
                                        eth_next_state <= SERVICE_INTERRUPT0;
752
                                end if;
753
 
754
                        when HANDLE_INIT_CMND0 =>
755
                                eth_next_state <= HANDLE_INIT_CMND1;
756
                        when HANDLE_INIT_CMND1 =>
757
                                eth_next_state <= HANDLE_INIT_CMND2;
758
                        when HANDLE_INIT_CMND2 =>
759
                                if frame_rd_cmplt = '1' then
760
                                        if frame_data = X"0000" then
761
                                                eth_next_state <= HANDLE_INIT_CMND6;
762
                                        else
763
                                                eth_next_state <= HANDLE_INIT_CMND3;
764
                                        end if;
765
                                end if;
766
                        when HANDLE_INIT_CMND3 =>
767
                                eth_next_state <= HANDLE_INIT_CMND4;
768
                        when HANDLE_INIT_CMND4 =>
769
                                if spi_oper_cmplt = '1' then
770
                                        eth_next_state <= HANDLE_INIT_CMND5;
771
                                end if;
772
                        when HANDLE_INIT_CMND5 =>
773
                                if slv(init_cmnd_addr) = C_init_cmnds_max_addr then
774
                                        eth_next_state <= HANDLE_INIT_CMND6;
775
                                else
776
                                        eth_next_state <= HANDLE_INIT_CMND1;
777
                                end if;
778
                        when HANDLE_INIT_CMND6 =>
779
                                eth_next_state <= IDLE;
780
 
781
                        when TRIGGER_DHCP_DISCOVER =>
782
                                eth_next_state <= IDLE;
783
                        when TRIGGER_ARP_REQUEST =>
784
                                eth_next_state <= IDLE;
785
                        when TRIGGER_CANCEL_DHCP_CONNECT =>
786
                                eth_next_state <= IDLE;
787
                        when TRIGGER_CLOSE_TCP_CONNECTION =>
788
                                eth_next_state <= IDLE;
789
                        when TRIGGER_CANCEL_TCP_CONNECTION =>
790
                                eth_next_state <= IDLE;
791
 
792
                        when SERVICE_INTERRUPT0 =>
793
                                eth_next_state <= SERVICE_INTERRUPT1;
794
                        when SERVICE_INTERRUPT1 =>
795
                                if spi_oper_cmplt = '1' then
796
                                        eth_next_state <= SERVICE_INTERRUPT2;
797
                                end if;
798
                        when SERVICE_INTERRUPT2 =>
799
                                eth_next_state <= SERVICE_INTERRUPT3;
800
                        when SERVICE_INTERRUPT3 =>
801
                                if spi_oper_cmplt = '1' then
802
                                        eth_next_state <= SERVICE_INTERRUPT4;
803
                                end if;
804
                        when SERVICE_INTERRUPT4 =>
805
                                eth_next_state <= SERVICE_INTERRUPT5;
806
                        when SERVICE_INTERRUPT5 =>
807
                                if eir_register(6) = '1' then
808
                                        eth_next_state <= HANDLE_RX_INTERRUPT0;
809
                                elsif eir_register(3) = '1' then
810
                                        eth_next_state <= HANDLE_TX_INTERRUPT0;
811
                                else
812
                                        eth_next_state <= SERVICE_INTERRUPT6;
813
                                end if;
814
                        when HANDLE_TX_INTERRUPT0 =>
815
                                eth_next_state <= HANDLE_TX_INTERRUPT1;
816
                        when HANDLE_TX_INTERRUPT1 =>
817
                                if spi_oper_cmplt = '1' then
818
                                        eth_next_state <= HANDLE_TX_INTERRUPT2;
819
                                end if;
820
                        when HANDLE_TX_INTERRUPT2 =>
821
                                eth_next_state <= SERVICE_INTERRUPT6;
822
                        when HANDLE_RX_INTERRUPT0 =>
823
                                eth_next_state <= HANDLE_RX_INTERRUPT1;
824
                        when HANDLE_RX_INTERRUPT1 =>
825
                                if spi_oper_cmplt = '1' then
826
                                        eth_next_state <= HANDLE_RX_INTERRUPT2;
827
                                end if;
828
                        when HANDLE_RX_INTERRUPT2 =>
829
                                eth_next_state <= HANDLE_RX_INTERRUPT3;
830
                        when HANDLE_RX_INTERRUPT3 =>
831
                                if spi_oper_cmplt = '1' then
832
                                        eth_next_state <= HANDLE_RX_INTERRUPT4;
833
                                end if;
834
                        when HANDLE_RX_INTERRUPT4 =>
835
                                eth_next_state <= COPY_RX_PACKET_TO_BUF0;
836
 
837
                        when COPY_RX_PACKET_TO_BUF0 =>
838
                                eth_next_state <= COPY_RX_PACKET_TO_BUF1;
839
                        when COPY_RX_PACKET_TO_BUF1 =>
840
                                eth_next_state <= COPY_RX_PACKET_TO_BUF2;
841
                        when COPY_RX_PACKET_TO_BUF2 =>
842
                                if spi_rd_cmplt = '1' then
843
                                        eth_next_state <= COPY_RX_PACKET_TO_BUF3;
844
                                end if;
845
                        when COPY_RX_PACKET_TO_BUF3 =>
846
                                eth_next_state <= COPY_RX_PACKET_TO_BUF4;
847
                        when COPY_RX_PACKET_TO_BUF4 =>
848
                                if slv(previous_packet_pointer) = next_packet_pointer then
849
                                        eth_next_state <= COPY_RX_PACKET_TO_BUF5;
850
                                else
851
                                        eth_next_state <= COPY_RX_PACKET_TO_BUF1;
852
                                end if;
853
                        when COPY_RX_PACKET_TO_BUF5 =>
854
                                if spi_oper_cmplt = '1' then
855
                                        eth_next_state <= COPY_RX_PACKET_TO_BUF6;
856
                                end if;
857
                        when COPY_RX_PACKET_TO_BUF6 =>
858
                                if rx_packet_handled = '1' then
859
                                        eth_next_state <= HANDLE_RX_INTERRUPT5;
860
                                end if;
861
 
862
                        when HANDLE_RX_INTERRUPT5 =>
863
                                eth_next_state <= HANDLE_RX_INTERRUPT6;
864
                        when HANDLE_RX_INTERRUPT6 =>
865
                                if spi_oper_cmplt = '1' then
866
                                        eth_next_state <= HANDLE_RX_INTERRUPT7;
867
                                end if;
868
                        when HANDLE_RX_INTERRUPT7 =>
869
                                eth_next_state <= HANDLE_RX_INTERRUPT8;
870
                        when HANDLE_RX_INTERRUPT8 =>
871
                                if spi_oper_cmplt = '1' then
872
                                        eth_next_state <= HANDLE_RX_INTERRUPT9;
873
                                end if;
874
                        when HANDLE_RX_INTERRUPT9 =>
875
                                eth_next_state <= HANDLE_RX_INTERRUPT10;
876
                        when HANDLE_RX_INTERRUPT10 =>
877
                                if spi_oper_cmplt = '1' then
878
                                        eth_next_state <= HANDLE_RX_INTERRUPT11;
879
                                end if;
880
                        when HANDLE_RX_INTERRUPT11 =>
881
                                eth_next_state <= HANDLE_RX_INTERRUPT12;
882
                        when HANDLE_RX_INTERRUPT12 =>
883
                                if spi_oper_cmplt = '1' then
884
                                        eth_next_state <= HANDLE_RX_INTERRUPT13;
885
                                end if;
886
                        when HANDLE_RX_INTERRUPT13 =>
887
                                eth_next_state <= HANDLE_RX_INTERRUPT14;
888
                        when HANDLE_RX_INTERRUPT14 =>
889
                                if spi_oper_cmplt = '1' then
890
                                        eth_next_state <= HANDLE_RX_INTERRUPT15;
891
                                end if;
892
                        when HANDLE_RX_INTERRUPT15 =>
893
                                eth_next_state <= HANDLE_RX_INTERRUPT16;
894
                        when HANDLE_RX_INTERRUPT16 =>
895
                                if spi_oper_cmplt = '1' then
896
                                        eth_next_state <= HANDLE_RX_INTERRUPT17;
897
                                end if;
898
                        when HANDLE_RX_INTERRUPT17 =>
899
                                eth_next_state <= SERVICE_INTERRUPT6;
900
 
901
                        when CHECK_IF_ACK_WAITING =>
902
                                if ack_required = '1' then
903
                                        eth_next_state <= TRIGGER_ACK_PACKET;
904
                                else
905
                                        eth_next_state <= IDLE;
906
                                end if;
907
                        when TRIGGER_ACK_PACKET =>
908
                                if packet_handler_state = TRIGGER_TCP_ACK0 then
909
                                        eth_next_state <= IDLE;
910
                                end if;
911
 
912
                        when TRIGGER_TCP_TX0 =>
913
                                if tcp_wr_data_count = X"000" or tx_packets_no_ack > X"1" then
914
                                        eth_next_state <= IDLE;
915
                                else
916
                                        eth_next_state <= TRIGGER_TCP_TX1;
917
                                end if;
918
                        when TRIGGER_TCP_TX1 =>
919
                                if packet_handler_state = RX_TCP_WINDOW_TOO_SMALL then
920
                                        eth_next_state <= IDLE;
921
                                elsif packet_handler_state = TRIGGER_TCP_PSH_ACK2 then
922
                                        eth_next_state <= TRIGGER_TCP_TX2;
923
                                end if;
924
                        when TRIGGER_TCP_TX2 =>
925
                                if tx_packet_ready_for_transmission = '1' then
926
                                        eth_next_state <= PRE_TX_TRANSMIT0;
927
                                end if;
928
 
929
                        when SERVICE_INTERRUPT6 =>
930
                                eth_next_state <= SERVICE_INTERRUPT7;
931
                        when SERVICE_INTERRUPT7 =>
932
                                if spi_oper_cmplt = '1' then
933
                                        eth_next_state <= SERVICE_INTERRUPT8;
934
                                end if;
935
                        when SERVICE_INTERRUPT8 =>
936
                                eth_next_state <= CHECK_IF_ACK_WAITING;
937
 
938
                        when PRE_TX_TRANSMIT0 =>
939
                                eth_next_state <= PRE_TX_TRANSMIT1;
940
                        when PRE_TX_TRANSMIT1 =>
941
                                if spi_oper_cmplt = '1' then
942
                                        eth_next_state <= PRE_TX_TRANSMIT2;
943
                                end if;
944
                        when PRE_TX_TRANSMIT2 =>
945
                                eth_next_state <= PRE_TX_TRANSMIT3;
946
                        when PRE_TX_TRANSMIT3 =>
947
                                if spi_oper_cmplt = '1' then
948
                                        eth_next_state <= PRE_TX_TRANSMIT4;
949
                                end if;
950
                        when PRE_TX_TRANSMIT4 =>
951
                                eth_next_state <= PRE_TX_TRANSMIT5;
952
                        when PRE_TX_TRANSMIT5 =>
953
                                if spi_oper_cmplt = '1' then
954
                                        eth_next_state <= HANDLE_TX_TRANSMIT0;
955
                                end if;
956
                        when HANDLE_TX_TRANSMIT0 =>
957
                                eth_next_state <= HANDLE_TX_TRANSMIT1;
958
                        when HANDLE_TX_TRANSMIT1 =>
959
                                if spi_oper_cmplt = '1' then
960
                                        eth_next_state <= HANDLE_TX_TRANSMIT2;
961
                                end if;
962
                        when HANDLE_TX_TRANSMIT2 =>
963
                                eth_next_state <= HANDLE_TX_TRANSMIT3;
964
                        when HANDLE_TX_TRANSMIT3 =>
965
                                if spi_oper_cmplt = '1' then
966
                                        eth_next_state <= HANDLE_TX_TRANSMIT4;
967
                                end if;
968
                        when HANDLE_TX_TRANSMIT4 =>
969
                                eth_next_state <= HANDLE_TX_TRANSMIT5;
970
                        when HANDLE_TX_TRANSMIT5 =>
971
                                if spi_oper_cmplt = '1' then
972
                                        eth_next_state <= HANDLE_TX_TRANSMIT6;
973
                                end if;
974
                        when HANDLE_TX_TRANSMIT6 =>
975
                                eth_next_state <= HANDLE_TX_TRANSMIT7;
976
                        when HANDLE_TX_TRANSMIT7 =>
977
                                if tx_packet_length_counter = X"0000" then
978
                                        eth_next_state <= HANDLE_TX_TRANSMIT_PRE11;
979
                                else
980
                                        eth_next_state <= HANDLE_TX_TRANSMIT8;
981
                                end if;
982
                        when HANDLE_TX_TRANSMIT8 =>
983
                                eth_next_state <= HANDLE_TX_TRANSMIT9;
984
                        when HANDLE_TX_TRANSMIT9 =>
985
                                eth_next_state <= HANDLE_TX_TRANSMIT10;
986
                        when HANDLE_TX_TRANSMIT10 =>
987
                                if spi_wr_cmplt = '1' then
988
                                        eth_next_state <= HANDLE_TX_TRANSMIT7;
989
                                end if;
990
                        when HANDLE_TX_TRANSMIT_PRE11 =>
991
                                if spi_oper_cmplt = '1' then
992
                                        eth_next_state <= HANDLE_TX_TRANSMIT11;
993
                                end if;
994
                        when HANDLE_TX_TRANSMIT11 =>
995
                                eth_next_state <= HANDLE_TX_TRANSMIT12;
996
                        when HANDLE_TX_TRANSMIT12 =>
997
                                if spi_oper_cmplt = '1' then
998
                                        eth_next_state <= HANDLE_TX_TRANSMIT13;
999
                                end if;
1000
                        when HANDLE_TX_TRANSMIT13 =>
1001
                                eth_next_state <= HANDLE_TX_TRANSMIT14;
1002
                        when HANDLE_TX_TRANSMIT14 =>
1003
                                if spi_oper_cmplt = '1' then
1004
                                        eth_next_state <= HANDLE_TX_TRANSMIT15;
1005
                                end if;
1006
                        when HANDLE_TX_TRANSMIT15 =>
1007
                                eth_next_state <= HANDLE_TX_TRANSMIT16;
1008
                        when HANDLE_TX_TRANSMIT16 =>
1009
                                if spi_oper_cmplt = '1' then
1010
                                        eth_next_state <= HANDLE_TX_TRANSMIT17;
1011
                                end if;
1012
                        when HANDLE_TX_TRANSMIT17 =>
1013
                                eth_next_state <= HANDLE_TX_TRANSMIT18;
1014
                        when HANDLE_TX_TRANSMIT18 =>
1015
                                if spi_oper_cmplt = '1' then
1016
                                        eth_next_state <= HANDLE_TX_TRANSMIT19;
1017
                                end if;
1018
                        when HANDLE_TX_TRANSMIT19 =>
1019
                                eth_next_state <= HANDLE_TX_TRANSMIT20;
1020
                        when HANDLE_TX_TRANSMIT20 =>
1021
                                if spi_oper_cmplt = '1' then
1022
                                        eth_next_state <= HANDLE_TX_TRANSMIT21;
1023
                                end if;
1024
                        when HANDLE_TX_TRANSMIT21 =>
1025
                                if spi_data_rd(3) = '1' then -- TX has completed
1026
                                        eth_next_state <= HANDLE_TX_TRANSMIT22;
1027
                                else
1028
                                        eth_next_state <= HANDLE_TX_TRANSMIT19;
1029
                                end if;
1030
                        when HANDLE_TX_TRANSMIT22 =>
1031
                                eth_next_state <= IDLE;
1032
 
1033
                        when HANDLE_TX_TRANSMIT_PREV0 =>
1034
                                eth_next_state <= HANDLE_TX_TRANSMIT_PREV1;
1035
                        when HANDLE_TX_TRANSMIT_PREV1 =>
1036
                                if spi_oper_cmplt = '1' then
1037
                                        eth_next_state <= HANDLE_TX_TRANSMIT_PREV2;
1038
                                end if;
1039
                        when HANDLE_TX_TRANSMIT_PREV2 =>
1040
                                eth_next_state <= HANDLE_TX_TRANSMIT_PREV3;
1041
                        when HANDLE_TX_TRANSMIT_PREV3 =>
1042
                                if spi_oper_cmplt = '1' then
1043
                                        eth_next_state <= HANDLE_TX_TRANSMIT_PREV4;
1044
                                end if;
1045
                        when HANDLE_TX_TRANSMIT_PREV4 =>
1046
                                eth_next_state <= HANDLE_TX_TRANSMIT_PREV5;
1047
                        when HANDLE_TX_TRANSMIT_PREV5 =>
1048
                                if spi_oper_cmplt = '1' then
1049
                                        eth_next_state <= HANDLE_TX_TRANSMIT_PREV6;
1050
                                end if;
1051
                        when HANDLE_TX_TRANSMIT_PREV6 =>
1052
                                eth_next_state <= HANDLE_TX_TRANSMIT_PREV7;
1053
                        when HANDLE_TX_TRANSMIT_PREV7 =>
1054
                                if spi_oper_cmplt = '1' then
1055
                                        eth_next_state <= HANDLE_TX_TRANSMIT_PREV8;
1056
                                end if;
1057
                        when HANDLE_TX_TRANSMIT_PREV8 =>
1058
                                eth_next_state <= HANDLE_TX_TRANSMIT_PREV9;
1059
                        when HANDLE_TX_TRANSMIT_PREV9 =>
1060
                                if spi_oper_cmplt = '1' then
1061
                                        eth_next_state <= HANDLE_TX_TRANSMIT_PREV10;
1062
                                end if;
1063
                        when HANDLE_TX_TRANSMIT_PREV10 =>
1064
                                eth_next_state <= HANDLE_TX_TRANSMIT_PREV11;
1065
                        when HANDLE_TX_TRANSMIT_PREV11 =>
1066
                                if spi_oper_cmplt = '1' then
1067
                                        eth_next_state <= HANDLE_TX_TRANSMIT_PREV12;
1068
                                end if;
1069
                        when HANDLE_TX_TRANSMIT_PREV12 =>
1070
                                eth_next_state <= HANDLE_TX_TRANSMIT_PREV13;
1071
                        when HANDLE_TX_TRANSMIT_PREV13 =>
1072
                                if spi_oper_cmplt = '1' then
1073
                                        eth_next_state <= HANDLE_TX_TRANSMIT_PREV14;
1074
                                end if;
1075
                        when HANDLE_TX_TRANSMIT_PREV14 =>
1076
                                eth_next_state <= HANDLE_TX_TRANSMIT_PREV15;
1077
                        when HANDLE_TX_TRANSMIT_PREV15 =>
1078
                                if spi_oper_cmplt = '1' then
1079
                                        eth_next_state <= HANDLE_TX_TRANSMIT_PREV16;
1080
                                end if;
1081
                        when HANDLE_TX_TRANSMIT_PREV16 =>
1082
                                eth_next_state <= WAIT_FOR_TRANSMIT_CMPLT;
1083
                        when WAIT_FOR_TRANSMIT_CMPLT =>
1084
                                if tx_timeout_counter = '0'&X"00000" then
1085
                                        eth_next_state <= PRE_TX_TRANSMIT0;
1086
                                end if;
1087
 
1088
                        when RESEND_ACK_IN_BUFFER =>
1089
                                eth_next_state <= HANDLE_TX_TRANSMIT15;
1090
 
1091
                end case;
1092
        end process;
1093
 
1094
        WR_CONTINUOUS_PROC :process(CLK_IN)
1095
        begin
1096
                if rising_edge(CLK_IN) then
1097
                        if eth_state = HANDLE_TX_TRANSMIT6 then
1098
                                spi_wr_continuous <= '1';
1099
                        elsif tx_packet_length_counter = X"0000" then
1100
                                spi_wr_continuous <= '0';
1101
                        end if;
1102
                end if;
1103
        end process;
1104
 
1105
        POLL_INT_PROC :process(CLK_IN)
1106
        begin
1107
                if rising_edge(CLK_IN) then
1108
                        poll_counter <= poll_counter - 1;
1109
                        if poll_counter = X"0" then
1110
                                poll_interrupt_reg <= '1';
1111
                        else
1112
                                poll_interrupt_reg <= '0';
1113
                        end if;
1114
                        if INIT_ENC28J60 = '1' then
1115
                                init_enc28j60_waiting <= '1';
1116
                        elsif eth_state = HANDLE_INIT_CMND0 then
1117
                                init_enc28j60_waiting <= '0';
1118
                        end if;
1119
                        if DHCP_CONNECT = '1' then
1120
                                dhcp_connect_waiting <= '1';
1121
                        elsif eth_state = TRIGGER_DHCP_DISCOVER then
1122
                                dhcp_connect_waiting <= '0';
1123
                        end if;
1124
                        if eth_state = TRIGGER_TCP_TX0 or tx_packets_no_ack > X"1"
1125
                                        or wait_for_tcp_window_size_update = '1' then
1126
                                tcp_data_flush_waiting <= '0';
1127
                        elsif tcp_wr_data_flush = '1' and tcp_connection_active = '1' then
1128
                                tcp_data_flush_waiting <= '1';
1129
                        end if;
1130
                        if unsigned(tcp_wr_data_count) < X"580" or tcp_connection_active = '0'
1131
                                        or tx_packets_no_ack > X"1" or wait_for_tcp_window_size_update = '1' then
1132
                                large_tx_packet_waiting <= '0';
1133
                        else
1134
                                large_tx_packet_waiting <= '1';
1135
                        end if;
1136
                        if trigger_send_prev_packet = '1' then
1137
                                send_prev_packet_waiting <= '1';
1138
                        elsif eth_state = HANDLE_TX_TRANSMIT_PREV0 then
1139
                                send_prev_packet_waiting <= '0';
1140
                        end if;
1141
                end if;
1142
        end process;
1143
 
1144
        TX_PACKET_LENGTH_PROC :process(CLK_IN)
1145
        begin
1146
                if rising_edge(CLK_IN) then
1147
                        if eth_state = HANDLE_TX_TRANSMIT5 then
1148
                                tx_packet_length_counter <= tx_packet_length;
1149
                        elsif eth_state = HANDLE_TX_TRANSMIT9 then
1150
                                tx_packet_length_counter <= tx_packet_length_counter - 1;
1151
                        end if;
1152
                        if eth_state = HANDLE_TX_TRANSMIT5 then
1153
                                tx_packet_ram_rd_addr <= "00000000000";
1154
                        elsif eth_state = HANDLE_TX_TRANSMIT9 then
1155
                                tx_packet_ram_rd_addr <= tx_packet_ram_rd_addr + 1;
1156
                        end if;
1157
                end if;
1158
        end process;
1159
 
1160
   INIT_ADDR_PROC: process(CLK_IN)
1161
   begin
1162
      if rising_edge(CLK_IN) then
1163
                        if eth_state = HANDLE_INIT_CMND0 then
1164
                                init_cmnd_addr <= unsigned(C_init_cmnds_start_addr);
1165
                        elsif eth_state = HANDLE_INIT_CMND3 then
1166
                                init_cmnd_addr <= init_cmnd_addr + 1;
1167
                        end if;
1168
      end if;
1169
   end process;
1170
 
1171
   SLOW_CS_PROC: process(CLK_IN)
1172
   begin
1173
      if rising_edge(CLK_IN) then
1174
                        if eth_state = HANDLE_INIT_CMND0 then
1175
                                slow_cs_en <= '1';
1176
                        elsif eth_state = IDLE then
1177
                                slow_cs_en <= '0';
1178
                        end if;
1179
      end if;
1180
   end process;
1181
 
1182
   FRAME_ADDR_PROC: process(CLK_IN)
1183
   begin
1184
      if rising_edge(CLK_IN) then
1185
                        if eth_state = HANDLE_INIT_CMND1 then
1186
                                frame_addr <= "000" & slv(init_cmnd_addr);
1187
                        end if;
1188
      end if;
1189
   end process;
1190
 
1191
        SETTINGS_PROC: process(CLK_IN)
1192
   begin
1193
      if rising_edge(CLK_IN) then
1194
                        if eth_state = HANDLE_INIT_CMND0 then
1195
                                network_interface_enabled <= '0';
1196
                        elsif eth_state = HANDLE_INIT_CMND6 then
1197
                                network_interface_enabled <= '1'; -- TODO add disable code
1198
                        end if;
1199
                end if;
1200
        end process;
1201
 
1202
        SPI_WR_PROC: process(CLK_IN)
1203
   begin
1204
      if rising_edge(CLK_IN) then
1205
                        if eth_state = HANDLE_INIT_CMND3 then
1206
                                spi_we <= '1';
1207
                        elsif eth_state = SERVICE_INTERRUPT0 then
1208
                                spi_we <= '1';
1209
                        elsif eth_state = SERVICE_INTERRUPT6 then
1210
                                spi_we <= '1';
1211
                        elsif eth_state = HANDLE_TX_INTERRUPT0 then
1212
                                spi_we <= '1';
1213
                        elsif eth_state = HANDLE_RX_INTERRUPT5 then
1214
                                spi_we <= '1';
1215
                        elsif eth_state = HANDLE_RX_INTERRUPT7 then
1216
                                spi_we <= '1';
1217
                        elsif eth_state = HANDLE_RX_INTERRUPT9 then
1218
                                spi_we <= '1';
1219
                        elsif eth_state = HANDLE_RX_INTERRUPT11 then
1220
                                spi_we <= '1';
1221
                        elsif eth_state = HANDLE_RX_INTERRUPT13 then
1222
                                spi_we <= '1';
1223
                        elsif eth_state = HANDLE_RX_INTERRUPT15 then
1224
                                spi_we <= '1';
1225
                        elsif eth_state = PRE_TX_TRANSMIT0 then
1226
                                spi_we <= '1';
1227
                        elsif eth_state = PRE_TX_TRANSMIT2 then
1228
                                spi_we <= '1';
1229
                        elsif eth_state = PRE_TX_TRANSMIT4 then
1230
                                spi_we <= '1';
1231
                        elsif eth_state = HANDLE_TX_TRANSMIT0 then
1232
                                spi_we <= '1';
1233
                        elsif eth_state = HANDLE_TX_TRANSMIT2 then
1234
                                spi_we <= '1';
1235
                        elsif eth_state = HANDLE_TX_TRANSMIT4 then
1236
                                spi_we <= '1';
1237
                        elsif eth_state = HANDLE_TX_TRANSMIT6 then
1238
                                spi_we <= '1';
1239
                        elsif eth_state = HANDLE_TX_TRANSMIT11 then
1240
                                spi_we <= '1';
1241
                        elsif eth_state = HANDLE_TX_TRANSMIT13 then
1242
                                spi_we <= '1';
1243
                        elsif eth_state = HANDLE_TX_TRANSMIT15 then
1244
                                spi_we <= '1';
1245
                        elsif eth_state = HANDLE_TX_TRANSMIT17 then
1246
                                spi_we <= '1';
1247
                        elsif eth_state = HANDLE_TX_TRANSMIT_PREV0 then
1248
                                spi_we <= '1';
1249
                        elsif eth_state = HANDLE_TX_TRANSMIT_PREV2 then
1250
                                spi_we <= '1';
1251
                        elsif eth_state = HANDLE_TX_TRANSMIT_PREV4 then
1252
                                spi_we <= '1';
1253
                        elsif eth_state = HANDLE_TX_TRANSMIT_PREV6 then
1254
                                spi_we <= '1';
1255
                        elsif eth_state = HANDLE_TX_TRANSMIT_PREV8 then
1256
                                spi_we <= '1';
1257
                        elsif eth_state = HANDLE_TX_TRANSMIT_PREV10 then
1258
                                spi_we <= '1';
1259
                        elsif eth_state = HANDLE_TX_TRANSMIT_PREV12 then
1260
                                spi_we <= '1';
1261
                        elsif eth_state = HANDLE_TX_TRANSMIT_PREV14 then
1262
                                spi_we <= '1';
1263
                        else
1264
                                spi_we <= '0';
1265
                        end if;
1266
      end if;
1267
   end process;
1268
 
1269
        SPI_ADDR_PROC: process(CLK_IN)
1270
   begin
1271
      if rising_edge(CLK_IN) then
1272
                        if eth_state = HANDLE_INIT_CMND3 then
1273
                                spi_wr_addr <= frame_data(15 downto 8);
1274
                        elsif eth_state = SERVICE_INTERRUPT0 then
1275
                                spi_wr_addr <= X"BB";
1276
                        elsif eth_state = HANDLE_TX_INTERRUPT0 then
1277
                                spi_wr_addr <= X"BC";
1278
                        elsif eth_state = HANDLE_RX_INTERRUPT5 then
1279
                                spi_wr_addr <= X"BF";
1280
                        elsif eth_state = HANDLE_RX_INTERRUPT7 then
1281
                                spi_wr_addr <= X"4C";
1282
                        elsif eth_state = HANDLE_RX_INTERRUPT9 then
1283
                                spi_wr_addr <= X"4D";
1284
                        elsif eth_state = HANDLE_RX_INTERRUPT11 then
1285
                                spi_wr_addr <= X"40";
1286
                        elsif eth_state = HANDLE_RX_INTERRUPT13 then
1287
                                spi_wr_addr <= X"41";
1288
                        elsif eth_state = HANDLE_RX_INTERRUPT15 then
1289
                                spi_wr_addr <= X"9E";
1290
                        elsif eth_state = SERVICE_INTERRUPT6 then
1291
                                spi_wr_addr <= X"9B";
1292
                        elsif eth_state = PRE_TX_TRANSMIT0 then
1293
                                spi_wr_addr <= X"BF";
1294
                        elsif eth_state = PRE_TX_TRANSMIT2 then
1295
                                spi_wr_addr <= X"42";
1296
                        elsif eth_state = PRE_TX_TRANSMIT4 then
1297
                                spi_wr_addr <= X"43";
1298
                        elsif eth_state = HANDLE_TX_TRANSMIT0 then
1299
                                spi_wr_addr <= X"44";
1300
                        elsif eth_state = HANDLE_TX_TRANSMIT2 then
1301
                                spi_wr_addr <= X"45";
1302
                        elsif eth_state = HANDLE_TX_TRANSMIT4 then
1303
                                spi_wr_addr <= X"7A";
1304
                        elsif eth_state = HANDLE_TX_TRANSMIT6 then
1305
                                spi_wr_addr <= X"7A";
1306
                        elsif eth_state = HANDLE_TX_TRANSMIT11 then
1307
                                spi_wr_addr <= X"46";
1308
                        elsif eth_state = HANDLE_TX_TRANSMIT13 then
1309
                                spi_wr_addr <= X"47";
1310
                        elsif eth_state = HANDLE_TX_TRANSMIT15 then
1311
                                spi_wr_addr <= X"BC";
1312
                        elsif eth_state = HANDLE_TX_TRANSMIT17 then
1313
                                spi_wr_addr <= X"9F";
1314
                        elsif eth_state = HANDLE_TX_TRANSMIT_PREV0 then
1315
                                spi_wr_addr <= X"BF";
1316
                        elsif eth_state = HANDLE_TX_TRANSMIT_PREV2 then
1317
                                spi_wr_addr <= X"42";
1318
                        elsif eth_state = HANDLE_TX_TRANSMIT_PREV4 then
1319
                                spi_wr_addr <= X"43";
1320
                        elsif eth_state = HANDLE_TX_TRANSMIT_PREV6 then
1321
                                spi_wr_addr <= X"44";
1322
                        elsif eth_state = HANDLE_TX_TRANSMIT_PREV8 then
1323
                                spi_wr_addr <= X"45";
1324
                        elsif eth_state = HANDLE_TX_TRANSMIT_PREV10 then
1325
                                spi_wr_addr <= X"46";
1326
                        elsif eth_state = HANDLE_TX_TRANSMIT_PREV12 then
1327
                                spi_wr_addr <= X"47";
1328
                        elsif eth_state = HANDLE_TX_TRANSMIT_PREV14 then
1329
                                spi_wr_addr <= X"9F";
1330
                        end if;
1331
      end if;
1332
   end process;
1333
 
1334
        SPI_DATA_PROC: process(CLK_IN)
1335
   begin
1336
      if rising_edge(CLK_IN) then
1337
                        if eth_state = HANDLE_INIT_CMND3 then
1338
                                spi_wr_data <= frame_data(7 downto 0);
1339
                        elsif eth_state = SERVICE_INTERRUPT0 then
1340
                                spi_wr_data <= X"80";
1341
                        elsif eth_state = HANDLE_TX_INTERRUPT0 then
1342
                                spi_wr_data <= X"08";
1343
                        elsif eth_state = HANDLE_RX_INTERRUPT5 then
1344
                                spi_wr_data <= X"03";
1345
                        elsif eth_state = HANDLE_RX_INTERRUPT7 then
1346
                                spi_wr_data <= next_packet_pointer(7 downto 0);
1347
                        elsif eth_state = HANDLE_RX_INTERRUPT9 then
1348
                                spi_wr_data <= next_packet_pointer(15 downto 8);
1349
                        elsif eth_state = HANDLE_RX_INTERRUPT11 then
1350
                                spi_wr_data <= next_packet_pointer(7 downto 0);
1351
                        elsif eth_state = HANDLE_RX_INTERRUPT13 then
1352
                                spi_wr_data <= next_packet_pointer(15 downto 8);
1353
                        elsif eth_state = HANDLE_RX_INTERRUPT15 then
1354
                                spi_wr_data <= X"40";
1355
                        elsif eth_state = SERVICE_INTERRUPT6 then
1356
                                spi_wr_data <= X"80";
1357
                        elsif eth_state = PRE_TX_TRANSMIT0 then
1358
                                spi_wr_data <= X"03";
1359
                        elsif eth_state = PRE_TX_TRANSMIT2 then
1360
                                spi_wr_data <= slv(tx_base_addr(7 downto 0));
1361
                        elsif eth_state = PRE_TX_TRANSMIT4 then
1362
                                spi_wr_data <= slv(tx_base_addr(15 downto 8));
1363
                        elsif eth_state = HANDLE_TX_TRANSMIT0 then
1364
                                spi_wr_data <= slv(tx_base_addr(7 downto 0));
1365
                        elsif eth_state = HANDLE_TX_TRANSMIT2 then
1366
                                spi_wr_data <= slv(tx_base_addr(15 downto 8));
1367
                        elsif eth_state = HANDLE_TX_TRANSMIT4 then
1368
                                spi_wr_data <= X"00";
1369
                        elsif eth_state = HANDLE_TX_TRANSMIT6 then
1370
                                spi_wr_data <= tx_packet_rd_data;
1371
                        elsif eth_state = HANDLE_TX_TRANSMIT10 then
1372
                                spi_wr_data <= tx_packet_rd_data;
1373
                        elsif eth_state = HANDLE_TX_TRANSMIT11 then
1374
                                spi_wr_data <= slv(tx_packet_end_pointer(7 downto 0));
1375
                        elsif eth_state = HANDLE_TX_TRANSMIT13 then
1376
                                spi_wr_data <= slv(tx_packet_end_pointer(15 downto 8));
1377
                        elsif eth_state = HANDLE_TX_TRANSMIT15 then
1378
                                spi_wr_data <= X"08";
1379
                        elsif eth_state = HANDLE_TX_TRANSMIT17 then
1380
                                spi_wr_data <= X"08";
1381
                        elsif eth_state = HANDLE_TX_TRANSMIT_PREV0 then
1382
                                spi_wr_data <= X"03";
1383
                        elsif eth_state = HANDLE_TX_TRANSMIT_PREV2 then
1384
                                spi_wr_data <= slv(tx_base_addr(7 downto 0));
1385
                        elsif eth_state = HANDLE_TX_TRANSMIT_PREV4 then
1386
                                spi_wr_data <= slv(tx_base_addr(15 downto 8));
1387
                        elsif eth_state = HANDLE_TX_TRANSMIT_PREV6 then
1388
                                spi_wr_data <= slv(tx_base_addr(7 downto 0));
1389
                        elsif eth_state = HANDLE_TX_TRANSMIT_PREV8 then
1390
                                spi_wr_data <= slv(tx_base_addr(15 downto 8));
1391
                        elsif eth_state = HANDLE_TX_TRANSMIT_PREV10 then
1392
                                spi_wr_data <= slv(prev_tx_packet_end_pointer(7 downto 0));
1393
                        elsif eth_state = HANDLE_TX_TRANSMIT_PREV12 then
1394
                                spi_wr_data <= slv(prev_tx_packet_end_pointer(15 downto 8));
1395
                        elsif eth_state = HANDLE_TX_TRANSMIT_PREV14 then
1396
                                spi_wr_data <= X"08";
1397
                        end if;
1398
      end if;
1399
   end process;
1400
 
1401
        COMMAND_CMPLT_PROC: process(CLK_IN)
1402
   begin
1403
      if rising_edge(CLK_IN) then
1404
                        if eth_state /= IDLE and eth_next_state = IDLE then
1405
                                command_cmplt <= '1';
1406
                        elsif eth_state /= IDLE and eth_next_state /= IDLE then
1407
                                command_cmplt <= '0';
1408
                        end if;
1409
      end if;
1410
   end process;
1411
 
1412
        SPI_RD_ADDR_PROC: process(CLK_IN)
1413
   begin
1414
      if rising_edge(CLK_IN) then
1415
                        if eth_state = SERVICE_INTERRUPT2 then
1416
                                spi_rd_addr <= X"1C";
1417
                        elsif eth_state = HANDLE_RX_INTERRUPT0 then
1418
                                spi_rd_addr <= X"3A";
1419
                        elsif eth_state = HANDLE_RX_INTERRUPT2 then
1420
                                spi_rd_addr <= X"3A";
1421
                        elsif eth_state = COPY_RX_PACKET_TO_BUF1 then
1422
                                spi_rd_addr <= X"3A";
1423
                        elsif eth_state = HANDLE_TX_TRANSMIT19 then
1424
                                spi_rd_addr <= X"1C";
1425
                        end if;
1426
      end if;
1427
   end process;
1428
 
1429
        SPI_RD_FLAG_PROC: process(CLK_IN)
1430
   begin
1431
      if rising_edge(CLK_IN) then
1432
                        if eth_state = SERVICE_INTERRUPT2 then
1433
                                spi_rd <= '1';
1434
                        elsif eth_state = HANDLE_RX_INTERRUPT0 then
1435
                                spi_rd <= '1';
1436
                        elsif eth_state = HANDLE_RX_INTERRUPT2 then
1437
                                spi_rd <= '1';
1438
                        elsif eth_state = COPY_RX_PACKET_TO_BUF1 then
1439
                                spi_rd <= '1';
1440
                        elsif eth_state = HANDLE_TX_TRANSMIT19 then
1441
                                spi_rd <= '1';
1442
                        else
1443
                                spi_rd <= '0';
1444
                        end if;
1445
      end if;
1446
   end process;
1447
 
1448
        RD_CONTINUOUS_PROC: process(CLK_IN)
1449
   begin
1450
      if rising_edge(CLK_IN) then
1451
                        if eth_state = COPY_RX_PACKET_TO_BUF1 then
1452
                                spi_rd_continuous <= '1';
1453
                        elsif eth_state = COPY_RX_PACKET_TO_BUF5 then
1454
                                spi_rd_continuous <= '0';
1455
                        end if;
1456
      end if;
1457
   end process;
1458
 
1459
        ENC_VERSION_PROC: process(CLK_IN)
1460
   begin
1461
      if rising_edge(CLK_IN) then
1462
                        if eth_state = SERVICE_INTERRUPT4 then
1463
                                eir_register <= spi_data_rd;
1464
                        end if;
1465
                        if eth_state = HANDLE_RX_INTERRUPT2 then
1466
                                next_packet_pointer(7 downto 0) <= spi_data_rd;
1467
                        end if;
1468
                        if eth_state = HANDLE_RX_INTERRUPT4 then
1469
                                next_packet_pointer(15 downto 8) <= spi_data_rd;
1470
                        end if;
1471
      end if;
1472
   end process;
1473
 
1474
------------------------- RX PACKET --------------------------------
1475
 
1476
        handle_rx_packet <= '1' when eth_state = COPY_RX_PACKET_TO_BUF6 else '0';
1477
        trigger_ack <= '1' when eth_state = TRIGGER_ACK_PACKET else '0';
1478
        handle_tx_packet <= '1' when eth_state = TRIGGER_TCP_TX1 else '0';
1479
 
1480
        process(CLK_IN)
1481
   begin
1482
      if rising_edge(CLK_IN) then
1483
                        if eth_state = HANDLE_RX_INTERRUPT0 then
1484
                                debug_rx_flag <= '1';
1485
                        elsif eth_state = HANDLE_RX_INTERRUPT17 then
1486
                                debug_rx_flag <= '0';
1487
                        end if;
1488
                end if;
1489
        end process;
1490
 
1491
        RX_PACKET_WR_ADDR: process(CLK_IN)
1492
   begin
1493
      if rising_edge(CLK_IN) then
1494
                        if eth_state = COPY_RX_PACKET_TO_BUF0 then
1495
                                rx_packet_ram_we_addr_buf <= "00000000000";
1496
                        elsif eth_state = COPY_RX_PACKET_TO_BUF3 then
1497
                                rx_packet_ram_we_addr_buf <= rx_packet_ram_we_addr_buf + 1;
1498
                        end if;
1499
                        if eth_state = HANDLE_RX_INTERRUPT5 then
1500
                                previous_packet_pointer <= unsigned(next_packet_pointer);
1501
                        elsif eth_state = COPY_RX_PACKET_TO_BUF3 then
1502
                                if previous_packet_pointer = C_rx_pointer_max then
1503
                                        previous_packet_pointer <= C_rx_pointer_min;
1504
                                else
1505
                                        previous_packet_pointer <= previous_packet_pointer + 1;
1506
                                end if;
1507
                        end if;
1508
                end if;
1509
        end process;
1510
 
1511
        rx_packet_ram_we <= '1' when eth_state = COPY_RX_PACKET_TO_BUF3 else '0';
1512
        rx_packet_ram_we_addr <= rx_packet_ram_we_addr_buf when doing_tx_packet_config = '0' else rx_packet_rd2_addr;
1513
 
1514
        RX_PACKET_RAM : TDP_RAM
1515
                Generic Map (   G_DATA_A_SIZE   => spi_data_rd'length,
1516
                                                        G_ADDR_A_SIZE   => rx_packet_ram_we_addr'length,
1517
                                                        G_RELATION              => 0, --log2(SIZE_A/SIZE_B)
1518
                                                        G_INIT_ZERO             => true,
1519
                                                        G_INIT_FILE             => "")
1520
                Port Map ( CLK_A_IN     => CLK_IN,
1521
                                 WE_A_IN                => rx_packet_ram_we,
1522
                                 ADDR_A_IN              => slv(rx_packet_ram_we_addr),
1523
                                 DATA_A_IN              => spi_data_rd,
1524
                                 DATA_A_OUT             => rx_packet_rd_data2,
1525
                                 CLK_B_IN               => CLK_IN,
1526
                                 WE_B_IN                => '0',
1527
                                 ADDR_B_IN              => slv(rx_packet_ram_rd_addr),
1528
                                 DATA_B_IN              => X"00",
1529
                                 DATA_B_OUT     => rx_packet_rd_data);
1530
 
1531
        PH_SYNC_PROC: process(CLK_IN)
1532
   begin
1533
      if rising_edge(CLK_IN) then
1534
                        packet_handler_state <= packet_handler_next_state;
1535
      end if;
1536
   end process;
1537
 
1538
        rx_packet_handled <= '1' when packet_handler_state = COMPLETE else '0';
1539
 
1540
        send_arp_reply <= '1' when packet_handler_state = TRIGGER_ARP_REPLY else '0';
1541
        send_icmp_reply <= '1' when packet_handler_state = TRIGGER_ICMP_PACKET_REPLY else '0';
1542
        send_dhcp_request <= '1' when packet_handler_state = TRIGGER_DHCP_REQUEST else '0';
1543
        send_tcp_ack_packet <= '1' when packet_handler_state = TRIGGER_TCP_ACK3 else '0';
1544
        send_tcp_tx_packet <= '1' when packet_handler_state = TRIGGER_TCP_PSH_ACK2 else '0';
1545
 
1546
        send_arp_request <= '1' when eth_state = TRIGGER_ARP_REQUEST else '0';
1547
        send_dhcp_discover <= '1' when eth_state = TRIGGER_DHCP_DISCOVER else '0';
1548
        cancel_dhcp_connect <= '1' when eth_state = TRIGGER_CANCEL_DHCP_CONNECT else '0';
1549
        close_tcp_connection <= '1' when eth_state = TRIGGER_CLOSE_TCP_CONNECTION else '0';
1550
        cancel_tcp_connection <= '1' when eth_state = TRIGGER_CANCEL_TCP_CONNECTION else '0';
1551
 
1552
        PH_NEXT_STATE_DECODE: process (packet_handler_state, handle_rx_packet, rx_packet_status_vector(23), rx_tcp_flags,
1553
                                                                                                rx_packet_type, arp_target_ip_addr, rx_tcp_option, tcp_option_addr, total_packet_length,
1554
                                                                                                        rx_tcp_option_length, arp_opcode, expecting_arp_reply, ip_addr, tx_packet_config_cmplt,
1555
                                                                                                                ip_packet_version, ip_packet_destination_ip, dhcp_enable, dhcp_addr_locked, ip_packet_protocol,
1556
                                                                                                                        ip_packet_length, udp_source_port, udp_dest_port, dhcp_transaction_id, transaction_id_rd,
1557
                                                                                                                                dhcp_magic_cookie, dhcp_option, dhcp_option_length, dhcp_option_addr, expecting_syn_ack,
1558
                                                                                                                                        dhcp_message_type, expecting_dhcp_offer, expecting_dhcp_ack, rx_tcp_source_port,
1559
                                                                                                                                                listen_port, rx_tcp_dest_port, client_port, ping_enable, rx_tcp_header_length, tcp_sequence_number_p1,
1560
                                                                                                                                                        rx_tcp_ack_number, tcp_sequence_number, tcp_acknowledge_number, rx_tcp_seq_number, rx_packet_ram_rd_addr,
1561
                                                                                                                                                                tx_packet_state)
1562
   begin
1563
      packet_handler_next_state <= packet_handler_state;  --default is to stay in current state
1564
      case (packet_handler_state) is
1565
         when IDLE =>
1566
                                if tx_packet_state = IDLE then          -- only configure new packet if currently not transmitting a packet
1567
                                        if handle_rx_packet = '1' then
1568
                                                packet_handler_next_state <= PARSE_SOURCE_MAC0;
1569
                                        elsif trigger_ack = '1' then
1570
                                                packet_handler_next_state <= TRIGGER_TCP_ACK0;
1571
                                        elsif handle_tx_packet = '1' then
1572
                                                packet_handler_next_state <= CHECK_IF_DATA_TO_SEND;
1573
                                        end if;
1574
                                end if;
1575
                        when PARSE_SOURCE_MAC0 =>
1576
                                packet_handler_next_state <= PARSE_SOURCE_MAC1;
1577
                        when PARSE_SOURCE_MAC1 =>
1578
                                packet_handler_next_state <= PARSE_SOURCE_MAC2;
1579
                        when PARSE_SOURCE_MAC2 =>
1580
                                packet_handler_next_state <= PARSE_SOURCE_MAC3;
1581
                        when PARSE_SOURCE_MAC3 =>
1582
                                packet_handler_next_state <= PARSE_SOURCE_MAC4;
1583
                        when PARSE_SOURCE_MAC4 =>
1584
                                packet_handler_next_state <= PARSE_SOURCE_MAC5;
1585
                        when PARSE_SOURCE_MAC5 =>
1586
                                packet_handler_next_state <= PARSE_SOURCE_MAC6;
1587
                        when PARSE_SOURCE_MAC6 =>
1588
                                packet_handler_next_state <= PARSE_SOURCE_MAC7;
1589
                        when PARSE_SOURCE_MAC7 =>
1590
                                packet_handler_next_state <= PARSE_PACKET_TYPE0;
1591
                        when PARSE_PACKET_TYPE0 =>
1592
                                packet_handler_next_state <= PARSE_PACKET_TYPE1;
1593
                        when PARSE_PACKET_TYPE1 =>
1594
                                packet_handler_next_state <= PARSE_PACKET_TYPE2;
1595
                        when PARSE_PACKET_TYPE2 =>
1596
                                packet_handler_next_state <= PARSE_PACKET_TYPE3;
1597
                        when PARSE_PACKET_TYPE3 =>
1598
                                packet_handler_next_state <= PARSE_PACKET_TYPE4;
1599
                        when PARSE_PACKET_TYPE4 =>
1600
                                if rx_packet_type = C_ARP_Packet_Type then
1601
                                        packet_handler_next_state <= HANDLE_ARP_PACKET0;
1602
                                elsif rx_packet_type = C_IP_Packet_Type then
1603
                                        packet_handler_next_state <= HANDLE_IP_PACKET0;
1604
                                else
1605
                                        packet_handler_next_state <= COMPLETE;
1606
                                end if;
1607
 
1608
                        when HANDLE_ARP_PACKET0 =>
1609
                                packet_handler_next_state <= HANDLE_ARP_PACKET1;
1610
                        when HANDLE_ARP_PACKET1 =>
1611
                                packet_handler_next_state <= HANDLE_ARP_PACKET2;
1612
                        when HANDLE_ARP_PACKET2 =>
1613
                                packet_handler_next_state <= HANDLE_ARP_PACKET3;
1614
                        when HANDLE_ARP_PACKET3 =>
1615
                                if arp_opcode = C_ARP_Request then
1616
                                        packet_handler_next_state <= HANDLE_ARP_REQUEST0;
1617
                                elsif arp_opcode = C_ARP_Reply then
1618
                                        packet_handler_next_state <= HANDLE_ARP_REPLY0;
1619
                                else
1620
                                        packet_handler_next_state <= COMPLETE;
1621
                                end if;
1622
 
1623
                        when HANDLE_ARP_REPLY0 =>
1624
                                if expecting_arp_reply = '1' then
1625
                                        packet_handler_next_state <= HANDLE_ARP_REPLY1;
1626
                                else
1627
                                        packet_handler_next_state <= COMPLETE;
1628
                                end if;
1629
                        when HANDLE_ARP_REPLY1 =>
1630
                                packet_handler_next_state <= HANDLE_ARP_REPLY2;
1631
                        when HANDLE_ARP_REPLY2 =>
1632
                                packet_handler_next_state <= HANDLE_ARP_REPLY3;
1633
                        when HANDLE_ARP_REPLY3 =>
1634
                                packet_handler_next_state <= HANDLE_ARP_REPLY4;
1635
                        when HANDLE_ARP_REPLY4 =>
1636
                                packet_handler_next_state <= HANDLE_ARP_REPLY5;
1637
                        when HANDLE_ARP_REPLY5 =>
1638
                                packet_handler_next_state <= HANDLE_ARP_REPLY6;
1639
                        when HANDLE_ARP_REPLY6 =>
1640
                                packet_handler_next_state <= HANDLE_ARP_REPLY7;
1641
                        when HANDLE_ARP_REPLY7 =>
1642
                                packet_handler_next_state <= COMPLETE;
1643
 
1644
                        when HANDLE_ARP_REQUEST0 =>
1645
                                packet_handler_next_state <= HANDLE_ARP_REQUEST1;
1646
                        when HANDLE_ARP_REQUEST1 =>
1647
                                packet_handler_next_state <= HANDLE_ARP_REQUEST2;
1648
                        when HANDLE_ARP_REQUEST2 =>
1649
                                packet_handler_next_state <= HANDLE_ARP_REQUEST3;
1650
                        when HANDLE_ARP_REQUEST3 =>
1651
                                packet_handler_next_state <= HANDLE_ARP_REQUEST4;
1652
                        when HANDLE_ARP_REQUEST4 =>
1653
                                packet_handler_next_state <= HANDLE_ARP_REQUEST5;
1654
                        when HANDLE_ARP_REQUEST5 =>
1655
                                packet_handler_next_state <= HANDLE_ARP_REQUEST6;
1656
                        when HANDLE_ARP_REQUEST6 =>
1657
                                if arp_target_ip_addr = ip_addr then
1658
                                        packet_handler_next_state <= HANDLE_ARP_REQUEST7;
1659
                                else
1660
                                        packet_handler_next_state <= COMPLETE;
1661
                                end if;
1662
                        when HANDLE_ARP_REQUEST7 =>
1663
                                packet_handler_next_state <= HANDLE_ARP_REQUEST8;
1664
                        when HANDLE_ARP_REQUEST8 =>
1665
                                packet_handler_next_state <= HANDLE_ARP_REQUEST9;
1666
                        when HANDLE_ARP_REQUEST9 =>
1667
                                packet_handler_next_state <= HANDLE_ARP_REQUEST10;
1668
                        when HANDLE_ARP_REQUEST10 =>
1669
                                packet_handler_next_state <= HANDLE_ARP_REQUEST11;
1670
                        when HANDLE_ARP_REQUEST11 =>
1671
                                packet_handler_next_state <= HANDLE_ARP_REQUEST12;
1672
                        when HANDLE_ARP_REQUEST12 =>
1673
                                packet_handler_next_state <= HANDLE_ARP_REQUEST13;
1674
                        when HANDLE_ARP_REQUEST13 =>
1675
                                packet_handler_next_state <= TRIGGER_ARP_REPLY;
1676
 
1677
                        when TRIGGER_ARP_REPLY =>
1678
                                if tx_packet_config_cmplt = '1' then
1679
                                        packet_handler_next_state <= COMPLETE;
1680
                                end if;
1681
 
1682
                        when HANDLE_IP_PACKET0 =>
1683
                                packet_handler_next_state <= HANDLE_IP_PACKET1;
1684
                        when HANDLE_IP_PACKET1 =>
1685
                                packet_handler_next_state <= HANDLE_IP_PACKET2;
1686
                        when HANDLE_IP_PACKET2 =>
1687
                                packet_handler_next_state <= HANDLE_IP_PACKET3;
1688
                        when HANDLE_IP_PACKET3 =>
1689
                                packet_handler_next_state <= HANDLE_IP_PACKET4;
1690
                        when HANDLE_IP_PACKET4 =>
1691
                                packet_handler_next_state <= HANDLE_IP_PACKET5;
1692
                        when HANDLE_IP_PACKET5 =>
1693
                                packet_handler_next_state <= HANDLE_IP_PACKET6;
1694
                        when HANDLE_IP_PACKET6 =>
1695
                                packet_handler_next_state <= HANDLE_IP_PACKET7;
1696
                        when HANDLE_IP_PACKET7 =>
1697
                                packet_handler_next_state <= HANDLE_IP_PACKET8;
1698
                        when HANDLE_IP_PACKET8 =>
1699
                                packet_handler_next_state <= HANDLE_IP_PACKET9;
1700
                        when HANDLE_IP_PACKET9 =>
1701
                                packet_handler_next_state <= HANDLE_IP_PACKET10;
1702
                        when HANDLE_IP_PACKET10 =>
1703
                                if ip_packet_version = C_IPV4_Protocol_Number then
1704
                                        packet_handler_next_state <= HANDLE_IP_PACKET11;
1705
                                else
1706
                                        packet_handler_next_state <= COMPLETE;
1707
                                end if;
1708
                        when HANDLE_IP_PACKET11 =>
1709
                                if ip_packet_destination_ip = ip_addr then
1710
                                        packet_handler_next_state <= HANDLE_IP_PACKET12;
1711
                                elsif dhcp_enable = '1' and dhcp_addr_locked = '0' then
1712
                                        packet_handler_next_state <= HANDLE_IP_PACKET12;
1713
                                else
1714
                                        packet_handler_next_state <= COMPLETE;
1715
                                end if;
1716
                        when HANDLE_IP_PACKET12 =>
1717
                                if ip_packet_protocol = C_ICMP_Protocol_Number then
1718
                                        packet_handler_next_state <= PRE_ICMP_PACKET_REPLY;
1719
                                elsif ip_packet_protocol = C_UDP_Protocol_Number then
1720
                                        packet_handler_next_state <= PARSE_UDP_PACKET0;
1721
                                elsif ip_packet_protocol = C_TCP_Protocol_Number then
1722
                                        packet_handler_next_state <= PARSE_TCP_PACKET0;
1723
                                else
1724
                                        packet_handler_next_state <= COMPLETE;
1725
                                end if;
1726
 
1727
                        when PRE_ICMP_PACKET_REPLY =>
1728
                                if ip_packet_length = C_ICMP_Ping_Length and ping_enable = '1' then
1729
                                        packet_handler_next_state <= TRIGGER_ICMP_PACKET_REPLY;
1730
                                else
1731
                                        packet_handler_next_state <= COMPLETE;
1732
                                end if;
1733
                        when TRIGGER_ICMP_PACKET_REPLY =>
1734
                                if tx_packet_config_cmplt = '1' then
1735
                                        packet_handler_next_state <= COMPLETE;
1736
                                end if;
1737
 
1738
                        when PARSE_UDP_PACKET0 =>
1739
                                packet_handler_next_state <= PARSE_UDP_PACKET1;
1740
                        when PARSE_UDP_PACKET1 =>
1741
                                packet_handler_next_state <= PARSE_UDP_PACKET2;
1742
                        when PARSE_UDP_PACKET2 =>
1743
                                packet_handler_next_state <= PARSE_UDP_PACKET3;
1744
                        when PARSE_UDP_PACKET3 =>
1745
                                packet_handler_next_state <= PARSE_UDP_PACKET4;
1746
                        when PARSE_UDP_PACKET4 =>
1747
                                packet_handler_next_state <= PARSE_UDP_PACKET5;
1748
                        when PARSE_UDP_PACKET5 =>
1749
                                packet_handler_next_state <= PARSE_UDP_PACKET_TYPE0;
1750
                        when PARSE_UDP_PACKET_TYPE0 =>
1751
                                if udp_source_port = C_DHCP_Source_Port then
1752
                                        packet_handler_next_state <= PARSE_UDP_PACKET_TYPE1;
1753
                                else
1754
                                        packet_handler_next_state <= COMPLETE;
1755
                                end if;
1756
                        when PARSE_UDP_PACKET_TYPE1 =>
1757
                                if udp_dest_port = C_DHCP_Dest_Port then
1758
                                        packet_handler_next_state <= PARSE_DHCP_PACKET0;
1759
                                else
1760
                                        packet_handler_next_state <= COMPLETE;
1761
                                end if;
1762
 
1763
                        when PARSE_DHCP_PACKET0 =>
1764
                                packet_handler_next_state <= PARSE_DHCP_PACKET1;
1765
                        when PARSE_DHCP_PACKET1 =>
1766
                                packet_handler_next_state <= PARSE_DHCP_PACKET2;
1767
                        when PARSE_DHCP_PACKET2 =>
1768
                                packet_handler_next_state <= PARSE_DHCP_PACKET3;
1769
                        when PARSE_DHCP_PACKET3 =>
1770
                                packet_handler_next_state <= PARSE_DHCP_PACKET4;
1771
                        when PARSE_DHCP_PACKET4 =>
1772
                                packet_handler_next_state <= PARSE_DHCP_PACKET5;
1773
                        when PARSE_DHCP_PACKET5 =>
1774
                                packet_handler_next_state <= PARSE_DHCP_PACKET6;
1775
                        when PARSE_DHCP_PACKET6 =>
1776
                                if dhcp_transaction_id = transaction_id_rd then
1777
                                        packet_handler_next_state <= PARSE_DHCP_PACKET7;
1778
                                else
1779
                                        packet_handler_next_state <= COMPLETE;
1780
                                end if;
1781
                        when PARSE_DHCP_PACKET7 =>
1782
                                packet_handler_next_state <= PARSE_DHCP_PACKET8;
1783
                        when PARSE_DHCP_PACKET8 =>
1784
                                packet_handler_next_state <= PARSE_DHCP_PACKET9;
1785
                        when PARSE_DHCP_PACKET9 =>
1786
                                packet_handler_next_state <= PARSE_DHCP_PACKET10;
1787
                        when PARSE_DHCP_PACKET10 =>
1788
                                packet_handler_next_state <= PARSE_DHCP_PACKET11;
1789
                        when PARSE_DHCP_PACKET11 =>
1790
                                packet_handler_next_state <= PARSE_DHCP_PACKET12;
1791
                        when PARSE_DHCP_PACKET12 =>
1792
                                packet_handler_next_state <= PARSE_DHCP_PACKET13;
1793
                        when PARSE_DHCP_PACKET13 =>
1794
                                packet_handler_next_state <= PARSE_DHCP_PACKET14;
1795
                        when PARSE_DHCP_PACKET14 =>
1796
                                packet_handler_next_state <= PARSE_DHCP_PACKET15;
1797
                        when PARSE_DHCP_PACKET15 =>
1798
                                packet_handler_next_state <= PARSE_DHCP_PACKET16;
1799
                        when PARSE_DHCP_PACKET16 =>
1800
                                packet_handler_next_state <= PARSE_DHCP_PACKET17;
1801
                        when PARSE_DHCP_PACKET17 =>
1802
                                packet_handler_next_state <= PARSE_DHCP_PACKET18;
1803
                        when PARSE_DHCP_PACKET18 =>
1804
                                if C_dhcp_magic_cookie = dhcp_magic_cookie then
1805
                                        packet_handler_next_state <= PARSE_DHCP_PACKET19;
1806
                                else
1807
                                        packet_handler_next_state <= COMPLETE;
1808
                                end if;
1809
 
1810
                        when PARSE_DHCP_PACKET19 =>
1811
                                packet_handler_next_state <= PARSE_DHCP_PACKET20;
1812
                        when PARSE_DHCP_PACKET20 =>
1813
                                packet_handler_next_state <= PARSE_DHCP_PACKET21;
1814
                        when PARSE_DHCP_PACKET21 =>
1815
                                packet_handler_next_state <= PARSE_DHCP_PACKET22;
1816
                        when PARSE_DHCP_PACKET22 =>
1817
                                packet_handler_next_state <= PARSE_DHCP_PACKET23;
1818
                        when PARSE_DHCP_PACKET23 =>
1819
                                if dhcp_option = X"35" and dhcp_option_length = X"01" then
1820
                                        packet_handler_next_state <= PARSE_DHCP_PACKET24;
1821
                                elsif dhcp_option = X"FF" then
1822
                                        packet_handler_next_state <= COMPLETE;
1823
                                elsif RESIZE(dhcp_option_addr, 16) > total_packet_length then
1824
                                        packet_handler_next_state <= COMPLETE;
1825
                                else
1826
                                        packet_handler_next_state <= PARSE_DHCP_PACKET19;
1827
                                end if;
1828
                        when PARSE_DHCP_PACKET24 =>
1829
                                if dhcp_message_type = X"02" then -- dhcp offer
1830
                                        packet_handler_next_state <= CHECK_OFFER_EXPECTED;
1831
                                elsif dhcp_message_type = X"04" then -- dhcp decline
1832
                                        packet_handler_next_state <= COMPLETE;
1833
                                elsif dhcp_message_type = X"05" then -- dhcp acknowledge
1834
                                        packet_handler_next_state <= HANDLE_DHCP_ACK0;
1835
                                elsif dhcp_message_type = X"06" then -- dhcp negative acknowledge
1836
                                        packet_handler_next_state <= COMPLETE;
1837
                                elsif dhcp_message_type = X"07" then -- dhcp release
1838
                                        packet_handler_next_state <= COMPLETE;
1839
                                else
1840
                                        packet_handler_next_state <= COMPLETE;
1841
                                end if;
1842
 
1843
                        when CHECK_OFFER_EXPECTED =>
1844
                                if expecting_dhcp_offer = '1' then
1845
                                        packet_handler_next_state <= TRIGGER_DHCP_REQUEST;
1846
                                else
1847
                                        packet_handler_next_state <= COMPLETE;
1848
                                end if;
1849
                        when TRIGGER_DHCP_REQUEST =>
1850
                                if tx_packet_config_cmplt = '1' then
1851
                                        packet_handler_next_state <= COMPLETE;
1852
                                end if;
1853
 
1854
                        when HANDLE_DHCP_ACK0 =>
1855
                                if expecting_dhcp_ack = '1' then
1856
                                        packet_handler_next_state <= HANDLE_DHCP_ACK1;
1857
                                else
1858
                                        packet_handler_next_state <= COMPLETE;
1859
                                end if;
1860
                        when HANDLE_DHCP_ACK1 =>
1861
                                packet_handler_next_state <= HANDLE_DHCP_ACK2;
1862
                        when HANDLE_DHCP_ACK2 =>
1863
                                packet_handler_next_state <= HANDLE_DHCP_ACK3;
1864
                        when HANDLE_DHCP_ACK3 =>
1865
                                packet_handler_next_state <= HANDLE_DHCP_ACK4;
1866
                        when HANDLE_DHCP_ACK4 =>
1867
                                packet_handler_next_state <= HANDLE_DHCP_ACK5;
1868
                        when HANDLE_DHCP_ACK5 =>
1869
                                packet_handler_next_state <= HANDLE_DHCP_ACK6;
1870
                        when HANDLE_DHCP_ACK6 =>
1871
                                packet_handler_next_state <= HANDLE_DHCP_ACK7;
1872
                        when HANDLE_DHCP_ACK7 =>
1873
                                packet_handler_next_state <= HANDLE_DHCP_ACK8;
1874
                        when HANDLE_DHCP_ACK8 =>
1875
                                packet_handler_next_state <= COMPLETE;
1876
 
1877
                        when PARSE_TCP_PACKET0 =>
1878
                                packet_handler_next_state <= PARSE_TCP_PACKET1;
1879
                        when PARSE_TCP_PACKET1 =>
1880
                                packet_handler_next_state <= PARSE_TCP_PACKET2;
1881
                        when PARSE_TCP_PACKET2 =>
1882
                                packet_handler_next_state <= PARSE_TCP_PACKET3;
1883
                        when PARSE_TCP_PACKET3 =>
1884
                                packet_handler_next_state <= PARSE_TCP_PACKET4;
1885
                        when PARSE_TCP_PACKET4 =>
1886
                                packet_handler_next_state <= PARSE_TCP_PACKET5;
1887
                        when PARSE_TCP_PACKET5 =>
1888
                                if rx_tcp_source_port = client_port then
1889
                                        packet_handler_next_state <= PARSE_TCP_PACKET6;
1890
                                else
1891
                                        packet_handler_next_state <= COMPLETE;
1892
                                end if;
1893
                        when PARSE_TCP_PACKET6 =>
1894
                                if rx_tcp_dest_port = listen_port then
1895
                                        packet_handler_next_state <= PARSE_TCP_PACKET7;
1896
                                else
1897
                                        packet_handler_next_state <= COMPLETE;
1898
                                end if;
1899
                        when PARSE_TCP_PACKET7 =>
1900
                                packet_handler_next_state <= PARSE_TCP_PACKET8;
1901
                        when PARSE_TCP_PACKET8 =>
1902
                                packet_handler_next_state <= PARSE_TCP_PACKET9;
1903
                        when PARSE_TCP_PACKET9 =>
1904
                                packet_handler_next_state <= PARSE_TCP_PACKET10;
1905
                        when PARSE_TCP_PACKET10 =>
1906
                                packet_handler_next_state <= PARSE_TCP_PACKET11;
1907
                        when PARSE_TCP_PACKET11 =>
1908
                                packet_handler_next_state <= PARSE_TCP_PACKET12;
1909
                        when PARSE_TCP_PACKET12 =>
1910
                                packet_handler_next_state <= PARSE_TCP_PACKET13;
1911
                        when PARSE_TCP_PACKET13 =>
1912
                                packet_handler_next_state <= PARSE_TCP_PACKET14;
1913
                        when PARSE_TCP_PACKET14 =>
1914
                                packet_handler_next_state <= PARSE_TCP_PACKET15;
1915
                        when PARSE_TCP_PACKET15 =>
1916
                                packet_handler_next_state <= PARSE_TCP_PACKET16;
1917
                        when PARSE_TCP_PACKET16 =>
1918
                                packet_handler_next_state <= PARSE_TCP_PACKET17;
1919
                        when PARSE_TCP_PACKET17 =>
1920
                                packet_handler_next_state <= PARSE_TCP_PACKET18;
1921
                        when PARSE_TCP_PACKET18 =>
1922
                                packet_handler_next_state <= PARSE_TCP_PACKET19;
1923
                        when PARSE_TCP_PACKET19 =>
1924
                                if rx_tcp_flags(4 downto 1) = X"1" and tcp_connection_active = '0' then -- SYN PACKET (READ OPTIONS)
1925
                                        packet_handler_next_state <= PARSE_TCP_PACKET20;
1926
                                else
1927
                                        packet_handler_next_state <= PARSE_TCP_PACKET25;
1928
                                end if;
1929
                        when PARSE_TCP_PACKET20 =>
1930
                                packet_handler_next_state <= PARSE_TCP_PACKET21;
1931
                        when PARSE_TCP_PACKET21 =>
1932
                                packet_handler_next_state <= PARSE_TCP_PACKET22;
1933
                        when PARSE_TCP_PACKET22 =>
1934
                                packet_handler_next_state <= PARSE_TCP_PACKET23;
1935
                        when PARSE_TCP_PACKET23 =>
1936
                                packet_handler_next_state <= PARSE_TCP_PACKET24;
1937
                        when PARSE_TCP_PACKET24 =>
1938
                                if rx_tcp_option = X"03" then
1939
                                        packet_handler_next_state <= PARSE_TCP_PACKET25;
1940
                                elsif rx_tcp_option = X"01" then
1941
                                        packet_handler_next_state <= PARSE_TCP_PACKET26;
1942
                                elsif RESIZE(tcp_option_addr, 16) > total_packet_length then
1943
                                        packet_handler_next_state <= COMPLETE;
1944
                                else
1945
                                        packet_handler_next_state <= PARSE_TCP_PACKET27;
1946
                                end if;
1947
                        when PARSE_TCP_PACKET25 =>
1948
                                if rx_tcp_flags(4 downto 1) = X"1" and tcp_connection_active = '0' then
1949
                                        packet_handler_next_state <= CHECK_TCP_SYN_PACKET0;
1950
                                elsif rx_tcp_flags(4 downto 1) = X"C" or rx_tcp_flags(4 downto 1) = X"8" then
1951
                                        packet_handler_next_state <= CHECK_TCP_PSH_ACK_PACKET0;
1952
                                else
1953
                                        packet_handler_next_state <= COMPLETE;
1954
                                end if;
1955
                        when PARSE_TCP_PACKET26 =>
1956
                                packet_handler_next_state <= PARSE_TCP_PACKET20;
1957
                        when PARSE_TCP_PACKET27 =>
1958
                                if rx_tcp_option_length = X"00" then
1959
                                        packet_handler_next_state <= COMPLETE;
1960
                                else
1961
                                        packet_handler_next_state <= PARSE_TCP_PACKET20;
1962
                                end if;
1963
                        when CHECK_TCP_SYN_PACKET0 =>
1964
                                packet_handler_next_state <= CHECK_TCP_SYN_PACKET1;
1965
                        when CHECK_TCP_SYN_PACKET1 =>
1966
                                packet_handler_next_state <= CHECK_TCP_SYN_PACKET2;
1967
                        when CHECK_TCP_SYN_PACKET2 =>
1968
                                packet_handler_next_state <= CHECK_TCP_SYN_PACKET3;
1969
                        when CHECK_TCP_SYN_PACKET3 =>
1970
                                packet_handler_next_state <= CHECK_TCP_SYN_PACKET4;
1971
                        when CHECK_TCP_SYN_PACKET4 =>
1972
                                packet_handler_next_state <= CHECK_TCP_SYN_PACKET5;
1973
                        when CHECK_TCP_SYN_PACKET5 =>
1974
                                packet_handler_next_state <= TRIGGER_TCP_ACK0;
1975
 
1976
                        when CHECK_TCP_PSH_ACK_PACKET0 =>
1977
                                if tcp_sequence_number = unsigned(rx_tcp_ack_number) then
1978
                                        packet_handler_next_state <= CHECK_TCP_PSH_ACK_PACKET1;
1979
                                else
1980
                                        packet_handler_next_state <= COMPLETE;
1981
                                end if;
1982
                        when CHECK_TCP_PSH_ACK_PACKET1 =>
1983
                                if tcp_acknowledge_number = unsigned(rx_tcp_seq_number) then
1984
                                        packet_handler_next_state <= CHECK_TCP_PSH_ACK_PACKET2;
1985
                                else
1986
                                        packet_handler_next_state <= RESEND_ACK;        -- ACK failed to reach target, resend
1987
                                end if;
1988
                        when CHECK_TCP_PSH_ACK_PACKET2 =>
1989
                                if rx_data_length /= X"0000" then
1990
                                        packet_handler_next_state <= CHECK_TCP_PSH_ACK_PACKET3;
1991
                                else
1992
                                        packet_handler_next_state <= COMPLETE; -- This was just an ACK
1993
                                end if;
1994
                        when CHECK_TCP_PSH_ACK_PACKET3 =>
1995
                                packet_handler_next_state <= READ_TCP_RX_DATA;
1996
 
1997
                        when READ_TCP_RX_DATA =>
1998
                                if RESIZE(rx_packet_ram_rd_addr, 16) > total_packet_length then
1999
                                        packet_handler_next_state <= COMPLETE;
2000
                                end if;
2001
 
2002
                        when TRIGGER_TCP_ACK0 =>
2003
                                packet_handler_next_state <= TRIGGER_TCP_ACK1;
2004
                        when TRIGGER_TCP_ACK1 =>
2005
                                if window_size > X"136" then
2006
                                        packet_handler_next_state <= TRIGGER_TCP_ACK2;
2007
                                end if;
2008
                        when TRIGGER_TCP_ACK2 =>
2009
                                packet_handler_next_state <= TRIGGER_TCP_ACK3;
2010
                        when TRIGGER_TCP_ACK3 =>
2011
                                if tx_packet_state = INIT_TCP_PACKET_METADATA then
2012
                                        packet_handler_next_state <= COMPLETE;
2013
                                end if;
2014
 
2015
                        when RESEND_ACK =>
2016
                                packet_handler_next_state <= COMPLETE;
2017
 
2018
                        when CHECK_IF_DATA_TO_SEND =>
2019
                                if tcp_wr_data_count /= X"000" then
2020
                                        packet_handler_next_state <= TRIGGER_TCP_PSH_ACK0;
2021
                                else
2022
                                        packet_handler_next_state <= COMPLETE;
2023
                                end if;
2024
                        when TRIGGER_TCP_PSH_ACK0 =>
2025
                                packet_handler_next_state <= TRIGGER_TCP_PSH_ACK1;
2026
                        when TRIGGER_TCP_PSH_ACK1 =>
2027
                                if rx_tcp_window_size_shifted(31 downto 12) = X"00000" then
2028
                                        packet_handler_next_state <= CHECK_TCP_WINDOW_SIZE;
2029
                                else
2030
                                        packet_handler_next_state <= TRIGGER_TCP_PSH_ACK2;
2031
                                end if;
2032
                        when CHECK_TCP_WINDOW_SIZE =>
2033
                                if tx_bytes_to_send > unsigned(rx_tcp_window_size_shifted(11 downto 0)) then -- server is not ready to receive data yet
2034
                                        packet_handler_next_state <= RX_TCP_WINDOW_TOO_SMALL;
2035
                                else
2036
                                        packet_handler_next_state <= TRIGGER_TCP_PSH_ACK2;
2037
                                end if;
2038
                        when TRIGGER_TCP_PSH_ACK2 =>
2039
                                if tx_packet_state = SET_CHECKSUM_LENGTH_TX_PACKET_LENGTH0 then -- wait until packet is formed before incrementing sequence number
2040
                                        packet_handler_next_state <= TRIGGER_TCP_PSH_ACK3;
2041
                                end if;
2042
                        when TRIGGER_TCP_PSH_ACK3 =>
2043
                                packet_handler_next_state <= COMPLETE;
2044
 
2045
                        when RX_TCP_WINDOW_TOO_SMALL =>
2046
                                packet_handler_next_state <= IDLE;
2047
                        when COMPLETE =>
2048
                                packet_handler_next_state <= IDLE;
2049
 
2050
                end case;
2051
        end process;
2052
 
2053
        ACK_TIMER_PROC: process(CLK_IN)
2054
        begin
2055
                if rising_edge(CLK_IN) then
2056
                        if packet_handler_state = CHECK_TCP_PSH_ACK_PACKET3 then
2057
                                ack_countdown <= C_250us;
2058
                        elsif ack_countdown /= X"0000" then
2059
                                ack_countdown <= ack_countdown - 1;
2060
                        end if;
2061
                        if ack_countdown = X"0001" then
2062
                                ack_required <= '1';
2063
                        elsif trigger_fin_ack = '1' then
2064
                                ack_required <= '1';
2065
                        elsif packet_handler_state = TRIGGER_TCP_ACK0 then
2066
                                ack_required <= '0';
2067
                        end if;
2068
                        if packet_handler_state = RESEND_ACK then
2069
                                resend_ack_packet <= '1';
2070
                        elsif eth_state = RESEND_ACK_IN_BUFFER then
2071
                                resend_ack_packet <= '0';
2072
                        end if;
2073
                        if packet_handler_state = RX_TCP_WINDOW_TOO_SMALL then
2074
                                wait_for_tcp_window_size_update <= '1';
2075
                        elsif packet_handler_state = PARSE_TCP_PACKET25 then
2076
                                wait_for_tcp_window_size_update <= '0';
2077
                        end if;
2078
                end if;
2079
        end process;
2080
 
2081
        RX_PACKET_RD_ADDR: process(CLK_IN)
2082
        begin
2083
                if rising_edge(CLK_IN) then
2084
                        if packet_handler_state = PARSE_SOURCE_MAC0 then
2085
                                rx_packet_ram_rd_addr <= "000"&X"0A";
2086
                        elsif packet_handler_state = PARSE_PACKET_TYPE0 then
2087
                                rx_packet_ram_rd_addr <= "000"&X"10";
2088
                        elsif packet_handler_state = HANDLE_ARP_REQUEST0 then
2089
                                rx_packet_ram_rd_addr <= "000"&X"2A";
2090
                        elsif packet_handler_state = HANDLE_ARP_REQUEST7 then
2091
                                rx_packet_ram_rd_addr <= "000"&X"20";
2092
                        elsif packet_handler_state = HANDLE_IP_PACKET0 then
2093
                                rx_packet_ram_rd_addr <= "000"&X"12";
2094
                        elsif packet_handler_state = HANDLE_IP_PACKET1 then
2095
                                rx_packet_ram_rd_addr <= "000"&X"1B";
2096
                        elsif packet_handler_state = HANDLE_IP_PACKET2 then
2097
                                rx_packet_ram_rd_addr <= "000"&X"22";
2098
                        elsif packet_handler_state = HANDLE_IP_PACKET6 then
2099
                                rx_packet_ram_rd_addr <= "000"&X"14";
2100
                        elsif packet_handler_state = PARSE_UDP_PACKET0 then
2101
                                rx_packet_ram_rd_addr <= "000"&X"26";
2102
                        elsif packet_handler_state = PARSE_DHCP_PACKET0 then
2103
                                rx_packet_ram_rd_addr <= "000"&X"32";
2104
                        elsif packet_handler_state = PARSE_DHCP_PACKET4 then
2105
                                rx_packet_ram_rd_addr <= "000"&X"3E";
2106
                        elsif packet_handler_state = PARSE_DHCP_PACKET12 then
2107
                                rx_packet_ram_rd_addr <= "001"&X"1A";
2108
                        elsif packet_handler_state = PARSE_DHCP_PACKET19 then
2109
                                rx_packet_ram_rd_addr <= dhcp_option_addr;
2110
                        elsif packet_handler_state = HANDLE_ARP_PACKET0 then
2111
                                rx_packet_ram_rd_addr <= "000"&X"19";
2112
                        elsif packet_handler_state = HANDLE_ARP_REPLY0 then
2113
                                rx_packet_ram_rd_addr <= "000"&X"1A";
2114
                        elsif packet_handler_state = PARSE_TCP_PACKET0 then
2115
                                rx_packet_ram_rd_addr <= next_protocol_start_addr;
2116
                        elsif packet_handler_state = PARSE_TCP_PACKET20 then
2117
                                rx_packet_ram_rd_addr <= tcp_option_addr;
2118
                        elsif packet_handler_state = CHECK_TCP_PSH_ACK_PACKET1 then
2119
                                rx_packet_ram_rd_addr <= rx_data_start_addr;
2120
                        elsif packet_handler_state = HANDLE_DHCP_ACK1 then
2121
                                rx_packet_ram_rd_addr <= "000"&X"0A";
2122
                        else
2123
                                rx_packet_ram_rd_addr <= rx_packet_ram_rd_addr + 1;
2124
                        end if;
2125
                        if packet_handler_state = HANDLE_ARP_PACKET2 then
2126
                                arp_opcode <= rx_packet_rd_data;
2127
                        end if;
2128
                        if packet_handler_state = HANDLE_ARP_REQUEST9 then
2129
                                arp_source_ip_addr(31 downto 24) <= rx_packet_rd_data;
2130
                        elsif packet_handler_state = HANDLE_ARP_REQUEST10 then
2131
                                arp_source_ip_addr(23 downto 16) <= rx_packet_rd_data;
2132
                        elsif packet_handler_state = HANDLE_ARP_REQUEST11 then
2133
                                arp_source_ip_addr(15 downto 8) <= rx_packet_rd_data;
2134
                        elsif packet_handler_state = HANDLE_ARP_REQUEST12 then
2135
                                arp_source_ip_addr(7 downto 0) <= rx_packet_rd_data;
2136
                        end if;
2137
                        if packet_handler_state = HANDLE_ARP_REQUEST2 then
2138
                                arp_target_ip_addr(31 downto 24) <= rx_packet_rd_data;
2139
                        elsif packet_handler_state = HANDLE_ARP_REQUEST3 then
2140
                                arp_target_ip_addr(23 downto 16) <= rx_packet_rd_data;
2141
                        elsif packet_handler_state = HANDLE_ARP_REQUEST4 then
2142
                                arp_target_ip_addr(15 downto 8) <= rx_packet_rd_data;
2143
                        elsif packet_handler_state = HANDLE_ARP_REQUEST5 then
2144
                                arp_target_ip_addr(7 downto 0) <= rx_packet_rd_data;
2145
                        end if;
2146
                        if packet_handler_state = PARSE_SOURCE_MAC2 then
2147
                                rx_packet_source_mac(47 downto 40) <= rx_packet_rd_data;
2148
                        elsif packet_handler_state = PARSE_SOURCE_MAC3 then
2149
                                rx_packet_source_mac(39 downto 32) <= rx_packet_rd_data;
2150
                        elsif packet_handler_state = PARSE_SOURCE_MAC4 then
2151
                                rx_packet_source_mac(31 downto 24) <= rx_packet_rd_data;
2152
                        elsif packet_handler_state = PARSE_SOURCE_MAC5 then
2153
                                rx_packet_source_mac(23 downto 16) <= rx_packet_rd_data;
2154
                        elsif packet_handler_state = PARSE_SOURCE_MAC6 then
2155
                                rx_packet_source_mac(15 downto 8) <= rx_packet_rd_data;
2156
                        elsif packet_handler_state = PARSE_SOURCE_MAC7 then
2157
                                rx_packet_source_mac(7 downto 0) <= rx_packet_rd_data;
2158
                        end if;
2159
                        if packet_handler_state = PARSE_PACKET_TYPE2 then
2160
                                rx_packet_type(15 downto 8) <= rx_packet_rd_data;
2161
                        elsif packet_handler_state = PARSE_PACKET_TYPE3 then
2162
                                rx_packet_type(7 downto 0) <= rx_packet_rd_data;
2163
                        end if;
2164
                        if packet_handler_state = HANDLE_IP_PACKET2 then
2165
                                ip_packet_version <= rx_packet_rd_data(7 downto 4);
2166
                        end if;
2167
                        if packet_handler_state = HANDLE_IP_PACKET3 then
2168
                                ip_packet_protocol <= rx_packet_rd_data;
2169
                        end if;
2170
                        if packet_handler_state = HANDLE_IP_PACKET2 then
2171
                                ip_packet_header_length(3 downto 0) <= rx_packet_rd_data(3 downto 0);
2172
                                ip_packet_header_length(7 downto 4) <= X"0";
2173
                        elsif packet_handler_state = HANDLE_IP_PACKET3 then
2174
                                ip_packet_header_length <= ip_packet_header_length(5 downto 0) & "00";
2175
                        end if;
2176
                        if packet_handler_state = HANDLE_IP_PACKET4 then
2177
                                next_protocol_start_addr <= RESIZE(unsigned(ip_packet_header_length), 11) + "00000010010"; -- src/dest mac + protocol + status reg (4 bytes)
2178
                        end if;
2179
                        if packet_handler_state = HANDLE_IP_PACKET4 then
2180
                                ip_packet_destination_ip(31 downto 24) <= rx_packet_rd_data;
2181
                        elsif packet_handler_state = HANDLE_IP_PACKET5 then
2182
                                ip_packet_destination_ip(23 downto 16) <= rx_packet_rd_data;
2183
                        elsif packet_handler_state = HANDLE_IP_PACKET6 then
2184
                                ip_packet_destination_ip(15 downto 8) <= rx_packet_rd_data;
2185
                        elsif packet_handler_state = HANDLE_IP_PACKET7 then
2186
                                ip_packet_destination_ip(7 downto 0) <= rx_packet_rd_data;
2187
                        end if;
2188
                        if packet_handler_state = HANDLE_IP_PACKET8 then
2189
                                ip_packet_length(15 downto 8) <= rx_packet_rd_data;
2190
                        elsif packet_handler_state = HANDLE_IP_PACKET9 then
2191
                                ip_packet_length(7 downto 0) <= rx_packet_rd_data;
2192
                        end if;
2193
                        if packet_handler_state = HANDLE_IP_PACKET10 then -- TODO Rename ip_packet_length ?
2194
                                total_packet_length <= unsigned(ip_packet_length) + X"0012"; -- src/dest mac + protocol + status reg (4 bytes)
2195
                        end if;
2196
                        if packet_handler_state = PARSE_UDP_PACKET2 then
2197
                                udp_source_port(15 downto 8) <= rx_packet_rd_data;
2198
                        elsif packet_handler_state = PARSE_UDP_PACKET3 then
2199
                                udp_source_port(7 downto 0) <= rx_packet_rd_data;
2200
                        end if;
2201
                        if packet_handler_state = PARSE_UDP_PACKET4 then
2202
                                udp_dest_port(15 downto 8) <= rx_packet_rd_data;
2203
                        elsif packet_handler_state = PARSE_UDP_PACKET5 then
2204
                                udp_dest_port(7 downto 0) <= rx_packet_rd_data;
2205
                        end if;
2206
                        if packet_handler_state = PARSE_DHCP_PACKET2 then
2207
                                transaction_id_rd(31 downto 24) <= rx_packet_rd_data;
2208
                        elsif packet_handler_state = PARSE_DHCP_PACKET3 then
2209
                                transaction_id_rd(23 downto 16) <= rx_packet_rd_data;
2210
                        elsif packet_handler_state = PARSE_DHCP_PACKET4 then
2211
                                transaction_id_rd(15 downto 8) <= rx_packet_rd_data;
2212
                        elsif packet_handler_state = PARSE_DHCP_PACKET5 then
2213
                                transaction_id_rd(7 downto 0) <= rx_packet_rd_data;
2214
                        end if;
2215
                        if packet_handler_state = PARSE_DHCP_PACKET6 then
2216
                                dhcp_your_ip_addr(31 downto 24) <= rx_packet_rd_data;
2217
                        elsif packet_handler_state = PARSE_DHCP_PACKET7 then
2218
                                dhcp_your_ip_addr(23 downto 16) <= rx_packet_rd_data;
2219
                        elsif packet_handler_state = PARSE_DHCP_PACKET8 then
2220
                                dhcp_your_ip_addr(15 downto 8) <= rx_packet_rd_data;
2221
                        elsif packet_handler_state = PARSE_DHCP_PACKET9 then
2222
                                dhcp_your_ip_addr(7 downto 0) <= rx_packet_rd_data;
2223
                        end if;
2224
                        if packet_handler_state = PARSE_DHCP_PACKET10 then
2225
                                dhcp_server_ip_addr(31 downto 24) <= rx_packet_rd_data;
2226
                        elsif packet_handler_state = PARSE_DHCP_PACKET11 then
2227
                                dhcp_server_ip_addr(23 downto 16) <= rx_packet_rd_data;
2228
                        elsif packet_handler_state = PARSE_DHCP_PACKET12 then
2229
                                dhcp_server_ip_addr(15 downto 8) <= rx_packet_rd_data;
2230
                        elsif packet_handler_state = PARSE_DHCP_PACKET13 then
2231
                                dhcp_server_ip_addr(7 downto 0) <= rx_packet_rd_data;
2232
                        end if;
2233
                        if packet_handler_state = PARSE_DHCP_PACKET14 then
2234
                                dhcp_magic_cookie(31 downto 24) <= rx_packet_rd_data;
2235
                        elsif packet_handler_state = PARSE_DHCP_PACKET15 then
2236
                                dhcp_magic_cookie(23 downto 16) <= rx_packet_rd_data;
2237
                        elsif packet_handler_state = PARSE_DHCP_PACKET16 then
2238
                                dhcp_magic_cookie(15 downto 8) <= rx_packet_rd_data;
2239
                        elsif packet_handler_state = PARSE_DHCP_PACKET17 then
2240
                                dhcp_magic_cookie(7 downto 0) <= rx_packet_rd_data;
2241
                        end if;
2242
                        if packet_handler_state = PARSE_DHCP_PACKET21 then
2243
                                dhcp_option <= rx_packet_rd_data;
2244
                        end if;
2245
                        if packet_handler_state = PARSE_DHCP_PACKET22 then
2246
                                dhcp_option_length <= rx_packet_rd_data;
2247
                        end if;
2248
                        if packet_handler_state = PARSE_DHCP_PACKET18 then
2249
                                dhcp_option_addr <= "001"&X"1E";
2250
                        elsif packet_handler_state = PARSE_DHCP_PACKET23 then
2251
                                dhcp_option_addr <= dhcp_option_addr + RESIZE(unsigned(dhcp_option_length), 11);
2252
                        end if;
2253
                        if packet_handler_state = PARSE_DHCP_PACKET23 then
2254
                                dhcp_message_type <= rx_packet_rd_data;
2255
                        end if;
2256
                        if (packet_handler_state = CHECK_TCP_SYN_PACKET0) then
2257
                                client_mac_addr(47 downto 40) <= rx_packet_source_mac(47 downto 40);
2258
                        elsif (packet_handler_state = CHECK_TCP_SYN_PACKET1) then
2259
                                client_mac_addr(39 downto 32) <= rx_packet_source_mac(39 downto 32);
2260
                        elsif (packet_handler_state = CHECK_TCP_SYN_PACKET2) then
2261
                                client_mac_addr(31 downto 24) <= rx_packet_source_mac(31 downto 24);
2262
                        elsif (packet_handler_state = CHECK_TCP_SYN_PACKET3) then
2263
                                client_mac_addr(23 downto 16) <= rx_packet_source_mac(23 downto 16);
2264
                        elsif (packet_handler_state = CHECK_TCP_SYN_PACKET4) then
2265
                                client_mac_addr(15 downto 8) <= rx_packet_source_mac(15 downto 8);
2266
                        elsif (packet_handler_state = CHECK_TCP_SYN_PACKET5) then
2267
                                client_mac_addr(7 downto 0) <= rx_packet_source_mac(7 downto 0);
2268
                        end if;
2269
                        if packet_handler_state = PARSE_TCP_PACKET2 then
2270
                                rx_tcp_source_port(15 downto 8) <= rx_packet_rd_data;
2271
                        elsif packet_handler_state = PARSE_TCP_PACKET3 then
2272
                                rx_tcp_source_port(7 downto 0) <= rx_packet_rd_data;
2273
                        end if;
2274
                        if packet_handler_state = PARSE_TCP_PACKET4 then
2275
                                rx_tcp_dest_port(15 downto 8) <= rx_packet_rd_data;
2276
                        elsif packet_handler_state = PARSE_TCP_PACKET5 then
2277
                                rx_tcp_dest_port(7 downto 0) <= rx_packet_rd_data;
2278
                        end if;
2279
                        if packet_handler_state = PARSE_TCP_PACKET6 then
2280
                                rx_tcp_seq_number(31 downto 24) <= rx_packet_rd_data;
2281
                        elsif packet_handler_state = PARSE_TCP_PACKET7 then
2282
                                rx_tcp_seq_number(23 downto 16) <= rx_packet_rd_data;
2283
                        elsif packet_handler_state = PARSE_TCP_PACKET8 then
2284
                                rx_tcp_seq_number(15 downto 8) <= rx_packet_rd_data;
2285
                        elsif packet_handler_state = PARSE_TCP_PACKET9 then
2286
                                rx_tcp_seq_number(7 downto 0) <= rx_packet_rd_data;
2287
                        end if;
2288
                        if packet_handler_state = PARSE_TCP_PACKET10 then
2289
                                rx_tcp_ack_number(31 downto 24) <= rx_packet_rd_data;
2290
                        elsif packet_handler_state = PARSE_TCP_PACKET11 then
2291
                                rx_tcp_ack_number(23 downto 16) <= rx_packet_rd_data;
2292
                        elsif packet_handler_state = PARSE_TCP_PACKET12 then
2293
                                rx_tcp_ack_number(15 downto 8) <= rx_packet_rd_data;
2294
                        elsif packet_handler_state = PARSE_TCP_PACKET13 then
2295
                                rx_tcp_ack_number(7 downto 0) <= rx_packet_rd_data;
2296
                        end if;
2297
                        if packet_handler_state = PARSE_TCP_PACKET14 then
2298
                                rx_tcp_header_length <= "00"&rx_packet_rd_data(7 downto 2);
2299
                        end if;
2300
                        if packet_handler_state = PARSE_TCP_PACKET15 then
2301
                                rx_tcp_flags <= rx_packet_rd_data;
2302
                        end if;
2303
                        if packet_handler_state = PARSE_TCP_PACKET14 then
2304
                                rx_data_length <= unsigned(ip_packet_length);
2305
                        elsif packet_handler_state = PARSE_TCP_PACKET15 then
2306
                                rx_data_length <= rx_data_length - RESIZE(unsigned(rx_tcp_header_length), 16);
2307
                        elsif packet_handler_state = PARSE_TCP_PACKET16 then
2308
                                rx_data_length <= rx_data_length - RESIZE(unsigned(ip_packet_header_length), 16);
2309
                        end if;
2310
                        if packet_handler_state = PARSE_TCP_PACKET15 then
2311
                                rx_data_start_addr <= next_protocol_start_addr;
2312
                        elsif packet_handler_state = PARSE_TCP_PACKET16 then
2313
                                rx_data_start_addr <= rx_data_start_addr + RESIZE(unsigned(rx_tcp_header_length), 11);
2314
                        end if;
2315
                        if packet_handler_state = PARSE_TCP_PACKET16 then
2316
                                rx_tcp_window_size(15 downto 8) <= rx_packet_rd_data;
2317
                        elsif packet_handler_state = PARSE_TCP_PACKET17 then
2318
                                rx_tcp_window_size(7 downto 0) <= rx_packet_rd_data;
2319
                        end if;
2320
                        if packet_handler_state = PARSE_TCP_PACKET18 then
2321
                                rx_tcp_checksum(15 downto 8) <= rx_packet_rd_data;
2322
                        elsif packet_handler_state = PARSE_TCP_PACKET19 then
2323
                                rx_tcp_checksum(7 downto 0) <= rx_packet_rd_data;
2324
                        end if;
2325
                        if packet_handler_state = PARSE_TCP_PACKET19 then
2326
                                tcp_option_addr <= rx_packet_ram_rd_addr + "00000000010"; -- skip 2 blanks after checksum
2327
                        elsif packet_handler_state = PARSE_TCP_PACKET26 then
2328
                                tcp_option_addr <= tcp_option_addr + 1;
2329
                        elsif packet_handler_state = PARSE_TCP_PACKET27 then
2330
                                tcp_option_addr <= tcp_option_addr + RESIZE(rx_tcp_option_length, 11);
2331
                        end if;
2332
                        if packet_handler_state = PARSE_TCP_PACKET22 then
2333
                                rx_tcp_option <= rx_packet_rd_data;
2334
                        end if;
2335
                        if packet_handler_state = PARSE_TCP_PACKET23 then
2336
                                rx_tcp_option_length <= unsigned(rx_packet_rd_data);
2337
                        end if;
2338
                        if packet_handler_state = PARSE_TCP_PACKET24 then
2339
                                rx_tcp_window_shift <= rx_packet_rd_data(3 downto 0);
2340
                        end if;
2341
                end if;
2342
        end process;
2343
 
2344
        -- TODO Could disable window shift via linux kernel..?
2345
        with rx_tcp_window_shift select
2346
                rx_tcp_window_size_shifted <= "0000000000000000"&rx_tcp_window_size when X"0",
2347
                                                                                                "000000000000000"&rx_tcp_window_size&"0" when X"1",
2348
                                                                                                "00000000000000"&rx_tcp_window_size&"00" when X"2",
2349
                                                                                                "0000000000000"&rx_tcp_window_size&"000" when X"3",
2350
                                                                                                "000000000000"&rx_tcp_window_size&"0000" when X"4",
2351
                                                                                                "00000000000"&rx_tcp_window_size&"00000" when X"5",
2352
                                                                                                "0000000000"&rx_tcp_window_size&"000000" when X"6",
2353
                                                                                                "000000000"&rx_tcp_window_size&"0000000" when X"7",
2354
                                                                                                "00000000"&rx_tcp_window_size&"00000000" when X"8",
2355
                                                                                                "0000000"&rx_tcp_window_size&"000000000" when X"9",
2356
                                                                                                "000000"&rx_tcp_window_size&"0000000000" when X"A",
2357
                                                                                                "00000"&rx_tcp_window_size&"00000000000" when X"B",
2358
                                                                                                "0000"&rx_tcp_window_size&"000000000000" when X"C",
2359
                                                                                                "000"&rx_tcp_window_size&"0000000000000" when X"D",
2360
                                                                                                "00"&rx_tcp_window_size&"00000000000000" when X"E",
2361
                                                                                                "0"&rx_tcp_window_size&"000000000000000" when others;
2362
 
2363
        DHCP_PROC: process(CLK_IN)
2364
   begin
2365
      if rising_edge(CLK_IN) then
2366
                        if packet_handler_state = HANDLE_DHCP_ACK1 then
2367
                                ip_addr <= dhcp_your_ip_addr;
2368
                                client_ip_addr <= dhcp_server_ip_addr;
2369
                        end if;
2370
                        if tx_packet_state = INIT_DHCP_DISCOVER_METADATA then
2371
                                expecting_dhcp_offer <= '1';
2372
                        elsif tx_packet_state = INIT_DHCP_REQUEST_METADATA then
2373
                                expecting_dhcp_offer <= '0';
2374
                        elsif tx_packet_state = CANCEL_DHCP_CONNECT_ST then
2375
                                expecting_dhcp_offer <= '0';
2376
                        end if;
2377
                        if tx_packet_state = INIT_DHCP_REQUEST_METADATA then
2378
                                expecting_dhcp_ack <= '1';
2379
                        elsif packet_handler_state = HANDLE_DHCP_ACK1 then
2380
                                expecting_dhcp_ack <= '0';
2381
                        elsif tx_packet_state = CANCEL_DHCP_CONNECT_ST then
2382
                                expecting_dhcp_ack <= '0';
2383
                        end if;
2384
                        if eth_state = TRIGGER_DHCP_DISCOVER then
2385
                                dhcp_addr_locked <= '0';
2386
                        elsif packet_handler_state = HANDLE_DHCP_ACK1 then
2387
                                dhcp_addr_locked <= '1';
2388
                        end if;
2389
                        if eth_state = TRIGGER_ARP_REQUEST then
2390
                                expecting_arp_reply <= '1';
2391
                        elsif packet_handler_state = HANDLE_ARP_REPLY1 then
2392
                                expecting_arp_reply <= '0';
2393
                        end if;
2394
                        if packet_handler_state = HANDLE_ARP_REPLY7 then
2395
                                static_addr_locked <= '1';
2396
                        elsif tx_packet_state = INIT_ARP_REQUEST_METADATA then
2397
                                static_addr_locked <= '0';
2398
                        elsif tx_packet_state = CANCEL_DHCP_CONNECT_ST then
2399
                                static_addr_locked <= '0';
2400
                        end if;
2401
      end if;
2402
   end process;
2403
 
2404
 
2405
--------------------- TX PACKET ------------------------------  
2406
 
2407
        TP_SYNC_PROC: process(CLK_IN)
2408
   begin
2409
      if rising_edge(CLK_IN) then
2410
                        tx_packet_state <= tx_packet_next_state;
2411
      end if;
2412
   end process;
2413
 
2414
        TP_NEXT_STATE_DECODE: process (tx_packet_state, send_arp_reply, send_arp_request, send_icmp_reply,
2415
                                                                                                send_dhcp_discover, send_dhcp_request, frame_rd_cmplt, send_tcp_ack_packet,
2416
                                                                                                        cancel_dhcp_connect, close_tcp_connection, cancel_tcp_connection,
2417
                                                                                                                packet_instruction, checksum_calc_done)
2418
   begin
2419
      tx_packet_next_state <= tx_packet_state;  --default is to stay in current state
2420
      case (tx_packet_state) is
2421
         when IDLE =>
2422
                                if send_arp_reply = '1' then
2423
                                        tx_packet_next_state <= INIT_ARP_REPLY_METADATA;
2424
                                elsif send_arp_request = '1' then
2425
                                        tx_packet_next_state <= INIT_ARP_REQUEST_METADATA;
2426
                                elsif send_icmp_reply = '1' then
2427
                                        tx_packet_next_state <= INIT_ICMP_REPLY_METADATA;
2428
                                elsif send_dhcp_discover = '1' then
2429
                                        tx_packet_next_state <= INIT_DHCP_DISCOVER_METADATA;
2430
                                elsif send_dhcp_request = '1' then
2431
                                        tx_packet_next_state <= INIT_DHCP_REQUEST_METADATA;
2432
                                elsif send_tcp_ack_packet = '1' then
2433
                                        tx_packet_next_state <= INIT_TCP_PACKET_METADATA;
2434
                                elsif cancel_dhcp_connect = '1' then
2435
                                        tx_packet_next_state <= CANCEL_DHCP_CONNECT_ST;
2436
                                elsif close_tcp_connection = '1' then
2437
                                        tx_packet_next_state <= TCP_CONNECTION_CLOSED;
2438
                                elsif cancel_tcp_connection = '1' then
2439
                                        tx_packet_next_state <= CANCEL_TCP_CONNECTION_ST;
2440
                                elsif send_tcp_tx_packet = '1' then
2441
                                        tx_packet_next_state <= INIT_TCP_TX_PACKET_METADATA;
2442
                                end if;
2443
                        when CANCEL_DHCP_CONNECT_ST =>
2444
                                tx_packet_next_state <= IDLE;
2445
                        when CANCEL_TCP_CONNECTION_ST =>
2446
                                tx_packet_next_state <= IDLE;
2447
                        when TCP_CONNECTION_CLOSED =>
2448
                                tx_packet_next_state <= IDLE;
2449
                        when INIT_ARP_REPLY_METADATA =>
2450
                                tx_packet_next_state <= READ_PACKET_BYTE0;
2451
                        when INIT_ARP_REQUEST_METADATA =>
2452
                                tx_packet_next_state <= READ_PACKET_BYTE0;
2453
                        when INIT_ICMP_REPLY_METADATA =>
2454
                                tx_packet_next_state <= READ_PACKET_BYTE0;
2455
                        when INIT_DHCP_DISCOVER_METADATA =>
2456
                                tx_packet_next_state <= READ_PACKET_BYTE0;
2457
                        when INIT_DHCP_REQUEST_METADATA =>
2458
                                tx_packet_next_state <= READ_PACKET_BYTE0;
2459
                        when INIT_TCP_PACKET_METADATA =>
2460
                                tx_packet_next_state <= READ_PACKET_BYTE0;
2461
                        when INIT_TCP_TX_PACKET_METADATA =>
2462
                                tx_packet_next_state <= READ_PACKET_BYTE0;
2463
                        when READ_PACKET_BYTE0 =>
2464
                                tx_packet_next_state <= READ_PACKET_BYTE1;
2465
                        when READ_PACKET_BYTE1 =>
2466
                                if frame_rd_cmplt = '1' then
2467
                                        tx_packet_next_state <= HANDLE_PACKET_INSTRUCTION0;
2468
                                end if;
2469
                        when HANDLE_PACKET_INSTRUCTION0 =>
2470
                                if packet_instruction = X"FF" then
2471
                                        tx_packet_next_state <= COMPLETE;
2472
                                elsif packet_instruction = X"17" then
2473
                                        tx_packet_next_state <= SET_RX_PACKET_ADDR_LOWER_BYTE;
2474
                                elsif packet_instruction = X"18" then
2475
                                        tx_packet_next_state <= SET_RX_PACKET_ADDR_UPPER_BYTE;
2476
                                elsif packet_instruction = X"20" then
2477
                                        tx_packet_next_state <= SET_CHECKSUM_LENGTH_LSB;
2478
                                elsif packet_instruction = X"21" then
2479
                                        tx_packet_next_state <= SET_CHECKSUM_LENGTH_MSB;
2480
                                elsif packet_instruction = X"22" then
2481
                                        tx_packet_next_state <= SET_CHECKSUM_START_ADDR_LSB;
2482
                                elsif packet_instruction = X"23" then
2483
                                        tx_packet_next_state <= SET_CHECKSUM_START_ADDR_MSB;
2484
                                elsif packet_instruction = X"24" then
2485
                                        tx_packet_next_state <= SET_CHECKSUM_WR_ADDR_LSB;
2486
                                elsif packet_instruction = X"25" then
2487
                                        tx_packet_next_state <= SET_CHECKSUM_WR_ADDR_MSB;
2488
                                elsif packet_instruction = X"26" then
2489
                                        tx_packet_next_state <= TRIG_CHECKSUM_CALC;
2490
                                elsif packet_instruction = X"29" then
2491
                                        tx_packet_next_state <= MOVE_TX_PACKET_WR_ADDR;
2492
                                elsif packet_instruction = X"2E" then
2493
                                        tx_packet_next_state <= SET_NEW_TRANSACTION_ID;
2494
                                elsif packet_instruction = X"50" then
2495
                                        tx_packet_next_state <= SET_CHECKSUM_START_VAL_LSB;
2496
                                elsif packet_instruction = X"51" then
2497
                                        tx_packet_next_state <= SET_CHECKSUM_START_VAL_MSB;
2498
                                elsif packet_instruction = X"52" then
2499
                                        tx_packet_next_state <= TRIGGER_CHECKSUM_LOAD_INITIAL_VALUE;
2500
                                elsif packet_instruction = X"57" then
2501
                                        tx_packet_next_state <= INIT_LOAD_TX_PACKET_DATA;
2502
                                elsif packet_instruction = X"58" then
2503
                                        tx_packet_next_state <= SET_CHECKSUM_LENGTH_TX_PACKET_LENGTH0;
2504
                                elsif packet_instruction = X"59" then
2505
                                        tx_packet_next_state <= SET_CHECKSUM_INITIAL_VALUE_TX_PACKET;
2506
                                else
2507
                                        tx_packet_next_state <= HANDLE_PACKET_INSTRUCTION1;
2508
                                end if;
2509
                        when HANDLE_PACKET_INSTRUCTION1 =>
2510
                                tx_packet_next_state <= READ_PACKET_BYTE0;
2511
 
2512
                        when SET_RX_PACKET_ADDR_LOWER_BYTE =>
2513
                                tx_packet_next_state <= READ_PACKET_BYTE0;
2514
                        when SET_RX_PACKET_ADDR_UPPER_BYTE =>
2515
                                tx_packet_next_state <= READ_PACKET_BYTE0;
2516
 
2517
                        when SET_CHECKSUM_LENGTH_LSB =>
2518
                                tx_packet_next_state <= READ_PACKET_BYTE0;
2519
                        when SET_CHECKSUM_LENGTH_MSB =>
2520
                                tx_packet_next_state <= READ_PACKET_BYTE0;
2521
 
2522
                        when SET_CHECKSUM_START_ADDR_LSB =>
2523
                                tx_packet_next_state <= READ_PACKET_BYTE0;
2524
                        when SET_CHECKSUM_START_ADDR_MSB =>
2525
                                tx_packet_next_state <= READ_PACKET_BYTE0;
2526
 
2527
                        when SET_CHECKSUM_WR_ADDR_LSB =>
2528
                                tx_packet_next_state <= READ_PACKET_BYTE0;
2529
                        when SET_CHECKSUM_WR_ADDR_MSB =>
2530
                                tx_packet_next_state <= READ_PACKET_BYTE0;
2531
 
2532
                        when SET_CHECKSUM_LENGTH_TX_PACKET_LENGTH0 =>
2533
                                tx_packet_next_state <= SET_CHECKSUM_LENGTH_TX_PACKET_LENGTH1;
2534
                        when SET_CHECKSUM_LENGTH_TX_PACKET_LENGTH1 =>
2535
                                tx_packet_next_state <= READ_PACKET_BYTE0;
2536
 
2537
                        when TRIG_CHECKSUM_CALC =>
2538
                                tx_packet_next_state <= WAIT_FOR_CHECKSUM_CMPLT;
2539
                        when WAIT_FOR_CHECKSUM_CMPLT =>
2540
                                if checksum_calc_done = '1' then
2541
                                        tx_packet_next_state <= READ_PACKET_BYTE0;
2542
                                end if;
2543
 
2544
                        when MOVE_TX_PACKET_WR_ADDR =>
2545
                                tx_packet_next_state <= READ_PACKET_BYTE0;
2546
 
2547
                        when SET_NEW_TRANSACTION_ID =>
2548
                                tx_packet_next_state <= READ_PACKET_BYTE0;
2549
 
2550
                        when SET_CHECKSUM_START_VAL_LSB =>
2551
                                tx_packet_next_state <= READ_PACKET_BYTE0;
2552
                        when SET_CHECKSUM_START_VAL_MSB =>
2553
                                tx_packet_next_state <= READ_PACKET_BYTE0;
2554
                        when TRIGGER_CHECKSUM_LOAD_INITIAL_VALUE =>
2555
                                tx_packet_next_state <= READ_PACKET_BYTE0;
2556
                        when SET_CHECKSUM_INITIAL_VALUE_TX_PACKET =>
2557
                                tx_packet_next_state <= READ_PACKET_BYTE0;
2558
 
2559
                        when INIT_LOAD_TX_PACKET_DATA =>
2560
                                tx_packet_next_state <= LOAD_TX_PACKET_DATA;
2561
                        when LOAD_TX_PACKET_DATA =>
2562
                                if tx_packet_data_counter = X"001" then
2563
                                        tx_packet_next_state <= HANDLE_PACKET_INSTRUCTION1;
2564
                                end if;
2565
 
2566
                        when COMPLETE =>
2567
                                tx_packet_next_state <= IDLE;
2568
 
2569
                end case;
2570
        end process;
2571
 
2572
        packet_instruction <= frame_data(15 downto 8);
2573
 
2574
        with packet_instruction(6 downto 0) select
2575
                packet_data <= frame_data(7 downto 0)                                                    when "000"&X"0",
2576
                                                        mac_addr(7 downto 0)                                                     when "000"&X"1",
2577
                                                        mac_addr(15 downto 8)                                                   when "000"&X"2",
2578
                                                        mac_addr(23 downto 16)                                                  when "000"&X"3",
2579
                                                        mac_addr(31 downto 24)                                                  when "000"&X"4",
2580
                                                        mac_addr(39 downto 32)                                                  when "000"&X"5",
2581
                                                        mac_addr(47 downto 40)                                                  when "000"&X"6",
2582
                                                        rx_packet_source_mac(7 downto 0)                         when "000"&X"7",
2583
                                                        rx_packet_source_mac(15 downto 8)                       when "000"&X"8",
2584
                                                        rx_packet_source_mac(23 downto 16)                      when "000"&X"9",
2585
                                                        rx_packet_source_mac(31 downto 24)                      when "000"&X"A",
2586
                                                        rx_packet_source_mac(39 downto 32)                      when "000"&X"B",
2587
                                                        rx_packet_source_mac(47 downto 40)                      when "000"&X"C",
2588
                                                        ip_addr(7 downto 0)                                                              when "000"&X"D",
2589
                                                        ip_addr(15 downto 8)                                                    when "000"&X"E",
2590
                                                        ip_addr(23 downto 16)                                                   when "000"&X"F",
2591
                                                        ip_addr(31 downto 24)                                                   when "001"&X"0",
2592
                                                        arp_source_ip_addr(7 downto 0)                           when "001"&X"1",
2593
                                                        arp_source_ip_addr(15 downto 8)                                 when "001"&X"2",
2594
                                                        arp_source_ip_addr(23 downto 16)                        when "001"&X"3",
2595
                                                        arp_source_ip_addr(31 downto 24)                        when "001"&X"4",
2596
                                                        ip_identification(7 downto 0)                                    when "001"&X"5",
2597
                                                        ip_identification(15 downto 8)                                  when "001"&X"6",
2598
                                                        X"00"                                                                                                   when "001"&X"7", -- set rx read lower byte
2599
                                                        X"00"                                                                                                   when "001"&X"8", -- set rx read upper byte
2600
                                                        rx_packet_rd_data2                                                              when "001"&X"9",
2601
                                                        cloud_ip_addr(7 downto 0)                                                when "001"&X"A",
2602
                                                        cloud_ip_addr(15 downto 8)                                              when "001"&X"B",
2603
                                                        cloud_ip_addr(23 downto 16)                                     when "001"&X"C",
2604
                                                        cloud_ip_addr(31 downto 24)                                     when "001"&X"D",
2605
                                                        X"00"                                                                                                   when "010"&X"0", -- set checksum length lsb
2606
                                                        X"00"                                                                                                   when "010"&X"1", -- set checksum length msb
2607
                                                        X"00"                                                                                                   when "010"&X"2", -- set checksum start addr lsb
2608
                                                        X"00"                                                                                                   when "010"&X"3", -- set checksum start addr msb
2609
                                                        X"00"                                                                                                   when "010"&X"4", -- set checksum wr addr lsb
2610
                                                        X"00"                                                                                                   when "010"&X"5", -- set checksum wr addr msb
2611
                                                        X"00"                                                                                                   when "010"&X"6", -- trigger checksum calc
2612
                                                        checksum(7 downto 0)                                                     when "010"&X"7",
2613
                                                        checksum(15 downto 8)                                                   when "010"&X"8",
2614
                                                        X"00"                                                                                                   when "010"&X"9", -- set tx write addr to checksum wr addr
2615
                                                        dhcp_transaction_id(7 downto 0)                          when "010"&X"A",
2616
                                                        dhcp_transaction_id(15 downto 8)                                when "010"&X"B",
2617
                                                        dhcp_transaction_id(23 downto 16)                       when "010"&X"C",
2618
                                                        dhcp_transaction_id(31 downto 24)                       when "010"&X"D",
2619
                                                        X"00"                                                                                                   when "010"&X"E", -- set new transaction ID
2620
                                                        dhcp_server_ip_addr(7 downto 0)                          when "010"&X"F",
2621
                                                        dhcp_server_ip_addr(15 downto 8)                                when "011"&X"0",
2622
                                                        dhcp_server_ip_addr(23 downto 16)                       when "011"&X"1",
2623
                                                        dhcp_server_ip_addr(31 downto 24)                       when "011"&X"2",
2624
                                                        dhcp_your_ip_addr(7 downto 0)                                    when "011"&X"3",
2625
                                                        dhcp_your_ip_addr(15 downto 8)                          when "011"&X"4",
2626
                                                        dhcp_your_ip_addr(23 downto 16)                         when "011"&X"5",
2627
                                                        dhcp_your_ip_addr(31 downto 24)                         when "011"&X"6",
2628
                                                        client_ip_addr(7 downto 0)                                               when "011"&X"7",
2629
                                                        client_ip_addr(15 downto 8)                                     when "011"&X"8",
2630
                                                        client_ip_addr(23 downto 16)                                    when "011"&X"9",
2631
                                                        client_ip_addr(31 downto 24)                                    when "011"&X"A",
2632
                                                        client_mac_addr(7 downto 0)                                      when "011"&X"B",
2633
                                                        client_mac_addr(15 downto 8)                                    when "011"&X"C",
2634
                                                        client_mac_addr(23 downto 16)                           when "011"&X"D",
2635
                                                        client_mac_addr(31 downto 24)                           when "011"&X"E",
2636
                                                        client_mac_addr(39 downto 32)                           when "011"&X"F",
2637
                                                        client_mac_addr(47 downto 40)                           when "100"&X"0",
2638
                                                        listen_port(7 downto 0)                                                  when "100"&X"1",
2639
                                                        listen_port(15 downto 8)                                                when "100"&X"2",
2640
                                                        client_port(7 downto 0)                                                  when "100"&X"3",
2641
                                                        client_port(15 downto 8)                                                when "100"&X"4",
2642
                                                        slv(tcp_sequence_number(7 downto 0))             when "100"&X"5",
2643
                                                        slv(tcp_sequence_number(15 downto 8))           when "100"&X"6",
2644
                                                        slv(tcp_sequence_number(23 downto 16))          when "100"&X"7",
2645
                                                        slv(tcp_sequence_number(31 downto 24))          when "100"&X"8",
2646
                                                        slv(tcp_acknowledge_number(7 downto 0))                  when "100"&X"9",
2647
                                                        slv(tcp_acknowledge_number(15 downto 8))                        when "100"&X"A",
2648
                                                        slv(tcp_acknowledge_number(23 downto 16))                       when "100"&X"B",
2649
                                                        slv(tcp_acknowledge_number(31 downto 24))                       when "100"&X"C",
2650
                                                        tcp_flags(7 downto 0)                                                                    when "100"&X"D",
2651
                                                        slv(window_size(7 downto 0))                                                     when "100"&X"E",
2652
                                                        slv(X"0"&window_size(11 downto 8))                                       when "100"&X"F",
2653
                                                        X"00"                                                                                                                   when "101"&X"0", -- Set initial checksum value
2654
                                                        X"00"                                                                                                                   when "101"&X"1", -- Set initial checksum value
2655
                                                        X"00"                                                                                                                   when "101"&X"2", -- Load initial checksum value
2656
                                                        slv(tcp_ip_identification(7 downto 0))                           when "101"&X"3",
2657
                                                        slv(tcp_ip_identification(15 downto 8))                 when "101"&X"4",
2658
                                                        slv(tx_total_packet_length(7 downto 0))                  when "101"&X"5", -- Data packet length + headers
2659
                                                        slv(X"0"&tx_total_packet_length(11 downto 8))    when "101"&X"6", -- Data packet length + headers
2660
                                                        tcp_tx_data                                                                                                     when "101"&X"7", -- TX Data
2661
                                                        X"00"                                                                                                                   when "101"&X"8", -- Set checksum length to tx data length
2662
                                                        X"00"                                                                                                                   when "101"&X"9", -- Set initial checksum value to length + protocol (6)
2663
                                                        X"00"                                                                                                                   when others;
2664
 
2665
        tcp_sequence_number_p1 <= tcp_sequence_number + 1;
2666
 
2667
        METADATA_PTOC: process(CLK_IN)
2668
        begin
2669
                if rising_edge(CLK_IN) then
2670
                        ip_identification <= lfsr_val(15 downto 0);
2671
                        if tx_packet_state = SET_NEW_TRANSACTION_ID then
2672
                                dhcp_transaction_id <= lfsr_val;
2673
                        end if;
2674
                        if packet_handler_state = CHECK_TCP_SYN_PACKET0 then
2675
                                tcp_ip_identification <= unsigned(lfsr_val(15 downto 0));
2676
                        elsif packet_handler_state = CHECK_TCP_PSH_ACK_PACKET2 then
2677
                                tcp_ip_identification <= tcp_ip_identification + 1;
2678
                        end if;
2679
                        if packet_handler_state = PARSE_TCP_PACKET4 and tcp_connection_active = '0' then
2680
                                client_port <= rx_tcp_source_port;
2681
                        end if;
2682
                        if packet_handler_state = CHECK_TCP_SYN_PACKET0 then
2683
                                tcp_sequence_number <= unsigned(lfsr_val);
2684
                        elsif packet_handler_state = PARSE_TCP_PACKET0 and sent_syn_ack = '1' then
2685
                                tcp_sequence_number <= tcp_sequence_number + 1;
2686
                        elsif packet_handler_state = TRIGGER_TCP_PSH_ACK3 then
2687
                                tcp_sequence_number <= tcp_sequence_number + RESIZE(tx_bytes_to_send, 32);
2688
                        end if;
2689
                        if packet_handler_state = CHECK_TCP_SYN_PACKET0 then
2690
                                tcp_acknowledge_number <= unsigned(rx_tcp_seq_number) + 1;
2691
                        elsif packet_handler_state = TRIGGER_TCP_ACK0 and fin_received = '1' then
2692
                                tcp_acknowledge_number <= tcp_acknowledge_number + 1;
2693
                        elsif packet_handler_state = CHECK_TCP_PSH_ACK_PACKET3 then
2694
                                tcp_acknowledge_number <= tcp_acknowledge_number + RESIZE(rx_data_length, 32);
2695
                        end if;
2696
                        if packet_handler_state = TRIGGER_TCP_ACK0 then
2697
                                if fin_received = '1' then
2698
                                        tcp_flags <= C_tcp_fin_ack_flags;
2699
                                elsif syn_ack_packet = '1' then
2700
                                        tcp_flags <= C_tcp_syn_ack_flags;
2701
                                else
2702
                                        tcp_flags <= C_tcp_ack_flags;
2703
                                end if;
2704
                        elsif packet_handler_state = TRIGGER_TCP_PSH_ACK2 then
2705
                                tcp_flags <= C_tcp_psh_ack_flags;
2706
                        end if;
2707
                        if packet_handler_state = TRIGGER_TCP_ACK0 then
2708
                                window_size <= X"FFF" - unsigned(tcp_rd_data_count);
2709
                        elsif packet_handler_state = TRIGGER_TCP_ACK1 then
2710
                                window_size <= X"FFF" - unsigned(tcp_rd_data_count);
2711
                        end if;
2712
                        if packet_handler_state = CHECK_TCP_SYN_PACKET0 then
2713
                                fin_received <= '0';
2714
                        elsif rx_tcp_flags(0) = '1' then
2715
                                fin_received <= '1';
2716
                        end if;
2717
                        fin_received_p <= fin_received;
2718
                        if fin_received = '1' and fin_received_p = '0' then
2719
                                trigger_fin_ack <= '1';
2720
                        else
2721
                                trigger_fin_ack <= '0';
2722
                        end if;
2723
                        if packet_handler_state = CHECK_TCP_SYN_PACKET0 then
2724
                                syn_ack_packet <= '1';
2725
                        elsif packet_handler_state = TRIGGER_TCP_ACK0 then
2726
                                syn_ack_packet <= '0';
2727
                        end if;
2728
                        if packet_handler_state = TRIGGER_TCP_ACK0 and syn_ack_packet = '1' then
2729
                                sent_syn_ack <= '1';
2730
                        elsif packet_handler_state = CHECK_TCP_PSH_ACK_PACKET0 then
2731
                                sent_syn_ack <= '0';
2732
                        end if;
2733
                        if packet_handler_state = CHECK_TCP_SYN_PACKET0 then
2734
                                tcp_connection_active <= '1';
2735
                        elsif fin_received = '1' then
2736
                                tcp_connection_active <= '0';
2737
                        elsif trigger_close_connection = '1' then
2738
                                tcp_connection_active <= '0';
2739
                        end if;
2740
                        if packet_handler_state = TRIGGER_TCP_PSH_ACK0 then
2741
                                if unsigned(tcp_wr_data_count) > X"580" then
2742
                                        tx_bytes_to_send <= X"580";
2743
                                else
2744
                                        tx_bytes_to_send <= unsigned(tcp_wr_data_count);
2745
                                end if;
2746
                        end if;
2747
                        if packet_handler_state = TRIGGER_TCP_PSH_ACK1 then
2748
                                tx_total_packet_length <= tx_bytes_to_send + X"030"; -- IP Header length (20 Bytes) + TCP Header length (28 Bytes)
2749
                        end if;
2750
                        if packet_handler_state = TRIGGER_TCP_PSH_ACK1 then
2751
                                tx_total_packet_length_inc_mac <= tx_bytes_to_send + X"03E"; -- IP Header length (20 Bytes) + TCP Header length (28 Bytes) + MAC length (14 bytes)
2752
                        end if;
2753
                        if packet_handler_state = TRIGGER_TCP_PSH_ACK1 then
2754
                                tx_total_packet_length_checksum <= tx_bytes_to_send + X"022"; --  TCP Header length (28 Bytes) + Protocol (value=6)
2755
                        end if;
2756
                        -- TODO need to 'lock' tx logic (so previous tx packet isn't overwritten by arp or something)
2757
                        -- Can be achieved by only responding to TCP packets when tx_packet_no_ack_timeout > X"1"
2758
                        if packet_handler_state = TRIGGER_TCP_PSH_ACK3 then
2759
                                tx_packets_no_ack <= tx_packets_no_ack + 1;
2760
                        elsif packet_handler_state = CHECK_TCP_PSH_ACK_PACKET2 then
2761
                                tx_packets_no_ack <= X"0";
2762
                        end if;
2763
                        if tx_packets_no_ack > X"1" then
2764
                                tx_packet_no_ack_timeout <= tx_packet_no_ack_timeout - 1;
2765
                        else
2766
                                tx_packet_no_ack_timeout <= C_100ms;
2767
                        end if;
2768
                        if tx_packets_no_ack < X"2" then
2769
                                tx_packet_timeout_counter <= X"00";
2770
                        elsif tx_packet_no_ack_timeout = X"000000" then
2771
                                tx_packet_timeout_counter <= tx_packet_timeout_counter + 1;
2772
                        end if;
2773
                        tx_packet_timeout_counter_prev <= tx_packet_timeout_counter;
2774
                        if tx_packet_timeout_counter = X"01" and tx_packet_timeout_counter_prev = X"00" then
2775
                                trigger_send_prev_packet <= '1';
2776
                        elsif tx_packet_timeout_counter = X"03" and tx_packet_timeout_counter_prev = X"02" then
2777
                                trigger_send_prev_packet <= '1';
2778
                        elsif tx_packet_timeout_counter = X"07" and tx_packet_timeout_counter_prev = X"06" then
2779
                                trigger_send_prev_packet <= '1';
2780
                        elsif tx_packet_timeout_counter = X"0F" and tx_packet_timeout_counter_prev = X"0E" then
2781
                                trigger_send_prev_packet <= '1';
2782
                        else
2783
                                trigger_send_prev_packet <= '0';
2784
                        end if;
2785
                        if tx_packet_timeout_counter = X"1F" and tx_packet_timeout_counter_prev = X"1E" then
2786
                                trigger_close_connection <= '1';
2787
                        else
2788
                                trigger_close_connection <= '0';
2789
                        end if;
2790
                end if;
2791
        end process;
2792
 
2793
        FRAME_ADDR_LENGTH_PROC: process(CLK_IN)
2794
   begin
2795
      if rising_edge(CLK_IN) then
2796
                        if tx_packet_state = INIT_ARP_REPLY_METADATA then
2797
                                tx_packet_frame_addr <= unsigned(C_arp_reply_frame_addr);
2798
                        elsif tx_packet_state = INIT_ARP_REQUEST_METADATA then
2799
                                tx_packet_frame_addr <= unsigned(C_arp_request_frame_addr);
2800
                        elsif tx_packet_state = INIT_ICMP_REPLY_METADATA then
2801
                                tx_packet_frame_addr <= unsigned(C_icmp_reply_frame_addr);
2802
                        elsif tx_packet_state = INIT_DHCP_DISCOVER_METADATA then
2803
                                tx_packet_frame_addr <= unsigned(C_dhcp_discover_frame_addr);
2804
                        elsif tx_packet_state = INIT_DHCP_REQUEST_METADATA then
2805
                                tx_packet_frame_addr <= unsigned(C_dhcp_request_frame_addr);
2806
                        elsif tx_packet_state = INIT_TCP_PACKET_METADATA then
2807
                                tx_packet_frame_addr <= unsigned(C_tcp_packet_frame_addr);
2808
                        elsif tx_packet_state = INIT_TCP_TX_PACKET_METADATA then
2809
                                tx_packet_frame_addr <= unsigned(C_tcp_tx_packet_frame_addr);
2810
                        elsif tx_packet_state = IDLE then
2811
                                tx_packet_frame_addr <= tx_packet_frame_addr;
2812
                        elsif tx_packet_state = READ_PACKET_BYTE0 then
2813
                                tx_packet_frame_addr <= tx_packet_frame_addr;
2814
                        elsif tx_packet_state = READ_PACKET_BYTE1 then
2815
                                tx_packet_frame_addr <= tx_packet_frame_addr;
2816
                        elsif tx_packet_state = HANDLE_PACKET_INSTRUCTION0 then
2817
                                tx_packet_frame_addr <= tx_packet_frame_addr;
2818
                        elsif tx_packet_state = WAIT_FOR_CHECKSUM_CMPLT then
2819
                                tx_packet_frame_addr <= tx_packet_frame_addr;
2820
                        elsif tx_packet_state = COMPLETE then
2821
                                tx_packet_frame_addr <= tx_packet_frame_addr;
2822
                        elsif tx_packet_state = INIT_LOAD_TX_PACKET_DATA then
2823
                                tx_packet_frame_addr <= tx_packet_frame_addr;
2824
                        elsif tx_packet_state = LOAD_TX_PACKET_DATA then
2825
                                tx_packet_frame_addr <= tx_packet_frame_addr;
2826
                        elsif tx_packet_state = SET_CHECKSUM_LENGTH_TX_PACKET_LENGTH0 then
2827
                                tx_packet_frame_addr <= tx_packet_frame_addr;
2828
                        else
2829
                                tx_packet_frame_addr <= tx_packet_frame_addr + 1;
2830
                        end if;
2831
                        if tx_packet_state = INIT_ARP_REPLY_METADATA then
2832
                                tx_packet_length <= unsigned(C_arp_reply_length);
2833
                        elsif tx_packet_state = INIT_ARP_REQUEST_METADATA then
2834
                                tx_packet_length <= unsigned(C_arp_request_length);
2835
                        elsif tx_packet_state = INIT_ICMP_REPLY_METADATA then
2836
                                tx_packet_length <= unsigned(C_icmp_reply_length);
2837
                        elsif tx_packet_state = INIT_DHCP_DISCOVER_METADATA then
2838
                                tx_packet_length <= unsigned(C_dhcp_discover_length);
2839
                        elsif tx_packet_state = INIT_DHCP_REQUEST_METADATA then
2840
                                tx_packet_length <= unsigned(C_dhcp_request_length);
2841
                        elsif tx_packet_state = INIT_TCP_PACKET_METADATA then
2842
                                tx_packet_length <= unsigned(C_tcp_packet_length);
2843
                        elsif tx_packet_state = INIT_TCP_TX_PACKET_METADATA then
2844
                                tx_packet_length <= RESIZE(unsigned(tx_total_packet_length_inc_mac), 16);
2845
                        end if;
2846
                        if tx_packet_state = INIT_ARP_REPLY_METADATA then
2847
                                tx_packet_end_pointer <= tx_base_addr + unsigned(C_arp_reply_length);
2848
                                prev_tx_packet_end_pointer <= tx_packet_end_pointer;
2849
                        elsif tx_packet_state = INIT_ARP_REQUEST_METADATA then
2850
                                tx_packet_end_pointer <= tx_base_addr + unsigned(C_arp_request_length);
2851
                                prev_tx_packet_end_pointer <= tx_packet_end_pointer;
2852
                        elsif tx_packet_state = INIT_ICMP_REPLY_METADATA then
2853
                                tx_packet_end_pointer <= tx_base_addr + unsigned(C_icmp_reply_length);
2854
                                prev_tx_packet_end_pointer <= tx_packet_end_pointer;
2855
                        elsif tx_packet_state = INIT_DHCP_DISCOVER_METADATA then
2856
                                tx_packet_end_pointer <= tx_base_addr + unsigned(C_dhcp_discover_length);
2857
                                prev_tx_packet_end_pointer <= tx_packet_end_pointer;
2858
                        elsif tx_packet_state = INIT_DHCP_REQUEST_METADATA then
2859
                                tx_packet_end_pointer <= tx_base_addr + unsigned(C_dhcp_discover_length);
2860
                                prev_tx_packet_end_pointer <= tx_packet_end_pointer;
2861
                        elsif tx_packet_state = INIT_TCP_PACKET_METADATA then
2862
                                tx_packet_end_pointer <= tx_base_addr + unsigned(C_tcp_packet_length);
2863
                                prev_tx_packet_end_pointer <= tx_packet_end_pointer;
2864
                        elsif tx_packet_state = INIT_TCP_TX_PACKET_METADATA then
2865
                                tx_packet_end_pointer <= tx_base_addr + RESIZE(unsigned(tx_total_packet_length_inc_mac), 16);
2866
                                prev_tx_packet_end_pointer <= tx_packet_end_pointer;
2867
                        end if;
2868
                        if tx_packet_state = IDLE then
2869
                                doing_tx_packet_config <= '0';
2870
                        else
2871
                                doing_tx_packet_config <= '1';
2872
                        end if;
2873
                        if tx_packet_state = IDLE then
2874
                                tx_packet_ram_we_addr_buf <= "00000000000";
2875
                        elsif tx_packet_state = HANDLE_PACKET_INSTRUCTION1 then
2876
                                tx_packet_ram_we_addr_buf <= tx_packet_ram_we_addr_buf + 1;
2877
                        elsif tx_packet_state = LOAD_TX_PACKET_DATA then
2878
                                tx_packet_ram_we_addr_buf <= tx_packet_ram_we_addr_buf + 1;
2879
                        elsif tx_packet_state = MOVE_TX_PACKET_WR_ADDR then
2880
                                tx_packet_ram_we_addr_buf <= unsigned(checksum_wr_addr);
2881
                        end if;
2882
                        if tx_packet_state = COMPLETE then
2883
                                tx_packet_ready_for_transmission <= '1';
2884
                        elsif eth_state = HANDLE_TX_TRANSMIT22 then
2885
                                tx_packet_ready_for_transmission <= '0';
2886
                        end if;
2887
                        if tx_packet_state = SET_RX_PACKET_ADDR_LOWER_BYTE then
2888
                                rx_packet_rd2_addr(7 downto 0) <= unsigned(frame_data(7 downto 0));
2889
                        elsif tx_packet_state = SET_RX_PACKET_ADDR_UPPER_BYTE then
2890
                                rx_packet_rd2_addr(10 downto 8) <= unsigned(frame_data(2 downto 0));
2891
                        elsif tx_packet_state = HANDLE_PACKET_INSTRUCTION1 then
2892
                                rx_packet_rd2_addr <= rx_packet_rd2_addr + 1;
2893
                        elsif tx_packet_state = LOAD_TX_PACKET_DATA then
2894
                                rx_packet_rd2_addr <= rx_packet_rd2_addr + 1;
2895
                        end if;
2896
      end if;
2897
   end process;
2898
 
2899
        tx_base_addr <= C_tx_base_addr1 when tx_base_addr_select = '0' else C_tx_base_addr2;
2900
 
2901
        process(CLK_IN)
2902
        begin
2903
                if rising_edge(CLK_IN) then
2904
                        if eth_state = HANDLE_TX_TRANSMIT22 or eth_state = HANDLE_TX_TRANSMIT_PREV16 then
2905
                                tx_base_addr_select <= not(tx_base_addr_select);
2906
                        end if;
2907
                        if eth_state = WAIT_FOR_TRANSMIT_CMPLT then
2908
                                tx_timeout_counter <= tx_timeout_counter - 1;
2909
                        else
2910
                                tx_timeout_counter <= C_20ms;
2911
                        end if;
2912
                end if;
2913
        end process;
2914
 
2915
        tx_packet_ram_data <= packet_data;
2916
        tx_packet_ram_we <= '1' when (tx_packet_state = HANDLE_PACKET_INSTRUCTION1) or (tx_packet_state = LOAD_TX_PACKET_DATA) else '0';
2917
        tx_packet_config_cmplt <= '1' when tx_packet_state = COMPLETE else '0';
2918
 
2919
        tx_packet_ram_we_addr <= unsigned(checksum_addr) when (tx_packet_state = WAIT_FOR_CHECKSUM_CMPLT) else tx_packet_ram_we_addr_buf;
2920
 
2921
        TX_PACKET_RAM : TDP_RAM
2922
                Generic Map (   G_DATA_A_SIZE   => tx_packet_ram_data'length,
2923
                                                        G_ADDR_A_SIZE   => tx_packet_ram_we_addr'length,
2924
                                                        G_RELATION              => 0, --log2(SIZE_A/SIZE_B)
2925
                                                        G_INIT_ZERO             => true,
2926
                                                        G_INIT_FILE             => "")
2927
                Port Map ( CLK_A_IN     => CLK_IN,
2928
                                 WE_A_IN                => tx_packet_ram_we,
2929
                                 ADDR_A_IN              => slv(tx_packet_ram_we_addr),
2930
                                 DATA_A_IN              => tx_packet_ram_data,
2931
                                 DATA_A_OUT             => tx_packet_rd_data2,
2932
                                 CLK_B_IN               => CLK_IN,
2933
                                 WE_B_IN                => '0',
2934
                                 ADDR_B_IN              => slv(tx_packet_ram_rd_addr),
2935
                                 DATA_B_IN              => X"00",
2936
                                 DATA_B_OUT     => tx_packet_rd_data);
2937
 
2938
        CHECKSUM_METADATA_PROC: process(CLK_IN)
2939
   begin
2940
      if rising_edge(CLK_IN) then
2941
                        if tx_packet_state = SET_CHECKSUM_LENGTH_LSB then
2942
                                checksum_count(7 downto 0) <= unsigned(frame_data(7 downto 0));
2943
                        elsif tx_packet_state = SET_CHECKSUM_LENGTH_MSB then
2944
                                checksum_count(10 downto 8) <= unsigned(frame_data(2 downto 0));
2945
                        elsif tx_packet_state = SET_CHECKSUM_LENGTH_TX_PACKET_LENGTH0 then
2946
                                checksum_count(10 downto 0) <= unsigned('0'&tx_bytes_to_send(10 downto 1)) + "00000010010";
2947
                        elsif tx_packet_state = SET_CHECKSUM_LENGTH_TX_PACKET_LENGTH1 then
2948
                                checksum_count(10 downto 0) <= checksum_count(10 downto 0) + ("0000000000"&tx_bytes_to_send(0));
2949
                        end if;
2950
                        if tx_packet_state = SET_CHECKSUM_LENGTH_TX_PACKET_LENGTH1 then
2951
                                checksum_odd_length <= tx_bytes_to_send(0);
2952
                        elsif tx_packet_state = MOVE_TX_PACKET_WR_ADDR then -- clear odd flag before next checksum is calcd
2953
                                checksum_odd_length <= '0';
2954
                        end if;
2955
                        if tx_packet_state = SET_CHECKSUM_START_ADDR_LSB then
2956
                                checksum_start_addr(7 downto 0) <= frame_data(7 downto 0);
2957
                        elsif tx_packet_state = SET_CHECKSUM_START_ADDR_MSB then
2958
                                checksum_start_addr(10 downto 8) <= frame_data(2 downto 0);
2959
                        end if;
2960
                        if tx_packet_state = SET_CHECKSUM_WR_ADDR_LSB then
2961
                                checksum_wr_addr(7 downto 0) <= frame_data(7 downto 0);
2962
                        elsif tx_packet_state = SET_CHECKSUM_WR_ADDR_MSB then
2963
                                checksum_wr_addr(10 downto 8) <= frame_data(2 downto 0);
2964
                        end if;
2965
                        if tx_packet_state = SET_CHECKSUM_START_VAL_LSB then
2966
                                checksum_initial_value(7 downto 0) <= frame_data(7 downto 0);
2967
                        elsif tx_packet_state = SET_CHECKSUM_INITIAL_VALUE_TX_PACKET then
2968
                                checksum_initial_value(7 downto 0) <= slv(tx_total_packet_length_checksum(7 downto 0));
2969
                        end if;
2970
                        if tx_packet_state = SET_CHECKSUM_START_VAL_MSB then
2971
                                checksum_initial_value(15 downto 8) <= frame_data(7 downto 0);
2972
                        elsif tx_packet_state = SET_CHECKSUM_INITIAL_VALUE_TX_PACKET then
2973
                                checksum_initial_value(11 downto 8) <= slv(tx_total_packet_length_checksum(11 downto 8));
2974
                                checksum_initial_value(15 downto 12) <= X"0";
2975
                        end if;
2976
                        if tx_packet_state = TRIGGER_CHECKSUM_LOAD_INITIAL_VALUE then
2977
                                checksum_set_initial_value <= '1';
2978
                        else
2979
                                checksum_set_initial_value <= '0';
2980
                        end if;
2981
                        if tx_packet_state = INIT_LOAD_TX_PACKET_DATA then
2982
                                tx_packet_data_counter <= tx_bytes_to_send - 1;
2983
                        else
2984
                                tx_packet_data_counter <= tx_packet_data_counter - 1;
2985
                        end if;
2986
                end if;
2987
        end process;
2988
 
2989
        calc_checksum <= '1' when tx_packet_state = TRIG_CHECKSUM_CALC else '0';
2990
 
2991
        checksum_calc_mod : checksum_calc
2992
    Port Map ( CLK_IN                                           => CLK_IN,
2993
                                        RST_IN                                          => '0',
2994
                                        CHECKSUM_CALC_IN                        => calc_checksum,
2995
                                        START_ADDR_IN                           => checksum_start_addr,
2996
                                        COUNT_IN                                        => slv(checksum_count),
2997
                                        VALUE_IN                                        => tx_packet_rd_data2,
2998
                                        VALUE_ADDR_OUT                  => checksum_addr,
2999
                                        CHECKSUM_INIT_IN                        => checksum_initial_value,
3000
                                        CHECKSUM_SET_INIT_IN            => checksum_set_initial_value,
3001
                                        CHECKSUM_ODD_LENGTH_IN  => checksum_odd_length,
3002
                                        CHECKSUM_OUT                            => checksum,
3003
                                        CHECKSUM_DONE_OUT               => checksum_calc_done);
3004
 
3005
------------------- PACKET DEFINITION ------------------------
3006
 
3007
        Packet_Definition_Mod : Packet_Definition
3008
          Port Map (
3009
                 clka   => CLK_IN,
3010
                 addra  => packet_definition_addr,
3011
                 douta  => packet_definition_data);
3012
 
3013
------------------------- SPI --------------------------------
3014
 
3015
        spi_mod_inst : spi_mod
3016
                Port Map (      CLK_IN                          => CLK_IN,
3017
                                                RST_IN                          => '0',
3018
 
3019
                                                WR_CONTINUOUS_IN        => spi_wr_continuous,
3020
                                                WE_IN                           => spi_we,
3021
                                                WR_ADDR_IN                      => spi_wr_addr,
3022
                                                WR_DATA_IN                      => spi_wr_data,
3023
                                                WR_DATA_CMPLT_OUT       => spi_wr_cmplt,
3024
 
3025
                                                RD_CONTINUOUS_IN        => spi_rd_continuous,
3026
                                                RD_IN                                   => spi_rd,
3027
                                                RD_WIDTH_IN             => spi_rd_width,
3028
                                                RD_ADDR_IN                      => spi_rd_addr,
3029
                                                RD_DATA_OUT             => spi_data_rd,
3030
                                                RD_DATA_CMPLT_OUT       => spi_rd_cmplt,
3031
 
3032
                                                SLOW_CS_EN_IN           => slow_cs_en,
3033
                                                OPER_CMPLT_POST_CS_OUT => spi_oper_cmplt,
3034
 
3035
                                                SDI_OUT                         => SDI_OUT,
3036
                                                SDO_IN                          => SDO_IN,
3037
                                                SCLK_OUT                                => SCLK_OUT,
3038
                                                CS_OUT                          => CS_OUT);
3039
 
3040
------------------------- LFSR -------------------------------
3041
 
3042
        lfsr32_mod_inst : lfsr32_mod
3043
                Port Map (      CLK_IN          => CLK_IN,
3044
                                                SEED_IN                 => X"00000000",
3045
                                                SEED_EN_IN      => '0',
3046
                                                VAL_OUT                 => lfsr_val);
3047
 
3048
--------------------- TCP RX DATA ----------------------------
3049
 
3050
        TCP_CONNECTION_ACTIVE_OUT <= tcp_connection_active;
3051
 
3052
        tcp_data_rd_en <= TCP_RD_DATA_EN_IN;
3053
        TCP_RD_DATA_AVAIL_OUT <= not(tcp_rd_data_available);
3054
        TCP_RD_DATA_OUT <= tcp_rx_data_rd_data;
3055
 
3056
        tcp_rx_data_we <= '1' when (packet_handler_next_state = READ_TCP_RX_DATA) else '0';
3057
 
3058
        TCP_RX_FIFO : TCP_FIFO
3059
          PORT MAP (
3060
                 clk                            => CLK_IN,
3061
                 din                            => rx_packet_rd_data,
3062
                 wr_en                  => tcp_rx_data_we,
3063
                 rd_en                  => tcp_data_rd_en,
3064
                 dout                   => tcp_rx_data_rd_data,
3065
                 full                   => open,
3066
                 almost_full    => open,
3067
                 empty                  => tcp_rd_data_available,
3068
                 data_count     => tcp_rd_data_count);
3069
 
3070
--------------------- TCP TX DATA ----------------------------
3071
 
3072
        TCP_WR_DATA_POSSIBLE_OUT <= tcp_wr_data_possible;
3073
        tcp_wr_data_possible <= '1' when tcp_wr_data_count < X"FA0" else '0';
3074
 
3075
        tcp_wr_data_en <= TCP_WR_DATA_EN_IN;
3076
        tcp_wr_data <= TCP_WR_DATA_IN;
3077
        tcp_wr_data_flush <= TCP_WR_DATA_FLUSH_IN;
3078
        tcp_tx_data_rd <= '1' when (tx_packet_state = LOAD_TX_PACKET_DATA) or (tx_packet_state = INIT_LOAD_TX_PACKET_DATA) else '0'; -- TODO or previous state = LOAD_TX_PACKET_DATA
3079
 
3080
        TCP_TX_FIFO : TCP_FIFO
3081
          PORT MAP (
3082
                 clk                            => CLK_IN,
3083
                 din                            => tcp_wr_data,
3084
                 wr_en                  => tcp_wr_data_en,
3085
                 rd_en                  => tcp_tx_data_rd,
3086
                 dout                   => tcp_tx_data,
3087
                 full                   => open,
3088
                 almost_full    => open,
3089
                 empty                  => open,
3090
                 data_count     => tcp_wr_data_count);
3091
 
3092
        --- Network Stats ---
3093
 
3094
--      process(CLK_IN)
3095
--      begin
3096
--              if rising_edge(CLK_IN) then
3097
--                      clk_1hz_prev <= clk_1hz;
3098
--                      if clk_1hz_prev = '0' and clk_1hz = '1' then
3099
--                              rx_kbytes_sec <= rx_bytes_counter(21 downto 10);
3100
--                      end if;
3101
--                      if clk_1hz_prev = '0' and clk_1hz = '1' then
3102
--                              rx_bytes_counter <= (others => '0');
3103
--                      elsif packet_handler_state = CHECK_TCP_PSH_ACK_PACKET2 then
3104
--                              rx_bytes_counter <= rx_bytes_counter + RESIZE(total_packet_length, 22);
3105
--                      end if;
3106
--              end if;
3107
--      end process;
3108
 
3109
        --- DATA I/O ---
3110
 
3111
--      process(CLK_IN)
3112
--      begin
3113
--              if rising_edge(CLK_IN) then
3114
--                      if ADDR_IN = X"00" then
3115
--                              DATA_OUT <= "0000000" & network_interface_enabled;
3116
--                      elsif ADDR_IN = X"01" then
3117
--                              DATA_OUT <= mac_addr(47 downto 40);
3118
--                      elsif ADDR_IN = X"02" then
3119
--                              DATA_OUT <= mac_addr(39 downto 32);
3120
--                      elsif ADDR_IN = X"03" then
3121
--                              DATA_OUT <= mac_addr(31 downto 24);
3122
--                      elsif ADDR_IN = X"04" then
3123
--                              DATA_OUT <= mac_addr(23 downto 16);
3124
--                      elsif ADDR_IN = X"05" then
3125
--                              DATA_OUT <= mac_addr(15 downto 8);
3126
--                      elsif ADDR_IN = X"06" then
3127
--                              DATA_OUT <= mac_addr(7 downto 0);
3128
--                      elsif ADDR_IN = X"07" then
3129
--                              DATA_OUT <= "0000000" & dhcp_enable;
3130
--                      elsif ADDR_IN = X"08" then
3131
--                              DATA_OUT <= "000000" & static_addr_locked & dhcp_addr_locked;
3132
--                      elsif ADDR_IN = X"09" then
3133
--                              DATA_OUT <= ip_addr(31 downto 24);
3134
--                      elsif ADDR_IN = X"0A" then
3135
--                              DATA_OUT <= ip_addr(23 downto 16);
3136
--                      elsif ADDR_IN = X"0B" then
3137
--                              DATA_OUT <= ip_addr(15 downto 8);
3138
--                      elsif ADDR_IN = X"0C" then
3139
--                              DATA_OUT <= ip_addr(7 downto 0);
3140
--                      elsif ADDR_IN = X"0D" then
3141
--                              DATA_OUT <= cloud_ip_addr(31 downto 24);
3142
--                      elsif ADDR_IN = X"0E" then
3143
--                              DATA_OUT <= cloud_ip_addr(23 downto 16);
3144
--                      elsif ADDR_IN = X"0F" then
3145
--                              DATA_OUT <= cloud_ip_addr(15 downto 8);
3146
--                      elsif ADDR_IN = X"10" then
3147
--                              DATA_OUT <= cloud_ip_addr(7 downto 0);
3148
--                      elsif ADDR_IN = X"11" then
3149
--                              DATA_OUT <= "0000000" & tcp_connection_active;
3150
--                      end if;
3151
--              end if;
3152
--      end process;
3153
 
3154
end Behavioral;
3155
 

powered by: WebSVN 2.1.0

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