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

Subversion Repositories sparc64soc

[/] [sparc64soc/] [trunk/] [OC-Ethernet/] [eth_sgmii.v] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 dmitryr
//////////////////////////////////////////////////////////////////////////////////
2
// Company:  (C) Athree, 2009
3
// Engineer: Dmitry Rozhdestvenskiy 
4
// Email dmitry.rozhdestvenskiy@srisc.com dmitryr@a3.spb.ru divx4log@narod.ru
5
// 
6
// Design Name:    OpenCores 10/10 Ethernet combined with Altera MII->SGMII bridge
7
// Module Name:    eth_sgmii 
8
// Project Name:   SPARC SoC single-core
9
//
10
// LICENSE:
11
// This is a Free Hardware Design; you can redistribute it and/or
12
// modify it under the terms of the GNU General Public License
13
// version 2 as published by the Free Software Foundation.
14
// The above named program is distributed in the hope that it will
15
// be useful, but WITHOUT ANY WARRANTY; without even the implied
16
// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17
// See the GNU General Public License for more details.
18
//
19
//////////////////////////////////////////////////////////////////////////////////
20
module eth_sgmii (
21
    input  wb_clk_i,
22
    input  wb_rst_i,
23
    input  sysclk,
24
 
25
    input  [63:0] wb_dat_i,
26
    output [63:0] wb_dat_o,
27
    input  [63:0] wb_adr_i,
28
    input  [ 7:0] wb_sel_i,
29
    input         wb_we_i,
30
    input         wb_cyc_i,
31
    input         wb_stb_i,
32
    output        wb_ack_o,
33
    output        wb_err_o,
34
 
35
    output [63:0] m_wb_adr_o,
36
    output [ 7:0] m_wb_sel_o,
37
    output        m_wb_we_o,
38
    output [63:0] m_wb_dat_o,
39
    input  [63:0] m_wb_dat_i,
40
    output        m_wb_cyc_o,
41
    output        m_wb_stb_o,
42
    input         m_wb_ack_i,
43
    input         m_wb_err_i,
44
 
45
    input         sgmii_rx,
46
    output        sgmii_tx,
47
 
48
    output        int_eth,
49
 
50
    output        led_10,
51
    output        led_100,
52
    output        led_1000,
53
    output        led_an,
54
    output        led_disp_err,
55
    output        led_char_err,
56
    output        led_link,
57
 
58
    inout         md,
59
    output        mdc
60
);
61
 
62
wire [ 3:0] mrxd;
63
wire [ 3:0] mtxd;
64
wire [31:0] dat_o;
65
wire [ 3:0] sel_o;
66
wire [31:0] mdat_o;
67
 
68
assign wb_dat_o={dat_o[7:0],dat_o[15:8],dat_o[23:16],dat_o[31:24],dat_o[7:0],dat_o[15:8],dat_o[23:16],dat_o[31:24]};
69
assign m_wb_adr_o[63:32]=0;
70
assign m_wb_sel_o=m_wb_adr_o[2] ? {4'b0000,sel_o[0],sel_o[1],sel_o[2],sel_o[3]}:{sel_o[0],sel_o[1],sel_o[2],sel_o[3],4'b0000};
71
assign m_wb_dat_o={mdat_o[7:0],mdat_o[15:8],mdat_o[23:16],mdat_o[31:24],mdat_o[7:0],mdat_o[15:8],mdat_o[23:16],mdat_o[31:24]};
72
 
73
// OpenCores 10/100 Ethernet MAC
74
eth_top eth_mac (
75
    .wb_clk_i(wb_clk_i),
76
    .wb_rst_i(wb_rst_i),
77
 
78
    .wb_dat_i(wb_sel_i[7:4]==4'b0 ? {wb_dat_i[7:0],wb_dat_i[15:8],wb_dat_i[23:16],wb_dat_i[31:24]}:{wb_dat_i[39:32],wb_dat_i[47:40],wb_dat_i[55:48],wb_dat_i[63:56]}),
79
    .wb_dat_o(dat_o),
80
    .wb_adr_i(wb_adr_i[31:0]),
81
    .wb_sel_i(wb_sel_i[7:4]==4'b0 ? {wb_sel_i[0],wb_sel_i[1],wb_sel_i[2],wb_sel_i[3]}:{wb_sel_i[4],wb_sel_i[5],wb_sel_i[6],wb_sel_i[7]}),
82
    .wb_we_i(wb_we_i),
83
    .wb_cyc_i(wb_cyc_i),
84
    .wb_stb_i(wb_stb_i),
85
    .wb_ack_o(wb_ack_o),
86
    .wb_err_o(wb_err_o),
87
    .m_wb_adr_o(m_wb_adr_o[31:0]),
88
    .m_wb_sel_o(sel_o),
89
    .m_wb_we_o(m_wb_we_o),
90
    .m_wb_dat_o(mdat_o),
91
    .m_wb_dat_i(m_wb_adr_o[2] ? {m_wb_dat_i[7:0],m_wb_dat_i[15:8],m_wb_dat_i[23:16],m_wb_dat_i[31:24]}:{m_wb_dat_i[39:32],m_wb_dat_i[47:40],m_wb_dat_i[55:48],m_wb_dat_i[63:56]}),
92
    .m_wb_cyc_o(m_wb_cyc_o),
93
    .m_wb_stb_o(m_wb_stb_o),
94
    .m_wb_ack_i(m_wb_ack_i),
95
    .m_wb_err_i(m_wb_err_i),
96
 
97
    .mtx_clk_pad_i(mtx_clk),
98
    .mtxd_pad_o(mtxd),
99
    .mtxen_pad_o(mtxen),
100
    .mtxerr_pad_o(mtxerr),
101
    .mrx_clk_pad_i(mrx_clk),
102
    .mrxd_pad_i(mrxd),
103
    .mrxdv_pad_i(mrxdv),
104
    .mrxerr_pad_i(mrxerr),
105
    .mcoll_pad_i(mcoll),
106
    .mcrs_pad_i(mcrs),
107
    .mdc_pad_o(mdc),
108
    .md_pad_i(md_i),
109
    .md_pad_o(md_o),
110
    .md_padoe_o(md_oe),
111
    .int_o(int_eth)
112
);
113
 
114
assign md_i=md;
115
assign md=md_oe ? md_o:1'bZ;
116
 
117
/*reg  [63:0] mdio_shift;
118
reg  [ 5:0] mdio_cnt;
119
wire [15:0] mdio_wrdata;
120
wire [15:0] mdio_rdata;
121
wire [ 4:0] mdio_addr;
122
reg mdio_wr;
123
 
124
assign mdio_rd=(mdio_cnt==6'd46) && mdio_shift[45:14]==32'hFFFFFFFF; // Address just latched, frame valid
125
assign mdio_wrdata=mdio_shift[15:0];
126
assign md_i=mdio_rdata[~mdio_cnt+1];
127
assign mdio_addr=(mdio_cnt<6'd48) ? mdio_shift[4:0]:mdio_shift[22:18];
128
 
129
always @(posedge mdc or posedge wb_rst_i)
130
   if(wb_rst_i)
131
      begin
132
         mdio_cnt<=0;
133
         mdio_shift<=64'b0;
134
      end
135
   else
136
      begin
137
          mdio_shift[0]<=md_o;
138
          mdio_shift[63:1]<=mdio_shift[62:0];
139
          mdio_cnt<=mdio_cnt+1;
140
          if(mdio_cnt==6'd63 && mdio_shift[62:27]==36'hFFFFFFFF5)
141
             mdio_wr<=1;
142
          else
143
             mdio_wr<=0;
144
      end*/
145
 
146
// Altera Ethernet controller in MII->SGMII bridge mode
147
// You may generate it with Quartus use it for free in test mode
148
// (either time-limited or connected to PC)
149
MII2SGMII eth_pcs(
150
        .ref_clk(sysclk),
151
        .reset(wb_rst_i),
152
 
153
        .gmii_rx_d(),
154
        .gmii_rx_dv(),
155
        .gmii_rx_err(),
156
        .gmii_tx_d(0),
157
        .gmii_tx_en(0),
158
        .gmii_tx_err(0),
159
 
160
        .tx_clk(mtx_clk),
161
        .reset_tx_clk(wb_rst_i),
162
        .tx_clkena(),
163
        .mii_tx_d(mtxd),
164
        .mii_tx_en(mtxen),
165
        .mii_tx_err(mtxerr),
166
 
167
        .rx_clk(mrx_clk),
168
        .reset_rx_clk(wb_rst_i),
169
        .rx_clkena(),
170
        .mii_rx_d(mrxd),
171
        .mii_rx_dv(mrxdv),
172
        .mii_rx_err(mrxerr),
173
        .mii_col(mcoll),
174
        .mii_crs(mcrs),
175
 
176
        .set_10(led_10),
177
        .set_100(led_100),
178
        .set_1000(led_1000),
179
 
180
        .hd_ena(),
181
 
182
        .txp(sgmii_tx),
183
        .rxp(sgmii_rx),
184
 
185
        .led_col(),
186
        .led_crs(),
187
        .led_an(led_an),
188
        .led_disp_err(led_disp_err),
189
        .led_char_err(led_char_err),
190
        .led_link(led_link),
191
 
192
        .clk(0),
193
        .readdata(),
194
        .waitrequest(),
195
        .address(),
196
        .read(0),
197
        .writedata(),
198
        .write(0)
199
);
200
 
201
endmodule

powered by: WebSVN 2.1.0

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