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

Subversion Repositories sgmii

[/] [sgmii/] [trunk/] [src/] [mTransmit.v] - Blame information for rev 23

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 jefflieu
/*
2
Developed By Subtleware Corporation Pte Ltd 2011
3
File            :
4
Description     :
5
Remarks         :
6
Revision        :
7
        Date    Author          Description
8
02/09/12        Jefflieu
9
*/
10
 
11
 
12
`include "SGMIIDefs.v"
13
 
14
module mTransmit(
15
        input   [02:00] i3_Xmit,
16
        input   [15:00] i16_ConfigReg,
17
 
18
        input   i_TxEN,
19
        input   i_TxER,
20
        input   [07:00] i8_TxD,
21
 
22
 
23
        output  reg o_Xmitting,
24
        output  reg o_TxEven,
25
        output  reg [07:00]     o8_TxCodeGroupOut,
26
        output  o_TxCodeValid,
27
        output  reg o_TxCodeCtrl,
28
        input   i_CurrentParity,
29
 
30
        input   i_Clk,
31
        input   i_ARst_L);
32
 
33
/*
34
        - Transmit order set Statemachine       : OSState
35
*/
36
 
37
        localparam      stTX_TEST       = 24'h000001;   //Initial State
38
        localparam      stCONFIG_C1A= 24'h000002;       //Configuration phase
39
        localparam      stCONFIG_C1B= 24'h000004;       //Configuration phase
40
        localparam      stCONFIG_C1C= 24'h000008;       //Configuration phase
41
        localparam      stCONFIG_C1D= 24'h000010;       //Configuration phase
42
        localparam      stCONFIG_C2A= 24'h000020;       //Configuration phase
43
        localparam      stCONFIG_C2B= 24'h000040;       //Configuration phase
44
        localparam      stCONFIG_C2C= 24'h000080;       //Configuration phase
45
        localparam      stCONFIG_C2D= 24'h000100;       //Configuration phase
46
        localparam      stTX_IDLE       = 24'h000200;   //IDLE Phase, Trasmitting Comma Character, this is to wait to sync with the MAC's packet
47
        localparam  stXMIT_DATA = 24'h000400;   //Data Phase, Trasmitting Comma Character
48
        localparam  stIDLE_DATA = 24'h000800;   //Trasmitting Data Character of /I/ Ordered Set
49
        localparam      stTX_SOP        = 24'h001000;   //Transmitting SOP
50
        localparam      stTX_PKT        = 24'h002000;   //False state
51
        localparam      stTX_DATA       = 24'h004000;   //Transmitting Data
52
        localparam      stTX_EOP        = 24'h008000;   //End of packet without any extension, tramitting T
53
        localparam  stTX_EOP_EXT= 24'h010000;   //End of packet with extension
54
        localparam      stTX_EXT_1      = 24'h020000;   //Extend 1 cycle to align the COMMA to Even Code group
55
        localparam      stEPD2_NOEXT= 24'h040000;       //Second Cycle of EPD, transmitting /R/
56
        localparam      stEPD3          = 24'h080000;   //Third Cycle of EPD, transmitting /R/
57
        localparam      stCARR_EXT      = 24'h100000;   //Carrier extension
58 15 jefflieu
        //localparam    stALIGN_ERR     = 24'h200000;   //Repeater's state, we don't use this, go straight to START ERR
59
        localparam      stSTART_ERR     = 24'h200000;   //Repeater's state
60
        localparam      stTX_ERR        = 24'h400000;   //Repeater's state
61 2 jefflieu
 
62
 
63 15 jefflieu
        reg     [22:00] r13_State;
64
        reg     [22:00] w24_NxtState;
65 2 jefflieu
 
66
 
67
        wire    w_XmitChange;
68
        reg     [02:00] r3_LstXmit;
69
        reg             r_TxEven;
70
        wire    w_TxOSIndicate;
71
 
72
 
73
        wire    w_FifoTxEn;
74
        wire    w_FifoTxEr;
75
        wire [07:00]    w8_FifoData;
76
        wire    w_UpdateXmitChange;
77
        wire    w_ResetState;
78 15 jefflieu
        reg     r_ToTxData;                             //This signal used in txIDLE_DATA state to comeback to TXIDLE or TXDATA
79 2 jefflieu
        wire    w_Disparity;
80
        wire [09:00] w10_FifoDin;
81
        wire [09:00] w10_FifoQ;
82
        wire w_FifoRd,w_FifoEmpty;
83
        reg      [07:00] r8_TxData;
84
 
85
        assign w_XmitChange = (r3_LstXmit!=i3_Xmit)?1'b1:1'b0;
86 15 jefflieu
        assign w_TxOSIndicate = (r13_State==stCONFIG_C1A||r13_State==stCONFIG_C1B||r13_State==stCONFIG_C1C||
87
                                                                r13_State==stCONFIG_C2A||r13_State==stCONFIG_C2B||r13_State==stCONFIG_C2C||
88
                                                                        r13_State==stTX_IDLE||r13_State==stTX_DATA)?1'b0:1'b1;
89 2 jefflieu
        //assign w_UpdateXmitChange = 
90
        //FIFO
91
        assign w10_FifoDin = {i_TxEN,i_TxER,i8_TxD};
92
        assign w_FifoTxEn = w10_FifoQ[9] & (~w_FifoEmpty);
93
        assign w_FifoTxEr = w10_FifoQ[8] & (~w_FifoEmpty);
94
        assign w8_FifoData = w10_FifoQ[7:0];
95
        mSyncFifo #(.pDataWidth(10),.pPtrWidth(2)) u0SyncFifo (
96
                .iv_Din(w10_FifoDin),
97
                .i_Wr((i_TxEN|i_TxER)),
98
                .i_Rd(w_FifoRd),
99
                .o_Empty(w_FifoEmpty),
100
                .o_Full(),
101
                .ov_Q(w10_FifoQ),
102
                .i_Clk(i_Clk),
103
                .i_ARst_L(i_ARst_L));
104
        //END FIFO
105 23 jefflieu
        assign w_FifoRd = ((w_FifoTxEn && (r13_State==stXMIT_DATA||r13_State==stIDLE_DATA)))?1'b0:1'b1;
106 2 jefflieu
 
107
        always@(posedge i_Clk or negedge i_ARst_L)
108
        if(i_ARst_L==1'b0) begin
109 15 jefflieu
                r13_State       <= stTX_TEST;
110
                r3_LstXmit  <= `cXmitIDLE;
111 2 jefflieu
                r_TxEven        <= 1'b0;
112 15 jefflieu
                o_TxEven        <= 1'b1;
113 2 jefflieu
                end
114
        else
115
                begin
116
                if(w_UpdateXmitChange) r3_LstXmit <= i3_Xmit;
117 15 jefflieu
                if(w_ResetState)
118
                        r13_State <= stTX_TEST;
119
                else
120
                        r13_State <= w24_NxtState;
121 2 jefflieu
                r_TxEven <= ~r_TxEven;
122
                o_TxEven <= r_TxEven;
123
                end
124
 
125 15 jefflieu
        // always@(posedge i_Clk or posedge w_ResetState)
126
        // if(w_ResetState)
127
                // r13_State <= stTX_TEST;      
128
        // else 
129
                // r13_State <= w24_NxtState;
130
 
131
 
132 2 jefflieu
        assign w_UpdateXmitChange = w_ResetState;
133 15 jefflieu
        assign w_ResetState = (i_ARst_L==1'b0)||(w_XmitChange && (o_TxEven==1'b0) && w_TxOSIndicate);
134 2 jefflieu
        assign w_Disparity = i_CurrentParity;
135
        always@(*)
136
        begin
137 15 jefflieu
 
138
                // else
139
                case(r13_State)
140
                stTX_TEST               :       if(i3_Xmit==`cXmitCONFIG && o_TxEven==1'b0) w24_NxtState <= stCONFIG_C1A; else
141
                                                        if((i3_Xmit==`cXmitIDLE &&(~o_TxEven)) || ((~o_TxEven) && i3_Xmit==`cXmitDATA && (w_FifoTxEn || w_FifoTxEr))) w24_NxtState <= stTX_IDLE; else
142 2 jefflieu
                                                        if(i3_Xmit==`cXmitDATA && (~w_FifoTxEn) && (~w_FifoTxEr)) w24_NxtState <= stXMIT_DATA;
143
                                                        else w24_NxtState <= stTX_TEST;
144
                stCONFIG_C1A    :       w24_NxtState <= stCONFIG_C1B;
145
                stCONFIG_C1B    :       w24_NxtState <= stCONFIG_C1C;
146
                stCONFIG_C1C    :       w24_NxtState <= stCONFIG_C1D;
147
                stCONFIG_C1D    :       if(i3_Xmit==`cXmitCONFIG) w24_NxtState <= stCONFIG_C2A; else
148
                                                        if(i3_Xmit==`cXmitIDLE || (i3_Xmit==`cXmitDATA && (w_FifoTxEn || w_FifoTxEr))) w24_NxtState <= stTX_IDLE; else
149
                                                        if(i3_Xmit==`cXmitDATA && (~w_FifoTxEn) && (~w_FifoTxEr)) w24_NxtState <= stXMIT_DATA; else
150
                                                        w24_NxtState <= stTX_ERR;
151
                stCONFIG_C2A    :       w24_NxtState <= stCONFIG_C2B;
152
                stCONFIG_C2B    :       w24_NxtState <= stCONFIG_C2C;
153
                stCONFIG_C2C    :       w24_NxtState <= stCONFIG_C2D;
154
                stCONFIG_C2D    :       if(i3_Xmit==`cXmitCONFIG) w24_NxtState <= stCONFIG_C1A; else
155
                                                        if(i3_Xmit==`cXmitIDLE || (i3_Xmit==`cXmitDATA && (w_FifoTxEn || w_FifoTxEr))) w24_NxtState <= stTX_IDLE; else
156
                                                        if(i3_Xmit==`cXmitDATA && (~w_FifoTxEn) && (~w_FifoTxEr)) w24_NxtState <= stXMIT_DATA; else
157
                                                        w24_NxtState <= stTX_ERR;
158
 
159
                stTX_IDLE               :       w24_NxtState <= stIDLE_DATA;
160
                stIDLE_DATA             :       if(r_ToTxData==1'b0) begin //Data phase of TX_IDLE
161
                                                                if(i3_Xmit==`cXmitDATA && (~w_FifoTxEn) && (~w_FifoTxEr)) w24_NxtState <= stXMIT_DATA; else
162
                                                                w24_NxtState <= stTX_IDLE;
163
                                                                end
164
                                                        else
165
                                                                begin
166
                                                                        if(w_FifoTxEn & (~w_FifoTxEr)) w24_NxtState <= stTX_SOP; else
167
                                                                        if(w_FifoTxEn & w_FifoTxEr) w24_NxtState <= stSTART_ERR; else
168
                                                                        w24_NxtState <= stXMIT_DATA;
169
                                                                end
170
                stXMIT_DATA             :       w24_NxtState <= stIDLE_DATA;
171
                stTX_DATA               :       if(w_FifoTxEn) w24_NxtState <= stTX_DATA; else
172
                                                        if((~w_FifoTxEn) & (~w_FifoTxEr)) w24_NxtState <= stTX_EOP; else
173
                                                        w24_NxtState <= stTX_EOP_EXT;
174
                stTX_SOP                :       if(w_FifoTxEn) w24_NxtState <= stTX_DATA; else
175
                                                        if((~w_FifoTxEn) & (~w_FifoTxEr)) w24_NxtState <= stTX_EOP; else
176
                                                        w24_NxtState <= stTX_EOP_EXT;
177
                stTX_EOP                :       w24_NxtState <= stEPD2_NOEXT;
178
                stEPD2_NOEXT    :       if(r_TxEven) w24_NxtState <= stEPD3; else
179
                                                        w24_NxtState <= stXMIT_DATA;
180
                stEPD3                  :       w24_NxtState <= stXMIT_DATA;
181
                stTX_EOP_EXT    :       if(~w_FifoTxEr) w24_NxtState <= stTX_EXT_1; else w24_NxtState <= stCARR_EXT;
182
                stTX_EXT_1              :       w24_NxtState <= stEPD2_NOEXT;
183
                stCARR_EXT              :       if((~w_FifoTxEn) & (~w_FifoTxEr)) w24_NxtState <= stTX_EXT_1; else
184
                                                        if(w_FifoTxEn & (~w_FifoTxEr)) w24_NxtState <= stTX_SOP; else
185
                                                        if(w_FifoTxEn & w_FifoTxEr) w24_NxtState <= stSTART_ERR; else
186
                                                        w24_NxtState <= stCARR_EXT;
187
 
188
                //stALIGN_ERR           :       
189
                stSTART_ERR             :       w24_NxtState <= stTX_ERR;
190
                stTX_ERR                :       if(w_FifoTxEn) w24_NxtState <= stTX_DATA; else
191
                                                        if((~w_FifoTxEn) & (~w_FifoTxEr)) w24_NxtState <= stTX_EOP; else
192
                                                        w24_NxtState <= stTX_EOP_EXT;
193
                endcase
194
        end
195
 
196
 
197
        assign o_TxCodeValid = 1'b1;
198
 
199
        always@(posedge i_Clk or negedge i_ARst_L)
200
        if(i_ARst_L==1'b0) begin
201
                o_Xmitting <= 1'b0;
202
                o_TxCodeCtrl <= 1'b0;
203
                o8_TxCodeGroupOut <= 8'h00;
204
        end else begin
205
                case(w24_NxtState)
206
                stTX_TEST               :       begin
207
                                                        o_Xmitting <= 1'b0;
208
                                                        end
209
                stCONFIG_C1A    :       begin
210
                                                        o8_TxCodeGroupOut <= `K28_5;
211
                                                        o_TxCodeCtrl <= 1'b1;
212
                                                        end
213
                stCONFIG_C1B    :       begin
214
                                                        o8_TxCodeGroupOut <= `D21_5;
215
                                                        o_TxCodeCtrl <= 1'b0;
216
                                                        end
217
                stCONFIG_C1C    :       o8_TxCodeGroupOut <= i16_ConfigReg[07:00];
218
                stCONFIG_C1D    :       o8_TxCodeGroupOut <= i16_ConfigReg[15:08];
219
 
220
                stCONFIG_C2A    :       begin
221
                                                        o8_TxCodeGroupOut <= `K28_5;
222
                                                        o_TxCodeCtrl <= 1'b1;
223
                                                        end
224
                stCONFIG_C2B    :       begin
225
                                                        o8_TxCodeGroupOut <= `D2_2;
226
                                                        o_TxCodeCtrl <= 1'b0;
227
                                                        end
228
                stCONFIG_C2C    :       o8_TxCodeGroupOut <= i16_ConfigReg[07:00];
229
                stCONFIG_C2D    :       o8_TxCodeGroupOut <= i16_ConfigReg[15:08];
230
                stTX_IDLE               :       begin
231
                                                        o8_TxCodeGroupOut <= `K28_5;
232
                                                        o_TxCodeCtrl    <= 1'b1;
233 15 jefflieu
                                                        r_ToTxData <= 1'b0;
234 2 jefflieu
                                                        end
235
                stIDLE_DATA             :       begin
236 15 jefflieu
                                                        o8_TxCodeGroupOut <= (w_Disparity==1'b1)?`D5_6:`D16_2;//Disparity = 1 means positive
237 2 jefflieu
                                                        o_TxCodeCtrl    <= 1'b0;
238
                                                        end
239
                stXMIT_DATA             :       begin
240
                                                        o8_TxCodeGroupOut <= `K28_5;
241
                                                        o_TxCodeCtrl    <= 1'b1;
242 15 jefflieu
                                                        r_ToTxData <= 1'b1;
243 2 jefflieu
                                                        end
244
                stTX_DATA               :       if(((~w_FifoTxEn) & w_FifoTxEr & w8_FifoData != 8'h0F)||(w_FifoTxEn & w_FifoTxEr))
245
                                                        begin
246
                                                                o8_TxCodeGroupOut <= `K30_7;
247
                                                                o_TxCodeCtrl    <= 1'b1;
248
                                                        end else
249
                                                        begin
250
                                                                o8_TxCodeGroupOut <= w8_FifoData;
251
                                                                o_TxCodeCtrl <= 1'b0;
252
                                                        end
253
                stTX_SOP                :       begin
254
                                                        o_Xmitting      <= 1'b1;
255
                                                        o8_TxCodeGroupOut <= `K27_7;
256
                                                        o_TxCodeCtrl    <= 1'b1;
257
                                                        end
258
                stTX_EOP                :       begin
259
                                                        o8_TxCodeGroupOut <= `K29_7;
260
                                                        o_TxCodeCtrl    <= 1'b1;
261
                                                        o_Xmitting <= (~r_TxEven);
262
                                                        end
263
                stEPD2_NOEXT    :       begin
264
                                                        o8_TxCodeGroupOut <= `K23_7;
265
                                                        o_TxCodeCtrl    <= 1'b1;
266
                                                        o_Xmitting <= 1'b0;
267
                                                        end
268
                stEPD3                  :       begin
269
                                                        o8_TxCodeGroupOut <= `K23_7;
270
                                                        o_TxCodeCtrl    <= 1'b1;
271
                                                        end
272
                stTX_EOP_EXT    :       if(((~w_FifoTxEn) & w_FifoTxEr & w8_FifoData != 8'h0F)||(w_FifoTxEn & w_FifoTxEr))
273
                                                        begin
274
                                                                o8_TxCodeGroupOut <= `K30_7;
275
                                                                o_TxCodeCtrl    <= 1'b1;
276
                                                        end else
277
                                                        begin
278
                                                                o8_TxCodeGroupOut <= `K29_7;
279
                                                                o_TxCodeCtrl    <= 1'b1;
280
                                                        end
281
                stTX_EXT_1              :       begin
282
                                                        o_Xmitting <= (~r_TxEven);
283
                                                                if(((~w_FifoTxEn) & w_FifoTxEr & w8_FifoData != 8'h0F)||(w_FifoTxEn & w_FifoTxEr))
284
                                                                begin
285
                                                                        o8_TxCodeGroupOut <= `K30_7;
286
                                                                        o_TxCodeCtrl    <= 1'b1;
287
 
288
                                                                end else
289
                                                                begin
290
                                                                        o8_TxCodeGroupOut <= `K23_7;
291
                                                                        o_TxCodeCtrl    <= 1'b1;
292
                                                                end
293
                                                        end
294
                stCARR_EXT              :       if(((~w_FifoTxEn) & w_FifoTxEr & w8_FifoData != 8'h0F)||(w_FifoTxEn & w_FifoTxEr))
295
                                                        begin
296
                                                                o8_TxCodeGroupOut <= `K30_7;
297
                                                                o_TxCodeCtrl    <= 1'b1;
298
                                                        end else
299
                                                        begin
300
                                                                o8_TxCodeGroupOut <= `K23_7;
301
                                                                o_TxCodeCtrl    <= 1'b1;
302
                                                        end
303
 
304
                //stALIGN_ERR           :       
305
                stSTART_ERR             :       begin
306
                                                        o8_TxCodeGroupOut       <= `K27_7;
307
                                                        o_TxCodeCtrl            <= 1'b1;
308
                                                        o_Xmitting                      <= 1'b1;
309
                                                        end
310
                stTX_ERR                :       begin
311
                                                        o8_TxCodeGroupOut <= `K30_7;
312
                                                        o_TxCodeCtrl    <= 1'b1;
313
                                                        end
314
                endcase
315
        end
316
 
317
//synthesis translate_off       
318
        reg [239:0] r240_TxStateName;
319
        always@(*)
320 15 jefflieu
        case(r13_State)
321 2 jefflieu
        stTX_TEST               : r240_TxStateName<="stTX_TEST  ";
322
        stCONFIG_C1A    : r240_TxStateName<="stCONFIG_C1A";
323
        stCONFIG_C1B    : r240_TxStateName<="stCONFIG_C1B";
324
        stCONFIG_C1C    : r240_TxStateName<="stCONFIG_C1C";
325
        stCONFIG_C1D    : r240_TxStateName<="stCONFIG_C1D";
326
        stCONFIG_C2A    : r240_TxStateName<="stCONFIG_C2A";
327
        stCONFIG_C2B    : r240_TxStateName<="stCONFIG_C2B";
328
        stCONFIG_C2C    : r240_TxStateName<="stCONFIG_C2C";
329
        stCONFIG_C2D    : r240_TxStateName<="stCONFIG_C2D";
330
        stTX_IDLE           : r240_TxStateName<="stTX_IDLE       ";
331
        stXMIT_DATA         : r240_TxStateName<="stXMIT_DATA";
332
        stIDLE_DATA         : r240_TxStateName<="stIDLE_DATA";
333
        stTX_SOP            : r240_TxStateName<="stTX_SOP        ";
334
        stTX_PKT            : r240_TxStateName<="stTX_PKT        ";
335
        stTX_DATA       : r240_TxStateName<="stTX_DATA   ";
336
        stTX_EOP            : r240_TxStateName<="stTX_EOP        ";
337
        stTX_EOP_EXT    : r240_TxStateName<="stTX_EOP_EXT";
338
        stTX_EXT_1          : r240_TxStateName<="stTX_EXT_1      ";
339
        stEPD2_NOEXT    : r240_TxStateName<="stEPD2_NOEXT";
340
        stEPD3              : r240_TxStateName<="stEPD3          ";
341
        stCARR_EXT          : r240_TxStateName<="stCARR_EXT      ";
342 15 jefflieu
        //stALIGN_ERR       : r240_TxStateName<="stALIGN_ERR";
343 2 jefflieu
        stSTART_ERR         : r240_TxStateName<="stSTART_ERR";
344
        stTX_ERR            : r240_TxStateName<="stTX_ERR        ";
345
        endcase
346
//synthesis translate_on
347
endmodule

powered by: WebSVN 2.1.0

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