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

Subversion Repositories amber

[/] [amber/] [trunk/] [hw/] [vlog/] [ethmac/] [eth_macstatus.v] - Blame information for rev 47

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 csantifort
//////////////////////////////////////////////////////////////////////
2
////                                                              ////
3
////  eth_macstatus.v                                             ////
4
////                                                              ////
5
////  This file is part of the Ethernet IP core project           ////
6
////  http://www.opencores.org/projects/ethmac/                   ////
7
////                                                              ////
8
////  Author(s):                                                  ////
9
////      - Igor Mohor (igorM@opencores.org)                      ////
10
////                                                              ////
11
////  All additional information is available in the Readme.txt   ////
12
////  file.                                                       ////
13
////                                                              ////
14
//////////////////////////////////////////////////////////////////////
15
////                                                              ////
16
//// Copyright (C) 2001, 2002 Authors                             ////
17
////                                                              ////
18
//// This source file may be used and distributed without         ////
19
//// restriction provided that this copyright statement is not    ////
20
//// removed from the file and that any derivative work contains  ////
21
//// the original copyright notice and the associated disclaimer. ////
22
////                                                              ////
23
//// This source file is free software; you can redistribute it   ////
24
//// and/or modify it under the terms of the GNU Lesser General   ////
25
//// Public License as published by the Free Software Foundation; ////
26
//// either version 2.1 of the License, or (at your option) any   ////
27
//// later version.                                               ////
28
////                                                              ////
29
//// This source is distributed in the hope that it will be       ////
30
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
31
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
32
//// PURPOSE.  See the GNU Lesser General Public License for more ////
33
//// details.                                                     ////
34
////                                                              ////
35
//// You should have received a copy of the GNU Lesser General    ////
36
//// Public License along with this source; if not, download it   ////
37
//// from http://www.opencores.org/lgpl.shtml                     ////
38
////                                                              ////
39
//////////////////////////////////////////////////////////////////////
40
//
41
// CVS Revision History
42
//
43
// $Log: not supported by cvs2svn $
44
// Revision 1.16  2005/02/21 10:42:11  igorm
45
// Defer indication fixed.
46
//
47
// Revision 1.15  2003/01/30 13:28:19  tadejm
48
// Defer indication changed.
49
//
50
// Revision 1.14  2002/11/22 01:57:06  mohor
51
// Rx Flow control fixed. CF flag added to the RX buffer descriptor. RxAbort
52
// synchronized.
53
//
54
// Revision 1.13  2002/11/13 22:30:58  tadejm
55
// Late collision is reported only when not in the full duplex.
56
// Sample is taken (for status) as soon as MRxDV is not valid (regardless
57
// of the received byte cnt).
58
//
59
// Revision 1.12  2002/09/12 14:50:16  mohor
60
// CarrierSenseLost bug fixed when operating in full duplex mode.
61
//
62
// Revision 1.11  2002/09/04 18:38:03  mohor
63
// CarrierSenseLost status is not set when working in loopback mode.
64
//
65
// Revision 1.10  2002/07/25 18:17:46  mohor
66
// InvalidSymbol generation changed.
67
//
68
// Revision 1.9  2002/04/22 13:51:44  mohor
69
// Short frame and ReceivedLengthOK were not detected correctly.
70
//
71
// Revision 1.8  2002/02/18 10:40:17  mohor
72
// Small fixes.
73
//
74
// Revision 1.7  2002/02/15 17:07:39  mohor
75
// Status was not written correctly when frames were discarted because of
76
// address mismatch.
77
//
78
// Revision 1.6  2002/02/11 09:18:21  mohor
79
// Tx status is written back to the BD.
80
//
81
// Revision 1.5  2002/02/08 16:21:54  mohor
82
// Rx status is written back to the BD.
83
//
84
// Revision 1.4  2002/01/23 10:28:16  mohor
85
// Link in the header changed.
86
//
87
// Revision 1.3  2001/10/19 08:43:51  mohor
88
// eth_timescale.v changed to timescale.v This is done because of the
89
// simulation of the few cores in a one joined project.
90
//
91
// Revision 1.2  2001/09/11 14:17:00  mohor
92
// Few little NCSIM warnings fixed.
93
//
94
// Revision 1.1  2001/08/06 14:44:29  mohor
95
// A define FPGA added to select between Artisan RAM (for ASIC) and Block Ram (For Virtex).
96
// Include files fixed to contain no path.
97
// File names and module names changed ta have a eth_ prologue in the name.
98
// File eth_timescale.v is used to define timescale
99
// All pin names on the top module are changed to contain _I, _O or _OE at the end.
100
// Bidirectional signal MDIO is changed to three signals (Mdc_O, Mdi_I, Mdo_O
101
// and Mdo_OE. The bidirectional signal must be created on the top level. This
102
// is done due to the ASIC tools.
103
//
104
// Revision 1.1  2001/07/30 21:23:42  mohor
105
// Directory structure changed. Files checked and joind together.
106
//
107
//
108
//
109
//
110
//
111
 
112
`include "timescale.v"
113
 
114
 
115
module eth_macstatus(
116
                      MRxClk, Reset, ReceivedLengthOK, ReceiveEnd, ReceivedPacketGood, RxCrcError,
117
                      MRxErr, MRxDV, RxStateSFD, RxStateData, RxStatePreamble, RxStateIdle, Transmitting,
118
                      RxByteCnt, RxByteCntEq0, RxByteCntGreat2, RxByteCntMaxFrame,
119
                      InvalidSymbol, MRxD, LatchedCrcError, Collision, CollValid, RxLateCollision,
120
                      r_RecSmall, r_MinFL, r_MaxFL, ShortFrame, DribbleNibble, ReceivedPacketTooBig, r_HugEn,
121
                      LoadRxStatus, StartTxDone, StartTxAbort, RetryCnt, RetryCntLatched, MTxClk, MaxCollisionOccured,
122
                      RetryLimit, LateCollision, LateCollLatched, DeferIndication, DeferLatched, RstDeferLatched, TxStartFrm,
123
                      StatePreamble, StateData, CarrierSense, CarrierSenseLost, TxUsedData, LatchedMRxErr, Loopback,
124
                      r_FullD
125
                    );
126
 
127
 
128
 
129
parameter Tp = 1;
130
 
131
 
132
input         MRxClk;
133
input         Reset;
134
input         RxCrcError;
135
input         MRxErr;
136
input         MRxDV;
137
 
138
input         RxStateSFD;
139
input   [1:0] RxStateData;
140
input         RxStatePreamble;
141
input         RxStateIdle;
142
input         Transmitting;
143
input  [15:0] RxByteCnt;
144
input         RxByteCntEq0;
145
input         RxByteCntGreat2;
146
input         RxByteCntMaxFrame;
147
input   [3:0] MRxD;
148
input         Collision;
149
input   [5:0] CollValid;
150
input         r_RecSmall;
151
input  [15:0] r_MinFL;
152
input  [15:0] r_MaxFL;
153
input         r_HugEn;
154
input         StartTxDone;
155
input         StartTxAbort;
156
input   [3:0] RetryCnt;
157
input         MTxClk;
158
input         MaxCollisionOccured;
159
input         LateCollision;
160
input         DeferIndication;
161
input         TxStartFrm;
162
input         StatePreamble;
163
input   [1:0] StateData;
164
input         CarrierSense;
165
input         TxUsedData;
166
input         Loopback;
167
input         r_FullD;
168
 
169
 
170
output        ReceivedLengthOK;
171
output        ReceiveEnd;
172
output        ReceivedPacketGood;
173
output        InvalidSymbol;
174
output        LatchedCrcError;
175
output        RxLateCollision;
176
output        ShortFrame;
177
output        DribbleNibble;
178
output        ReceivedPacketTooBig;
179
output        LoadRxStatus;
180
output  [3:0] RetryCntLatched;
181
output        RetryLimit;
182
output        LateCollLatched;
183
output        DeferLatched;
184
input         RstDeferLatched;
185
output        CarrierSenseLost;
186
output        LatchedMRxErr;
187
 
188
 
189
reg           ReceiveEnd;
190
 
191
reg           LatchedCrcError;
192
reg           LatchedMRxErr;
193
reg           LoadRxStatus;
194
reg           InvalidSymbol;
195
reg     [3:0] RetryCntLatched;
196
reg           RetryLimit;
197
reg           LateCollLatched;
198
reg           DeferLatched;
199
reg           CarrierSenseLost;
200
 
201
wire          TakeSample;
202
wire          SetInvalidSymbol; // Invalid symbol was received during reception in 100Mbps 
203
 
204
// Crc error
205
always @ (posedge MRxClk or posedge Reset)
206
begin
207
  if(Reset)
208
    LatchedCrcError <=#Tp 1'b0;
209
  else
210
  if(RxStateSFD)
211
    LatchedCrcError <=#Tp 1'b0;
212
  else
213
  if(RxStateData[0])
214
    LatchedCrcError <=#Tp RxCrcError & ~RxByteCntEq0;
215
end
216
 
217
 
218
// LatchedMRxErr
219
always @ (posedge MRxClk or posedge Reset)
220
begin
221
  if(Reset)
222
    LatchedMRxErr <=#Tp 1'b0;
223
  else
224
  if(MRxErr & MRxDV & (RxStatePreamble | RxStateSFD | (|RxStateData) | RxStateIdle & ~Transmitting))
225
    LatchedMRxErr <=#Tp 1'b1;
226
  else
227
    LatchedMRxErr <=#Tp 1'b0;
228
end
229
 
230
 
231
// ReceivedPacketGood
232
assign ReceivedPacketGood = ~LatchedCrcError;
233
 
234
 
235
// ReceivedLengthOK
236
assign ReceivedLengthOK = RxByteCnt[15:0] >= r_MinFL[15:0] & RxByteCnt[15:0] <= r_MaxFL[15:0];
237
 
238
 
239
 
240
 
241
 
242
// Time to take a sample
243
//assign TakeSample = |RxStateData     & ~MRxDV & RxByteCntGreat2  |
244
assign TakeSample = (|RxStateData)   & (~MRxDV)                    |
245
                      RxStateData[0] &   MRxDV & RxByteCntMaxFrame;
246
 
247
 
248
// LoadRxStatus
249
always @ (posedge MRxClk or posedge Reset)
250
begin
251
  if(Reset)
252
    LoadRxStatus <=#Tp 1'b0;
253
  else
254
    LoadRxStatus <=#Tp TakeSample;
255
end
256
 
257
 
258
 
259
// ReceiveEnd
260
always @ (posedge MRxClk or posedge Reset)
261
begin
262
  if(Reset)
263
    ReceiveEnd  <=#Tp 1'b0;
264
  else
265
    ReceiveEnd  <=#Tp LoadRxStatus;
266
end
267
 
268
 
269
// Invalid Symbol received during 100Mbps mode
270
assign SetInvalidSymbol = MRxDV & MRxErr & MRxD[3:0] == 4'he;
271
 
272
 
273
// InvalidSymbol
274
always @ (posedge MRxClk or posedge Reset)
275
begin
276
  if(Reset)
277
    InvalidSymbol <=#Tp 1'b0;
278
  else
279
  if(LoadRxStatus & ~SetInvalidSymbol)
280
    InvalidSymbol <=#Tp 1'b0;
281
  else
282
  if(SetInvalidSymbol)
283
    InvalidSymbol <=#Tp 1'b1;
284
end
285
 
286
 
287
// Late Collision
288
 
289
reg RxLateCollision;
290
reg RxColWindow;
291
// Collision Window
292
always @ (posedge MRxClk or posedge Reset)
293
begin
294
  if(Reset)
295
    RxLateCollision <=#Tp 1'b0;
296
  else
297
  if(LoadRxStatus)
298
    RxLateCollision <=#Tp 1'b0;
299
  else
300
  if(Collision & (~r_FullD) & (~RxColWindow | r_RecSmall))
301
    RxLateCollision <=#Tp 1'b1;
302
end
303
 
304
// Collision Window
305
always @ (posedge MRxClk or posedge Reset)
306
begin
307
  if(Reset)
308
    RxColWindow <=#Tp 1'b1;
309
  else
310
  if(~Collision & RxByteCnt[5:0] == CollValid[5:0] & RxStateData[1])
311
    RxColWindow <=#Tp 1'b0;
312
  else
313
  if(RxStateIdle)
314
    RxColWindow <=#Tp 1'b1;
315
end
316
 
317
 
318
// ShortFrame
319
reg ShortFrame;
320
always @ (posedge MRxClk or posedge Reset)
321
begin
322
  if(Reset)
323
    ShortFrame <=#Tp 1'b0;
324
  else
325
  if(LoadRxStatus)
326
    ShortFrame <=#Tp 1'b0;
327
  else
328
  if(TakeSample)
329
    ShortFrame <=#Tp RxByteCnt[15:0] < r_MinFL[15:0];
330
end
331
 
332
 
333
// DribbleNibble
334
reg DribbleNibble;
335
always @ (posedge MRxClk or posedge Reset)
336
begin
337
  if(Reset)
338
    DribbleNibble <=#Tp 1'b0;
339
  else
340
  if(RxStateSFD)
341
    DribbleNibble <=#Tp 1'b0;
342
  else
343
  if(~MRxDV & RxStateData[1])
344
    DribbleNibble <=#Tp 1'b1;
345
end
346
 
347
 
348
reg ReceivedPacketTooBig;
349
always @ (posedge MRxClk or posedge Reset)
350
begin
351
  if(Reset)
352
    ReceivedPacketTooBig <=#Tp 1'b0;
353
  else
354
  if(LoadRxStatus)
355
    ReceivedPacketTooBig <=#Tp 1'b0;
356
  else
357
  if(TakeSample)
358
    ReceivedPacketTooBig <=#Tp ~r_HugEn & RxByteCnt[15:0] > r_MaxFL[15:0];
359
end
360
 
361
 
362
 
363
// Latched Retry counter for tx status
364
always @ (posedge MTxClk or posedge Reset)
365
begin
366
  if(Reset)
367
    RetryCntLatched <=#Tp 4'h0;
368
  else
369
  if(StartTxDone | StartTxAbort)
370
    RetryCntLatched <=#Tp RetryCnt;
371
end
372
 
373
 
374
// Latched Retransmission limit
375
always @ (posedge MTxClk or posedge Reset)
376
begin
377
  if(Reset)
378
    RetryLimit <=#Tp 1'h0;
379
  else
380
  if(StartTxDone | StartTxAbort)
381
    RetryLimit <=#Tp MaxCollisionOccured;
382
end
383
 
384
 
385
// Latched Late Collision
386
always @ (posedge MTxClk or posedge Reset)
387
begin
388
  if(Reset)
389
    LateCollLatched <=#Tp 1'b0;
390
  else
391
  if(StartTxDone | StartTxAbort)
392
    LateCollLatched <=#Tp LateCollision;
393
end
394
 
395
 
396
 
397
// Latched Defer state
398
always @ (posedge MTxClk or posedge Reset)
399
begin
400
  if(Reset)
401
    DeferLatched <=#Tp 1'b0;
402
  else
403
  if(DeferIndication)
404
    DeferLatched <=#Tp 1'b1;
405
  else
406
  if(RstDeferLatched)
407
    DeferLatched <=#Tp 1'b0;
408
end
409
 
410
 
411
// CarrierSenseLost
412
always @ (posedge MTxClk or posedge Reset)
413
begin
414
  if(Reset)
415
    CarrierSenseLost <=#Tp 1'b0;
416
  else
417
  if((StatePreamble | (|StateData)) & ~CarrierSense & ~Loopback & ~Collision & ~r_FullD)
418
    CarrierSenseLost <=#Tp 1'b1;
419
  else
420
  if(TxStartFrm)
421
    CarrierSenseLost <=#Tp 1'b0;
422
end
423
 
424
 
425
endmodule

powered by: WebSVN 2.1.0

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