OpenCores
URL https://opencores.org/ocsvn/fpga-cf/fpga-cf/trunk

Subversion Repositories fpga-cf

[/] [fpga-cf/] [trunk/] [hdl/] [boardsupport/] [v5/] [v5_emac_v1_6_locallink.v] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 peteralieb
//-----------------------------------------------------------------------------
2
// Title      : Virtex-5 Ethernet MAC Local Link Wrapper
3
// Project    : Virtex-5 Ethernet MAC Wrappers
4
//-----------------------------------------------------------------------------
5
// File       : v5_emac_v1_6_locallink.v
6
//-----------------------------------------------------------------------------
7
// Copyright (c) 2004-2008 by Xilinx, Inc. All rights reserved.
8
// This text/file contains proprietary, confidential
9
// information of Xilinx, Inc., is distributed under license
10
// from Xilinx, Inc., and may be used, copied and/or
11
// disclosed only pursuant to the terms of a valid license
12
// agreement with Xilinx, Inc. Xilinx hereby grants you
13
// a license to use this text/file solely for design, simulation,
14
// implementation and creation of design files limited
15
// to Xilinx devices or technologies. Use with non-Xilinx
16
// devices or technologies is expressly prohibited and
17
// immediately terminates your license unless covered by
18
// a separate agreement.
19
//
20
// Xilinx is providing this design, code, or information
21
// "as is" solely for use in developing programs and
22
// solutions for Xilinx devices. By providing this design,
23
// code, or information as one possible implementation of
24
// this feature, application or standard, Xilinx is making no
25
// representation that this implementation is free from any
26
// claims of infringement. You are responsible for
27
// obtaining any rights you may require for your implementation.
28
// Xilinx expressly disclaims any warranty whatsoever with
29
// respect to the adequacy of the implementation, including
30
// but not limited to any warranties or representations that this
31
// implementation is free from claims of infringement, implied
32
// warranties of merchantability or fitness for a particular
33
// purpose.
34
//
35
// Xilinx products are not intended for use in life support
36
// appliances, devices, or systems. Use in such applications are
37
// expressly prohibited.
38
//
39
// This copyright and support notice must be retained as part
40
// of this text at all times. (c) Copyright 2004-2008 Xilinx, Inc.
41
// All rights reserved.
42
//
43
//-----------------------------------------------------------------------------
44
// Description:  This level:
45
//
46
//               * instantiates the TEMAC top level file (the TEMAC
47
//                 wrapper with the clocking and physical interface
48
//                                 logic;
49
//               
50
//               * instantiates TX and RX reference design FIFO's with 
51
//                 a local link interface.
52
//               
53
//               Please refer to the Datasheet, Getting Started Guide, and
54
//               the Virtex-5 Embedded Tri-Mode Ethernet MAC User Gude for
55
//               further information.
56
//-----------------------------------------------------------------------------
57
 
58
 
59
`timescale 1 ps / 1 ps
60
 
61
 
62
//-----------------------------------------------------------------------------
63
// The module declaration for the MAC with FIFO design.
64
//-----------------------------------------------------------------------------
65
module v5_emac_v1_6_locallink
66
(
67
    // EMAC0 Clocking
68
    // 125MHz clock output from transceiver
69
    CLK125_OUT,
70
    // 125MHz clock input from BUFG
71
    CLK125,
72
    // Tri-speed clock output from EMAC0
73
    CLIENT_CLK_OUT_0,
74
    // EMAC0 Tri-speed clock input from BUFG
75
    CLIENT_CLK_0,
76
 
77
    // Local link Receiver Interface - EMAC0
78
    RX_LL_CLOCK_0,
79
    RX_LL_RESET_0,
80
    RX_LL_DATA_0,
81
    RX_LL_SOF_N_0,
82
    RX_LL_EOF_N_0,
83
    RX_LL_SRC_RDY_N_0,
84
    RX_LL_DST_RDY_N_0,
85
    RX_LL_FIFO_STATUS_0,
86
 
87
    // Local link Transmitter Interface - EMAC0
88
    TX_LL_CLOCK_0,
89
    TX_LL_RESET_0,
90
    TX_LL_DATA_0,
91
    TX_LL_SOF_N_0,
92
    TX_LL_EOF_N_0,
93
    TX_LL_SRC_RDY_N_0,
94
    TX_LL_DST_RDY_N_0,
95
 
96
 
97
    // Client Receiver Interface - EMAC0
98
    EMAC0CLIENTRXDVLD,
99
    EMAC0CLIENTRXFRAMEDROP,
100
    EMAC0CLIENTRXSTATS,
101
    EMAC0CLIENTRXSTATSVLD,
102
    EMAC0CLIENTRXSTATSBYTEVLD,
103
 
104
    // Client Transmitter Interface - EMAC0
105
    CLIENTEMAC0TXIFGDELAY,
106
    EMAC0CLIENTTXSTATS,
107
    EMAC0CLIENTTXSTATSVLD,
108
    EMAC0CLIENTTXSTATSBYTEVLD,
109
 
110
    // MAC Control Interface - EMAC0
111
    CLIENTEMAC0PAUSEREQ,
112
    CLIENTEMAC0PAUSEVAL,
113
 
114
    //EMAC-MGT link status
115
    EMAC0CLIENTSYNCACQSTATUS,
116
    EMAC0ANINTERRUPT,
117
 
118
 
119
    // SGMII Interface - EMAC0
120
    TXP_0,
121
    TXN_0,
122
    RXP_0,
123
    RXN_0,
124
    PHYAD_0,
125
    RESETDONE_0,
126
 
127
    // unused transceiver
128
    TXN_1_UNUSED,
129
    TXP_1_UNUSED,
130
    RXN_1_UNUSED,
131
    RXP_1_UNUSED,
132
 
133
    // SGMII MGT Clock buffer inputs 
134
    CLK_DS,
135
    GTRESET,
136
 
137
    // Asynchronous Reset
138
    RESET
139
);
140
 
141
 
142
//-----------------------------------------------------------------------------
143
// Port Declarations 
144
//-----------------------------------------------------------------------------
145
    // EMAC0 Clocking
146
    // 125MHz clock output from transceiver
147
    output          CLK125_OUT;
148
    // 125MHz clock input from BUFG
149
    input           CLK125;
150
    // Tri-speed clock output from EMAC0
151
    output          CLIENT_CLK_OUT_0;
152
    // EMAC0 Tri-speed clock input from BUFG
153
    input           CLIENT_CLK_0;
154
 
155
    // Local link Receiver Interface - EMAC0
156
    input           RX_LL_CLOCK_0;
157
    input           RX_LL_RESET_0;
158
    output   [7:0]  RX_LL_DATA_0;
159
    output          RX_LL_SOF_N_0;
160
    output          RX_LL_EOF_N_0;
161
    output          RX_LL_SRC_RDY_N_0;
162
    input           RX_LL_DST_RDY_N_0;
163
    output   [3:0]  RX_LL_FIFO_STATUS_0;
164
 
165
    // Local link Transmitter Interface - EMAC0
166
    input           TX_LL_CLOCK_0;
167
    input           TX_LL_RESET_0;
168
    input    [7:0]  TX_LL_DATA_0;
169
    input           TX_LL_SOF_N_0;
170
    input           TX_LL_EOF_N_0;
171
    input           TX_LL_SRC_RDY_N_0;
172
    output          TX_LL_DST_RDY_N_0;
173
 
174
    // Client Receiver Interface - EMAC0
175
    output          EMAC0CLIENTRXDVLD;
176
    output          EMAC0CLIENTRXFRAMEDROP;
177
    output   [6:0]  EMAC0CLIENTRXSTATS;
178
    output          EMAC0CLIENTRXSTATSVLD;
179
    output          EMAC0CLIENTRXSTATSBYTEVLD;
180
 
181
    // Client Transmitter Interface - EMAC0
182
    input    [7:0]  CLIENTEMAC0TXIFGDELAY;
183
    output          EMAC0CLIENTTXSTATS;
184
    output          EMAC0CLIENTTXSTATSVLD;
185
    output          EMAC0CLIENTTXSTATSBYTEVLD;
186
 
187
    // MAC Control Interface - EMAC0
188
    input           CLIENTEMAC0PAUSEREQ;
189
    input   [15:0]  CLIENTEMAC0PAUSEVAL;
190
 
191
    //EMAC-MGT link status
192
    output          EMAC0CLIENTSYNCACQSTATUS;
193
    output          EMAC0ANINTERRUPT;
194
 
195
 
196
    // SGMII Interface - EMAC0
197
    output          TXP_0;
198
    output          TXN_0;
199
    input           RXP_0;
200
    input           RXN_0;
201
    input           [4:0] PHYAD_0;
202
    output          RESETDONE_0;
203
 
204
    // unused transceiver
205
    output          TXN_1_UNUSED;
206
    output          TXP_1_UNUSED;
207
    input           RXN_1_UNUSED;
208
    input           RXP_1_UNUSED;
209
 
210
    // SGMII MGT Clock buffer inputs 
211
    input           CLK_DS;
212
    input           GTRESET;
213
 
214
    // Asynchronous Reset
215
    input           RESET;
216
 
217
 
218
//-----------------------------------------------------------------------------
219
// Wire and Reg Declarations 
220
//-----------------------------------------------------------------------------
221
 
222
    // Global asynchronous reset
223
    wire            reset_i;
224
    // Client interface clocking signals - EMAC0
225
    wire            tx_clk_0_i;
226
    wire            rx_clk_0_i;
227
 
228
    // Internal client interface connections - EMAC0
229
    // Transmitter interface
230
    wire     [7:0]  tx_data_0_i;
231
    wire            tx_data_valid_0_i;
232
    wire            tx_underrun_0_i;
233
    wire            tx_ack_0_i;
234
    wire            tx_collision_0_i;
235
    wire            tx_retransmit_0_i;
236
    // Receiver interface
237
    wire     [7:0]  rx_data_0_i;
238
    wire            rx_data_valid_0_i;
239
    wire            rx_good_frame_0_i;
240
    wire            rx_bad_frame_0_i;
241
    // Registers for the EMAC receiver output
242
    reg      [7:0]  rx_data_0_r;
243
    reg             rx_data_valid_0_r;
244
    reg             rx_good_frame_0_r;
245
    reg             rx_bad_frame_0_r;
246
 
247
    // Reset signals from the transceiver
248
    wire            resetdone_0_i;
249
 
250
    // create a synchronous reset in the transmitter clock domain
251
    reg       [5:0] tx_pre_reset_0_i;
252
    reg             tx_reset_0_i;
253
 
254
    // create a synchronous reset in the receiver clock domain
255
    reg       [5:0] rx_pre_reset_0_i;
256
    reg             rx_reset_0_i;
257
 
258
    // synthesis attribute ASYNC_REG of rx_pre_reset_0_i is "TRUE";
259
    // synthesis attribute ASYNC_REG of tx_pre_reset_0_i is "TRUE";
260
 
261
 
262
//-----------------------------------------------------------------------------
263
// Main Body of Code 
264
//-----------------------------------------------------------------------------
265
 
266
    // Asynchronous reset input
267
    assign reset_i = RESET;
268
 
269
    //------------------------------------------------------------------------
270
    // Instantiate the EMAC Wrapper (v5_emac_v1_6_block.v) 
271
    //------------------------------------------------------------------------
272
    v5_emac_v1_6_block v5_emac_block_inst
273
    (
274
    // EMAC0 Clocking
275
    // 125MHz clock output from transceiver
276
    .CLK125_OUT                          (CLK125_OUT),
277
    // 125MHz clock input from BUFG
278
    .CLK125                              (CLK125),
279
    // Tri-speed clock output from EMAC0
280
    .CLIENT_CLK_OUT_0                    (CLIENT_CLK_OUT_0),
281
    // EMAC0 Tri-speed clock input from BUFG
282
    .CLIENT_CLK_0                        (CLIENT_CLK_0),
283
 
284
    // Client Receiver Interface - EMAC0
285
    .EMAC0CLIENTRXD                      (rx_data_0_i),
286
    .EMAC0CLIENTRXDVLD                   (rx_data_valid_0_i),
287
    .EMAC0CLIENTRXGOODFRAME              (rx_good_frame_0_i),
288
    .EMAC0CLIENTRXBADFRAME               (rx_bad_frame_0_i),
289
    .EMAC0CLIENTRXFRAMEDROP              (EMAC0CLIENTRXFRAMEDROP),
290
    .EMAC0CLIENTRXSTATS                  (EMAC0CLIENTRXSTATS),
291
    .EMAC0CLIENTRXSTATSVLD               (EMAC0CLIENTRXSTATSVLD),
292
    .EMAC0CLIENTRXSTATSBYTEVLD           (EMAC0CLIENTRXSTATSBYTEVLD),
293
 
294
    // Client Transmitter Interface - EMAC0
295
    .CLIENTEMAC0TXD                      (tx_data_0_i),
296
    .CLIENTEMAC0TXDVLD                   (tx_data_valid_0_i),
297
    .EMAC0CLIENTTXACK                    (tx_ack_0_i),
298
    .CLIENTEMAC0TXFIRSTBYTE              (1'b0),
299
    .CLIENTEMAC0TXUNDERRUN               (tx_underrun_0_i),
300
    .EMAC0CLIENTTXCOLLISION              (tx_collision_0_i),
301
    .EMAC0CLIENTTXRETRANSMIT             (tx_retransmit_0_i),
302
    .CLIENTEMAC0TXIFGDELAY               (CLIENTEMAC0TXIFGDELAY),
303
    .EMAC0CLIENTTXSTATS                  (EMAC0CLIENTTXSTATS),
304
    .EMAC0CLIENTTXSTATSVLD               (EMAC0CLIENTTXSTATSVLD),
305
    .EMAC0CLIENTTXSTATSBYTEVLD           (EMAC0CLIENTTXSTATSBYTEVLD),
306
 
307
    // MAC Control Interface - EMAC0
308
    .CLIENTEMAC0PAUSEREQ                 (CLIENTEMAC0PAUSEREQ),
309
    .CLIENTEMAC0PAUSEVAL                 (CLIENTEMAC0PAUSEVAL),
310
 
311
    //EMAC-MGT link status
312
    .EMAC0CLIENTSYNCACQSTATUS            (EMAC0CLIENTSYNCACQSTATUS),
313
    .EMAC0ANINTERRUPT                    (EMAC0ANINTERRUPT),
314
 
315
 
316
    // SGMII Interface - EMAC0
317
    .TXP_0                               (TXP_0),
318
    .TXN_0                               (TXN_0),
319
    .RXP_0                               (RXP_0),
320
    .RXN_0                               (RXN_0),
321
    .PHYAD_0                             (PHYAD_0),
322
    .RESETDONE_0                         (resetdone_0_i),
323
 
324
    // unused transceiver
325
    .TXN_1_UNUSED                        (TXN_1_UNUSED),
326
    .TXP_1_UNUSED                        (TXP_1_UNUSED),
327
    .RXN_1_UNUSED                        (RXN_1_UNUSED),
328
    .RXP_1_UNUSED                        (RXP_1_UNUSED),
329
 
330
    // SGMII MGT Clock buffer inputs 
331
    .CLK_DS                              (CLK_DS),
332
    .GTRESET                             (GTRESET),
333
 
334
    // Asynchronous Reset Input
335
    .RESET                               (reset_i));
336
 
337
  //-------------------------------------------------------------------
338
  // Instantiate the client side FIFO
339
  //-------------------------------------------------------------------
340
  eth_fifo_8 client_side_FIFO_emac0 (
341
     // EMAC transmitter client interface
342
     .tx_clk(tx_clk_0_i),
343
     .tx_reset(tx_reset_0_i),
344
     .tx_enable(1'b1),
345
     .tx_data(tx_data_0_i),
346
     .tx_data_valid(tx_data_valid_0_i),
347
     .tx_ack(tx_ack_0_i),
348
     .tx_underrun(tx_underrun_0_i),
349
     .tx_collision(tx_collision_0_i),
350
     .tx_retransmit(tx_retransmit_0_i),
351
 
352
     // Transmitter local link interface     
353
     .tx_ll_clock(TX_LL_CLOCK_0),
354
     .tx_ll_reset(TX_LL_RESET_0),
355
     .tx_ll_data_in(TX_LL_DATA_0),
356
     .tx_ll_sof_in_n(TX_LL_SOF_N_0),
357
     .tx_ll_eof_in_n(TX_LL_EOF_N_0),
358
     .tx_ll_src_rdy_in_n(TX_LL_SRC_RDY_N_0),
359
     .tx_ll_dst_rdy_out_n(TX_LL_DST_RDY_N_0),
360
     .tx_fifo_status(),
361
     .tx_overflow(),
362
 
363
     // EMAC receiver client interface     
364
     .rx_clk(rx_clk_0_i),
365
     .rx_reset(rx_reset_0_i),
366
     .rx_enable(1'b1),
367
     .rx_data(rx_data_0_r),
368
     .rx_data_valid(rx_data_valid_0_r),
369
     .rx_good_frame(rx_good_frame_0_r),
370
     .rx_bad_frame(rx_bad_frame_0_r),
371
     .rx_overflow(),
372
 
373
     // Receiver local link interface
374
     .rx_ll_clock(RX_LL_CLOCK_0),
375
     .rx_ll_reset(RX_LL_RESET_0),
376
     .rx_ll_data_out(RX_LL_DATA_0),
377
     .rx_ll_sof_out_n(RX_LL_SOF_N_0),
378
     .rx_ll_eof_out_n(RX_LL_EOF_N_0),
379
     .rx_ll_src_rdy_out_n(RX_LL_SRC_RDY_N_0),
380
     .rx_ll_dst_rdy_in_n(RX_LL_DST_RDY_N_0),
381
     .rx_fifo_status(RX_LL_FIFO_STATUS_0));
382
 
383
 
384
  //-------------------------------------------------------------------
385
  // Create synchronous reset signals for use in the FIFO.
386
  // A synchronous reset signal is created in each
387
  // clock domain.
388
  //-------------------------------------------------------------------
389
 
390
  // Create synchronous reset in the transmitter clock domain.
391
  always @(posedge tx_clk_0_i, posedge reset_i)
392
  begin
393
    if (reset_i === 1'b1)
394
    begin
395
      tx_pre_reset_0_i <= 6'h3F;
396
      tx_reset_0_i     <= 1'b1;
397
    end
398
    else
399
    begin
400
      if (resetdone_0_i == 1'b1)
401
      begin
402
        tx_pre_reset_0_i[0]   <= 1'b0;
403
        tx_pre_reset_0_i[5:1] <= tx_pre_reset_0_i[4:0];
404
        tx_reset_0_i          <= tx_pre_reset_0_i[5];
405
      end
406
    end
407
  end
408
 
409
always @(posedge rx_clk_0_i, posedge reset_i)
410
  begin
411
    if (reset_i === 1'b1)
412
    begin
413
      rx_pre_reset_0_i <= 6'h3F;
414
      rx_reset_0_i     <= 1'b1;
415
    end
416
    else
417
    begin
418
      if (resetdone_0_i == 1'b1)
419
      begin
420
        rx_pre_reset_0_i[0]   <= 1'b0;
421
        rx_pre_reset_0_i[5:1] <= rx_pre_reset_0_i[4:0];
422
        rx_reset_0_i          <= rx_pre_reset_0_i[5];
423
      end
424
    end
425
  end
426
 
427
 
428
  //--------------------------------------------------------------------
429
  // Register the receiver outputs from EMAC0 before routing 
430
  // to the FIFO
431
  //--------------------------------------------------------------------
432
  always @(posedge rx_clk_0_i, posedge reset_i)
433
  begin
434
    if (reset_i == 1'b1)
435
    begin
436
      rx_data_valid_0_r <= 1'b0;
437
      rx_data_0_r       <= 8'h00;
438
      rx_good_frame_0_r <= 1'b0;
439
      rx_bad_frame_0_r  <= 1'b0;
440
    end
441
    else
442
    begin
443
      if (resetdone_0_i == 1'b1)
444
      begin
445
        rx_data_0_r       <= rx_data_0_i;
446
        rx_data_valid_0_r <= rx_data_valid_0_i;
447
        rx_good_frame_0_r <= rx_good_frame_0_i;
448
        rx_bad_frame_0_r  <= rx_bad_frame_0_i;
449
      end
450
    end
451
  end
452
 
453
    assign EMAC0CLIENTRXDVLD = rx_data_valid_0_i;
454
 
455
    // EMAC0 Clocking
456
    assign tx_clk_0_i = CLIENT_CLK_0;
457
    assign rx_clk_0_i = CLIENT_CLK_0;
458
 
459
    assign RESETDONE_0 = resetdone_0_i;
460
 
461
endmodule

powered by: WebSVN 2.1.0

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