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/] [PING.vhd] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 boa_a_m
--****************************************************************************************
2
library IEEE;
3
use IEEE.STD_LOGIC_1164.all;
4
use IEEE.NUMERIC_STD.all;
5
use IEEE.std_logic_unsigned.all;
6
 
7
library work;
8
use work.signal_Package.all;
9
 
10
entity ping is
11
        port (
12
                --      system signals
13
                i_tx_clk                        : in    std_logic;
14
                i_rx_clk                        : in    std_logic;
15
                i_reset                         : in    std_logic;
16
 
17
                --      MAC layer RX inputs
18
                i_mac_data_in                   : in    std_logic_vector (7 downto 0);
19
                i_mac_data_in_valid             : in    std_logic;
20
                i_mac_data_in_last              : in    std_logic;
21
 
22
                --      IP_RX output and status
23
                i_ip_rx_err_in                          : in    std_logic_vector(3 downto 0);
24
                i_no_ping_packet                : in    std_logic;
25
 
26
                Status_indc                                             : buffer std_logic_vector(7 downto 0):=x"BB";
27
 
28
                --      for transfer data to mac layer
29
                o_mac_tx_req                    : out   std_logic;
30
                i_mac_tx_granted                : in    std_logic;
31
                i_mac_tready                    : in    std_logic;
32
                o_mac_tvalid                    : out   std_logic;
33
                o_mac_tlast                     : out   std_logic;
34
                o_mac_tdata                     : out   std_logic_vector (7 downto 0)
35
        );
36
end ping;
37
 
38
architecture Behavioral of ping is
39
 
40
--======== FIFO for Saving Ping Data from Mac Layer ==========================================
41
component ping_fifo IS
42
  PORT (
43
        rst                             : IN    STD_LOGIC;
44
        wr_clk                          : IN    STD_LOGIC;
45
        rd_clk                          : IN    STD_LOGIC;
46
        din                             : IN    STD_LOGIC_VECTOR(7 DOWNTO 0);
47
        wr_en                           : IN    STD_LOGIC;
48
        rd_en                           : IN    STD_LOGIC;
49
        dout                            : OUT   STD_LOGIC_VECTOR(7 DOWNTO 0);
50
        full                            : OUT   STD_LOGIC;
51
        empty                           : OUT   STD_LOGIC;
52
        valid                           : OUT   STD_LOGIC
53
  );
54
END component;
55
--============================================================================================
56
 
57
--=========Sync FIFO for Convert RX_CLK Domain Signals to TX_CLK Domain Signals===============
58
component sync_fifo_ping IS
59
  PORT (
60
        rst                             : IN    STD_LOGIC;
61
        wr_clk                          : IN    STD_LOGIC;
62
        rd_clk                          : IN    STD_LOGIC;
63
        din                             : IN    STD_LOGIC_VECTOR(14 DOWNTO 0);
64
        wr_en                           : IN    STD_LOGIC;
65
        rd_en                           : IN    STD_LOGIC;
66
        dout                            : OUT   STD_LOGIC_VECTOR(14 DOWNTO 0);
67
        full                            : OUT   STD_LOGIC;
68
        empty                           : OUT   STD_LOGIC;
69
        valid                           : OUT   STD_LOGIC
70
  );
71
END component;
72
--===========================================================================================
73
 
74
--======== Ping Checksum Calculator =========================================================
75
component ping_cheksum_calc is
76
port
77
(
78
        i_clk                   : in    std_logic;
79
        i_reset                 : in    std_logic;
80
        i_din                   : in    std_logic_vector(7 downto 0);
81
        i_din_rdy               : in    std_logic;
82
        i_start_calc            : in    std_logic;
83
        i_stop_calc             : in    std_logic;
84
        o_checksum_valid        : out   std_logic;
85
        o_checksum              : out   std_logic_vector(15 downto 0)
86
);
87
end component;
88
--===========================================================================================
89
 
90
--================================= Constant ===========================================================
91
--Generate Block Conditional Constants
92
constant c_GENERATE_PING_MODULE             : boolean  := true;                                  --if Ping Block is not Used,Value is False
93
constant c_GENERATE_ARP_MODULE              : boolean  := true;                                  --if ARP  Block is not Used,Value is False
94
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    
95
 
96
 
97
--Application Layer Data Length
98
constant c_PACKET_LENGTH                    : std_logic_vector (15 downto 0):= x"05c0";          --1472 (Maximum Application Layer Packet Length)
99
constant c_udp_tx_src_ip                    : std_logic_vector (31 downto 0):= x"C0A86403";      --192.168.100.3(FPGA IP Adress)
100
constant c_udp_tx_dst_ip                    : std_logic_vector (31 downto 0):= x"C0A86402";      --192.168.100.2(PC IP Address)
101
constant c_udp_tx_protocol                  : std_logic_vector (7 downto 0) := x"11";            --UDP Protocol
102
constant c_udp_tx_src_mac                   : std_logic_vector (47 downto 0):= x"112233445566";  --FPGA MAC Address
103
constant c_udp_tx_checksum                  : std_logic_vector (15 downto 0):= x"0000";          --UDP Checksum(Value For This Constant is not Importanat)
104
constant c_udp_tx_src_port                  : std_logic_vector (15 downto 0):= x"0401";          --UDP Src Port(Value For This Constant is not Importanat)
105
constant c_udp_tx_dst_port                  : std_logic_vector (15 downto 0):= x"0FF5";          --UDP Dst Port(Value For This Constant is not Importanat)
106
 
107
 
108
--ARP Constants
109
constant c_TIME_OUT_LOOKUP_TABLE_ARP        : std_logic_vector (31 downto 0) := x"9502F900";     --20S(Value/125MHz = 20 )       
110
constant c_TIME_OUT_WAIT_FOR_ARP_REPLY      : std_logic_vector (31 downto 0) := x"07735940";     --1S    (Value/125MHz = 1 )     
111
constant c_RE_SEND_ARP_REQUEST              : std_logic_vector (3 downto 0)  := x"A";            --10    
112
 
113
 
114
--IP Constants
115
constant c_IP_TTL                           : std_logic_vector (7 downto 0)  := x"80";           -- IP Packet Time to live
116
constant c_IP_BC_ADDR                       : std_logic_vector (31 downto 0) := x"ffffffff";     -- Broadcast IP  Address
117
constant c_MAC_BC_ADDR                      : std_logic_vector (47 downto 0) := x"ffffffffffff"; -- Broadcast MAC Address
118
--======================================================================================================
119
 
120
--===================== Reset_gen Signals ==============================================================
121
signal   s_cnt_rst     : std_logic_vector(15 downto 0):=(others=>'0');
122
--======================================================================================================
123
 
124
--================================ Ethernet 1g Signals =================================================
125
signal   s_gtx_clk                :  std_logic;
126
signal   s_tx_clk                 :  std_logic;
127
signal   s_rx_clk                 :  std_logic;
128
signal   s_rstn                   :  std_logic;
129
signal   s_rx_reset             :  std_logic;
130
signal   s_tx_reset             :  std_logic;
131
 
132
 
133
--mac to gmii_if signals
134
signal   s_mac_gmii_rxd           :  std_logic_vector(7 downto 0);
135
signal   s_mac_gmii_rx_dv         :  std_logic;
136
signal   s_mac_gmii_rx_er         :  std_logic;
137
 
138
signal   s_mac_gmii_txd           :  std_logic_vector(7 downto 0);
139
signal   s_mac_gmii_tx_en         :  std_logic;
140
signal   s_mac_gmii_tx_er         :  std_logic;
141
 
142
 
143
 
144
--ip to mac signals
145
signal   s_mac_tx_tready        :  std_logic;
146
signal  s_mac_tx_tdata         :  std_logic_vector(7 downto 0);
147
signal   s_mac_tx_tvalid        :  std_logic;
148
signal   s_mac_tx_tlast         :  std_logic;
149
 
150
signal   s_mac_rx_tdata         :  std_logic_vector(7 downto 0);
151
signal   s_mac_rx_tvalid        :  std_logic;
152
signal   s_mac_rx_tlast         :  std_logic;
153
--======================================================================================================
154
 
155
 
156
--================================ UDP Signals =========================================================
157
    -------- for transfer Rx data from IP to UDP layer----------------
158
        signal s_ip_rx_dout           :  std_logic_vector(7 downto 0);
159
        signal s_ip_rx_dout_rdy       :  std_logic;
160
        signal s_ip_rx_dout_last      :  std_logic;
161
 
162
        -------- for transfer Rx status data from IP to UDP layer---------
163
        signal s_ip_rx_src_ip         :  std_logic_vector(31 downto 0);
164
    signal s_ip_rx_dst_ip         :  std_logic_vector(31 downto 0);
165
    signal s_ip_rx_data_len       :  std_logic_vector(15 downto 0);
166
    signal s_ip_rx_protocol       :  std_logic_vector(7 downto 0);
167
    signal s_ip_rx_broadcast      :  std_logic;
168
    signal s_ip_rx_err_out_udp        :  std_logic_vector (3 downto 0);
169
    signal s_ip_tx_err_out_udp        :  std_logic_vector (3 downto 0);
170
    signal s_arp_rx_err_out_udp       :  std_logic_vector (3 downto 0);
171
 
172
        -------- for transfer Tx data from UDP to IP layer---------------
173
        signal s_ip_tx_start          :  std_logic;
174
        signal s_ip_tx_rdy            :  std_logic;
175
        signal s_ip_tx_din                :  std_logic_vector(7 downto 0);
176
 
177
        -------- for transfer Tx header data from UDP to IP layer--------
178
        signal s_ip_tx_src_ip         :  std_logic_vector(31 downto 0);
179
        signal s_ip_tx_dst_ip         :  std_logic_vector(31 downto 0);
180
        signal s_ip_tx_src_mac        :  std_logic_vector(47 downto 0);
181
        signal s_ip_tx_data_len       :  std_logic_vector(15 downto 0);
182
        signal s_ip_tx_protocol       :  std_logic_vector(7 downto 0);
183
        -----------------------------------------------------------------
184
--======================================================================================================
185
 
186
 
187
 
188
--============================= IP Signals =============================================================
189
  signal s_ip_mac_tx_tvalid    : std_logic;
190
  signal s_ip_mac_tx_tlast     : std_logic;
191
  signal s_ip_mac_tx_tdata     : std_logic_vector(7 downto 0);
192
  signal s_ip_mac_tx_req       : std_logic;
193
  signal s_ip_mac_tx_granted   : std_logic;
194
 
195
  signal s_arp_mac_tx_tvalid   : std_logic;
196
  signal s_arp_mac_tx_tlast    : std_logic;
197
  signal s_arp_mac_tx_tdata    : std_logic_vector(7 downto 0);
198
  signal s_arp_mac_tx_req      : std_logic;
199
  signal s_arp_mac_tx_granted  : std_logic;
200
 
201
  signal s_ping_mac_tx_tvalid   : std_logic;
202
  signal s_ping_mac_tx_tlast    : std_logic;
203
  signal s_ping_mac_tx_tdata    : std_logic_vector(7 downto 0);
204
  signal s_ping_mac_tx_req      : std_logic;
205
  signal s_ping_mac_tx_granted  : std_logic;
206
 
207
  signal s_lookup_req          : std_logic;
208
  signal s_lookup_ip           : std_logic_vector(31 downto 0);
209
  signal s_lookup_mac_addr     : std_logic_vector(47 downto 0);
210
  signal s_lookup_mac_got      : std_logic;
211
  signal s_lookup_mac_err      : std_logic;
212
 
213
 
214
 
215
  signal s_no_ping_packet      : std_logic;
216
  signal s_ip_rx_err_out            : std_logic_vector(3 downto 0);
217
  --======================================================================================================
218
 
219
 
220
 
221
 
222
 
223
 
224
 
225
 
226
 
227
 
228
 
229
 
230
  --============================= IP4_TX Signals ==========================================================
231
  type t_tx_ip_state_type   is (IDLE,WAIT_MAC_ADDR,WAIT_CHN,SEND_DATA);
232
  type t_crc_state_type  is (IDLE, TOT_LEN, ID, FLAGS, TTL, CKS, SAH, SAL, DAH, DAL, ADDOVF, FINAL, WAIT_END);
233
  signal st_crc_state     : t_crc_state_type:=IDLE;
234
  signal s_tx_hdr_cks    : std_logic_vector (23 downto 0):=(others=>'0');
235
  signal s_cal_cheksum   : std_logic:='0';
236
 
237
 
238
  signal st_tx_ip_state      : t_tx_ip_state_type:=IDLE;
239
  signal s_cnt_ip_tx      : std_logic_vector (15 downto 0):=(others=>'0');
240
  signal s_dst_mac_addr  : std_logic_vector (47 downto 0); -- arp block updats this signal
241
  signal s_total_length  : std_logic_vector (15 downto 0); -- s_total_length is i_data_length+20(ip header) 
242
 
243
  signal s_ip_header     : std_logic_vector (7 downto 0):=(others=>'0');
244
  --========================================================================================================
245
 
246
 
247
 
248
 
249
 
250
 
251
 
252
 
253
 
254
 
255
  --============================ IP4_RX  Signals============================================================
256
  type t_rx_ip_state_type is (IDLE,ETH_H,IP_H,USER_DATA,WAIT_END);
257
  signal st_RX_IP_STATE         : t_rx_ip_state_type:=IDLE;
258
  signal s_cnt_ip_rx         : std_logic_vector (15 downto 0):=x"0001";
259
 
260
  signal s_src_ip_ip_rx         : std_logic_vector (31 downto 0):=(others=>'0');
261
  signal s_dst_ip_ip_rx         : std_logic_vector (31 downto 0):=(others=>'0');
262
  signal s_data_len_ip_rx       : std_logic_vector (15 downto 0):=(others=>'0');
263
  signal s_protocol_ip_rx       : std_logic_vector (7 downto 0) :=(others=>'0');
264
  signal s_broadcast_ip_rx      : std_logic;
265
  --========================================================================================================
266
 
267
 
268
 
269
 
270
 
271
 
272
 
273
 
274
 
275
 
276
 
277
--==================================== ARP Signals ==========================================================
278
type         t_arp_state_type is     (IDLE,LOOK_UP,WAIT_PC_REPLY);
279
signal       st_ARP_STATE             : t_arp_state_type:=IDLE;
280
signal       s_timeout_wait_reply_cnt           : std_logic_vector(31 downto 0):=(others=>'0');
281
signal       s_error_cnt             : std_logic_vector(3 downto 0):=(others=>'0');
282
 
283
--ARP_TX Signals
284
signal       s_dst_ip_addr_pc      : std_logic_vector(31 downto 0):=(others=>'0');
285
signal       s_dst_mac_addr_pc     : std_logic_vector(47 downto 0):=(others=>'0');
286
signal       s_dst_ip_addr_lookup  : std_logic_vector(31 downto 0):=(others=>'0');
287
signal       s_fpga_req_tx         : std_logic:='0';
288
signal       s_pc_req_tx           : std_logic:='0';
289
 
290
 
291
--ARP_RX Signals
292
signal       s_ip_addr0            : std_logic_vector(31 downto 0);
293
signal       s_mac_addr0           : std_logic_vector(47 downto 0);
294
signal       s_addr_valid0         : std_logic;
295
signal       s_pc_reply_rx         : std_logic;
296
signal       s_pc_req_rx           : std_logic;
297
--===========================================================================================================
298
 
299
 
300
 
301
 
302
 
303
 
304
 
305
 
306
 
307
 
308
 
309
--=============================== ARP RX Signals ============================================================
310
type t_rx_arp_state_type is       (IDLE,ETH_H,ARP_DATA,WAIT_END);
311
signal st_RX_ARP_STATE             : t_rx_arp_state_type:=IDLE;
312
signal s_cnt_arp_rx             : std_logic_vector (15 downto 0):=x"0001";
313
 
314
 
315
signal s_dst_ip            : std_logic_vector (31 downto 0):=(others=>'0');
316
signal s_operation         : std_logic_vector (15 downto 0):=(others=>'0');
317
signal s_addr_valid        : std_logic:='0';
318
signal s_pc_req            : std_logic:='0';
319
signal s_pc_reply          : std_logic:='0';
320
 
321
 
322
signal s_src_mac_arp_rx            : std_logic_vector (47 downto 0):=(others=>'0');
323
signal s_src_ip_arp_rx             : std_logic_vector (31 downto 0):=(others=>'0');
324
signal s_addr_valid_pulse   : std_logic:='0';
325
signal s_pc_req_pulse       : std_logic:='0';
326
signal s_pc_reply_pulse     : std_logic:='0';
327
signal s_trans_data_pulse   : std_logic:='0';
328
--===========================================================================================================
329
 
330
 
331
 
332
 
333
 
334
 
335
 
336
 
337
 
338
 
339
 
340
 
341
--=================================== ARP LOOKUP_TABLE Signals ==============================================
342
signal   s_timeout_lookup_table_cnt        : std_logic_vector(31 downto 0):=(others=>'0');
343
 
344
signal   s_din              : std_logic_vector(82 downto 0):=(others=>'0');
345
signal   s_wr_en            : std_logic;
346
signal   s_dout             : std_logic_vector(82 downto 0):=(others=>'0');
347
signal   s_valid            : std_logic;
348
signal   s_empty              : std_logic;
349
signal   s_notempty           : std_logic;
350
 
351
 
352
signal   s_mac_addr_out     : std_logic_vector(47 downto 0):=(others=>'0');
353
signal   s_ip_addr_out      : std_logic_vector(31 downto 0):=(others=>'0');
354
signal   s_addr_valid_out   : std_logic:='0';
355
signal   s_request_out      : std_logic:='0';
356
signal   s_reply_out        : std_logic:='0';
357
--============================================================================================================
358
 
359
 
360
 
361
 
362
 
363
 
364
 
365
 
366
 
367
 
368
 
369
--============================ ARP TX Signals ================================================================
370
type t_arp_tx_state_type   is (IDLE,WAIT_CHN,SEND_DATA);
371
signal st_tx_arp_state          : t_arp_tx_state_type:=IDLE;
372
signal s_cnt_arp_tx          : std_logic_vector (7 downto 0):=(others=>'0');
373
signal s_arp_type          : std_logic_vector (15 downto 0):=(others=>'0');
374
signal s_dst_ip_addr     : std_logic_vector (31 downto 0):=(others=>'0');
375
signal s_dst_mac_addr1   : std_logic_vector (47 downto 0):=(others=>'0');
376
signal s_dst_mac_addr2   : std_logic_vector (47 downto 0):=(others=>'0');
377
--============================================================================================================
378
 
379
 
380
 
381
 
382
 
383
 
384
 
385
 
386
 
387
 
388
 
389
 
390
--============================== PING Signals =================================================================
391
--for Delayed Inputs
392
signal   s_mac_data_in_r        : std_logic_vector (7 downto 0);
393
signal   s_mac_data_in_valid_r  : std_logic;
394
signal   s_mac_data_in_last_r   : std_logic;
395
 
396
 
397
--Sync_fifo_ping Signals
398
signal   s_ip_rx_in          : std_logic_vector(14 downto 0);
399
signal   s_ip_rx_out         : std_logic_vector(14 downto 0):=(others=>'0');
400
signal   s_mac_data_in          : std_logic_vector(7 downto 0);
401
signal   s_mac_data_in_valid  : std_logic;
402
signal   s_mac_data_in_last   : std_logic;
403
signal   s_mac_data_in_last_d : std_logic;
404
signal   s_ip_rx_err_in       : std_logic_vector(3 downto 0);
405
signal   s_no_ping_data     : std_logic;
406
signal   s_empty_sync_fifo    : std_logic:='0';
407
signal   s_not_empty_sync_fifo: std_logic;
408
 
409
 
410
--Data_fifo_ping Signals
411
signal   s_rst_fifo_ping     : std_logic:='1';
412
signal   s_wr_en_fifo_ping   : std_logic:='0';
413
signal   s_din_fifo_ping     : std_logic_vector(7 downto 0):=(others=>'0');
414
signal   s_rd_en_fifo_ping   : std_logic;
415
signal   s_dout_fifo_ping    : std_logic_vector(7 downto 0);
416
 
417
 
418
--Checksum Signals
419
signal   s_checksum_data_out   : std_logic_vector(15 downto 0);
420
signal   s_checksum_data_in    : std_logic_vector(7 downto 0);
421
signal   s_checksum_start_calc : std_logic:='0';
422
signal   s_checksum_stop_calc  : std_logic:='0';
423
 
424
 
425
--st_PING_STATE Machine Process Signals 
426
type     t_ping_state            is (IDLE,ACQUIRE_DATA,WAIT_END,WAIT_CHN,SEND_DATA);
427
signal   st_PING_STATE               : t_ping_state:=IDLE;
428
signal   s_wr_cnt              : std_logic_vector(7 downto 0):=(others=>'0');
429
signal   s_rd_cnt              : std_logic_vector(7 downto 0):=(others=>'0');
430
signal   s_start_send          : std_logic;
431
 
432
 
433
signal   s_src_mac_ping           : std_logic_vector(47 downto 0):=(others=>'0');
434
signal   s_dst_mac_ping           : std_logic_vector(47 downto 0):=(others=>'0');
435
signal   s_src_ip_ping            : std_logic_vector(31 downto 0):=(others=>'0');
436
signal   s_dst_ip_ping            : std_logic_vector(31 downto 0):=(others=>'0');
437
--=================================================================================================================
438
 
439
 
440
 
441
 
442
 
443
 
444
 
445
 
446
 
447
 
448
 
449
 
450
--================================= Ping Checksum Calc Signals ====================================================
451
type        t_checksum_state   is   (IDLE,CALC);
452
signal      st_checksum_state      : t_checksum_state:=IDLE;
453
 
454
signal      s_flag       : std_logic:='0';
455
signal      s_din_r      : std_logic_vector(7 downto 0);
456
signal      s_sum        : std_logic_vector(31 downto 0):=(others=>'0');
457
--=================================================================================================================
458
 
459
 
460
 
461
 
462
 
463
 
464
 
465
 
466
 
467
 
468
 
469
--============================ TX_Arbitior Signals =====================================================================
470
type   t_state_type is       (IDLE,DATA_REQ,ARP_REQ,PING_REQ);
471
signal st_STATE               : t_state_type:=IDLE;
472
--======================================================================================================================
473
 
474
 
475
 
476
 
477
 
478
 
479
 
480
 
481
 
482
 
483
 
484
 
485
--============================ UDP RX Signals ===========================================================================
486
  type t_rx_udp_state_type is  (IDLE, UDP_HDR, USER_DATA, WAIT_END);
487
  signal st_RX_UDP_STATE         : t_rx_udp_state_type:=IDLE;
488
  signal s_cnt_udp_rx         : std_logic_vector (15 downto 0):=x"0001";
489
 
490
  signal s_src_ip_udp_rx  : std_logic_vector (31 downto 0):=(others=>'0');
491
  signal s_src_port       : std_logic_vector (15 downto 0):=(others=>'0');
492
  signal s_dst_port       : std_logic_vector (15 downto 0):=(others=>'0');
493
  signal s_data_len_udp_rx       : std_logic_vector (15 downto 0):=(others=>'0');
494
  signal s_err_out        : std_logic_vector (3 downto 0) :=(others=>'0');
495
 --======================================================================================================================= 
496
 
497
 
498
 
499
 
500
 
501
 
502
 
503
 
504
 
505
 
506
 
507
 --============================ UDP TX Signals =============================================================================
508
  type t_tx_udp_state_type     is (IDLE,SEND_DATA);
509
  signal st_tx_udp_state        : t_tx_udp_state_type:=IDLE;
510
 
511
  signal s_cnt_udp_tx        : std_logic_vector (15 downto 0):=(others=>'0');
512
  signal s_ip_data_len   : std_logic_vector (15 downto 0);
513
  signal s_udp_header      : std_logic_vector (7 downto 0):=(others=>'0');
514
--==========================================================================================================================
515
 
516
 
517
 
518
 
519
 
520
 
521
 
522
 
523
 
524
 
525
 
526
--============================ PHY_Interface Signals =======================================================================
527
signal s_gmii_col_reg         : std_logic;
528
signal s_gmii_col_reg_reg     : std_logic;
529
signal s_gmii_rx_clk          : std_logic;
530
--==========================================================================================================================
531
 
532
 
533
 
534
 
535
 
536
 
537
 
538
 
539
 
540
 
541
 
542
--=========================== Ping_Pong Fifo Signals =======================================================================
543
signal s_empty1              : std_logic;
544
signal s_empty2              : std_logic;
545
signal s_notempty1           : std_logic;
546
signal s_notempty2           : std_logic;
547
 
548
 
549
signal s_data_m              : std_logic_vector(7 downto 0);
550
signal s_valid_m             : std_logic;
551
signal s_last_m              : std_logic;
552
 
553
 
554
signal s_wr_en_a             : std_logic:='0';
555
signal s_din_a               : std_logic_vector(7 downto 0):=(others=>'0');
556
signal s_rd_en_a             : std_logic;
557
signal s_dout_a              : std_logic_vector(7 downto 0);
558
signal s_valid_a             : std_logic;
559
signal s_empty_a             : std_logic;
560
 
561
signal s_wr_en_b             : std_logic:='0';
562
signal s_din_b               : std_logic_vector(7 downto 0):=(others=>'0');
563
signal s_rd_en_b             : std_logic;
564
signal s_dout_b              : std_logic_vector(7 downto 0);
565
signal s_valid_b             : std_logic;
566
signal s_empty_b             : std_logic;
567
 
568
 
569
signal s_cnt_a               : std_logic_vector(15 downto 0):=(others=>'0');
570
signal s_cnt_b               : std_logic_vector(15 downto 0):=(others=>'0');
571
signal s_rd_cnt_a            : std_logic_vector(15 downto 0):=(others=>'0');
572
signal s_rd_cnt_b            : std_logic_vector(15 downto 0):=(others=>'0');
573
 
574
signal s_busy_a              : std_logic:='0';
575
signal s_busy_b              : std_logic:='0';
576
 
577
signal s_last_a              : std_logic:='0';
578
signal s_last_b              : std_logic:='0';
579
 
580
signal s_dout_len          : std_logic_vector(15 downto 0);
581
 
582
type        t_pingpong_state     is (wait_data,rd_fifo_a,rd_fifo_b);
583
signal      st_ping_pong_state          : t_pingpong_state:=wait_data;
584
--========================================================================================================================= 
585
 
586
 
587
 
588
begin
589
 
590
---------------------------------------TX Data---------------------------------------
591
s_rd_en_fifo_ping   <=  (i_mac_tready or s_start_send)       when (st_PING_STATE=SEND_DATA) else '0';
592
 
593
--================== Swapping Address for Reply Ping Packet =========================
594
o_mac_tdata         <=  s_src_mac_ping(47 downto 40)                    when (s_rd_cnt=1)  else
595
                        s_src_mac_ping(39 downto 32)                    when (s_rd_cnt=2)  else
596
                                                s_src_mac_ping(31 downto 24)                    when (s_rd_cnt=3)  else
597
                                                s_src_mac_ping(23 downto 16)                    when (s_rd_cnt=4)  else
598
                                                s_src_mac_ping(15 downto 8)                     when (s_rd_cnt=5)  else
599
                                                s_src_mac_ping(7 downto 0)                       when (s_rd_cnt=6)  else
600
 
601
                                                s_dst_mac_ping(47 downto 40)                    when (s_rd_cnt=7)  else
602
                                                s_dst_mac_ping(39 downto 32)                    when (s_rd_cnt=8)  else
603
                                                s_dst_mac_ping(31 downto 24)                    when (s_rd_cnt=9)  else
604
                                                s_dst_mac_ping(23 downto 16)                    when (s_rd_cnt=10) else
605
                                                s_dst_mac_ping(15 downto 8)                     when (s_rd_cnt=11) else
606
                                                s_dst_mac_ping(7  downto 0)                      when (s_rd_cnt=12) else
607
 
608
                                                s_dst_ip_ping(31 downto 24)                     when (s_rd_cnt=27) else
609
                                                s_dst_ip_ping(23 downto 16)                     when (s_rd_cnt=28) else
610
                                                s_dst_ip_ping(15 downto 8)                      when (s_rd_cnt=29) else
611
                                                s_dst_ip_ping(7  downto 0)                       when (s_rd_cnt=30) else
612
 
613
                                                s_src_ip_ping(31 downto 24)                     when (s_rd_cnt=31) else
614
                                                s_src_ip_ping(23 downto 16)                     when (s_rd_cnt=32) else
615
                                                s_src_ip_ping(15 downto 8)                      when (s_rd_cnt=33) else
616
                                                s_src_ip_ping(7  downto 0)                       when (s_rd_cnt=34) else
617
 
618
                                                x"00"                                           when (s_rd_cnt=35) else
619
                                                s_checksum_data_out(15 downto 8)                when (s_rd_cnt=37) else
620
                                                s_checksum_data_out(7 downto 0)          when (s_rd_cnt=38) else
621
                                                (s_dout_fifo_ping);
622
--===================================================================================                                                           
623
 
624
--========================== Checksum Trig & Data ===================================
625
s_checksum_start_calc        <= '1'            when (s_wr_cnt=33)                else '0';
626
s_checksum_stop_calc         <= '1'            when (s_mac_data_in_last_d='1')   else '0';
627
 
628
s_checksum_data_in           <= x"00"          when (s_wr_cnt=34)                else
629
                                x"00"          when (s_wr_cnt=36)                else
630
                                x"00"          when (s_wr_cnt=37)                else
631
                                s_mac_data_in;
632
--===================================================================================
633
 
634
--======================== Delay in Rx_Data =========================================
635
 
636
p_delay:process(i_rx_clk)
637
begin
638
        if rising_edge(i_rx_clk) then
639
                s_mac_data_in_r         <= i_mac_data_in;
640
                s_mac_data_in_valid_r   <= i_mac_data_in_valid;
641
                s_mac_data_in_last_r    <= i_mac_data_in_last;
642
        end if;
643
end process p_delay;
644
--===================================================================================
645
 
646
--======================= Sync_fifo =================================================
647
s_ip_rx_in                      <= i_ip_rx_err_in & i_no_ping_packet & s_mac_data_in_last_r & s_mac_data_in_valid_r & s_mac_data_in_r;
648
s_ip_rx_err_in                  <= s_ip_rx_out(14 downto 11);
649
s_no_ping_data                  <= s_ip_rx_out(10);
650
s_mac_data_in_last              <= s_ip_rx_out(9);
651
s_mac_data_in                   <= s_ip_rx_out(7 downto 0);
652
s_not_empty_sync_fifo           <= not(s_empty_sync_fifo);
653
 
654
inst_sync_fifo_ping: sync_fifo_ping
655
  PORT map (
656
    rst      => i_reset,
657
    wr_clk   => i_rx_clk,
658
    rd_clk   => i_tx_clk,
659
    din      => s_ip_rx_in,
660
    wr_en    => s_mac_data_in_valid_r,
661
    rd_en    => s_not_empty_sync_fifo,
662
    dout     => s_ip_rx_out,
663
    full     => open,
664
    empty    => s_empty_sync_fifo,
665
    valid    => s_mac_data_in_valid
666
  );
667
--===================================================================================  
668
 
669
--======================== Acquire Src & Dst Address ================================
670
p_acquire_address:process(i_tx_clk)
671
begin
672
if rising_edge(i_tx_clk) then
673
  if ( s_mac_data_in_valid = '1') then
674
  case  s_wr_cnt   is
675
                        --dst mac addr
676
                        when  x"00" =>  s_dst_mac_ping(47 downto 40)    <= s_mac_data_in;
677
                        when  x"01" =>  s_dst_mac_ping(39 downto 32)    <= s_mac_data_in;
678
                        when  x"02" =>  s_dst_mac_ping(31 downto 24)    <= s_mac_data_in;
679
                        when  x"03" =>  s_dst_mac_ping(23 downto 16)    <= s_mac_data_in;
680
                        when  x"04" =>  s_dst_mac_ping(15 downto 8)     <= s_mac_data_in;
681
                        when  x"05" =>  s_dst_mac_ping(7 downto 0)      <= s_mac_data_in;
682
 
683
                        --src mac addr  
684
                        when  x"06" =>  s_src_mac_ping(47 downto 40)    <= s_mac_data_in;
685
                        when  x"07" =>  s_src_mac_ping(39 downto 32)    <= s_mac_data_in;
686
                        when  x"08" =>  s_src_mac_ping(31 downto 24)    <= s_mac_data_in;
687
                        when  x"09" =>  s_src_mac_ping(23 downto 16)    <= s_mac_data_in;
688
                        when  x"0a" =>  s_src_mac_ping(15 downto 8)     <= s_mac_data_in;
689
                        when  x"0b" =>  s_src_mac_ping(7 downto 0)      <= s_mac_data_in;
690
 
691
                        --src ip addr   
692
                        when  x"1a" =>  s_src_ip_ping(31 downto 24)     <= s_mac_data_in;
693
                        when  x"1b" =>  s_src_ip_ping(23 downto 16)     <= s_mac_data_in;
694
                        when  x"1c" =>  s_src_ip_ping(15 downto 8)      <= s_mac_data_in;
695
                        when  x"1d" =>  s_src_ip_ping(7 downto 0)       <= s_mac_data_in;
696
 
697
                        --dst ip addr   
698
                        when  x"1e" =>  s_dst_ip_ping(31 downto 24)     <= s_mac_data_in;
699
                        when  x"1f" =>  s_dst_ip_ping(23 downto 16)     <= s_mac_data_in;
700
                        when  x"20" =>  s_dst_ip_ping(15 downto 8)      <= s_mac_data_in;
701
                        when  x"21" =>  s_dst_ip_ping(7 downto 0)       <= s_mac_data_in;
702
 
703
                        when others =>  null;
704
        end case;
705
        end if;
706
end if;
707
end process p_acquire_address;
708
--===================================================================================
709
 
710
--================== Receive & Process & Transmit Ping Packets======================
711
p_recieve_transmit_ping_data:process(i_tx_clk)
712
begin
713
        if(rising_edge(i_tx_clk)) then
714
        s_wr_en_fifo_ping       <= '0';
715
        s_rst_fifo_ping         <= '0';
716
        s_start_send            <= '0';
717
        s_mac_data_in_last_d    <= s_mac_data_in_last;
718
 
719
        Status_indc                                     <=      x"A1";
720
 
721
                if (i_reset='1') then
722
 
723
                        s_rst_fifo_ping         <= '1';
724
                        s_wr_cnt                <= (others=>'0');
725
                        s_rd_cnt                <= (others=>'0');
726
 
727
                        o_mac_tlast             <= '0';
728
                        o_mac_tvalid            <= '0';
729
                        o_mac_tx_req            <= '0';
730
 
731
                        st_PING_STATE           <= IDLE;
732
                        Status_indc                             <=      x"FF";
733
 
734
                else
735
 
736
                        CASE st_PING_STATE IS
737
                        --=============================================================================================
738
                                WHEN IDLE =>
739
                                                Status_indc                             <=      x"01";
740
                                                if (s_mac_data_in_valid = '1') then
741
                                                        st_PING_STATE                   <= ACQUIRE_DATA;
742
                                                        s_wr_en_fifo_ping                       <= '1';
743
                                                        s_din_fifo_ping                         <= s_mac_data_in;
744
                                                        s_wr_cnt                        <= s_wr_cnt+1;
745
                                                 end if;
746
 
747
                                ----------------------------------------------------
748
                                WHEN ACQUIRE_DATA =>
749
                                                Status_indc                             <=      x"02";
750
                                                if (s_mac_data_in_valid = '1') then
751
                                                        s_wr_en_fifo_ping                       <= '1';
752
                                                        s_din_fifo_ping                         <= s_mac_data_in;
753
                                                        s_wr_cnt                        <= s_wr_cnt+1;
754
                                                        if (s_mac_data_in_last = '1') then
755
                                                                st_PING_STATE           <= WAIT_CHN;
756
                                                        end if;
757
                                                        if ((s_wr_cnt=34) and (s_mac_data_in/=x"08")) then
758
                                                                s_rst_fifo_ping                 <= '1';
759
                                                                st_PING_STATE                   <= WAIT_END;
760
                                                        end if;
761
                                                 end if;
762
 
763
                                                if (s_ip_rx_err_in/="0000") then
764
                                                        s_rst_fifo_ping                         <= '1';
765
                                                        st_PING_STATE                   <= WAIT_END;
766
                                                        if (s_mac_data_in_last = '1') then
767
                                                                st_PING_STATE           <= IDLE;
768
                                                        end if;
769
                                                end if;
770
 
771
                                                if (s_no_ping_data='1') then
772
                                                        s_rst_fifo_ping                         <= '1';
773
                                                        st_PING_STATE                   <= WAIT_END;
774
                                                        if (s_mac_data_in_last = '1') then
775
                                                                st_PING_STATE                   <= IDLE;
776
                                                        end if;
777
                                                end if;
778
 
779
                                -----------------------------------------------------
780
                                WHEN WAIT_END =>
781
                                                Status_indc                             <=      x"03";
782
                                                if (s_mac_data_in_valid = '1') then
783
                                                        if (s_mac_data_in_last = '1') then
784
                                                                s_wr_cnt                        <= (others=>'0');
785
                                                                s_rd_cnt                        <= (others=>'0');
786
                                                                st_PING_STATE           <= IDLE;
787
                                                        end if;
788
                                                end if;
789
 
790
                                -----------------------------------------------------                     
791
                                WHEN WAIT_CHN =>
792
                                                Status_indc                             <=      x"04";
793
                                                o_mac_tx_req                                    <= '1';
794
                                                if (i_mac_tx_granted = '1') then
795
                                                        st_PING_STATE                           <= SEND_DATA;
796
                                                        s_start_send                            <= '1';
797
                                                end if;
798
 
799
                                ------------------------------------------------------
800
                                WHEN SEND_DATA =>
801
                                                Status_indc                             <=      x"05";
802
                                                if (s_rd_cnt=0) then
803
                                                        s_rd_cnt                        <= s_rd_cnt+1;
804
                                                        o_mac_tvalid                    <= '1';
805
                                                end if;
806
                                                ---------------------------------
807
                                                if (i_mac_tready='1') then
808
                                                        s_rd_cnt                                        <= s_rd_cnt+1;
809
                                                        if (s_rd_cnt=s_wr_cnt-1) then
810
                                                                o_mac_tlast             <= '1';
811
                                                        end if;
812
                                                end if;
813
                                                ---------------------------------         
814
                                                if (s_rd_cnt=s_wr_cnt) then
815
                                                        s_rst_fifo_ping                         <= '1';
816
                                                        s_wr_cnt                        <= (others=>'0');
817
                                                        s_rd_cnt                        <= (others=>'0');
818
                                                        o_mac_tx_req                    <= '0';
819
                                                        o_mac_tvalid                    <= '0';
820
                                                        o_mac_tlast                     <= '0';
821
                                                        st_PING_STATE                   <= IDLE;
822
                                                end if;
823
 
824
                        END CASE;
825
                end if;
826
        end if;
827
end process p_recieve_transmit_ping_data;
828
--============================================================================================    
829
 
830
--======== FIFO for Saving Ping Data from Mac Layer ==========================================
831
inst_ping_fifo :ping_fifo
832
PORT map
833
(
834
        rst                             =>      s_rst_fifo_ping,
835
        wr_clk                          =>      i_tx_clk,
836
        rd_clk                          =>      i_tx_clk,
837
        din                             =>      s_din_fifo_ping,
838
        wr_en                           =>      s_wr_en_fifo_ping,
839
        rd_en                           =>      s_rd_en_fifo_ping,
840
        dout                            =>      s_dout_fifo_ping,
841
        full                            =>      open,
842
        empty                           =>      open,
843
        valid                           =>      open
844
);
845
--============================================================================================ 
846
 
847
--=========Sync FIFO for Convert RX_CLK Domain Signals to TX_CLK Domain Signals===============  
848
inst_ping_cheksum_calc:ping_cheksum_calc
849
port map
850
(
851
        i_clk                   => i_tx_clk,
852
        i_reset                 => i_reset,
853
        i_din                   => s_checksum_data_in,
854
        i_din_rdy               => s_mac_data_in_valid,
855
        i_start_calc            => s_checksum_start_calc,
856
        i_stop_calc             => s_checksum_stop_calc,
857
        o_checksum_valid        => open,
858
        o_checksum              => s_checksum_data_out
859
);
860
--============================================================================================
861
 
862
end Behavioral;

powered by: WebSVN 2.1.0

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