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

Subversion Repositories gigabit_udp_mac

[/] [gigabit_udp_mac/] [trunk/] [LAN/] [UDP_KED/] [UDP_TX.vhd] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 boa_a_m
library IEEE;
2
use IEEE.STD_LOGIC_1164.all;
3
use IEEE.NUMERIC_STD.all;
4
use IEEE.std_logic_unsigned.all;
5
 
6
library work;
7
use work.signal_Package.all;
8
 
9
 
10
entity UDP_TX is
11
  port (
12
 
13
        i_tx_clk               : in  std_logic;
14
   i_reset                : in  std_logic;
15
 
16
        ----------------for IP header-----------------------------
17
   i_udp_src_ip           : in  std_logic_vector (31 downto 0);
18
        i_udp_dst_ip           : in  std_logic_vector (31 downto 0);
19
        i_udp_src_mac          : in  std_logic_vector (47 downto 0);
20
        i_udp_data_len         : in  std_logic_vector (15 downto 0);  --application data length
21
        i_udp_protocol         : in  std_logic_vector (7 downto 0);   --udp protocol, is x"11"
22
        ----------------for udp header-----------------------------
23
        i_udp_checksum         : in  std_logic_vector (15 downto 0);  -- is x"00"
24
        i_udp_src_port         : in  std_logic_vector (15 downto 0);
25
        i_udp_dst_port         : in  std_logic_vector (15 downto 0);
26
        i_fragmantation        : in std_logic_vector(15 downto 0):=x"4000";
27
        i_fragment_len         : in  std_logic_vector(16 - 1 downto 0):=x"4000";
28
        ----------------udp Data Path-----------------------------
29
        i_udp_start            : in  std_logic;
30
    o_udp_ready            : out std_logic;
31
    i_udp_din              : in  std_logic_vector (7 downto 0);
32
 
33
        -----------------IP Data Path-----------------------------
34
        o_ip_start             : out  std_logic;
35
    i_ip_ready             : in std_logic;
36
    o_ip_dout              : out  std_logic_vector (7 downto 0);
37
 
38
        ----------------for IP header-----------------------------               
39
        o_ip_src_ip            : out  std_logic_vector (31 downto 0);
40
        o_ip_dst_ip            : out  std_logic_vector (31 downto 0);
41
        o_ip_src_mac           : out  std_logic_vector (47 downto 0);
42
        o_ip_data_len          : out  std_logic_vector (15 downto 0);
43
        o_ip_protocol          : out  std_logic_vector (7 downto 0);
44
    ----------------Error Status-------------------------------
45
        o_err_out              : out  std_logic_vector (3 downto 0)
46
 
47
    );
48
end UDP_TX;
49
 
50
 
51
architecture Behavioral of UDP_TX is
52
 
53
--================================= Constant ===========================================================
54
--Generate Block Conditional Constants
55
constant c_GENERATE_PING_MODULE             : boolean  := true;                                  --if Ping Block is not Used,Value is False
56
constant c_GENERATE_ARP_MODULE              : boolean  := true;                                  --if ARP  Block is not Used,Value is False
57
constant c_DEFAULT_DST_MAC_ADDR             : std_logic_vector (47 downto 0) := x"F46D04962225"; --if ARP Block is not Used,Copy PC MAC Address to This Value    
58
 
59
 
60
--Application Layer Data Length
61
constant c_PACKET_LENGTH                    : std_logic_vector (15 downto 0):= x"05c0";          --1472 (Maximum Application Layer Packet Length)
62
constant c_udp_tx_src_ip                    : std_logic_vector (31 downto 0):= x"C0A86403";      --192.168.100.3(FPGA IP Adress)
63
constant c_udp_tx_dst_ip                    : std_logic_vector (31 downto 0):= x"C0A86402";      --192.168.100.2(PC IP Address)
64
constant c_udp_tx_protocol                  : std_logic_vector (7 downto 0) := x"11";            --udp Protocol
65
constant c_udp_tx_src_mac                   : std_logic_vector (47 downto 0):= x"112233445566";  --FPGA MAC Address
66
constant c_udp_tx_checksum                  : std_logic_vector (15 downto 0):= x"0000";          --udp Checksum(Value For This Constant is not Importanat)
67
constant c_udp_tx_src_port                  : std_logic_vector (15 downto 0):= x"0401";          --udp Src Port(Value For This Constant is not Importanat)
68
constant c_udp_tx_dst_port                  : std_logic_vector (15 downto 0):= x"0FF5";          --udp Dst Port(Value For This Constant is not Importanat)
69
 
70
 
71
--ARP Constants
72
constant c_TIME_OUT_LOOKUP_TABLE_ARP        : std_logic_vector (31 downto 0) := x"9502F900";     --20S(Value/125MHz = 20 )       
73
constant c_TIME_OUT_WAIT_FOR_ARP_REPLY      : std_logic_vector (31 downto 0) := x"07735940";     --1S    (Value/125MHz = 1 )     
74
constant c_RE_SEND_ARP_REQUEST              : std_logic_vector (3 downto 0)  := x"A";            --10    
75
 
76
 
77
--IP Constants
78
constant c_IP_TTL                           : std_logic_vector (7 downto 0)  := x"80";           -- IP Packet Time to live
79
constant c_IP_BC_ADDR                       : std_logic_vector (31 downto 0) := x"ffffffff";     -- Broadcast IP  Address
80
constant c_MAC_BC_ADDR                      : std_logic_vector (47 downto 0) := x"ffffffffffff"; -- Broadcast MAC Address
81
--======================================================================================================
82
 
83
--===================== Reset_gen Signals ==============================================================
84
signal   s_cnt_rst     : std_logic_vector(15 downto 0):=(others=>'0');
85
--======================================================================================================
86
 
87
--================================ Ethernet 1g Signals =================================================
88
signal   s_gtx_clk                :  std_logic;
89
signal   s_tx_clk                 :  std_logic;
90
signal   s_rx_clk                 :  std_logic;
91
signal   s_rstn                   :  std_logic;
92
signal   s_rx_reset             :  std_logic;
93
signal   s_tx_reset             :  std_logic;
94
 
95
 
96
--mac to gmii_if signals
97
signal   s_mac_gmii_rxd           :  std_logic_vector(7 downto 0);
98
signal   s_mac_gmii_rx_dv         :  std_logic;
99
signal   s_mac_gmii_rx_er         :  std_logic;
100
 
101
signal   s_mac_gmii_txd           :  std_logic_vector(7 downto 0);
102
signal   s_mac_gmii_tx_en         :  std_logic;
103
signal   s_mac_gmii_tx_er         :  std_logic;
104
 
105
 
106
 
107
--ip to mac signals
108
signal   s_mac_tx_tready        :  std_logic;
109
signal  s_mac_tx_tdata         :  std_logic_vector(7 downto 0);
110
signal   s_mac_tx_tvalid        :  std_logic;
111
signal   s_mac_tx_tlast         :  std_logic;
112
 
113
signal   s_mac_rx_tdata         :  std_logic_vector(7 downto 0);
114
signal   s_mac_rx_tvalid        :  std_logic;
115
signal   s_mac_rx_tlast         :  std_logic;
116
--======================================================================================================
117
 
118
 
119
--================================ udp Signals =========================================================
120
    -------- for transfer Rx data from IP to udp layer----------------
121
        signal s_ip_rx_dout           :  std_logic_vector(7 downto 0);
122
        signal s_ip_rx_dout_rdy       :  std_logic;
123
        signal s_ip_rx_dout_last      :  std_logic;
124
 
125
        -------- for transfer Rx status data from IP to udp layer---------
126
        signal s_ip_rx_src_ip         :  std_logic_vector(31 downto 0);
127
    signal s_ip_rx_dst_ip         :  std_logic_vector(31 downto 0);
128
    signal s_ip_rx_data_len       :  std_logic_vector(15 downto 0);
129
    signal s_ip_rx_protocol       :  std_logic_vector(7 downto 0);
130
    signal s_ip_rx_broadcast      :  std_logic;
131
    signal s_ip_rx_err_out_udp        :  std_logic_vector (3 downto 0);
132
    signal s_ip_tx_err_out_udp        :  std_logic_vector (3 downto 0);
133
    signal s_arp_rx_err_out_udp       :  std_logic_vector (3 downto 0);
134
 
135
        -------- for transfer Tx data from udp to IP layer---------------
136
        signal s_ip_tx_start          :  std_logic;
137
        signal s_ip_tx_rdy            :  std_logic;
138
        signal s_ip_tx_din                :  std_logic_vector(7 downto 0);
139
 
140
        -------- for transfer Tx header data from udp to IP layer--------
141
        signal s_ip_tx_src_ip         :  std_logic_vector(31 downto 0);
142
        signal s_ip_tx_dst_ip         :  std_logic_vector(31 downto 0);
143
        signal s_ip_tx_src_mac        :  std_logic_vector(47 downto 0);
144
        signal s_ip_tx_data_len       :  std_logic_vector(15 downto 0);
145
        signal s_ip_tx_protocol       :  std_logic_vector(7 downto 0);
146
        -----------------------------------------------------------------
147
--======================================================================================================
148
 
149
 
150
 
151
--============================= IP Signals =============================================================
152
  signal s_ip_mac_tx_tvalid    : std_logic;
153
  signal s_ip_mac_tx_tlast     : std_logic;
154
  signal s_ip_mac_tx_tdata     : std_logic_vector(7 downto 0);
155
  signal s_ip_mac_tx_req       : std_logic;
156
  signal s_ip_mac_tx_granted   : std_logic;
157
 
158
  signal s_arp_mac_tx_tvalid   : std_logic;
159
  signal s_arp_mac_tx_tlast    : std_logic;
160
  signal s_arp_mac_tx_tdata    : std_logic_vector(7 downto 0);
161
  signal s_arp_mac_tx_req      : std_logic;
162
  signal s_arp_mac_tx_granted  : std_logic;
163
 
164
  signal s_ping_mac_tx_tvalid   : std_logic;
165
  signal s_ping_mac_tx_tlast    : std_logic;
166
  signal s_ping_mac_tx_tdata    : std_logic_vector(7 downto 0);
167
  signal s_ping_mac_tx_req      : std_logic;
168
  signal s_ping_mac_tx_granted  : std_logic;
169
 
170
  signal s_lookup_req          : std_logic;
171
  signal s_lookup_ip           : std_logic_vector(31 downto 0);
172
  signal s_lookup_mac_addr     : std_logic_vector(47 downto 0);
173
  signal s_lookup_mac_got      : std_logic;
174
  signal s_lookup_mac_err      : std_logic;
175
 
176
 
177
 
178
  signal s_no_ping_packet      : std_logic;
179
  signal s_ip_rx_err_out            : std_logic_vector(3 downto 0);
180
  --======================================================================================================
181
 
182
 
183
 
184
 
185
 
186
 
187
 
188
 
189
 
190
 
191
 
192
 
193
  --============================= IP4_TX Signals ==========================================================
194
  type t_tx_ip_state_type   is (IDLE,WAIT_MAC_ADDR,WAIT_CHN,SEND_DATA);
195
  type t_crc_state_type  is (IDLE, TOT_LEN, ID, FLAGS, TTL, CKS, SAH, SAL, DAH, DAL, ADDOVF, FINAL, WAIT_END);
196
  signal st_crc_state     : t_crc_state_type:=IDLE;
197
  signal s_tx_hdr_cks    : std_logic_vector (23 downto 0):=(others=>'0');
198
  signal s_cal_cheksum   : std_logic:='0';
199
 
200
 
201
  signal st_tx_ip_state      : t_tx_ip_state_type:=IDLE;
202
  signal s_cnt_ip_tx      : std_logic_vector (15 downto 0):=(others=>'0');
203
  signal s_dst_mac_addr  : std_logic_vector (47 downto 0); -- arp block updats this signal
204
  signal s_total_length  : std_logic_vector (15 downto 0); -- s_total_length is i_data_length+20(ip header) 
205
 
206
  signal s_ip_header     : std_logic_vector (7 downto 0):=(others=>'0');
207
  --========================================================================================================
208
 
209
 
210
 
211
 
212
 
213
 
214
 
215
 
216
 
217
 
218
  --============================ IP4_RX  Signals============================================================
219
  type t_rx_ip_state_type is (IDLE,ETH_H,IP_H,USER_DATA,WAIT_END);
220
  signal st_RX_IP_STATE         : t_rx_ip_state_type:=IDLE;
221
  signal s_cnt_ip_rx         : std_logic_vector (15 downto 0):=x"0001";
222
 
223
  signal s_src_ip_ip_rx         : std_logic_vector (31 downto 0):=(others=>'0');
224
  signal s_dst_ip_ip_rx         : std_logic_vector (31 downto 0):=(others=>'0');
225
  signal s_data_len_ip_rx       : std_logic_vector (15 downto 0):=(others=>'0');
226
  signal s_protocol_ip_rx       : std_logic_vector (7 downto 0) :=(others=>'0');
227
  signal s_broadcast_ip_rx      : std_logic;
228
  --========================================================================================================
229
 
230
 
231
 
232
 
233
 
234
 
235
 
236
 
237
 
238
 
239
 
240
--==================================== ARP Signals ==========================================================
241
type         t_arp_state_type is     (IDLE,LOOK_UP,WAIT_PC_REPLY);
242
signal       st_ARP_STATE             : t_arp_state_type:=IDLE;
243
signal       s_timeout_wait_reply_cnt           : std_logic_vector(31 downto 0):=(others=>'0');
244
signal       s_error_cnt             : std_logic_vector(3 downto 0):=(others=>'0');
245
 
246
--ARP_TX Signals
247
signal       s_dst_ip_addr_pc      : std_logic_vector(31 downto 0):=(others=>'0');
248
signal       s_dst_mac_addr_pc     : std_logic_vector(47 downto 0):=(others=>'0');
249
signal       s_dst_ip_addr_lookup  : std_logic_vector(31 downto 0):=(others=>'0');
250
signal       s_fpga_req_tx         : std_logic:='0';
251
signal       s_pc_req_tx           : std_logic:='0';
252
 
253
 
254
--ARP_RX Signals
255
signal       s_ip_addr0            : std_logic_vector(31 downto 0);
256
signal       s_mac_addr0           : std_logic_vector(47 downto 0);
257
signal       s_addr_valid0         : std_logic;
258
signal       s_pc_reply_rx         : std_logic;
259
signal       s_pc_req_rx           : std_logic;
260
--===========================================================================================================
261
 
262
 
263
 
264
 
265
 
266
 
267
 
268
 
269
 
270
 
271
 
272
--=============================== ARP RX Signals ============================================================
273
type t_rx_arp_state_type is       (IDLE,ETH_H,ARP_DATA,WAIT_END);
274
signal st_RX_ARP_STATE             : t_rx_arp_state_type:=IDLE;
275
signal s_cnt_arp_rx             : std_logic_vector (15 downto 0):=x"0001";
276
 
277
 
278
signal s_dst_ip            : std_logic_vector (31 downto 0):=(others=>'0');
279
signal s_operation         : std_logic_vector (15 downto 0):=(others=>'0');
280
signal s_addr_valid        : std_logic:='0';
281
signal s_pc_req            : std_logic:='0';
282
signal s_pc_reply          : std_logic:='0';
283
 
284
 
285
signal s_src_mac_arp_rx            : std_logic_vector (47 downto 0):=(others=>'0');
286
signal s_src_ip_arp_rx             : std_logic_vector (31 downto 0):=(others=>'0');
287
signal s_addr_valid_pulse   : std_logic:='0';
288
signal s_pc_req_pulse       : std_logic:='0';
289
signal s_pc_reply_pulse     : std_logic:='0';
290
signal s_trans_data_pulse   : std_logic:='0';
291
--===========================================================================================================
292
 
293
 
294
 
295
 
296
 
297
 
298
 
299
 
300
 
301
 
302
 
303
 
304
--=================================== ARP LOOKUP_TABLE Signals ==============================================
305
signal   s_timeout_lookup_table_cnt        : std_logic_vector(31 downto 0):=(others=>'0');
306
 
307
signal   s_din              : std_logic_vector(82 downto 0):=(others=>'0');
308
signal   s_wr_en            : std_logic;
309
signal   s_dout             : std_logic_vector(82 downto 0):=(others=>'0');
310
signal   s_valid            : std_logic;
311
signal   s_empty              : std_logic;
312
signal   s_notempty           : std_logic;
313
 
314
 
315
signal   s_mac_addr_out     : std_logic_vector(47 downto 0):=(others=>'0');
316
signal   s_ip_addr_out      : std_logic_vector(31 downto 0):=(others=>'0');
317
signal   s_addr_valid_out   : std_logic:='0';
318
signal   s_request_out      : std_logic:='0';
319
signal   s_reply_out        : std_logic:='0';
320
--============================================================================================================
321
 
322
 
323
 
324
 
325
 
326
 
327
 
328
 
329
 
330
 
331
 
332
--============================ ARP TX Signals ================================================================
333
type t_arp_tx_state_type   is (IDLE,WAIT_CHN,SEND_DATA);
334
signal st_tx_arp_state          : t_arp_tx_state_type:=IDLE;
335
signal s_cnt_arp_tx          : std_logic_vector (7 downto 0):=(others=>'0');
336
signal s_arp_type          : std_logic_vector (15 downto 0):=(others=>'0');
337
signal s_dst_ip_addr     : std_logic_vector (31 downto 0):=(others=>'0');
338
signal s_dst_mac_addr1   : std_logic_vector (47 downto 0):=(others=>'0');
339
signal s_dst_mac_addr2   : std_logic_vector (47 downto 0):=(others=>'0');
340
--============================================================================================================
341
 
342
 
343
 
344
 
345
 
346
 
347
 
348
 
349
 
350
 
351
 
352
 
353
--============================== PING Signals =================================================================
354
--for Delayed Inputs
355
signal   s_mac_data_in_r        : std_logic_vector (7 downto 0);
356
signal   s_mac_data_in_valid_r  : std_logic;
357
signal   s_mac_data_in_last_r   : std_logic;
358
 
359
 
360
--Sync_fifo_ping Signals
361
signal   s_ip_rx_in          : std_logic_vector(14 downto 0);
362
signal   s_ip_rx_out         : std_logic_vector(14 downto 0):=(others=>'0');
363
signal   s_mac_data_in          : std_logic_vector(7 downto 0);
364
signal   s_mac_data_in_valid  : std_logic;
365
signal   s_mac_data_in_last   : std_logic;
366
signal   s_mac_data_in_last_d : std_logic;
367
signal   s_ip_rx_err_in       : std_logic_vector(3 downto 0);
368
signal   s_no_ping_data     : std_logic;
369
signal   s_empty_sync_fifo    : std_logic:='0';
370
signal   s_not_empty_sync_fifo: std_logic;
371
 
372
 
373
--Data_fifo_ping Signals
374
signal   s_rst_fifo_ping     : std_logic:='1';
375
signal   s_wr_en_fifo_ping   : std_logic:='0';
376
signal   s_din_fifo_ping     : std_logic_vector(7 downto 0):=(others=>'0');
377
signal   s_rd_en_fifo_ping   : std_logic;
378
signal   s_dout_fifo_ping    : std_logic_vector(7 downto 0);
379
 
380
 
381
--Checksum Signals
382
signal   s_checksum_data_out   : std_logic_vector(15 downto 0);
383
signal   s_checksum_data_in    : std_logic_vector(7 downto 0);
384
signal   s_checksum_start_calc : std_logic:='0';
385
signal   s_checksum_stop_calc  : std_logic:='0';
386
 
387
 
388
--st_PING_STATE Machine Process Signals 
389
type     t_ping_state            is (IDLE,ACQUIRE_DATA,WAIT_END,WAIT_CHN,SEND_DATA);
390
signal   st_PING_STATE               : t_ping_state:=IDLE;
391
signal   s_wr_cnt              : std_logic_vector(7 downto 0):=(others=>'0');
392
signal   s_rd_cnt              : std_logic_vector(7 downto 0):=(others=>'0');
393
signal   s_start_send          : std_logic;
394
 
395
 
396
signal   s_src_mac_ping           : std_logic_vector(47 downto 0):=(others=>'0');
397
signal   s_dst_mac_ping           : std_logic_vector(47 downto 0):=(others=>'0');
398
signal   s_src_ip_ping            : std_logic_vector(31 downto 0):=(others=>'0');
399
signal   s_dst_ip_ping            : std_logic_vector(31 downto 0):=(others=>'0');
400
--=================================================================================================================
401
 
402
 
403
 
404
 
405
 
406
 
407
 
408
 
409
 
410
 
411
 
412
 
413
--================================= Ping Checksum Calc Signals ====================================================
414
type        t_checksum_state   is   (IDLE,CALC);
415
signal      st_checksum_state      : t_checksum_state:=IDLE;
416
 
417
signal      s_flag       : std_logic:='0';
418
signal      s_din_r      : std_logic_vector(7 downto 0);
419
signal      s_sum        : std_logic_vector(31 downto 0):=(others=>'0');
420
--=================================================================================================================
421
 
422
 
423
 
424
 
425
 
426
 
427
 
428
 
429
 
430
 
431
 
432
--============================ TX_Arbitior Signals =====================================================================
433
type   t_state_type is       (IDLE,DATA_REQ,ARP_REQ,PING_REQ);
434
signal st_STATE               : t_state_type:=IDLE;
435
--======================================================================================================================
436
 
437
 
438
 
439
 
440
 
441
 
442
 
443
 
444
 
445
 
446
 
447
 
448
--============================ udp RX Signals ===========================================================================
449
  type t_rx_udp_state_type is  (IDLE, udp_HDR, USER_DATA, WAIT_END);
450
  signal st_RX_udp_STATE         : t_rx_udp_state_type:=IDLE;
451
  signal s_cnt_udp_rx         : std_logic_vector (15 downto 0):=x"0001";
452
 
453
  signal s_src_ip_udp_rx  : std_logic_vector (31 downto 0):=(others=>'0');
454
  signal s_src_port       : std_logic_vector (15 downto 0):=(others=>'0');
455
  signal s_dst_port       : std_logic_vector (15 downto 0):=(others=>'0');
456
  signal s_data_len_udp_rx       : std_logic_vector (15 downto 0):=(others=>'0');
457
  signal s_err_out        : std_logic_vector (3 downto 0) :=(others=>'0');
458
 --======================================================================================================================= 
459
 
460
 
461
 
462
 
463
 
464
 
465
 
466
 
467
 
468
 
469
 
470
 --============================ udp TX Signals =============================================================================
471
  type t_tx_udp_state_type     is (IDLE,SEND_DATA);
472
  signal st_tx_udp_state        : t_tx_udp_state_type:=IDLE;
473
 
474
  signal s_cnt_udp_tx        : std_logic_vector (15 downto 0):=(others=>'0');
475
  signal s_ip_data_len   : std_logic_vector (15 downto 0);
476
  signal s_udp_header      : std_logic_vector (7 downto 0):=(others=>'0');
477
--==========================================================================================================================
478
 
479
 
480
 
481
 
482
 
483
 
484
 
485
 
486
 
487
 
488
 
489
--============================ PHY_Interface Signals =======================================================================
490
signal s_gmii_col_reg         : std_logic;
491
signal s_gmii_col_reg_reg     : std_logic;
492
signal s_gmii_rx_clk          : std_logic;
493
--==========================================================================================================================
494
 
495
 
496
 
497
 
498
 
499
 
500
 
501
 
502
 
503
 
504
 
505
--=========================== Ping_Pong Fifo Signals =======================================================================
506
signal s_empty1              : std_logic;
507
signal s_empty2              : std_logic;
508
signal s_notempty1           : std_logic;
509
signal s_notempty2           : std_logic;
510
 
511
 
512
signal s_data_m              : std_logic_vector(7 downto 0);
513
signal s_valid_m             : std_logic;
514
signal s_last_m              : std_logic;
515
 
516
 
517
signal s_wr_en_a             : std_logic:='0';
518
signal s_din_a               : std_logic_vector(7 downto 0):=(others=>'0');
519
signal s_rd_en_a             : std_logic;
520
signal s_dout_a              : std_logic_vector(7 downto 0);
521
signal s_valid_a             : std_logic;
522
signal s_empty_a             : std_logic;
523
 
524
signal s_wr_en_b             : std_logic:='0';
525
signal s_din_b               : std_logic_vector(7 downto 0):=(others=>'0');
526
signal s_rd_en_b             : std_logic;
527
signal s_dout_b              : std_logic_vector(7 downto 0);
528
signal s_valid_b             : std_logic;
529
signal s_empty_b             : std_logic;
530
 
531
 
532
signal s_cnt_a               : std_logic_vector(15 downto 0):=(others=>'0');
533
signal s_cnt_b               : std_logic_vector(15 downto 0):=(others=>'0');
534
signal s_rd_cnt_a            : std_logic_vector(15 downto 0):=(others=>'0');
535
signal s_rd_cnt_b            : std_logic_vector(15 downto 0):=(others=>'0');
536
 
537
signal s_busy_a              : std_logic:='0';
538
signal s_busy_b              : std_logic:='0';
539
 
540
signal s_last_a              : std_logic:='0';
541
signal s_last_b              : std_logic:='0';
542
 
543
signal s_dout_len          : std_logic_vector(15 downto 0);
544
 
545
type        t_pingpong_state     is (wait_data,rd_fifo_a,rd_fifo_b);
546
signal      st_ping_pong_state          : t_pingpong_state:=wait_data;
547
 
548
 
549
signal    udp_header_len : integer:=8;
550
 
551
signal    dntFragSet : std_logic:='0';
552
signal    MoreFrag: std_logic:='0';
553
signal    offset_fragment       :  std_logic_vector(12 downto 0):=(others=>'0');
554
 
555
signal    s_ip_data_len_pack       :  std_logic_vector(15 downto 0):=(others=>'0');
556
--========================================================================================================================= 
557
 
558
 
559
 
560
---------------------------------------------------------------------
561
begin
562
dntFragSet          <=  i_fragmantation(14);
563
MoreFrag            <=  i_fragmantation(13);
564
offset_fragment     <=  i_fragmantation(12 downto 0);
565
 
566
udp_header_len      <=  8 When (dntFragSet = '1') else
567
                        8 When (offset_fragment = 0) else
568
                        0;
569
--=================== Status Outputs ============================================================================
570
o_ip_protocol        <= i_udp_protocol;
571
s_ip_data_len        <= std_logic_vector(unsigned(i_udp_data_len) + udp_header_len); --s_ip_data_len is application data length + udp header  
572
o_ip_data_len        <= s_ip_data_len;
573
o_ip_src_ip          <= i_udp_src_ip;
574
o_ip_dst_ip          <= i_udp_dst_ip;
575
o_ip_src_mac         <= i_udp_src_mac;
576
--===============================================================================================================
577
s_ip_data_len_pack  <=  s_ip_data_len   When (dntFragSet = '1') else
578
                        i_fragment_len + udp_header_len;
579
--==================================== Immediate Transfering Data to IP & Application Layers ====================
580
o_ip_dout            <= s_udp_header   when (s_cnt_udp_tx <= udp_header_len)  else  i_udp_din when (s_cnt_udp_tx > udp_header_len and s_cnt_udp_tx <=(udp_header_len+i_udp_data_len)) else (others=>'0');
581
o_udp_ready          <= i_ip_ready     when (s_cnt_udp_tx >=udp_header_len and s_cnt_udp_tx <(udp_header_len+i_udp_data_len)) else '0';
582
--===============================================================================================================
583
 
584
 
585
--=================================== Process for Transmit udp Data to IP Layer ================================
586
p_transmit_udp_data:process(i_tx_clk)
587
begin
588
if(rising_edge(i_tx_clk)) then
589
if (i_reset='1') then
590
 
591
        st_tx_udp_state      <=IDLE;
592
   s_cnt_udp_tx         <=(others=>'0');
593
        s_udp_header         <=(others=>'0');
594
        o_ip_start           <= '0'; --start pulse for ip_tx block              
595
   -------------------------------------------------------------------
596
        o_err_out           <=(others=>'0');
597
        else
598
 
599
    case st_tx_udp_state is
600
         when IDLE =>
601
 
602
                      s_cnt_udp_tx              <=(others=>'0');
603
            s_udp_header        <=(others=>'0');
604
                 o_ip_start           <= '0';
605
            o_err_out                           <=(others=>'0');
606
 
607
 
608
                          if i_udp_start = '1' then
609
                                 st_tx_udp_state        <= SEND_DATA;
610
                                 o_ip_start                     <= '1';
611
                                 if (unsigned(i_udp_data_len) > 1472) then
612
                                         o_ip_start       <= '0';
613
                                         o_err_out              <="0001";
614
                                         st_tx_udp_state  <= IDLE;
615
                             end if;
616
                          end if;
617
 
618
         when SEND_DATA =>
619
 
620
                          o_ip_start            <= '0';
621
 
622
                          if (i_ip_ready='1') then --i_ip_ready determined that ip_tx block is ready for receive data
623
 
624
                              s_cnt_udp_tx              <= s_cnt_udp_tx+1;
625
                                  --***************************************************************
626
                                  case  s_cnt_udp_tx is
627
 
628
                                  when x"0000" =>   s_udp_header   <= i_udp_src_port(15 downto 8);
629
                                  when x"0001" =>   s_udp_header   <= i_udp_src_port(7 downto 0);
630
 
631
                                  when x"0002" =>   s_udp_header   <= i_udp_dst_port(15 downto 8);
632
                                  when x"0003" =>   s_udp_header   <= i_udp_dst_port(7 downto 0);
633
 
634
                                  when x"0004" =>   s_udp_header   <= s_ip_data_len_pack(15 downto 8);
635
                                  when x"0005" =>   s_udp_header   <= s_ip_data_len_pack(7 downto 0);
636
 
637
                                  when x"0006" =>   s_udp_header   <= i_udp_checksum(15 downto 8);
638
                                  when x"0007" =>   s_udp_header   <= i_udp_checksum(7 downto 0);
639
 
640
 
641
                                  when others  =>   --null                                      
642
                                  end case;
643
 
644
                          end if;
645
                        --***************************************************************
646
 
647
 
648
                     if(s_cnt_udp_tx = i_udp_data_len+udp_header_len) then
649
                                        o_ip_start         <= '0';
650
                                   s_udp_header       <= (others=>'0');
651
                                   s_cnt_udp_tx       <= (others=>'0');
652
                                   st_tx_udp_state    <= IDLE;
653
             end if;
654
 
655
 
656
 
657
           end case;
658
         end if;
659
       end if;
660
    end process p_transmit_udp_data;
661
--=======================================================================================================================================        
662
 
663
 
664
  end Behavioral;

powered by: WebSVN 2.1.0

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