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

Subversion Repositories sgmii

[/] [sgmii/] [trunk/] [build/] [OpenCore_MAC/] [TECH/] [altera/] [RGMII_GMII_Adaptation.v] - Blame information for rev 26

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 26 jefflieu
`timescale 1ns / 1ps
2
//////////////////////////////////////////////////////////////////////////////////
3
// Company: 
4
// Engineer: 
5
// 
6
// Create Date:    16:19:29 06/01/2010 
7
// Design Name: 
8
// Module Name:    RGMII_GMII_Adaptation 
9
// Project Name: 
10
// Target Devices: 
11
// Tool versions: 
12
// Description: 
13
//
14
// Dependencies: 
15
//
16
// Revision: 
17
// Revision 0.01 - File Created
18
// Additional Comments: This implementation follows the recommendations in XAPP692 of Mary Low
19
//
20
//////////////////////////////////////////////////////////////////////////////////
21
module RGMII_GMII_Adaptation(
22
         input [2:0] Speed,
23
         input RxClkPhase,//0: normal, 1 shift 90deg
24
    input [7:0] TxD,
25
    input TxEN,
26
    input TxER,
27
    input TxClk,
28
    output [7:0] RxD,
29
    output RxDV,
30
    output RxER,
31
    output RxClk,
32
         output RxClk_MAC,//for MAC Rx block which works at half Rx Clock in 100/10 mode and at full Rx clk in 1G mode
33
    output [3:0] RGMII_TxD,
34
    output RGMII_TxCtl,
35
    output RGMII_TxClk,
36
    input [3:0] RGMII_RxD,
37
    input RGMII_RxCtl,
38
    input RGMII_RxClk,
39
    output reg [3:0] Status,
40
         input CE,
41
         input rst
42
    );
43
 
44
wire RXDVi,RXERi;
45
wire [7:0] RXDi;
46
 
47
reg RxSync_Rst,RxSync_Rst1;
48
reg TxSync_Rst,TxSync_Rst1;
49
 
50
reg RxCE, RxCE1;
51
reg TxCE, TxCE1;
52
 
53
wire RxClkDiv2;
54
wire CLK0, CLKFB, CLK_RX, CLK_180, CLK_90;
55
 
56
        assign RxDV = RXDVi;
57
        assign RxER = RXERi;
58
        assign RxD = RXDi;
59
 
60
 
61
 
62
GMII2RGMII TX_Adapter(.TxD(TxD),.TxClk(TxClk),.TxEn(TxEN),.TxErr(TxER),
63
                                                        .RGMII_TxD(RGMII_TxD),.RGMII_TxCtl(RGMII_TxCtl),.RGMII_TxClk(RGMII_TxClk),
64
                                                        .ClkEN(TxCE),.rst(TxSync_Rst));
65
 
66
 
67
RGMII2GMII RX_Adapter(.RGMII_RxD(RGMII_RxD),.RGMII_RxCtl(RGMII_RxCtl),.RGMII_RxClk(CLK_RX),
68
                                                                .RxD(RXDi),.RxDV(RXDVi),.RxER(RXERi),.RxClk(RxClk),.ClkEN(RxCE),.rst(RxSync_Rst));
69
 
70
        always@(posedge(rst) or posedge(CLK_RX))
71
        begin
72
                        if(rst)
73
                        begin
74
                                Status <= 4'b0;
75
                        end
76
                        else
77
                        begin
78
                        if(~(RXDVi|RXERi))
79
                                begin
80
                                        Status <= RXDi;
81
                                end
82
                        end
83
        end
84
 
85
        always@(posedge(CLK_RX))
86
        begin
87
                if(rst)
88
                        RxSync_Rst1 <= 1;
89
                else
90
                        RxSync_Rst1 <= 0;
91
                RxSync_Rst <= RxSync_Rst1;
92
                RxCE <= RxCE1;
93
                RxCE1 <= CE;
94
        end
95
 
96
        always@(posedge(TxClk))
97
        begin
98
                if(rst)
99
                        TxSync_Rst1 <= 1;
100
                else
101
                        TxSync_Rst1 <= 0;
102
                TxSync_Rst <= TxSync_Rst1;
103
                TxCE <= TxCE1;
104
                TxCE1 <= CE;
105
        end
106
 
107
        //DCM for Receiving Path
108
          DCM_BASE #(
109
      .CLKDV_DIVIDE(2.0), // Divide by: 1.5,2.0,2.5,3.0,3.5,4.0,4.5,5.0,5.5,6.0,6.5
110
                          //   7.0,7.5,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0 or 16.0
111
      .CLKFX_DIVIDE(2), // Can be any integer from 1 to 32
112
      .CLKFX_MULTIPLY(4), // Can be any integer from 2 to 32
113
      .CLKIN_DIVIDE_BY_2("FALSE"), // TRUE/FALSE to enable CLKIN divide by two feature
114
      .CLKIN_PERIOD(10.0), // Specify period of input clock in ns from 1.25 to 1000.00
115
      .CLKOUT_PHASE_SHIFT("NONE"), // Specify phase shift mode of NONE or FIXED
116
      .CLK_FEEDBACK("1X"), // Specify clock feedback of NONE, 1X or 2X
117
      .DCM_PERFORMANCE_MODE("MAX_SPEED"), // Can be MAX_SPEED or MAX_RANGE
118
      .DESKEW_ADJUST("SYSTEM_SYNCHRONOUS"), // SOURCE_SYNCHRONOUS, SYSTEM_SYNCHRONOUS or
119
                                            //   an integer from 0 to 15
120
      .DFS_FREQUENCY_MODE("LOW"), // LOW or HIGH frequency mode for frequency synthesis
121
      .DLL_FREQUENCY_MODE("LOW"), // LOW, HIGH, or HIGH_SER frequency mode for DLL
122
      .DUTY_CYCLE_CORRECTION("TRUE"), // Duty cycle correction, TRUE or FALSE
123
      .FACTORY_JF(16'hf0f0), // FACTORY JF value suggested to be set to 16'hf0f0
124
      .PHASE_SHIFT(0), // Amount of fixed phase shift from -255 to 1023
125
      .STARTUP_WAIT("FALSE") // Delay configuration DONE until DCM LOCK, TRUE/FALSE
126
   ) DCM_BASE_inst (
127
      .CLK0(CLK0),         // 0 degree DCM CLK output
128
      .CLK180(CLK_180),     // 180 degree DCM CLK output
129
      .CLK270(),     // 270 degree DCM CLK output
130
      .CLK2X(),       // 2X DCM CLK output
131
      .CLK2X180(), // 2X, 180 degree DCM CLK out
132
      .CLK90(CLK_90),       // 90 degree DCM CLK output
133
      .CLKDV(RxClkDiv2),       // Divided DCM CLK out (CLKDV_DIVIDE)
134
      .CLKFX(),       // DCM CLK synthesis out (M/D)
135
      .CLKFX180(), // 180 degree CLK synthesis out
136
      .LOCKED(),     // DCM LOCK status output
137
      .CLKFB(CLKFB),       // DCM clock feedback
138
      .CLKIN(RGMII_RxClk),       // Clock input (from IBUFG, BUFG or DCM)
139
      .RST(rst)            // DCM asynchronous reset input
140
   );
141
 
142
        BUFG BUFG_inst (
143
      .O(CLKFB),     // Clock buffer output
144
      .I(CLK0)      // Clock buffer input
145
   );
146
        //Use this to have the same amount of delay
147
        BUFGMUX BUFGMUX_inst (
148
      .O(CLK_RX),    // Clock MUX output
149
      .I0(CLK0),  // Clock0 input
150
      .I1(CLK_90),  // Clock1 input
151
      .S(RxClkPhase)     // Clock select input
152
   );
153
 
154
        //      BUFG BUFG_RX_inst (
155
        //      .O(CLK_RX),     // Clock buffer output
156
        //      .I(CLK_90)      // Clock buffer input
157
        //   );
158
        //assign CLK_RX = CLKFB;        
159
        BUFGMUX RxClkMux(
160
                                                        .I0(RxClkDiv2),
161
                                                        .I1(CLK0),
162
                                                        .O(RxClk_MAC),
163
                                                        .S(Speed[2]));
164
 
165
endmodule

powered by: WebSVN 2.1.0

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