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

Subversion Repositories gbiteth

[/] [gbiteth/] [trunk/] [rtl/] [rgmii/] [rgmii_rx.vhd] - Blame information for rev 3

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 3 axuan25268
-------------------------------------------------------------------------------
2
-- Title      : 
3
-- Project    : 
4
-------------------------------------------------------------------------------
5
-- File       : rgmii_rx.vhd
6
-- Author     : liyi  <alxiuyain@foxmail.com>
7
-- Company    : OE@HUST
8
-- Created    : 2012-11-14
9
-- Last update: 2013-05-21
10
-- Platform   : 
11
-- Standard   : VHDL'93/02
12
-------------------------------------------------------------------------------
13
-- Description: 
14
-------------------------------------------------------------------------------
15
-- Copyright (c) 2012 OE@HUST
16
-------------------------------------------------------------------------------
17
-- Revisions  :
18
-- Date        Version  Author  Description
19
-- 2012-11-14  1.0      root    Created
20
-- 2013-05-13  1.0      liyi    change dataen signal ,now the dest&sourcr mac
21
--                              addr and type_len info are counted as valid data 
22
-------------------------------------------------------------------------------
23
LIBRARY ieee;
24
USE ieee.std_logic_1164.ALL;
25
USE ieee.numeric_std.ALL;
26
USE work.eth_pkg.ALL;
27
-------------------------------------------------------------------------------
28
ENTITY rgmii_rx IS
29
 
30
  PORT (
31
    iClk   : IN STD_LOGIC;
32
    iRst_n : IN STD_LOGIC;
33
 
34
    iRxData : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
35
    iRxDV   : IN STD_LOGIC;
36
    iRxEr   : IN STD_LOGIC;
37
 
38
    -- these signals come from wishbone clock domian, NOT synchronized
39
    iCheckSumIPCheck   : IN STD_LOGIC;
40
    iCheckSumTCPCheck  : IN STD_LOGIC;
41
    iCheckSumUDPCheck  : IN STD_LOGIC;
42
    iCheckSumICMPCheck : IN STD_LOGIC;
43
 
44
    oEOF         : OUT STD_LOGIC;
45
    oSOF         : OUT STD_LOGIC;
46
    oCRCErr      : OUT STD_LOGIC;
47
    oRxErr       : OUT STD_LOGIC;
48
    oLenErr      : OUT STD_LOGIC;
49
    oCheckSumErr : OUT STD_LOGIC;
50
 
51
    iMyMAC : IN STD_LOGIC_VECTOR(47 DOWNTO 0);
52
 
53
    oGetARP  : OUT    STD_LOGIC;
54
    oGetIPv4 : BUFFER STD_LOGIC;
55
    oGetCtrl : OUT    STD_LOGIC;
56
    oGetRaw  : BUFFER STD_LOGIC;
57
 
58
    oTaged      : OUT    STD_LOGIC;
59
    oTagInfo    : OUT    STD_LOGIC_VECTOR(15 DOWNTO 0);
60
    oStackTaged : BUFFER STD_LOGIC;
61
    oTagInfo2   : OUT    STD_LOGIC_VECTOR(15 DOWNTO 0);
62
 
63
    oLink   : OUT STD_LOGIC;
64
    oSpeed  : OUT STD_LOGIC_VECTOR(1 DOWNTO 0);
65
    oDuplex : OUT STD_LOGIC;
66
 
67
    oPayloadLen : BUFFER UNSIGNED(15 DOWNTO 0);
68
    oRxData     : OUT    STD_LOGIC_VECTOR(7 DOWNTO 0);
69
    oRxDV       : OUT    STD_LOGIC
70
    );
71
 
72
END ENTITY rgmii_rx;
73
-------------------------------------------------------------------------------
74
ARCHITECTURE rtl OF rgmii_rx IS
75
 
76
  SIGNAL sof, eof      : STD_LOGIC;
77
  SIGNAL crcEn, crcEn2 : STD_LOGIC;
78
  SIGNAL crcErr        : STD_LOGIC;
79
 
80
  SIGNAL dvDly   : STD_LOGIC_VECTOR(3 DOWNTO 0);
81
  TYPE dataAyy_t IS ARRAY (3 DOWNTO 0) OF STD_LOGIC_VECTOR(7 DOWNTO 0);
82
  SIGNAL dataDly : dataAyy_t;
83
 
84
  TYPE state_t IS (IDLE, SFD, DEST_MAC, SOURCE_MAC, FRAME_TYPE, TAG_INFO1, TAG_INFO2, PAYLOAD);
85
  SIGNAL state       : state_t;
86
  SIGNAL byteCnt     : UNSIGNED(15 DOWNTO 0);
87
  SIGNAL destMACAddr : STD_LOGIC_VECTOR(47 DOWNTO 8);
88
 
89
  SIGNAL frm4Me : STD_LOGIC;
90
 
91
  SIGNAL rxDV, dataEn : STD_LOGIC;
92
 
93
  SIGNAL rCheckSumOk : BOOLEAN;
94
 
95
BEGIN  -- ARCHITECTURE rtl
96
 
97
  -- check sum calc
98
  blkCS : BLOCK IS
99
    TYPE state_t IS (IDLE, IP4_HEAD, TCP, UDP, ICMP, UNKNOWN, DONE);
100
    SIGNAL rState         : state_t;
101
    SIGNAL cRxDataD1      : STD_LOGIC_VECTOR(7 DOWNTO 0);
102
    SIGNAL rCheckSum      : UNSIGNED(31 DOWNTO 0);
103
    SIGNAL cCheckSum      : UNSIGNED(15 DOWNTO 0);
104
    SIGNAL rIPCSOK        : BOOLEAN;               -- ip checksum ok
105
    SIGNAL rByteCnt       : UNSIGNED(15 DOWNTO 0);
106
    SIGNAL cByteValid     : STD_LOGIC;
107
    SIGNAL rPesudoCS      : UNSIGNED(18 DOWNTO 0);
108
    SIGNAL rIPHeadLen     : UNSIGNED(5 DOWNTO 0);  -- 20~60 bytes
109
    SIGNAL rTotalLen      : UNSIGNED(15 DOWNTO 0);
110
    SIGNAL cIPPayloadLen  : UNSIGNED(15 DOWNTO 0);
111
    SIGNAL rProtocol      : STD_LOGIC_VECTOR(7 DOWNTO 0);
112
    SIGNAL cIPCSCheckEn   : BOOLEAN;
113
    SIGNAL cTCPCSCheckEn  : BOOLEAN;
114
    SIGNAL cICMPCSCheckEn : BOOLEAN;
115
    SIGNAL cUDPCSCheckEn  : BOOLEAN;
116
    SIGNAL rGetCheckSum   : BOOLEAN;
117
    SIGNAL rCsCheckSync   : STD_LOGIC_VECTOR(7 DOWNTO 0);
118
  BEGIN  -- BLOCK blkCS
119
    cRxDataD1      <= dataDly(0);
120
    cByteValid     <= dvDly(0);
121
    cCheckSum      <= rCheckSum(31 DOWNTO 16) + rCheckSum(15 DOWNTO 0);
122
    --cCheckSumOk   <= cCheckSum = X"FFFF";
123
    cIPPayloadLen  <= rTotalLen - rIPHeadLen;
124
    cIPCSCheckEn   <= rCsCheckSync(1) = '1';
125
    cTCPCSCheckEn  <= rCsCheckSync(3) = '1';
126
    cUDPCSCheckEn  <= rCsCheckSync(5) = '1';
127
    cICMPCSCheckEn <= rCsCheckSync(7) = '1';
128
 
129
    PROCESS (iClk) IS
130
    BEGIN
131
      IF rising_edge(iClk) THEN
132
        rCsCheckSync(1 DOWNTO 0) <= rCsCheckSync(0)&iCheckSumIPCheck;
133
        rCsCheckSync(3 DOWNTO 2) <= rCsCheckSync(2)&iCheckSumTCPCheck;
134
        rCsCheckSync(5 DOWNTO 4) <= rCsCheckSync(4)&iCheckSumUDPCheck;
135
        rCsCheckSync(7 DOWNTO 6) <= rCsCheckSync(6)&iCheckSumICMPCheck;
136
      END IF;
137
    END PROCESS;
138
 
139
    PROCESS (iClk, iRst_n) IS
140
    BEGIN
141
      IF iRst_n = '0' THEN
142
        rState       <= IDLE;
143
        rCheckSum    <= (OTHERS => '0');
144
        rByteCnt     <= (OTHERS => '0');
145
        rPesudoCS    <= (OTHERS => '0');
146
        rIPHeadLen   <= (OTHERS => '0');
147
        rTotalLen    <= (OTHERS => '0');
148
        rProtocol    <= (OTHERS => '0');
149
        rCheckSumOk  <= FALSE;
150
        rGetCheckSum <= FALSE;
151
        rIPCSOK      <= FALSE;
152
      ELSIF rising_edge(iClk) THEN
153
        rGetCheckSum <= FALSE;
154
        IF eof = '1' THEN
155
          rState <= IDLE;
156
        END IF;
157
        CASE rState IS
158
          WHEN IDLE =>
159
            rPesudoCS   <= (OTHERS => '0');
160
            rCheckSum   <= (OTHERS => '0');
161
            rByteCnt    <= X"0001";
162
            rCheckSumOk <= TRUE;
163
            rIPCSOK     <= FALSE;
164
            IF oGetIPv4 = '1' THEN
165
              rState <= IP4_HEAD;
166
              rCheckSumOk <= FALSE;
167
            END IF;
168
          ---------------------------------------------------------------------
169
          WHEN IP4_HEAD =>
170
            IF cByteValid = '1' THEN
171
              rByteCnt <= rByteCnt + 1;
172
              IF rByteCnt(0) = '1' THEN  -- higher byte
173
                rCheckSum <= rCheckSum + to_integer(UNSIGNED(cRxDataD1)&X"00");
174
              ELSE                       -- lower byte
175
                rCheckSum <= rCheckSum + UNSIGNED(cRxDataD1);
176
              END IF;
177
              CASE rByteCnt(5 DOWNTO 0) IS
178
                WHEN B"000001" =>
179
                  rIPHeadLen <= UNSIGNED(cRxDataD1(3 DOWNTO 0))&B"00";
180
                WHEN B"000011" => rTotalLen(15 DOWNTO 8) <= UNSIGNED(cRxDataD1);
181
                WHEN B"000100" => rTotalLen(7 DOWNTO 0)  <= UNSIGNED(cRxDataD1);
182
                WHEN B"001010" =>        -- Protocol
183
                  rPesudoCS <= rPesudoCS + UNSIGNED(cRxDataD1);
184
                  rProtocol <= cRxDataD1;
185
                WHEN B"001011" =>
186
                  rPesudoCS <= rPesudoCS + cIPPayloadLen;
187
                -- source &Destination ip addr
188
                WHEN B"001101" | B"001111" | B"010001" | B"010011" =>
189
                  rPesudoCS <= rPesudoCS + to_integer(UNSIGNED(cRxDataD1)&X"00");
190
                WHEN B"001110" | B"010000" | B"010010" | B"010100"=>
191
                  rPesudoCS <= rPesudoCS + UNSIGNED(cRxDataD1);
192
                WHEN OTHERS => NULL;
193
              END CASE;
194
              IF rIPHeadLen = rByteCnt(5 DOWNTO 0) THEN
195
                rGetCheckSum <= TRUE;
196
                rState       <= UNKNOWN;
197
                CASE rProtocol IS
198
                  WHEN X"01" =>          -- ICMP
199
                    rState <= ICMP;
200
                  WHEN X"06" =>          -- TCP
201
                    rState <= TCP;
202
                  WHEN X"11" =>          -- UDP
203
                    rState <= UDP;
204
                  WHEN OTHERS => NULL;
205
                END CASE;
206
              END IF;
207
            END IF;
208
          ---------------------------------------------------------------------
209
          -- tcp & udp are the same,both contain a pesudo header
210
          WHEN TCP | UDP =>
211
            IF rGetCheckSum THEN
212
              rIPCSOK   <= NOT cIPCSCheckEn OR (cIPCSCheckEn AND cCheckSum = X"FFFF");
213
              rCheckSum <= X"000"&B"0"&rPesudoCS;
214
            END IF;
215
            IF cByteValid = '1' THEN
216
              rByteCnt <= rByteCnt + 1;
217
              IF rByteCnt(0) = '1' THEN  -- higher byte
218
                IF rGetCheckSum THEN
219
                  rCheckSum <= X"000"&'0'&rPesudoCS + to_integer(UNSIGNED(cRxDataD1)&X"00");
220
                ELSE
221
                  rCheckSum <= rCheckSum + to_integer(UNSIGNED(cRxDataD1)&X"00");
222
                END IF;
223
              ELSE                       -- lower byte
224
                rCheckSum <= rCheckSum + UNSIGNED(cRxDataD1);
225
              END IF;
226
              IF rByteCnt = rTotalLen THEN
227
                rState       <= DONE;
228
                rGetCheckSum <= TRUE;
229
              END IF;
230
            END IF;
231
          ---------------------------------------------------------------------
232
          WHEN ICMP =>
233
            IF rGetCheckSum THEN
234
              rIPCSOK   <= NOT cIPCSCheckEn OR (cIPCSCheckEn AND cCheckSum = X"FFFF");
235
              rCheckSum <= (OTHERS => '0');
236
            END IF;
237
            IF cByteValid = '1' THEN
238
              rByteCnt <= rByteCnt + 1;
239
              IF rByteCnt(0) = '1' THEN  -- higher byte
240
                IF rGetCheckSum THEN
241
                  rCheckSum <= X"0000"&UNSIGNED(cRxDataD1)&X"00";
242
                ELSE
243
                  rCheckSum <= rCheckSum + to_integer(UNSIGNED(cRxDataD1)&X"00");
244
                END IF;
245
              ELSE                       -- lower byte
246
                rCheckSum <= rCheckSum + UNSIGNED(cRxDataD1);
247
              END IF;
248
              IF rByteCnt = rTotalLen THEN
249
                rState       <= DONE;
250
                rGetCheckSum <= TRUE;
251
              END IF;
252
            END IF;
253
          ---------------------------------------------------------------------
254
          WHEN UNKNOWN =>
255
            IF rGetCheckSum THEN
256
              rCheckSumOk <= NOT cIPCSCheckEn OR (cIPCSCheckEn AND cCheckSum = X"FFFF");
257
            END IF;
258
          ---------------------------------------------------------------------
259
          WHEN DONE =>
260
            IF rGetCheckSum THEN
261
              CASE rProtocol IS
262
                WHEN X"01" =>
263
                  rCheckSumOk <= rIPCSOK AND
264
                                 (NOT cICMPCSCheckEn OR
265
                                  (cICMPCSCheckEn AND cCheckSum = X"FFFF"));
266
                WHEN X"06" =>
267
                  rCheckSumOk <= rIPCSOK AND
268
                                 (NOT cTCPCSCheckEn OR
269
                                  (cTCPCSCheckEn AND cCheckSum = X"FFFF"));
270
                WHEN X"11" =>
271
                  rCheckSumOk <= rIPCSOK AND
272
                                 (NOT cUDPCSCheckEn OR
273
                                  (cUDPCSCheckEn AND cCheckSum = X"FFFF"));
274
                WHEN OTHERS => NULL;
275
              END CASE;
276
            END IF;
277
          ---------------------------------------------------------------------
278
          WHEN OTHERS => NULL;
279
        END CASE;
280
      END IF;
281
    END PROCESS;
282
  END BLOCK blkCS;
283
 
284
  -- USE normal inter-frame TO get link information
285
  PROCESS (iClk, iRst_n) IS
286
  BEGIN
287
    IF iRst_n = '0' THEN
288
      oLink   <= '0';
289
      oSpeed  <= B"00";
290
      oDuplex <= '0';
291
    ELSIF rising_edge(iClk) THEN
292
      IF iRxEr = '0' AND iRxDV = '0' THEN
293
        oLink   <= iRxData(0);          -- 0=down,1=up
294
        oSpeed  <= iRxData(2 DOWNTO 1);  -- 00=10Mbps,01=100Mbps,10=1000Mbps,11=reserved
295
        oDuplex <= iRxData(3);          -- 0=half-duplex,1=full-duplex
296
      END IF;
297
    END IF;
298
  END PROCESS;
299
 
300
  oEOF    <= eof;
301
  oCRCErr <= crcErr;
302
 
303
  -- delay! IN order TO get OUT OF the CRC part
304
  rxDV    <= iRxDV AND dataEn AND NOT iRxEr;
305
  oRxData <= dataDly(3);
306
  --oRxDV   <= dvDly(3) AND rxDV;
307
  oRxDV   <= dvDly(3) AND dataEn;       -- changed @ 2013-05-20
308
  PROCESS (iClk, iRst_n) IS
309
  BEGIN
310
    IF iRst_n = '0' THEN
311
      dvDly      <= (OTHERS => '0');
312
      dataDly(0) <= (OTHERS => '0');
313
      dataDly(1) <= (OTHERS => '0');
314
      dataDly(2) <= (OTHERS => '0');
315
      dataDly(3) <= (OTHERS => '0');
316
    ELSIF rising_edge(iClk) THEN
317
      dvDly      <= dvDly(2 DOWNTO 0) & rxDV;
318
      dataDly(3) <= dataDly(2);
319
      dataDly(2) <= dataDly(1);
320
      dataDly(1) <= dataDly(0);
321
      dataDly(0) <= iRxData;
322
    END IF;
323
  END PROCESS;
324
 
325
  crcEn2 <= crcEn AND iRxDV AND NOT iRxEr;
326
  crcCheck : ENTITY work.eth_crc32
327
    PORT MAP (
328
      iClk    => iClk,
329
      iRst_n  => iRst_n,
330
      iInit   => sof,
331
      iCalcEn => crcEn2,
332
      iData   => iRxData,
333
      oCRC    => OPEN,
334
      oCRCErr => crcErr);
335
 
336
  PROCESS (iClk, iRst_n) IS
337
    VARIABLE ethType : STD_LOGIC_VECTOR(15 DOWNTO 0);
338
  BEGIN
339
    IF iRst_n = '0' THEN
340
      state        <= IDLE;
341
      eof          <= '0';
342
      byteCnt      <= (OTHERS => '0');
343
      oPayloadLen  <= (OTHERS => '0');
344
      oGetCtrl     <= '0';
345
      oGetARP      <= '0';
346
      oGetIPv4     <= '0';
347
      oGetRaw      <= '0';
348
      --oDrop       <= '0';
349
      frm4Me       <= '0';
350
      crcEn        <= '0';
351
      sof          <= '0';
352
      dataEn       <= '0';
353
      destMACAddr  <= (OTHERS => '0');
354
      oTagInfo2    <= (OTHERS => '0');
355
      oTaged       <= '0';
356
      oStackTaged  <= '0';
357
      oTagInfo     <= (OTHERS => '0');
358
      oLenErr      <= '0';
359
      oCheckSumErr <= '0';
360
      oSOF         <= '0';
361
    ELSIF rising_edge(iClk) THEN
362
      --oGetCtrl <= '0';
363
      --oGetARP  <= '0';
364
      --oGetIPv4 <= '0';
365
      --oGetRaw  <= '0';
366
      eof  <= '0';
367
      --oDrop    <= '0';
368
      sof  <= '0';
369
      oSOF <= '0';
370
      IF iRxDV = '1' AND iRxEr = '1' THEN
371
        oRxErr <= '1';
372
      END IF;
373
 
374
      CASE state IS
375
        WHEN IDLE =>
376
          crcEn        <= '0';
377
          dataEn       <= '0';
378
          frm4Me       <= '0';
379
          oGetCtrl     <= '0';
380
          oGetARP      <= '0';
381
          oGetIPv4     <= '0';
382
          oGetRaw      <= '0';
383
          oRxErr       <= '0';
384
          oTaged       <= '0';
385
          oStackTaged  <= '0';
386
          oLenErr      <= '0';
387
          oCheckSumErr <= '0';
388
          IF iRxData = X"55" THEN
389
            state   <= SFD;
390
            byteCnt <= (OTHERS => '0');
391
            sof     <= '1';
392
          END IF;
393
        -----------------------------------------------------------------------
394
        WHEN SFD =>
395
          IF iRxData = X"55" THEN
396
            byteCnt <= byteCnt + 1;
397
          ELSIF iRxData = X"D5" THEN
398
            IF byteCnt(2 DOWNTO 0) = B"110" THEN
399
              state   <= DEST_MAC;
400
              crcEn   <= '1';
401
              dataEn  <= '1';           -- 2013-05-13
402
              oSOF    <= '1';
403
              byteCnt <= (OTHERS => '0');
404
            ELSE
405
              state <= IDLE;
406
            END IF;
407
          ELSE
408
            state <= IDLE;
409
          END IF;
410
          IF iRxDV = '0' THEN
411
            state   <= IDLE;
412
            eof     <= '1';
413
            oLenErr <= '1';
414
          END IF;
415
        -----------------------------------------------------------------------
416
        WHEN DEST_MAC =>
417
          IF iRxDV = '1' AND iRxEr = '0' THEN
418
            byteCnt <= byteCnt + 1;
419
            CASE byteCnt(2 DOWNTO 0) IS
420
              WHEN B"000" => destMACAddr(47 DOWNTO 40) <= iRxData;
421
              WHEN B"001" => destMACAddr(39 DOWNTO 32) <= iRxData;
422
              WHEN B"010" => destMACAddr(31 DOWNTO 24) <= iRxData;
423
              WHEN B"011" => destMACAddr(23 DOWNTO 16) <= iRxData;
424
              WHEN B"100" => destMACAddr(15 DOWNTO 8)  <= iRxData;
425
              WHEN B"101" =>
426
                byteCnt(2 DOWNTO 0) <= (OTHERS => '0');
427
                state               <= SOURCE_MAC;
428
                IF destMACAddr(47 DOWNTO 8)&iRxData = iMyMAC  -- unicast
429
                            OR destMACAddr(47 DOWNTO 8)&iRxData = MAC_ADDR_CTRL  -- multicast for flow control
430
                            OR destMACAddr(47 DOWNTO 8)&iRxData = X"FFFFFFFFFFFF" THEN  -- broadcast
431
                  --oDrop <= '1';
432
                  frm4Me <= '1';
433
                END IF;
434
              WHEN OTHERS => NULL;
435
            END CASE;
436
          END IF;
437
          IF iRxDV = '0' THEN
438
            state   <= IDLE;
439
            eof     <= '1';
440
            oLenErr <= '1';
441
          END IF;
442
        -----------------------------------------------------------------------
443
        WHEN SOURCE_MAC =>
444
          IF iRxDV = '1' AND iRxEr = '0' THEN
445
            byteCnt <= byteCnt + 1;
446
            IF byteCnt(2 DOWNTO 0) = B"101" THEN
447
              state               <= FRAME_TYPE;
448
              byteCnt(2 DOWNTO 0) <= (OTHERS => '0');
449
            END IF;
450
          END IF;
451
          IF iRxDV = '0' THEN
452
            state   <= IDLE;
453
            eof     <= '1';
454
            oLenErr <= '1';
455
          END IF;
456
        -----------------------------------------------------------------------
457
        WHEN FRAME_TYPE =>
458
          IF iRxDV = '1' AND iRxEr = '0' THEN
459
            byteCnt <= byteCnt + 1;
460
            IF byteCnt(0) = '0' THEN
461
              destMACAddr(15 DOWNTO 8) <= iRxData;
462
            ELSE
463
              byteCnt(1 DOWNTO 0) <= (OTHERS => '0');
464
              ethType             := destMACAddr(15 DOWNTO 8) & iRxData;
465
              IF ethType < X"0600" AND ethType > X"0000" THEN
466
                oGetRaw <= frm4Me;
467
                state   <= PAYLOAD;
468
                dataEn  <= '1';
469
              END IF;
470
              oPayloadLen <= UNSIGNED(ethType);
471
              -- check the ethnert frame TYPE ,only ARP AND IP PACKAGE are wanted
472
              CASE ethType IS
473
                WHEN ETH_TYPE_IPv4 =>
474
                  oGetIPv4 <= frm4Me;
475
                  state    <= PAYLOAD;
476
                  dataEn   <= '1';
477
                WHEN ETH_TYPE_ARP =>
478
                  oGetARP <= frm4Me;
479
                  state   <= PAYLOAD;
480
                  dataEn  <= '1';
481
                WHEN ETH_TYPE_CTRL =>
482
                  oGetCtrl <= frm4Me;
483
                  state    <= PAYLOAD;
484
                  dataEn   <= '1';
485
                WHEN x"8100" =>
486
                  oTaged <= '1';
487
                  state  <= TAG_INFO1;
488
                  dataEn <= '0';
489
                WHEN x"88A8" | x"9100" =>
490
                  oStackTaged <= '1';
491
                  state       <= TAG_INFO1;
492
                  dataEn      <= '0';
493
                WHEN OTHERS =>          --oDrop    <= '1';
494
                  state  <= PAYLOAD;
495
                  dataEn <= '0';
496
                  frm4Me <= '0';        -- add @ 2013-05-13
497
              END CASE;
498
            END IF;
499
          END IF;
500
          IF iRxDV = '0' THEN
501
            state   <= IDLE;
502
            eof     <= '1';
503
            oLenErr <= '1';
504
          END IF;
505
        -----------------------------------------------------------------------
506
        WHEN TAG_INFO1 =>
507
          IF iRxDV = '1' AND iRxEr = '0' THEN
508
            byteCnt <= byteCnt + 1;
509
            IF byteCnt(0) = '0' THEN
510
              oTagInfo(15 DOWNTO 8) <= iRxData;
511
            ELSE
512
              byteCnt(1 DOWNTO 0)  <= (OTHERS => '0');
513
              oTagInfo(7 DOWNTO 0) <= iRxData;
514
              IF oStackTaged = '1' THEN
515
                state <= TAG_INFO2;
516
              ELSE
517
                state <= FRAME_TYPE;
518
              END IF;
519
            END IF;
520
          END IF;
521
          IF iRxDV = '0' THEN
522
            state   <= IDLE;
523
            eof     <= '1';
524
            oLenErr <= '1';
525
          END IF;
526
        -----------------------------------------------------------------------
527
        WHEN TAG_INFO2 =>
528
          IF iRxDV = '1' AND iRxEr = '0' THEN
529
            byteCnt <= byteCnt + 1;
530
            CASE byteCnt(1 DOWNTO 0) IS
531
              -- we do NOT check,but 0x8100 is expected!
532
              WHEN B"00" => NULL;
533
              WHEN B"01" => NULL;
534
              WHEN B"10" =>
535
                oTagInfo2(15 DOWNTO 8) <= iRxData;
536
              WHEN B"11" =>
537
                oTagInfo2(7 DOWNTO 0) <= iRxData;
538
                byteCnt(2 DOWNTO 0)   <= (OTHERS => '0');
539
                state                 <= FRAME_TYPE;
540
              WHEN OTHERS => NULL;
541
            END CASE;
542
          END IF;
543
                             IF iRxDV = '0' THEN
544
                               state   <= IDLE;
545
                               eof     <= '1';
546
                               oLenErr <= '1';
547
                             END IF;
548
        -----------------------------------------------------------------------
549
        WHEN PAYLOAD =>
550
          IF oGetRaw = '1' THEN
551
            IF byteCnt + 1 = oPayloadLen THEN                 -- PAD truncation
552
              dataEn <= '0';
553
            END IF;
554
          END IF;
555
          IF iRxDV = '1' THEN
556
            IF iRxEr = '0' THEN
557
              byteCnt <= byteCnt + 1;
558
            END IF;
559
          ELSE
560
            state <= IDLE;
561
            eof   <= '1';
562
            IF rCheckSumOk THEN
563
              oCheckSumErr <= '0';
564
            ELSE
565
              oCheckSumErr <= '1';
566
            END IF;
567
            IF frm4Me = '0' THEN        -- add @ 2013-05-13
568
              oLenErr <= '1';
569
            END IF;
570
            IF oGetRaw = '0' THEN
571
              -- oPayloadLen <= byteCnt - 4; change @ 2013-05-13
572
              oPayloadLen <= 14 + byteCnt - 4;
573
            ELSIF oPayloadLen > byteCnt - 4 THEN
574
              oLenErr <= '1';
575
            END IF;
576
            -- add @ 2013-05-13
577
            IF oGetRaw = '1' THEN
578
              oPayloadLen <= oPayloadLen + 14;
579
            END IF;
580
            IF byteCnt > X"0600" OR byteCnt < X"0020" THEN
581
              oLenErr <= '1';
582
            END IF;
583
          END IF;
584
        WHEN OTHERS => state <= IDLE;
585
      END CASE;
586
 
587
    END IF;
588
  END PROCESS;
589
 
590
END ARCHITECTURE rtl;

powered by: WebSVN 2.1.0

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