| 1 | 15 | mohor | //////////////////////////////////////////////////////////////////////
 | 
      
         | 2 |  |  | ////                                                              ////
 | 
      
         | 3 |  |  | ////  eth_txcounters.v                                            ////
 | 
      
         | 4 |  |  | ////                                                              ////
 | 
      
         | 5 |  |  | ////  This file is part of the Ethernet IP core project           ////
 | 
      
         | 6 | 346 | olof | ////  http://www.opencores.org/project,ethmac                     ////
 | 
      
         | 7 | 15 | mohor | ////                                                              ////
 | 
      
         | 8 |  |  | ////  Author(s):                                                  ////
 | 
      
         | 9 |  |  | ////      - Igor Mohor (igorM@opencores.org)                      ////
 | 
      
         | 10 |  |  | ////      - Novan Hartadi (novan@vlsi.itb.ac.id)                  ////
 | 
      
         | 11 |  |  | ////      - Mahmud Galela (mgalela@vlsi.itb.ac.id)                ////
 | 
      
         | 12 |  |  | ////                                                              ////
 | 
      
         | 13 |  |  | ////  All additional information is avaliable in the Readme.txt   ////
 | 
      
         | 14 |  |  | ////  file.                                                       ////
 | 
      
         | 15 |  |  | ////                                                              ////
 | 
      
         | 16 |  |  | //////////////////////////////////////////////////////////////////////
 | 
      
         | 17 |  |  | ////                                                              ////
 | 
      
         | 18 |  |  | //// Copyright (C) 2001 Authors                                   ////
 | 
      
         | 19 |  |  | ////                                                              ////
 | 
      
         | 20 |  |  | //// This source file may be used and distributed without         ////
 | 
      
         | 21 |  |  | //// restriction provided that this copyright statement is not    ////
 | 
      
         | 22 |  |  | //// removed from the file and that any derivative work contains  ////
 | 
      
         | 23 |  |  | //// the original copyright notice and the associated disclaimer. ////
 | 
      
         | 24 |  |  | ////                                                              ////
 | 
      
         | 25 |  |  | //// This source file is free software; you can redistribute it   ////
 | 
      
         | 26 |  |  | //// and/or modify it under the terms of the GNU Lesser General   ////
 | 
      
         | 27 |  |  | //// Public License as published by the Free Software Foundation; ////
 | 
      
         | 28 |  |  | //// either version 2.1 of the License, or (at your option) any   ////
 | 
      
         | 29 |  |  | //// later version.                                               ////
 | 
      
         | 30 |  |  | ////                                                              ////
 | 
      
         | 31 |  |  | //// This source is distributed in the hope that it will be       ////
 | 
      
         | 32 |  |  | //// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
 | 
      
         | 33 |  |  | //// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
 | 
      
         | 34 |  |  | //// PURPOSE.  See the GNU Lesser General Public License for more ////
 | 
      
         | 35 |  |  | //// details.                                                     ////
 | 
      
         | 36 |  |  | ////                                                              ////
 | 
      
         | 37 |  |  | //// You should have received a copy of the GNU Lesser General    ////
 | 
      
         | 38 |  |  | //// Public License along with this source; if not, download it   ////
 | 
      
         | 39 |  |  | //// from http://www.opencores.org/lgpl.shtml                     ////
 | 
      
         | 40 |  |  | ////                                                              ////
 | 
      
         | 41 |  |  | //////////////////////////////////////////////////////////////////////
 | 
      
         | 42 |  |  | //
 | 
      
         | 43 |  |  | // CVS Revision History
 | 
      
         | 44 |  |  | //
 | 
      
         | 45 |  |  | // $Log: not supported by cvs2svn $
 | 
      
         | 46 | 328 | igorm | // Revision 1.5  2002/04/22 14:54:14  mohor
 | 
      
         | 47 |  |  | // FCS should not be included in NibbleMinFl.
 | 
      
         | 48 |  |  | //
 | 
      
         | 49 | 104 | mohor | // Revision 1.4  2002/01/23 10:28:16  mohor
 | 
      
         | 50 |  |  | // Link in the header changed.
 | 
      
         | 51 |  |  | //
 | 
      
         | 52 | 37 | mohor | // Revision 1.3  2001/10/19 08:43:51  mohor
 | 
      
         | 53 |  |  | // eth_timescale.v changed to timescale.v This is done because of the
 | 
      
         | 54 |  |  | // simulation of the few cores in a one joined project.
 | 
      
         | 55 |  |  | //
 | 
      
         | 56 | 22 | mohor | // Revision 1.2  2001/09/11 14:17:00  mohor
 | 
      
         | 57 |  |  | // Few little NCSIM warnings fixed.
 | 
      
         | 58 |  |  | //
 | 
      
         | 59 | 18 | mohor | // Revision 1.1  2001/08/06 14:44:29  mohor
 | 
      
         | 60 |  |  | // A define FPGA added to select between Artisan RAM (for ASIC) and Block Ram (For Virtex).
 | 
      
         | 61 |  |  | // Include files fixed to contain no path.
 | 
      
         | 62 |  |  | // File names and module names changed ta have a eth_ prologue in the name.
 | 
      
         | 63 |  |  | // File eth_timescale.v is used to define timescale
 | 
      
         | 64 |  |  | // All pin names on the top module are changed to contain _I, _O or _OE at the end.
 | 
      
         | 65 |  |  | // Bidirectional signal MDIO is changed to three signals (Mdc_O, Mdi_I, Mdo_O
 | 
      
         | 66 |  |  | // and Mdo_OE. The bidirectional signal must be created on the top level. This
 | 
      
         | 67 |  |  | // is done due to the ASIC tools.
 | 
      
         | 68 |  |  | //
 | 
      
         | 69 | 15 | mohor | // Revision 1.1  2001/07/30 21:23:42  mohor
 | 
      
         | 70 |  |  | // Directory structure changed. Files checked and joind together.
 | 
      
         | 71 |  |  | //
 | 
      
         | 72 |  |  | // Revision 1.4  2001/06/27 21:27:45  mohor
 | 
      
         | 73 |  |  | // Few typos fixed.
 | 
      
         | 74 |  |  | //
 | 
      
         | 75 |  |  | // Revision 1.2  2001/06/19 10:38:07  mohor
 | 
      
         | 76 |  |  | // Minor changes in header.
 | 
      
         | 77 |  |  | //
 | 
      
         | 78 |  |  | // Revision 1.1  2001/06/19 10:27:57  mohor
 | 
      
         | 79 |  |  | // TxEthMAC initial release.
 | 
      
         | 80 |  |  | //
 | 
      
         | 81 |  |  | //
 | 
      
         | 82 |  |  | //
 | 
      
         | 83 |  |  |  
 | 
      
         | 84 |  |  |  
 | 
      
         | 85 | 22 | mohor | `include "timescale.v"
 | 
      
         | 86 | 15 | mohor |  
 | 
      
         | 87 |  |  |  
 | 
      
         | 88 |  |  | module eth_txcounters (StatePreamble, StateIPG, StateData, StatePAD, StateFCS, StateJam,
 | 
      
         | 89 |  |  |                        StateBackOff, StateDefer, StateIdle, StartDefer, StartIPG, StartFCS,
 | 
      
         | 90 |  |  |                        StartJam, StartBackoff, TxStartFrm, MTxClk, Reset, MinFL, MaxFL, HugEn,
 | 
      
         | 91 |  |  |                        ExDfrEn, PacketFinished_q, DlyCrcEn, StateSFD, ByteCnt, NibCnt,
 | 
      
         | 92 |  |  |                        ExcessiveDefer, NibCntEq7, NibCntEq15, MaxFrame, NibbleMinFl, DlyCrcCnt
 | 
      
         | 93 |  |  |                       );
 | 
      
         | 94 |  |  |  
 | 
      
         | 95 |  |  | input MTxClk;             // Tx clock
 | 
      
         | 96 |  |  | input Reset;              // Reset
 | 
      
         | 97 |  |  | input StatePreamble;      // Preamble state
 | 
      
         | 98 |  |  | input StateIPG;           // IPG state
 | 
      
         | 99 |  |  | input [1:0] StateData;    // Data state
 | 
      
         | 100 |  |  | input StatePAD;           // PAD state
 | 
      
         | 101 |  |  | input StateFCS;           // FCS state
 | 
      
         | 102 |  |  | input StateJam;           // Jam state
 | 
      
         | 103 |  |  | input StateBackOff;       // Backoff state
 | 
      
         | 104 |  |  | input StateDefer;         // Defer state
 | 
      
         | 105 |  |  | input StateIdle;          // Idle state
 | 
      
         | 106 |  |  | input StateSFD;           // SFD state
 | 
      
         | 107 |  |  | input StartDefer;         // Defer state will be activated in next clock
 | 
      
         | 108 |  |  | input StartIPG;           // IPG state will be activated in next clock
 | 
      
         | 109 |  |  | input StartFCS;           // FCS state will be activated in next clock
 | 
      
         | 110 |  |  | input StartJam;           // Jam state will be activated in next clock
 | 
      
         | 111 |  |  | input StartBackoff;       // Backoff state will be activated in next clock
 | 
      
         | 112 |  |  | input TxStartFrm;         // Tx start frame
 | 
      
         | 113 |  |  | input [15:0] MinFL;       // Minimum frame length (in bytes)
 | 
      
         | 114 |  |  | input [15:0] MaxFL;       // Miximum frame length (in bytes)
 | 
      
         | 115 |  |  | input HugEn;              // Pakets bigger then MaxFL enabled
 | 
      
         | 116 |  |  | input ExDfrEn;            // Excessive deferral enabled
 | 
      
         | 117 |  |  | input PacketFinished_q;
 | 
      
         | 118 |  |  | input DlyCrcEn;           // Delayed CRC enabled
 | 
      
         | 119 |  |  |  
 | 
      
         | 120 |  |  | output [15:0] ByteCnt;    // Byte counter
 | 
      
         | 121 |  |  | output [15:0] NibCnt;     // Nibble counter
 | 
      
         | 122 |  |  | output ExcessiveDefer;    // Excessive Deferral occuring
 | 
      
         | 123 |  |  | output NibCntEq7;         // Nibble counter is equal to 7
 | 
      
         | 124 |  |  | output NibCntEq15;        // Nibble counter is equal to 15
 | 
      
         | 125 |  |  | output MaxFrame;          // Maximum frame occured
 | 
      
         | 126 |  |  | output NibbleMinFl;       // Nibble counter is greater than the minimum frame length
 | 
      
         | 127 |  |  | output [2:0] DlyCrcCnt;   // Delayed CRC Count
 | 
      
         | 128 |  |  |  
 | 
      
         | 129 |  |  | wire ExcessiveDeferCnt;
 | 
      
         | 130 |  |  | wire ResetNibCnt;
 | 
      
         | 131 |  |  | wire IncrementNibCnt;
 | 
      
         | 132 |  |  | wire ResetByteCnt;
 | 
      
         | 133 |  |  | wire IncrementByteCnt;
 | 
      
         | 134 |  |  | wire ByteCntMax;
 | 
      
         | 135 |  |  |  
 | 
      
         | 136 |  |  | reg [15:0] NibCnt;
 | 
      
         | 137 |  |  | reg [15:0] ByteCnt;
 | 
      
         | 138 |  |  | reg  [2:0] DlyCrcCnt;
 | 
      
         | 139 |  |  |  
 | 
      
         | 140 |  |  |  
 | 
      
         | 141 |  |  |  
 | 
      
         | 142 | 328 | igorm | assign IncrementNibCnt = StateIPG | StatePreamble | (|StateData) | StatePAD
 | 
      
         | 143 | 15 | mohor |                        | StateFCS | StateJam | StateBackOff | StateDefer & ~ExcessiveDefer & TxStartFrm;
 | 
      
         | 144 |  |  |  
 | 
      
         | 145 |  |  |  
 | 
      
         | 146 |  |  | assign ResetNibCnt = StateDefer & ExcessiveDefer & ~TxStartFrm | StatePreamble & NibCntEq15
 | 
      
         | 147 |  |  |                    | StateJam & NibCntEq7 | StateIdle | StartDefer | StartIPG | StartFCS | StartJam;
 | 
      
         | 148 |  |  |  
 | 
      
         | 149 |  |  | // Nibble Counter
 | 
      
         | 150 |  |  | always @ (posedge MTxClk or posedge Reset)
 | 
      
         | 151 |  |  | begin
 | 
      
         | 152 |  |  |   if(Reset)
 | 
      
         | 153 | 352 | olof |     NibCnt <=  16'h0;
 | 
      
         | 154 | 15 | mohor |   else
 | 
      
         | 155 |  |  |     begin
 | 
      
         | 156 |  |  |       if(ResetNibCnt)
 | 
      
         | 157 | 352 | olof |         NibCnt <=  16'h0;
 | 
      
         | 158 | 15 | mohor |       else
 | 
      
         | 159 |  |  |       if(IncrementNibCnt)
 | 
      
         | 160 | 353 | olof |         NibCnt <=  NibCnt + 16'd1;
 | 
      
         | 161 | 15 | mohor |      end
 | 
      
         | 162 |  |  | end
 | 
      
         | 163 |  |  |  
 | 
      
         | 164 |  |  |  
 | 
      
         | 165 |  |  | assign NibCntEq7   = &NibCnt[2:0];
 | 
      
         | 166 |  |  | assign NibCntEq15  = &NibCnt[3:0];
 | 
      
         | 167 |  |  |  
 | 
      
         | 168 | 353 | olof | assign NibbleMinFl = NibCnt >= (((MinFL-16'd4)<<1) -1);  // FCS should not be included in NibbleMinFl
 | 
      
         | 169 | 15 | mohor |  
 | 
      
         | 170 | 353 | olof | assign ExcessiveDeferCnt = NibCnt[13:0] == 14'h17b7;
 | 
      
         | 171 | 15 | mohor |  
 | 
      
         | 172 | 353 | olof | assign ExcessiveDefer  = NibCnt[13:0] == 14'h17b7 & ~ExDfrEn;   // 6071 nibbles
 | 
      
         | 173 | 15 | mohor |  
 | 
      
         | 174 | 328 | igorm | assign IncrementByteCnt = StateData[1] & ~ByteCntMax
 | 
      
         | 175 | 15 | mohor |                         | StateBackOff & (&NibCnt[6:0])
 | 
      
         | 176 |  |  |                         | (StatePAD | StateFCS) & NibCnt[0] & ~ByteCntMax;
 | 
      
         | 177 |  |  |  
 | 
      
         | 178 |  |  | assign ResetByteCnt = StartBackoff | StateIdle & TxStartFrm | PacketFinished_q;
 | 
      
         | 179 |  |  |  
 | 
      
         | 180 |  |  |  
 | 
      
         | 181 |  |  | // Transmit Byte Counter
 | 
      
         | 182 |  |  | always @ (posedge MTxClk or posedge Reset)
 | 
      
         | 183 |  |  | begin
 | 
      
         | 184 |  |  |   if(Reset)
 | 
      
         | 185 | 352 | olof |     ByteCnt[15:0] <=  16'h0;
 | 
      
         | 186 | 15 | mohor |   else
 | 
      
         | 187 |  |  |     begin
 | 
      
         | 188 |  |  |       if(ResetByteCnt)
 | 
      
         | 189 | 352 | olof |         ByteCnt[15:0] <=  16'h0;
 | 
      
         | 190 | 15 | mohor |       else
 | 
      
         | 191 |  |  |       if(IncrementByteCnt)
 | 
      
         | 192 | 353 | olof |         ByteCnt[15:0] <=  ByteCnt[15:0] + 16'd1;
 | 
      
         | 193 | 15 | mohor |     end
 | 
      
         | 194 |  |  | end
 | 
      
         | 195 |  |  |  
 | 
      
         | 196 |  |  |  
 | 
      
         | 197 |  |  | assign MaxFrame = ByteCnt[15:0] == MaxFL[15:0] & ~HugEn;
 | 
      
         | 198 |  |  |  
 | 
      
         | 199 |  |  | assign ByteCntMax = &ByteCnt[15:0];
 | 
      
         | 200 |  |  |  
 | 
      
         | 201 |  |  |  
 | 
      
         | 202 |  |  | // Delayed CRC counter
 | 
      
         | 203 |  |  | always @ (posedge MTxClk or posedge Reset)
 | 
      
         | 204 |  |  | begin
 | 
      
         | 205 |  |  |   if(Reset)
 | 
      
         | 206 | 352 | olof |     DlyCrcCnt <=  3'h0;
 | 
      
         | 207 | 15 | mohor |   else
 | 
      
         | 208 |  |  |     begin
 | 
      
         | 209 |  |  |       if(StateData[1] & DlyCrcCnt == 3'h4 | StartJam | PacketFinished_q)
 | 
      
         | 210 | 352 | olof |         DlyCrcCnt <=  3'h0;
 | 
      
         | 211 | 15 | mohor |       else
 | 
      
         | 212 |  |  |       if(DlyCrcEn & (StateSFD | StateData[1] & (|DlyCrcCnt[2:0])))
 | 
      
         | 213 | 353 | olof |         DlyCrcCnt <=  DlyCrcCnt + 3'd1;
 | 
      
         | 214 | 15 | mohor |     end
 | 
      
         | 215 |  |  | end
 | 
      
         | 216 |  |  |  
 | 
      
         | 217 |  |  |  
 | 
      
         | 218 |  |  |  
 | 
      
         | 219 |  |  | endmodule
 |