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

Subversion Repositories gbiteth

[/] [gbiteth/] [trunk/] [rtl/] [rgmii/] [rgmii_rx_buf.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_buf.vhd
6
-- Author     : liyi  <alxiuyain@foxmail.com>
7
-- Company    : OE@HUST
8
-- Created    : 2013-05-05
9
-- Last update: 2013-05-20
10
-- Platform   : 
11
-- Standard   : VHDL'93/02
12
-------------------------------------------------------------------------------
13
-- Description: 
14
-------------------------------------------------------------------------------
15
-- Copyright (c) 2013 OE@HUST
16
-------------------------------------------------------------------------------
17
-- Revisions  :
18
-- Date        Version  Author  Description
19
-- 2013-05-05  1.0      liyi    Created
20
-------------------------------------------------------------------------------
21
LIBRARY ieee;
22
USE ieee.std_logic_1164.ALL;
23
USE ieee.numeric_std.ALL;
24
-------------------------------------------------------------------------------
25
ENTITY rgmii_rx_buf IS
26
 
27
  PORT (
28
    iEthClk : IN STD_LOGIC;
29
    iWbClk  : IN STD_LOGIC;
30
    iRst_n  : IN STD_LOGIC;
31
 
32
    iEOF        : IN STD_LOGIC;
33
    iRxData     : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
34
    iPayloadLen : IN UNSIGNED(15 DOWNTO 0);
35
    iRxDV       : IN STD_LOGIC;
36
    iErrCRC     : IN STD_LOGIC;
37
    iErrLen     : IN STD_LOGIC;
38
    iErrCheckSum: IN STD_LOGIC;
39
    iGetArp     : IN STD_LOGIC;
40
    iGetIPv4    : IN STD_LOGIC;
41
    iGetRaw     : IN STD_LOGIC;
42
    iSOF        : IN STD_LOGIC;
43
 
44
    oRxData     : OUT STD_LOGIC_VECTOR(31 DOWNTO 0);
45
    oRxLenInfo  : OUT STD_LOGIC_VECTOR(31 DOWNTO 0);
46
    iRxDataRead : IN  STD_LOGIC;
47
    iRxInfoRead : IN  STD_LOGIC;
48
 
49
    oIntNewFrame    : OUT STD_LOGIC;
50
    iIntNewFrameClr : IN  STD_LOGIC;
51
 
52
    -- receive enable
53
    iRxEn : IN STD_LOGIC
54
    );
55
 
56
END ENTITY rgmii_rx_buf;
57
-------------------------------------------------------------------------------
58
ARCHITECTURE rtl OF rgmii_rx_buf IS
59
 
60
  CONSTANT DATA_WIDTH : NATURAL  := 32;
61
  CONSTANT ADDR_WIDTH : NATURAL  := 11;
62
  -- Build a 2-D array type for the RAM
63
  SUBTYPE word_t IS STD_LOGIC_VECTOR((DATA_WIDTH-1) DOWNTO 0);
64
  TYPE memory_t IS ARRAY(2**ADDR_WIDTH-1 DOWNTO 0) OF word_t;
65
  -- Declare the RAM signal.    
66
  SIGNAL ram          : memory_t := (OTHERS => (OTHERS => '0'));
67
  SIGNAL raddr        : NATURAL RANGE 0 TO 2**ADDR_WIDTH - 1;
68
  SIGNAL waddr        : NATURAL RANGE 0 TO 2**ADDR_WIDTH - 1;
69
  SIGNAL rWE          : STD_LOGIC;
70
  SIGNAL rRxData      : STD_LOGIC_VECTOR(31 DOWNTO 0);
71
 
72
  SIGNAL rRxInfoI       : STD_LOGIC_VECTOR(31 DOWNTO 0);
73
  SIGNAL cRxInfoO       : STD_LOGIC_VECTOR(31 DOWNTO 0);
74
  SIGNAL cInfoFifoRd    : STD_LOGIC;
75
  SIGNAL rInfoFifoWr    : STD_LOGIC;
76
  SIGNAL cInfoFifoEmpty : STD_LOGIC;
77
  SIGNAL cInfoFifoFull  : STD_LOGIC;
78
 
79
BEGIN  -- ARCHITECTURE rtl
80
 
81
  blk0 : BLOCK IS
82
    TYPE state_t IS (IDLE, DATA);
83
    SIGNAL rState     : state_t;
84
    SIGNAL rCnt       : UNSIGNED(1 DOWNTO 0);
85
    SIGNAL rBeginAddr : NATURAL RANGE 0 TO 2**ADDR_WIDTH - 1;
86
 
87
    --SIGNAL rNewFrame  : STD_LOGIC;
88
    --SIGNAL rNewFrameD : STD_LOGIC_VECTOR(1 DOWNTO 0);
89
 
90
    SIGNAL rInfoFifoRdD1 : STD_LOGIC;
91
  BEGIN  -- BLOCK blk0
92
    PROCESS (iEthClk, iRst_n) IS
93
    --VARIABLE vGetFrame : STD_LOGIC_VECTOR(3 DOWNTO 0);
94
    BEGIN
95
      IF iRst_n = '0' THEN
96
        rState                           <= IDLE;
97
        rCnt                             <= (OTHERS => '0');
98
        waddr                            <= 0;
99
        rBeginAddr                       <= 0;
100
        rWE                              <= '0';
101
        --rNewFrame   <= '0';
102
        rRxInfoI(15+ADDR_WIDTH DOWNTO 0) <= (OTHERS => '0');
103
        rInfoFifoWr                      <= '0';
104
        rRxInfoI(31 DOWNTO 28) <= (OTHERS => '0');
105
      ELSIF rising_edge(iEthClk) THEN
106
        rWE                               <= '0';
107
        rInfoFifoWr                       <= '0';
108
        --rRxInfoI(27 DOWNTO ADDR_WIDTH+16) <= (OTHERS => '0');
109
        IF rWE = '1' THEN
110
          -- synthesis translate_off
111
          IF waddr < 2**ADDR_WIDTH-1 THEN
112
            -- synthesis translate_on
113
            waddr <= waddr + 1;
114
          -- synthesis translate_off
115
          END IF;
116
        -- synthesis translate_on
117
        END IF;
118
        CASE rState IS
119
          WHEN IDLE =>
120
            rCnt <= (OTHERS => '0');
121
            --vGetFrame              := '0'&iGetArp&iGetIPv4&iGetRaw;
122
            --rRxInfoI(31 DOWNTO 28) <= vGetFrame;
123
            -- IF vGetFrame /= X"0" AND iRxEn = '1' AND cInfoFifoFull = '0' THEN
124
            -- IF iSOF = '1' AND iRxEn = '1' AND cInfoFifoFull = '0' THEN
125
                        IF iSOF = '1' AND cInfoFifoFull = '0' THEN
126
              rState     <= DATA;
127
              rBeginAddr <= waddr;
128
              --rNewFrame  <= '0';
129
 
130
              rRxInfoI(15+ADDR_WIDTH DOWNTO 16) <= STD_LOGIC_VECTOR(TO_UNSIGNED(waddr, ADDR_WIDTH));
131
            END IF;
132
          ---------------------------------------------------------------------
133
          WHEN DATA =>
134
            IF iRxDV = '1' THEN
135
              rCnt <= rCnt + 1;
136
              CASE rCnt IS
137
                WHEN B"00" => rRxData(31 DOWNTO 24) <= iRxData;
138
                WHEN B"01" => rRxData(23 DOWNTO 16) <= iRxData;
139
                WHEN B"10" => rRxData(15 DOWNTO 8)  <= iRxData;
140
                WHEN B"11" =>
141
                  rRxData(7 DOWNTO 0) <= iRxData;
142
                  rWE                 <= '1';
143
                WHEN OTHERS => NULL;
144
              END CASE;
145
            END IF;
146
            IF iEOF = '1' THEN
147
              rRxInfoI(31 DOWNTO 28) <= '0'&iGetArp&iGetIPv4&iGetRaw;
148
              rRxInfoI(15 DOWNTO 0) <= STD_LOGIC_VECTOR(iPayloadLen);
149
              rState                <= IDLE;
150
              IF iErrCheckSum = '1' OR iErrCRC = '1' OR iErrLen = '1' THEN  -- discard wath we just write
151
                waddr <= rBeginAddr;
152
              ELSE                      -- no err
153
                -- rNewFrame             <= '1';
154
                rInfoFifoWr <= '1';
155
                IF rCnt /= B"00" THEN   -- last one,length NOT multiple of 4
156
                  rWE <= '1';
157
                END IF;
158
              END IF;
159
            END IF;
160
          WHEN OTHERS => NULL;
161
        END CASE;
162
      END IF;
163
    END PROCESS;
164
 
165
    ---------------------------------------------------------------------------
166
    -- interrupt generate
167
    ---------------------------------------------------------------------------
168
    PROCESS (iWbClk, iRst_n) IS
169
    BEGIN
170
      IF iRst_n = '0' THEN
171
        oIntNewFrame  <= '0';
172
        --rNewFrameD    <= (OTHERS => '0');
173
        --oRxLenInfo    <= (OTHERS => '0');
174
        --rInfoFifoRd   <= '0';
175
        rInfoFifoRdD1 <= '0';
176
        raddr         <= 0;
177
      ELSIF rising_edge(iWbClk) THEN
178
        IF iRxDataRead = '1' THEN
179
          -- synthesis translate_off
180
          IF raddr < 2**ADDR_WIDTH-1 THEN
181
            -- synthesis translate_on
182
            raddr <= raddr + 1;
183
          -- synthesis translate_off
184
          END IF;
185
        -- synthesis translate_on
186
        END IF;
187
        --rNewFrameD    <= rNewFrameD(0)&rNewFrame;
188
        --rInfoFifoRd   <= '0';
189
        rInfoFifoRdD1 <= cInfoFifoRd;
190
        IF rInfoFifoRdD1 = '1' THEN
191
          raddr <= to_integer(UNSIGNED(cRxInfoO(15+ADDR_WIDTH DOWNTO 16)));
192
        END IF;
193
        IF cInfoFifoEmpty = '0' THEN
194
          -- oIntNewFrame <= '1';
195
                  oIntNewFrame <= iRxEn;
196
        END IF;
197
        IF iIntNewFrameClr = '1' OR cInfoFifoEmpty = '1' THEN
198
          oIntNewFrame <= '0';
199
        END IF;
200
      END IF;
201
    END PROCESS;
202
 
203
  END BLOCK blk0;
204
 
205
  -----------------------------------------------------------------------------
206
  -- data buffer
207
  -----------------------------------------------------------------------------
208
  PROCESS(iEthClk)
209
  BEGIN
210
    IF(rising_edge(iEthClk)) THEN
211
      IF(rWE = '1') THEN
212
        ram(waddr) <= rRxData;
213
      END IF;
214
    END IF;
215
  END PROCESS;
216
  PROCESS(iWbClk)
217
  BEGIN
218
    IF(rising_edge(iWbClk)) THEN
219
      oRxData <= ram(raddr);
220
    END IF;
221
  END PROCESS;
222
 
223
  -----------------------------------------------------------------------------
224
  -- infomation fifo
225
  -----------------------------------------------------------------------------
226
  oRxLenInfo  <= cRxInfoO;
227
  cInfoFifoRd <= (iRxInfoRead OR NOT iRxEn) AND NOT cInfoFifoEmpty;
228
  fifo32x8_1 : ENTITY work.fifo32x8
229
    PORT MAP (
230
      data    => rRxInfoI,
231
      rdclk   => iWbClk,
232
      rdreq   => cInfoFifoRd,
233
      wrclk   => iEthClk,
234
      wrreq   => rInfoFifoWr,
235
      q       => cRxInfoO,
236
      rdempty => cInfoFifoEmpty,
237
      wrfull  => cInfoFifoFull);
238
 
239
END ARCHITECTURE rtl;

powered by: WebSVN 2.1.0

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