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

Subversion Repositories ethmac

[/] [ethmac/] [trunk/] [rtl/] [verilog/] [eth_rxethmac.v] - Diff between revs 352 and 354

Only display areas with differences | Details | Blame | View Log

Rev 352 Rev 354
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
////                                                              ////
////                                                              ////
////  eth_rxethmac.v                                              ////
////  eth_rxethmac.v                                              ////
////                                                              ////
////                                                              ////
////  This file is part of the Ethernet IP core project           ////
////  This file is part of the Ethernet IP core project           ////
////  http://www.opencores.org/projects,ethmac/                   ////
////  http://www.opencores.org/project,ethmac                     ////
////                                                              ////
////                                                              ////
////  Author(s):                                                  ////
////  Author(s):                                                  ////
////      - Igor Mohor (igorM@opencores.org)                      ////
////      - Igor Mohor (igorM@opencores.org)                      ////
////      - Novan Hartadi (novan@vlsi.itb.ac.id)                  ////
////      - Novan Hartadi (novan@vlsi.itb.ac.id)                  ////
////      - Mahmud Galela (mgalela@vlsi.itb.ac.id)                ////
////      - Mahmud Galela (mgalela@vlsi.itb.ac.id)                ////
////      - Olof Kindgren (olof@opencores.org                     ////
////      - Olof Kindgren (olof@opencores.org                     ////
////                                                              ////
////                                                              ////
////  All additional information is avaliable in the Readme.txt   ////
////  All additional information is avaliable in the Readme.txt   ////
////  file.                                                       ////
////  file.                                                       ////
////                                                              ////
////                                                              ////
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
////                                                              ////
////                                                              ////
//// Copyright (C) 2011 Authors                                   ////
//// Copyright (C) 2001, 2011 Authors                             ////
////                                                              ////
////                                                              ////
//// This source file may be used and distributed without         ////
//// This source file may be used and distributed without         ////
//// restriction provided that this copyright statement is not    ////
//// restriction provided that this copyright statement is not    ////
//// removed from the file and that any derivative work contains  ////
//// removed from the file and that any derivative work contains  ////
//// the original copyright notice and the associated disclaimer. ////
//// the original copyright notice and the associated disclaimer. ////
////                                                              ////
////                                                              ////
//// This source file is free software; you can redistribute it   ////
//// This source file is free software; you can redistribute it   ////
//// and/or modify it under the terms of the GNU Lesser General   ////
//// and/or modify it under the terms of the GNU Lesser General   ////
//// Public License as published by the Free Software Foundation; ////
//// Public License as published by the Free Software Foundation; ////
//// either version 2.1 of the License, or (at your option) any   ////
//// either version 2.1 of the License, or (at your option) any   ////
//// later version.                                               ////
//// later version.                                               ////
////                                                              ////
////                                                              ////
//// This source is distributed in the hope that it will be       ////
//// This source is distributed in the hope that it will be       ////
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
//// PURPOSE.  See the GNU Lesser General Public License for more ////
//// PURPOSE.  See the GNU Lesser General Public License for more ////
//// details.                                                     ////
//// details.                                                     ////
////                                                              ////
////                                                              ////
//// You should have received a copy of the GNU Lesser General    ////
//// You should have received a copy of the GNU Lesser General    ////
//// Public License along with this source; if not, download it   ////
//// Public License along with this source; if not, download it   ////
//// from http://www.opencores.org/lgpl.shtml                     ////
//// from http://www.opencores.org/lgpl.shtml                     ////
////                                                              ////
////                                                              ////
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
//
//
// 2011-07-06 Olof Kindgren <olof@opencores.org>
// 2011-07-06 Olof Kindgren <olof@opencores.org>
// Add ByteCntEq0 to rxaddrcheck
// Add ByteCntEq0 to rxaddrcheck
//
//
// CVS Revision History
// CVS Revision History
//
//
//
//
// $Log: not supported by cvs2svn $
// $Log: not supported by cvs2svn $
// Revision 1.12  2004/04/26 15:26:23  igorm
// Revision 1.12  2004/04/26 15:26:23  igorm
// - Bug connected to the TX_BD_NUM_Wr signal fixed (bug came in with the
// - Bug connected to the TX_BD_NUM_Wr signal fixed (bug came in with the
//   previous update of the core.
//   previous update of the core.
// - TxBDAddress is set to 0 after the TX is enabled in the MODER register.
// - TxBDAddress is set to 0 after the TX is enabled in the MODER register.
// - RxBDAddress is set to r_TxBDNum<<1 after the RX is enabled in the MODER
// - RxBDAddress is set to r_TxBDNum<<1 after the RX is enabled in the MODER
//   register. (thanks to Mathias and Torbjorn)
//   register. (thanks to Mathias and Torbjorn)
// - Multicast reception was fixed. Thanks to Ulrich Gries
// - Multicast reception was fixed. Thanks to Ulrich Gries
//
//
// Revision 1.11  2004/03/17 09:32:15  igorm
// Revision 1.11  2004/03/17 09:32:15  igorm
// Multicast detection fixed. Only the LSB of the first byte is checked.
// Multicast detection fixed. Only the LSB of the first byte is checked.
//
//
// Revision 1.10  2002/11/22 01:57:06  mohor
// Revision 1.10  2002/11/22 01:57:06  mohor
// Rx Flow control fixed. CF flag added to the RX buffer descriptor. RxAbort
// Rx Flow control fixed. CF flag added to the RX buffer descriptor. RxAbort
// synchronized.
// synchronized.
//
//
// Revision 1.9  2002/11/19 17:35:35  mohor
// Revision 1.9  2002/11/19 17:35:35  mohor
// AddressMiss status is connecting to the Rx BD. AddressMiss is identifying
// AddressMiss status is connecting to the Rx BD. AddressMiss is identifying
// that a frame was received because of the promiscous mode.
// that a frame was received because of the promiscous mode.
//
//
// Revision 1.8  2002/02/16 07:15:27  mohor
// Revision 1.8  2002/02/16 07:15:27  mohor
// Testbench fixed, code simplified, unused signals removed.
// Testbench fixed, code simplified, unused signals removed.
//
//
// Revision 1.7  2002/02/15 13:44:28  mohor
// Revision 1.7  2002/02/15 13:44:28  mohor
// RxAbort is an output. No need to have is declared as wire.
// RxAbort is an output. No need to have is declared as wire.
//
//
// Revision 1.6  2002/02/15 11:17:48  mohor
// Revision 1.6  2002/02/15 11:17:48  mohor
// File format changed.
// File format changed.
//
//
// Revision 1.5  2002/02/14 20:48:43  billditt
// Revision 1.5  2002/02/14 20:48:43  billditt
// Addition  of new module eth_addrcheck.v
// Addition  of new module eth_addrcheck.v
//
//
// Revision 1.4  2002/01/23 10:28:16  mohor
// Revision 1.4  2002/01/23 10:28:16  mohor
// Link in the header changed.
// Link in the header changed.
//
//
// Revision 1.3  2001/10/19 08:43:51  mohor
// Revision 1.3  2001/10/19 08:43:51  mohor
// eth_timescale.v changed to timescale.v This is done because of the
// eth_timescale.v changed to timescale.v This is done because of the
// simulation of the few cores in a one joined project.
// simulation of the few cores in a one joined project.
//
//
// Revision 1.2  2001/09/11 14:17:00  mohor
// Revision 1.2  2001/09/11 14:17:00  mohor
// Few little NCSIM warnings fixed.
// Few little NCSIM warnings fixed.
//
//
// Revision 1.1  2001/08/06 14:44:29  mohor
// Revision 1.1  2001/08/06 14:44:29  mohor
// A define FPGA added to select between Artisan RAM (for ASIC) and Block Ram (For Virtex).
// A define FPGA added to select between Artisan RAM (for ASIC) and Block Ram (For Virtex).
// Include files fixed to contain no path.
// Include files fixed to contain no path.
// File names and module names changed ta have a eth_ prologue in the name.
// File names and module names changed ta have a eth_ prologue in the name.
// File eth_timescale.v is used to define timescale
// File eth_timescale.v is used to define timescale
// All pin names on the top module are changed to contain _I, _O or _OE at the end.
// All pin names on the top module are changed to contain _I, _O or _OE at the end.
// Bidirectional signal MDIO is changed to three signals (Mdc_O, Mdi_I, Mdo_O
// Bidirectional signal MDIO is changed to three signals (Mdc_O, Mdi_I, Mdo_O
// and Mdo_OE. The bidirectional signal must be created on the top level. This
// and Mdo_OE. The bidirectional signal must be created on the top level. This
// is done due to the ASIC tools.
// is done due to the ASIC tools.
//
//
// Revision 1.1  2001/07/30 21:23:42  mohor
// Revision 1.1  2001/07/30 21:23:42  mohor
// Directory structure changed. Files checked and joind together.
// Directory structure changed. Files checked and joind together.
//
//
// Revision 1.1  2001/06/27 21:26:19  mohor
// Revision 1.1  2001/06/27 21:26:19  mohor
// Initial release of the RxEthMAC module.
// Initial release of the RxEthMAC module.
//
//
//
//
//
//
//
//
//
//
 
 
`include "timescale.v"
`include "timescale.v"
 
 
 
 
module eth_rxethmac (MRxClk, MRxDV, MRxD, Reset, Transmitting, MaxFL, r_IFG, HugEn, DlyCrcEn,
module eth_rxethmac (MRxClk, MRxDV, MRxD, Reset, Transmitting, MaxFL, r_IFG,
                     RxData, RxValid, RxStartFrm, RxEndFrm, ByteCnt, ByteCntEq0, ByteCntGreat2,
                     HugEn, DlyCrcEn, RxData, RxValid, RxStartFrm, RxEndFrm,
                     ByteCntMaxFrame, CrcError, StateIdle, StatePreamble, StateSFD, StateData,
                     ByteCnt, ByteCntEq0, ByteCntGreat2, ByteCntMaxFrame,
                     MAC, r_Pro, r_Bro,r_HASH0, r_HASH1, RxAbort, AddressMiss, PassAll, ControlFrmAddressOK
                     CrcError, StateIdle, StatePreamble, StateSFD, StateData,
 
                     MAC, r_Pro, r_Bro,r_HASH0, r_HASH1, RxAbort, AddressMiss,
 
                     PassAll, ControlFrmAddressOK
                    );
                    );
 
 
 
 
 
 
input         MRxClk;
input         MRxClk;
input         MRxDV;
input         MRxDV;
input   [3:0] MRxD;
input   [3:0] MRxD;
input         Transmitting;
input         Transmitting;
input         HugEn;
input         HugEn;
input         DlyCrcEn;
input         DlyCrcEn;
input  [15:0] MaxFL;
input  [15:0] MaxFL;
input         r_IFG;
input         r_IFG;
input         Reset;
input         Reset;
input  [47:0] MAC;     //  Station Address  
input  [47:0] MAC;     //  Station Address  
input         r_Bro;   //  broadcast disable
input         r_Bro;   //  broadcast disable
input         r_Pro;   //  promiscuous enable 
input         r_Pro;   //  promiscuous enable 
input [31:0]  r_HASH0; //  lower 4 bytes Hash Table
input [31:0]  r_HASH0; //  lower 4 bytes Hash Table
input [31:0]  r_HASH1; //  upper 4 bytes Hash Table
input [31:0]  r_HASH1; //  upper 4 bytes Hash Table
input         PassAll;
input         PassAll;
input         ControlFrmAddressOK;
input         ControlFrmAddressOK;
 
 
output  [7:0] RxData;
output  [7:0] RxData;
output        RxValid;
output        RxValid;
output        RxStartFrm;
output        RxStartFrm;
output        RxEndFrm;
output        RxEndFrm;
output [15:0] ByteCnt;
output [15:0] ByteCnt;
output        ByteCntEq0;
output        ByteCntEq0;
output        ByteCntGreat2;
output        ByteCntGreat2;
output        ByteCntMaxFrame;
output        ByteCntMaxFrame;
output        CrcError;
output        CrcError;
output        StateIdle;
output        StateIdle;
output        StatePreamble;
output        StatePreamble;
output        StateSFD;
output        StateSFD;
output  [1:0] StateData;
output  [1:0] StateData;
output        RxAbort;
output        RxAbort;
output        AddressMiss;
output        AddressMiss;
 
 
reg     [7:0] RxData;
reg     [7:0] RxData;
reg           RxValid;
reg           RxValid;
reg           RxStartFrm;
reg           RxStartFrm;
reg           RxEndFrm;
reg           RxEndFrm;
reg           Broadcast;
reg           Broadcast;
reg           Multicast;
reg           Multicast;
reg     [5:0] CrcHash;
reg     [5:0] CrcHash;
reg           CrcHashGood;
reg           CrcHashGood;
reg           DelayData;
reg           DelayData;
reg     [7:0] LatchedByte;
reg     [7:0] LatchedByte;
reg     [7:0] RxData_d;
reg     [7:0] RxData_d;
reg           RxValid_d;
reg           RxValid_d;
reg           RxStartFrm_d;
reg           RxStartFrm_d;
reg           RxEndFrm_d;
reg           RxEndFrm_d;
 
 
wire          MRxDEqD;
wire          MRxDEqD;
wire          MRxDEq5;
wire          MRxDEq5;
wire          StateDrop;
wire          StateDrop;
wire          ByteCntEq1;
wire          ByteCntEq1;
wire          ByteCntEq2;
wire          ByteCntEq2;
wire          ByteCntEq3;
wire          ByteCntEq3;
wire          ByteCntEq4;
wire          ByteCntEq4;
wire          ByteCntEq5;
wire          ByteCntEq5;
wire          ByteCntEq6;
wire          ByteCntEq6;
wire          ByteCntEq7;
wire          ByteCntEq7;
wire          ByteCntSmall7;
wire          ByteCntSmall7;
wire   [31:0] Crc;
wire   [31:0] Crc;
wire          Enable_Crc;
wire          Enable_Crc;
wire          Initialize_Crc;
wire          Initialize_Crc;
wire    [3:0] Data_Crc;
wire    [3:0] Data_Crc;
wire          GenerateRxValid;
wire          GenerateRxValid;
wire          GenerateRxStartFrm;
wire          GenerateRxStartFrm;
wire          GenerateRxEndFrm;
wire          GenerateRxEndFrm;
wire          DribbleRxEndFrm;
wire          DribbleRxEndFrm;
wire    [3:0] DlyCrcCnt;
wire    [3:0] DlyCrcCnt;
wire          IFGCounterEq24;
wire          IFGCounterEq24;
 
 
assign MRxDEqD = MRxD == 4'hd;
assign MRxDEqD = MRxD == 4'hd;
assign MRxDEq5 = MRxD == 4'h5;
assign MRxDEq5 = MRxD == 4'h5;
 
 
 
 
// Rx State Machine module
// Rx State Machine module
eth_rxstatem
eth_rxstatem rxstatem1
rxstatem1 (.MRxClk(MRxClk), .Reset(Reset), .MRxDV(MRxDV), .ByteCntEq0(ByteCntEq0),
  (.MRxClk(MRxClk),
                        .ByteCntGreat2(ByteCntGreat2), .Transmitting(Transmitting), .MRxDEq5(MRxDEq5),
   .Reset(Reset),
                        .MRxDEqD(MRxDEqD), .IFGCounterEq24(IFGCounterEq24), .ByteCntMaxFrame(ByteCntMaxFrame),
   .MRxDV(MRxDV),
                        .StateData(StateData), .StateIdle(StateIdle), .StatePreamble(StatePreamble),
   .ByteCntEq0(ByteCntEq0),
                        .StateSFD(StateSFD), .StateDrop(StateDrop)
   .ByteCntGreat2(ByteCntGreat2),
 
   .Transmitting(Transmitting),
 
   .MRxDEq5(MRxDEq5),
 
   .MRxDEqD(MRxDEqD),
 
   .IFGCounterEq24(IFGCounterEq24),
 
   .ByteCntMaxFrame(ByteCntMaxFrame),
 
   .StateData(StateData),
 
   .StateIdle(StateIdle),
 
   .StatePreamble(StatePreamble),
 
   .StateSFD(StateSFD),
 
   .StateDrop(StateDrop)
                       );
                       );
 
 
 
 
// Rx Counters module
// Rx Counters module
eth_rxcounters
eth_rxcounters rxcounters1
rxcounters1 (.MRxClk(MRxClk), .Reset(Reset), .MRxDV(MRxDV), .StateIdle(StateIdle),
  (.MRxClk(MRxClk),
                            .StateSFD(StateSFD), .StateData(StateData), .StateDrop(StateDrop),
   .Reset(Reset),
                            .StatePreamble(StatePreamble), .MRxDEqD(MRxDEqD), .DlyCrcEn(DlyCrcEn),
   .MRxDV(MRxDV),
                            .DlyCrcCnt(DlyCrcCnt), .Transmitting(Transmitting), .MaxFL(MaxFL), .r_IFG(r_IFG),
   .StateIdle(StateIdle),
                            .HugEn(HugEn), .IFGCounterEq24(IFGCounterEq24), .ByteCntEq0(ByteCntEq0),
   .StateSFD(StateSFD),
                            .ByteCntEq1(ByteCntEq1), .ByteCntEq2(ByteCntEq2), .ByteCntEq3(ByteCntEq3),
   .StateData(StateData),
                            .ByteCntEq4(ByteCntEq4), .ByteCntEq5(ByteCntEq5), .ByteCntEq6(ByteCntEq6),
   .StateDrop(StateDrop),
                            .ByteCntEq7(ByteCntEq7), .ByteCntGreat2(ByteCntGreat2),
   .StatePreamble(StatePreamble),
                            .ByteCntSmall7(ByteCntSmall7), .ByteCntMaxFrame(ByteCntMaxFrame),
   .MRxDEqD(MRxDEqD),
 
   .DlyCrcEn(DlyCrcEn),
 
   .DlyCrcCnt(DlyCrcCnt),
 
   .Transmitting(Transmitting),
 
   .MaxFL(MaxFL),
 
   .r_IFG(r_IFG),
 
   .HugEn(HugEn),
 
   .IFGCounterEq24(IFGCounterEq24),
 
   .ByteCntEq0(ByteCntEq0),
 
   .ByteCntEq1(ByteCntEq1),
 
   .ByteCntEq2(ByteCntEq2),
 
   .ByteCntEq3(ByteCntEq3),
 
   .ByteCntEq4(ByteCntEq4),
 
   .ByteCntEq5(ByteCntEq5),
 
   .ByteCntEq6(ByteCntEq6),
 
   .ByteCntEq7(ByteCntEq7),
 
   .ByteCntGreat2(ByteCntGreat2),
 
   .ByteCntSmall7(ByteCntSmall7),
 
   .ByteCntMaxFrame(ByteCntMaxFrame),
                            .ByteCntOut(ByteCnt)
                            .ByteCntOut(ByteCnt)
                           );
   );
 
 
// Rx Address Check
// Rx Address Check
 
 
eth_rxaddrcheck
eth_rxaddrcheck rxaddrcheck1
rxaddrcheck1
  (.MRxClk(MRxClk),
              (.MRxClk(MRxClk),         .Reset( Reset),             .RxData(RxData),
   .Reset( Reset),
               .Broadcast (Broadcast),  .r_Bro (r_Bro),             .r_Pro(r_Pro),
   .RxData(RxData),
               .ByteCntEq6(ByteCntEq6), .ByteCntEq7(ByteCntEq7),    .ByteCntEq2(ByteCntEq2),
   .Broadcast (Broadcast),
               .ByteCntEq3(ByteCntEq3), .ByteCntEq4(ByteCntEq4),    .ByteCntEq5(ByteCntEq5),
   .r_Bro (r_Bro),
               .HASH0(r_HASH0),         .HASH1(r_HASH1),            .ByteCntEq0(ByteCntEq0),
   .r_Pro(r_Pro),
               .CrcHash(CrcHash),       .CrcHashGood(CrcHashGood),  .StateData(StateData),
   .ByteCntEq6(ByteCntEq6),
               .Multicast(Multicast),   .MAC(MAC),                  .RxAbort(RxAbort),
   .ByteCntEq7(ByteCntEq7),
               .RxEndFrm(RxEndFrm),     .AddressMiss(AddressMiss),  .PassAll(PassAll),
   .ByteCntEq2(ByteCntEq2),
 
   .ByteCntEq3(ByteCntEq3),
 
   .ByteCntEq4(ByteCntEq4),
 
   .ByteCntEq5(ByteCntEq5),
 
   .HASH0(r_HASH0),
 
   .HASH1(r_HASH1),
 
   .ByteCntEq0(ByteCntEq0),
 
   .CrcHash(CrcHash),
 
   .CrcHashGood(CrcHashGood),
 
   .StateData(StateData),
 
   .Multicast(Multicast),
 
   .MAC(MAC),
 
   .RxAbort(RxAbort),
 
   .RxEndFrm(RxEndFrm),
 
   .AddressMiss(AddressMiss),
 
   .PassAll(PassAll),
               .ControlFrmAddressOK(ControlFrmAddressOK)
               .ControlFrmAddressOK(ControlFrmAddressOK)
              );
   );
 
 
 
 
assign Enable_Crc = MRxDV & (|StateData & ~ByteCntMaxFrame);
assign Enable_Crc = MRxDV & (|StateData & ~ByteCntMaxFrame);
assign Initialize_Crc = StateSFD | DlyCrcEn & (|DlyCrcCnt[3:0]) & DlyCrcCnt[3:0] < 4'h9;
assign Initialize_Crc = StateSFD | DlyCrcEn & (|DlyCrcCnt[3:0]) &
 
                        DlyCrcCnt[3:0] < 4'h9;
 
 
assign Data_Crc[0] = MRxD[3];
assign Data_Crc[0] = MRxD[3];
assign Data_Crc[1] = MRxD[2];
assign Data_Crc[1] = MRxD[2];
assign Data_Crc[2] = MRxD[1];
assign Data_Crc[2] = MRxD[1];
assign Data_Crc[3] = MRxD[0];
assign Data_Crc[3] = MRxD[0];
 
 
 
 
// Connecting module Crc
// Connecting module Crc
eth_crc
eth_crc crcrx
crcrx (.Clk(MRxClk), .Reset(Reset), .Data(Data_Crc), .Enable(Enable_Crc), .Initialize(Initialize_Crc),
  (.Clk(MRxClk),
               .Crc(Crc), .CrcError(CrcError)
   .Reset(Reset),
 
   .Data(Data_Crc),
 
   .Enable(Enable_Crc),
 
   .Initialize(Initialize_Crc),
 
   .Crc(Crc),
 
   .CrcError(CrcError)
              );
              );
 
 
 
 
 
 
// Latching CRC for use in the hash table
// Latching CRC for use in the hash table
 
 
always @ (posedge MRxClk)
always @ (posedge MRxClk)
begin
begin
  CrcHashGood <=  StateData[0] & ByteCntEq6;
  CrcHashGood <=  StateData[0] & ByteCntEq6;
end
end
 
 
always @ (posedge MRxClk)
always @ (posedge MRxClk)
begin
begin
  if(Reset | StateIdle)
  if(Reset | StateIdle)
    CrcHash[5:0] <=  6'h0;
    CrcHash[5:0] <=  6'h0;
  else
  else
  if(StateData[0] & ByteCntEq6)
  if(StateData[0] & ByteCntEq6)
    CrcHash[5:0] <=  Crc[31:26];
    CrcHash[5:0] <=  Crc[31:26];
end
end
 
 
 
 
// Output byte stream
// Output byte stream
always @ (posedge MRxClk or posedge Reset)
always @ (posedge MRxClk or posedge Reset)
begin
begin
  if(Reset)
  if(Reset)
    begin
    begin
      RxData_d[7:0]      <=  8'h0;
      RxData_d[7:0]      <=  8'h0;
      DelayData          <=  1'b0;
      DelayData          <=  1'b0;
      LatchedByte[7:0]   <=  8'h0;
      LatchedByte[7:0]   <=  8'h0;
      RxData[7:0]        <=  8'h0;
      RxData[7:0]        <=  8'h0;
    end
    end
  else
  else
    begin
    begin
      LatchedByte[7:0]   <=  {MRxD[3:0], LatchedByte[7:4]};  // Latched byte
      // Latched byte
 
      LatchedByte[7:0]   <=  {MRxD[3:0], LatchedByte[7:4]};
      DelayData          <=  StateData[0];
      DelayData          <=  StateData[0];
 
 
      if(GenerateRxValid)
      if(GenerateRxValid)
        RxData_d[7:0] <=  LatchedByte[7:0] & {8{|StateData}};  // Data goes through only in data state 
        // Data goes through only in data state 
 
        RxData_d[7:0] <=  LatchedByte[7:0] & {8{|StateData}};
      else
      else
      if(~DelayData)
      if(~DelayData)
        RxData_d[7:0] <=  8'h0;                                // Delaying data to be valid for two cycles. Zero when not active.
        // Delaying data to be valid for two cycles.
 
        // Zero when not active.
 
        RxData_d[7:0] <=  8'h0;
 
 
      RxData[7:0] <=  RxData_d[7:0];                           // Output data byte
      RxData[7:0] <=  RxData_d[7:0];          // Output data byte
    end
    end
end
end
 
 
 
 
 
 
always @ (posedge MRxClk or posedge Reset)
always @ (posedge MRxClk or posedge Reset)
begin
begin
  if(Reset)
  if(Reset)
    Broadcast <=  1'b0;
    Broadcast <=  1'b0;
  else
  else
    begin
    begin
      if(StateData[0] & ~(&LatchedByte[7:0]) & ByteCntSmall7)
      if(StateData[0] & ~(&LatchedByte[7:0]) & ByteCntSmall7)
        Broadcast <=  1'b0;
        Broadcast <=  1'b0;
      else
      else
      if(StateData[0] & (&LatchedByte[7:0]) & ByteCntEq1)
      if(StateData[0] & (&LatchedByte[7:0]) & ByteCntEq1)
        Broadcast <=  1'b1;
        Broadcast <=  1'b1;
      else
      else
      if(RxAbort | RxEndFrm)
      if(RxAbort | RxEndFrm)
        Broadcast <=  1'b0;
        Broadcast <=  1'b0;
    end
    end
end
end
 
 
 
 
always @ (posedge MRxClk or posedge Reset)
always @ (posedge MRxClk or posedge Reset)
begin
begin
  if(Reset)
  if(Reset)
    Multicast <=  1'b0;
    Multicast <=  1'b0;
  else
  else
    begin
    begin
      if(StateData[0] & ByteCntEq1 & LatchedByte[0])
      if(StateData[0] & ByteCntEq1 & LatchedByte[0])
        Multicast <=  1'b1;
        Multicast <=  1'b1;
      else if(RxAbort | RxEndFrm)
      else if(RxAbort | RxEndFrm)
      Multicast <=  1'b0;
      Multicast <=  1'b0;
    end
    end
end
end
 
 
 
 
assign GenerateRxValid = StateData[0] & (~ByteCntEq0 | DlyCrcCnt >= 4'h3);
assign GenerateRxValid = StateData[0] & (~ByteCntEq0 | DlyCrcCnt >= 4'h3);
 
 
always @ (posedge MRxClk or posedge Reset)
always @ (posedge MRxClk or posedge Reset)
begin
begin
  if(Reset)
  if(Reset)
    begin
    begin
      RxValid_d <=  1'b0;
      RxValid_d <=  1'b0;
      RxValid   <=  1'b0;
      RxValid   <=  1'b0;
    end
    end
  else
  else
    begin
    begin
      RxValid_d <=  GenerateRxValid;
      RxValid_d <=  GenerateRxValid;
      RxValid   <=  RxValid_d;
      RxValid   <=  RxValid_d;
    end
    end
end
end
 
 
 
 
assign GenerateRxStartFrm = StateData[0] & (ByteCntEq1 & ~DlyCrcEn | DlyCrcCnt == 4'h3 & DlyCrcEn);
assign GenerateRxStartFrm = StateData[0] &
 
                            ((ByteCntEq1 & ~DlyCrcEn) |
 
                            ((DlyCrcCnt == 4'h3) & DlyCrcEn));
 
 
always @ (posedge MRxClk or posedge Reset)
always @ (posedge MRxClk or posedge Reset)
begin
begin
  if(Reset)
  if(Reset)
    begin
    begin
      RxStartFrm_d <=  1'b0;
      RxStartFrm_d <=  1'b0;
      RxStartFrm   <=  1'b0;
      RxStartFrm   <=  1'b0;
    end
    end
  else
  else
    begin
    begin
      RxStartFrm_d <=  GenerateRxStartFrm;
      RxStartFrm_d <=  GenerateRxStartFrm;
      RxStartFrm   <=  RxStartFrm_d;
      RxStartFrm   <=  RxStartFrm_d;
    end
    end
end
end
 
 
 
 
assign GenerateRxEndFrm = StateData[0] & (~MRxDV & ByteCntGreat2 | ByteCntMaxFrame);
assign GenerateRxEndFrm = StateData[0] &
 
                          (~MRxDV & ByteCntGreat2 | ByteCntMaxFrame);
assign DribbleRxEndFrm  = StateData[1] &  ~MRxDV & ByteCntGreat2;
assign DribbleRxEndFrm  = StateData[1] &  ~MRxDV & ByteCntGreat2;
 
 
 
 
always @ (posedge MRxClk or posedge Reset)
always @ (posedge MRxClk or posedge Reset)
begin
begin
  if(Reset)
  if(Reset)
    begin
    begin
      RxEndFrm_d <=  1'b0;
      RxEndFrm_d <=  1'b0;
      RxEndFrm   <=  1'b0;
      RxEndFrm   <=  1'b0;
    end
    end
  else
  else
    begin
    begin
      RxEndFrm_d <=  GenerateRxEndFrm;
      RxEndFrm_d <=  GenerateRxEndFrm;
      RxEndFrm   <=  RxEndFrm_d | DribbleRxEndFrm;
      RxEndFrm   <=  RxEndFrm_d | DribbleRxEndFrm;
    end
    end
end
end
 
 
 
 
endmodule
endmodule
 
 

powered by: WebSVN 2.1.0

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