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

Subversion Repositories xenie

[/] [xenie/] [trunk/] [examples/] [Eth_example/] [ip_repo/] [axi_mdio/] [src/] [mdio_c.vhd] - Blame information for rev 4

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 4 DFC
---------------------------------------------------------------------------------------------------
2
--
3
-- Title       : mido
4
-- Design      : mdio
5
-- Author      : 0
6
-- Company     : 0
7
--
8
---------------------------------------------------------------------------------------------------
9
--
10
-- File        : mido.vhd
11
-- Generated   : Mon Apr  5 16:43:44 2004
12
-- From        : interface description file
13
-- By          : Itf2Vhdl ver. 1.20
14
--
15
---------------------------------------------------------------------------------------------------
16
--
17
-- Description :
18
--
19
---------------------------------------------------------------------------------------------------
20
 
21
--{{ Section below this comment is automatically maintained
22
--   and may be overwritten
23
--{entity {mido} architecture {mido}}
24
 
25
library IEEE;
26
use IEEE.STD_LOGIC_1164.all;
27
use ieee.std_logic_unsigned.all;
28
use ieee.std_logic_arith.all;
29
 
30
entity mdio_c is
31
    port(
32
        CLK :   in std_logic;       -- Input clock
33
        DIV_CLK : in std_logic_vector(7 downto 0); -- Clock divider, should be X"1C" for 125 MHz CLK
34
        PREAMB_SUP : in std_logic;
35
 
36
        START_OP : in std_logic_vector(1 downto 0);  -- Start sequence, should be "01"
37
        OPERATION : in std_logic_vector(1 downto 0); -- "01" = write, "10" = read, "00" = adress (Clause 45), "10" = Read & address++ (IEEE 802.3 Clause 45)
38
        PHY_ADDR : in std_logic_vector(4 downto 0);  -- Phyter address
39
        REG_ADDR : in std_logic_vector(4 downto 0);  -- Register address or device type (Clause 45)
40
        DATA_IN : in std_logic_vector(15 downto 0);  -- Data or address (Clause 45)
41
        DATA_OUT : out std_logic_vector(15 downto 0);
42
 
43
        DATA_RDY : out std_logic;
44
        RUN_OP : in std_logic;
45
        BUSY : out std_logic;
46
 
47
 
48
        MDC     : out std_logic; -- MDIO Clock output
49
        MDIO_I  : in  std_logic; -- MDIO Input data
50
        MDIO_O  : out std_logic; -- MDIO Output data
51
        MDIO_OE : out std_logic  -- MDIO Output Enable, active low!!!
52
 
53
 
54
        );
55
end mdio_c;
56
 
57
--}} End of automatically maintained section
58
 
59
architecture mdio_c of mdio_c is
60
 
61
    constant DIR_IN : std_logic := '1';
62
    constant DIR_OUT : std_logic := '0';
63
 
64
    constant TURN_AROUND_O : std_logic_vector(0 to 1) := "10";
65
 
66
    constant OP_READ : std_logic_vector(1 downto 0) := "10";
67
    constant OP_WRITE : std_logic_vector(1 downto 0) := "01";
68
    constant OP_ADDR : std_logic_vector(1 downto 0) := "00";
69
    constant OP_READ_INC : std_logic_vector(1 downto 0) := "11";
70
 
71
    type STATE_MDIO_T is (GEN_PREAMBLE, GEN_START, OPCODE, PHY_ADDRESS,
72
    REG_ADDRESS, TURN_AROUND, DATA, MDIO_DONE);
73
 
74
    signal STATE_MDIO : STATE_MDIO_T := GEN_PREAMBLE;
75
 
76
    signal DIV_CNT : integer range 0 to 255 := 0;
77
    signal ENABLE_OP : std_logic := '0';
78
    signal MDC_I : std_logic := '0';
79
    signal sig_MDIO_I : std_logic := '1';
80
    signal MDIO_DIR : std_logic := '0';
81
 
82
    signal MDC_FE : std_logic;
83
    signal MDIO_GO : std_logic := '1';
84
 
85
    signal MDIO_CNT : integer range 0 to 31 := 0;
86
 
87
    signal START_OP_I : std_logic_vector(0 to 1);
88
    signal OPERATION_I : std_logic_vector(0 to 1);
89
    signal PHY_ADDR_I, REG_ADDR_I : std_logic_vector(0 to 4);
90
    signal DATA_IN_I, DATA_OUT_I : std_logic_vector(0 to 15);
91
 
92
    signal OP_DONE : std_logic := '0';
93
 
94
begin
95
 
96
    GEN_CLK: PROCESS(CLK)
97
    BEGIN
98
        If CLK'event And CLK = '1'
99
            Then
100
            If ENABLE_OP = '1'
101
                Then
102
                If DIV_CNT = (CONV_INTEGER(DIV_CLK))
103
                    Then
104
                    DIV_CNT <= 0;
105
                    MDC_I <= Not MDC_I;
106
                Else
107
                    DIV_CNT <= DIV_CNT + 1;
108
                End If;
109
            Else
110
                MDC_I <= '0';
111
                DIV_CNT <= 0;
112
            End If;
113
        End If;
114
    END PROCESS;
115
 
116
    MDC_FE <= '1' When DIV_CNT = (CONV_INTEGER(DIV_CLK)) And MDC_I = '1' Else '0';
117
 
118
 
119
    PROCESS(CLK)
120
    BEGIN
121
        If CLK'event And CLK = '1'
122
            Then
123
            If RUN_OP = '1'
124
                Then
125
 
126
                START_OP_I <= START_OP;
127
                PHY_ADDR_I <= PHY_ADDR;
128
                REG_ADDR_I <= REG_ADDR;
129
                OPERATION_I <= OPERATION;
130
                DATA_IN_I <= DATA_IN;
131
                ENABLE_OP <= '1';
132
            Else
133
                If OP_DONE = '1' And MDC_I = '0'
134
                    Then
135
                    ENABLE_OP <= '0';
136
                End If;
137
            End If;
138
        End If;
139
    END PROCESS;
140
 
141
    PROCESS(CLK, MDC_FE, STATE_MDIO)
142
    BEGIN
143
        If CLK'event And CLK = '1'
144
            Then
145
            If ENABLE_OP = '1'
146
                Then
147
                If MDC_FE = '1'
148
                    Then
149
                    Case STATE_MDIO is
150
                        --When WAIT_FOR_START =>
151
                        --MDIO_DIR <= DIR_OUT;
152
                        --sig_MDIO_I <= '1';
153
                        --If MDIO_GO = '1'
154
                        --      Then
155
                        --              MDIO_CNT <= 0;
156
                        --              STATE_MDIO <= GEN_PREAMBLE;
157
                        --      Else
158
                        --              STATE_MDIO <= WAIT_FOR_START;
159
                        --      End If;
160
 
161
                        When GEN_PREAMBLE =>
162
                           sig_MDIO_I   <= '1';
163
                           MDIO_DIR <= DIR_OUT;
164
                        If MDIO_CNT < 31
165
                            Then
166
                            MDIO_CNT <= MDIO_CNT + 1;
167
                            STATE_MDIO <= GEN_PREAMBLE;
168
                        Else
169
                            MDIO_CNT <= 0;
170
                            STATE_MDIO <= GEN_START;
171
                        End If;
172
 
173
                        When GEN_START =>
174
                        sig_MDIO_I <= START_OP_I(MDIO_CNT);
175
                        MDIO_DIR <= DIR_OUT;
176
                        If MDIO_CNT < 1
177
                            Then
178
                            MDIO_CNT <= MDIO_CNT + 1;
179
                            STATE_MDIO <= GEN_START;
180
                        Else
181
                            MDIO_CNT <= 0;
182
                            STATE_MDIO <= OPCODE;
183
                        End If;
184
 
185
                        When OPCODE =>
186
                        sig_MDIO_I <= OPERATION_I(MDIO_CNT);
187
                        If MDIO_CNT < 1
188
                            Then
189
                            MDIO_CNT <= MDIO_CNT + 1;
190
                            STATE_MDIO <= OPCODE;
191
                        Else
192
                            MDIO_CNT <= 0;
193
                            STATE_MDIO <= PHY_ADDRESS;
194
                        End If;
195
 
196
                        When PHY_ADDRESS =>
197
                        sig_MDIO_I <= PHY_ADDR_I(MDIO_CNT);
198
                        If MDIO_CNT < 4
199
                            Then
200
                            MDIO_CNT <= MDIO_CNT + 1;
201
                            STATE_MDIO <= PHY_ADDRESS;
202
                        Else
203
                            MDIO_CNT <= 0;
204
                            STATE_MDIO <= REG_ADDRESS;
205
                        End If;
206
 
207
                        When REG_ADDRESS =>
208
                        sig_MDIO_I <= REG_ADDR_I(MDIO_CNT);
209
                        If MDIO_CNT < 4
210
                            Then
211
                            MDIO_CNT <= MDIO_CNT + 1;
212
                            STATE_MDIO <= REG_ADDRESS;
213
                        Else
214
                            MDIO_CNT <= 0;
215
                            STATE_MDIO <= TURN_AROUND;
216
                        End If;
217
 
218
                        When TURN_AROUND =>
219
                        sig_MDIO_I <= TURN_AROUND_O(MDIO_CNT);
220
                        If MDIO_CNT < 1
221
                            Then
222
                            MDIO_CNT <= MDIO_CNT + 1;
223
                            STATE_MDIO <= TURN_AROUND;
224
                        Else
225
                            MDIO_CNT <= 0;
226
                            STATE_MDIO <= DATA;
227
                        End If;
228
 
229
                        Case OPERATION_I is
230
                            When OP_READ | OP_READ_INC =>
231
                            MDIO_DIR <= DIR_IN;
232
                            When Others =>
233
                            MDIO_DIR <= DIR_OUT;
234
                        End Case;
235
 
236
                        When DATA =>
237
                        If MDIO_DIR = DIR_IN
238
                            Then
239
                            DATA_OUT_I(MDIO_CNT) <= MDIO_I;
240
                        Else
241
                            sig_MDIO_I <= DATA_IN_I(MDIO_CNT);
242
                        End If;
243
                        If MDIO_CNT < 15
244
                            Then
245
                            MDIO_CNT <= MDIO_CNT + 1;
246
                            STATE_MDIO <= DATA;
247
                        Else
248
                            MDIO_CNT <= 0;
249
                            STATE_MDIO <= MDIO_DONE;
250
                        End If;
251
 
252
                        When MDIO_DONE => -- generate falling edge
253
                           OP_DONE    <= '1';
254
                           --MDIO_DIR   <= DIR_IN;
255
                           STATE_MDIO <= GEN_PREAMBLE;
256
--                            else
257
--                               STATE_MDIO <= MDIO_DONE;
258
--                            end if;
259
 
260
                        When Others =>
261
                        STATE_MDIO <= GEN_PREAMBLE;
262
                    End Case;
263
                End If;
264
            Else
265
                MDIO_CNT <= 0;
266
                OP_DONE <= '0';
267
                MDIO_DIR <= DIR_IN;
268
                if PREAMB_SUP = '1' then
269
                    STATE_MDIO <= GEN_START;
270
                else
271
                    STATE_MDIO <= GEN_PREAMBLE;
272
                end if;
273
            End If;
274
        End If;
275
 
276
    END PROCESS;
277
 
278
    BUSY <= ENABLE_OP;
279
 
280
    MDC <= MDC_I;
281
    MDIO_O <= sig_MDIO_I;
282
    MDIO_OE <= MDIO_DIR;
283
 
284
    DATA_OUT <= DATA_OUT_I;
285
 
286
end mdio_c;

powered by: WebSVN 2.1.0

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