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

Subversion Repositories gbiteth

[/] [gbiteth/] [trunk/] [rtl/] [rgmii/] [rgmii_wbs.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_wbs.vhd
6
-- Author     : liyi  <alxiuyain@foxmail.com>
7
-- Company    : OE@HUST
8
-- Created    : 2012-12-02
9
-- Last update: 2013-05-20
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-12-02  1.0      liyi    Created
20
-------------------------------------------------------------------------------
21
LIBRARY ieee;
22
USE ieee.std_logic_1164.ALL;
23
USE ieee.numeric_std.ALL;
24
USE work.de2_pkg.ALL;
25
-------------------------------------------------------------------------------
26
ENTITY rgmii_wbs IS
27
  GENERIC (
28
    IN_SIMULATION : BOOLEAN := FALSE);
29
  PORT (
30
    iWbClk : IN STD_LOGIC;
31
    iRst_n : IN STD_LOGIC;
32
 
33
    iWbM2S      : IN  wbMasterToSlaveIF_t;
34
    oWbS2M      : OUT wbSlaveToMasterIF_t;
35
    -- synthesis translate_off
36
    iWbM2S_addr : IN  STD_LOGIC_VECTOR(31 DOWNTO 0);
37
    iWbM2S_dat  : IN  STD_LOGIC_VECTOR(31 DOWNTO 0);
38
    iWbM2S_sel  : IN  STD_LOGIC_VECTOR(3 DOWNTO 0);
39
    iWbM2S_stb  : IN  STD_LOGIC;
40
    iWbM2S_cyc  : IN  STD_LOGIC;
41
    iWbM2S_we   : IN  STD_LOGIC;
42
    oWbS2M_dat  : OUT STD_LOGIC_VECTOR(31 DOWNTO 0);
43
    oWbS2M_ack  : OUT STD_LOGIC;
44
    -- synthesis translate_on
45
 
46
    ---------------------------------------------------------------------------
47
    -- tx wishbone master
48
    ---------------------------------------------------------------------------
49
    oTxEn            : OUT STD_LOGIC;   -- tx module enable
50
    oTxIntEn         : OUT STD_LOGIC;   -- interrupt enable
51
    oTxIntClr        : OUT STD_LOGIC;   -- clear interrupt SIGNAL
52
    iTxIntInfo       : IN  STD_LOGIC_VECTOR(7 DOWNTO 0);
53
    oTxDescData      : OUT STD_LOGIC_VECTOR(31 DOWNTO 0);
54
    iTxDescData      : IN  STD_LOGIC_VECTOR(31 DOWNTO 0);
55
    oTxDescWr        : OUT STD_LOGIC;
56
    oTxDescAddr      : OUT STD_LOGIC_VECTOR(8 DOWNTO 2);
57
    -- hardware checksum generation
58
    oCheckSumIPGen   : OUT STD_LOGIC;
59
    oCheckSumTCPGen  : OUT STD_LOGIC;
60
    oCheckSumUDPGen  : OUT STD_LOGIC;
61
    oCheckSumICMPGen : OUT STD_LOGIC;
62
 
63
    ---------------------------------------------------------------------------
64
    -- rx wishbone master
65
    ---------------------------------------------------------------------------
66
    oRxEn              : OUT STD_LOGIC;
67
    oRxDescAddr        : OUT STD_LOGIC_VECTOR(8 DOWNTO 2);
68
    oRxDescWr          : OUT STD_LOGIC;
69
    oRxDescData        : OUT STD_LOGIC_VECTOR(31 DOWNTO 0);
70
    iRxDescData        : IN  STD_LOGIC_VECTOR(31 DOWNTO 0);
71
    oRxIntClr          : OUT STD_LOGIC;
72
    iRxIntInfo         : IN  STD_LOGIC_VECTOR(7 DOWNTO 0);
73
    oRxIntEn           : OUT STD_LOGIC;
74
    oRxBufBegin        : OUT STD_LOGIC_VECTOR(31 DOWNTO 2);
75
    oRxBufEnd          : OUT STD_LOGIC_VECTOR(31 DOWNTO 2);
76
    -- hardware checksum check
77
    oCheckSumIPCheck   : OUT STD_LOGIC;
78
    oCheckSumTCPCheck  : OUT STD_LOGIC;
79
    oCheckSumUDPCheck  : OUT STD_LOGIC;
80
    oCheckSumICMPCheck : OUT STD_LOGIC;
81
 
82
    ---------------------------------------------------------------------------
83
    -- MDIO
84
    ---------------------------------------------------------------------------
85
    oPHYAddr          : OUT STD_LOGIC_VECTOR(4 DOWNTO 0);
86
    oRegAddr          : OUT STD_LOGIC_VECTOR(4 DOWNTO 0);
87
    oRdOp             : OUT STD_LOGIC;
88
    oWrOp             : OUT STD_LOGIC;
89
    oNoPre            : OUT STD_LOGIC;
90
    oClkDiv           : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
91
    iClrRdOp          : IN  STD_LOGIC                     := '0';
92
    iClrWrOp          : IN  STD_LOGIC                     := '0';
93
    oDataToPHY        : OUT STD_LOGIC_VECTOR(15 DOWNTO 0);
94
    iDataFromPHY      : IN  STD_LOGIC_VECTOR(15 DOWNTO 0) := X"0000";
95
    iDataFromPHYValid : IN  STD_LOGIC                     := '0';
96
    iMDIOBusy         : IN  STD_LOGIC                     := '0'
97
    );
98
 
99
END ENTITY rgmii_wbs;
100
-------------------------------------------------------------------------------
101
ARCHITECTURE rtl OF rgmii_wbs IS
102
  TYPE state_t IS (IDLE, WAIT1, WAIT2, WAIT3);
103
  SIGNAL rState   : state_t;
104
  SIGNAL rRegCtrl : STD_LOGIC_VECTOR(31 DOWNTO 0);
105
 
106
  SIGNAL cWbDatI : STD_LOGIC_VECTOR(31 DOWNTO 0);
107
  SIGNAL cWbAddr : STD_LOGIC_VECTOR(31 DOWNTO 0);
108
  SIGNAL cWbWE   : STD_LOGIC;
109
  SIGNAL cWbCyc  : STD_LOGIC;
110
  SIGNAL cWbStb  : STD_LOGIC;
111
  SIGNAL cWbSel  : STD_LOGIC_VECTOR(3 DOWNTO 0);
112
 
113
  SIGNAL rWbAck  : STD_LOGIC;
114
  SIGNAL rWbDatO : STD_LOGIC_VECTOR(31 DOWNTO 0);
115
BEGIN  -- ARCHITECTURE rtl
116
 
117
  oWbS2M.stall <= '0';
118
  oWbS2M.err   <= '0';
119
  oWbS2M.rty   <= '0';
120
  oWbS2M.ack   <= rWbAck;
121
  oWbS2M.dat   <= rWbDatO;
122
 
123
  -- synthesis translate_off
124
  gen0 : IF IN_SIMULATION GENERATE
125
    cWbDatI <= iWbM2S_dat;
126
    cWbAddr <= iWbM2S_addr;
127
    cWbWE   <= iWbM2S_we;
128
    cWbCyc  <= iWbM2S_cyc;
129
    cWbStb  <= iWbM2S_stb;
130
    cWbSel  <= iWbM2S_sel;
131
  END GENERATE gen0;
132
  oWbS2M_ack <= rWbAck;
133
  oWbS2M_dat <= rWbDatO;
134
  -- synthesis translate_on
135
  gen1 : IF NOT IN_SIMULATION GENERATE
136
    cWbDatI <= iWbM2S.dat;
137
    cWbAddr <= iWbM2S.addr;
138
    cWbWE   <= iWbM2S.we;
139
    cWbCyc  <= iWbM2S.cyc;
140
    cWbStb  <= iWbM2S.stb;
141
    cWbSel  <= iWbM2S.sel;
142
  END GENERATE gen1;
143
 
144
  oTxDescData <= cWbDatI;
145
  oTxDescAddr <= cWbAddr(8 DOWNTO 2);
146
  oTxDescWr   <= cWbWE AND
147
                 cWbStb AND
148
                 cWbCyc AND
149
                 NOT cWbAddr(10) AND
150
                 NOT cWbAddr(9);
151
 
152
  oRxDescData <= cWbDatI;
153
  oRxDescAddr <= cWbAddr(8 DOWNTO 2);
154
  oRxDescWr   <= cWbWE AND
155
                 cWbStb AND
156
                 cWbCyc AND
157
                 NOT cWbAddr(10) AND
158
                 cWbAddr(9);
159
 
160
  oTxEn              <= rRegCtrl(0);
161
  oTxIntEn           <= rRegCtrl(1);
162
  oCheckSumIPGen     <= rRegCtrl(8);
163
  oCheckSumTCPGen    <= rRegCtrl(9);
164
  oCheckSumUDPGen    <= rRegCtrl(10);
165
  oCheckSumICMPGen   <= rRegCtrl(11);
166
  oRxEn              <= rRegCtrl(16);
167
  oRxIntEn           <= rRegCtrl(17);
168
  oCheckSumIPCheck   <= rRegCtrl(24);
169
  oCheckSumTCPCheck  <= rRegCtrl(25);
170
  oCheckSumUDPCheck  <= rRegCtrl(26);
171
  oCheckSumICMPCheck <= rRegCtrl(27);
172
  PROCESS (iWbClk, iRst_n) IS
173
  BEGIN
174
    IF iRst_n = '0' THEN
175
      rWbAck      <= '0';
176
      rWbDatO     <= (OTHERS => '0');
177
      oTxIntClr   <= '0';
178
      oRxIntClr   <= '0';
179
      rRegCtrl    <= (OTHERS => '0');
180
      oRxBufBegin <= (OTHERS => '0');
181
      oRxBufEnd   <= (OTHERS => '0');
182
    ELSIF rising_edge(iWbClk) THEN
183
      oTxIntClr <= '0';
184
      oRxIntClr <= '0';
185
      rWbAck    <= '0';
186
      CASE rState IS
187
        WHEN IDLE =>
188
          IF cWbCyc = '1' AND cWbStb = '1' THEN
189
            rWbAck <= cWbWE;
190
            IF cWbWE = '1' THEN
191
              rState <= WAIT3;
192
            ELSE
193
              rState <= WAIT1;
194
            END IF;
195
 
196
            IF cWbWE = '0' AND cWbAddr(10) = '1' THEN
197
              IF cWbAddr(3 DOWNTO 2) = B"11" THEN
198
                oTxIntClr <= cWbSel(0);
199
                oRxIntClr <= cWbSel(1);
200
              END IF;
201
            END IF;
202
            IF (cWbWE AND cWbAddr(10)) = '1' THEN
203
              CASE cWbAddr(3 DOWNTO 2) IS
204
                WHEN B"00" =>
205
                  rRegCtrl <= cWbDatI;
206
                WHEN B"01" =>
207
                  oRxBufBegin <= cWbDatI(31 DOWNTO 2);
208
                WHEN B"10" =>
209
                  oRxBufEnd <= cWbDatI(31 DOWNTO 2);
210
                WHEN OTHERS => NULL;
211
              END CASE;
212
            END IF;
213
          END IF;
214
        -----------------------------------------------------------------------
215
        WHEN WAIT1 =>
216
          rState <= WAIT2;
217
        WHEN WAIT2 =>
218
          rState <= WAIT3;
219
          rWbAck <= '1';
220
          IF cWbAddr(10) = '0' THEN
221
            IF cWbAddr(9) = '0' THEN
222
              rWbDatO <= iTxDescData;
223
            ELSE
224
              rWbDatO <= iRxDescData;
225
            END IF;
226
          ELSE
227
            CASE cWbAddr(3 DOWNTO 2) IS
228
              WHEN B"11"  => rWbDatO <= X"0000"&iRxIntInfo&iTxIntInfo;
229
              WHEN OTHERS => NULL;
230
            END CASE;
231
          END IF;
232
        -----------------------------------------------------------------------
233
        WHEN WAIT3 =>
234
          rState <= IDLE;
235
        WHEN OTHERS => NULL;
236
      END CASE;
237
    END IF;
238
  END PROCESS;
239
 
240
END ARCHITECTURE rtl;

powered by: WebSVN 2.1.0

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