⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 eth_wishbone.v

📁 此文档为采用FPGA实现的以太网MAC层
💻 V
📖 第 1 页 / 共 5 页
字号:
    RxBDAddress <=#Tp 7'h0;  else if(r_RxEn & (~r_RxEn_q))    RxBDAddress <=#Tp r_TxBDNum[6:0];  else if(RxStatusWrite)    RxBDAddress <=#Tp TempRxBDAddress;endwire [8:0] TxStatusInLatched = {TxUnderRun, RetryCntLatched[3:0], RetryLimit, LateCollLatched, DeferLatched, CarrierSenseLost};assign RxBDDataIn = {LatchedRxLength, 1'b0, RxStatus, 4'h0, RxStatusInLatched};assign TxBDDataIn = {LatchedTxLength, 1'b0, TxStatus, 2'h0, TxStatusInLatched};// Signals used for various purposesassign TxRetryPulse   = TxRetry_wb   & ~TxRetry_wb_q;assign TxDonePulse    = TxDone_wb    & ~TxDone_wb_q;assign TxAbortPulse   = TxAbort_wb   & ~TxAbort_wb_q;// Generating delayed signalsalways @ (posedge MTxClk or posedge Reset)begin  if(Reset)    begin      TxAbort_q      <=#Tp 1'b0;      TxRetry_q      <=#Tp 1'b0;      TxUsedData_q   <=#Tp 1'b0;    end  else    begin      TxAbort_q      <=#Tp TxAbort;      TxRetry_q      <=#Tp TxRetry;      TxUsedData_q   <=#Tp TxUsedData;    endend// Generating delayed signalsalways @ (posedge WB_CLK_I or posedge Reset)begin  if(Reset)    begin      TxDone_wb_q   <=#Tp 1'b0;      TxAbort_wb_q  <=#Tp 1'b0;      TxRetry_wb_q  <=#Tp 1'b0;    end  else    begin      TxDone_wb_q   <=#Tp TxDone_wb;      TxAbort_wb_q  <=#Tp TxAbort_wb;      TxRetry_wb_q  <=#Tp TxRetry_wb;    endendreg TxAbortPacketBlocked;always @ (posedge WB_CLK_I or posedge Reset)begin  if(Reset)    TxAbortPacket <=#Tp 1'b0;  else  if(TxAbort_wb & (~tx_burst_en) & MasterWbTX & MasterAccessFinished & (~TxAbortPacketBlocked) |     TxAbort_wb & (~MasterWbTX) & (~TxAbortPacketBlocked))    TxAbortPacket <=#Tp 1'b1;  else    TxAbortPacket <=#Tp 1'b0;endalways @ (posedge WB_CLK_I or posedge Reset)begin  if(Reset)    TxAbortPacket_NotCleared <=#Tp 1'b0;  else  if(TxEn & TxEn_q & TxAbortPacket_NotCleared)    TxAbortPacket_NotCleared <=#Tp 1'b0;  else  if(TxAbort_wb & (~tx_burst_en) & MasterWbTX & MasterAccessFinished & (~TxAbortPacketBlocked) |     TxAbort_wb & (~MasterWbTX) & (~TxAbortPacketBlocked))    TxAbortPacket_NotCleared <=#Tp 1'b1;endalways @ (posedge WB_CLK_I or posedge Reset)begin  if(Reset)    TxAbortPacketBlocked <=#Tp 1'b0;  else  if(!TxAbort_wb & TxAbort_wb_q)    TxAbortPacketBlocked <=#Tp 1'b0;  else  if(TxAbortPacket)    TxAbortPacketBlocked <=#Tp 1'b1;endreg TxRetryPacketBlocked;always @ (posedge WB_CLK_I or posedge Reset)begin  if(Reset)    TxRetryPacket <=#Tp 1'b0;  else  if(TxRetry_wb & !tx_burst_en & MasterWbTX & MasterAccessFinished & !TxRetryPacketBlocked |      TxRetry_wb & !MasterWbTX & !TxRetryPacketBlocked)    TxRetryPacket <=#Tp 1'b1;  else    TxRetryPacket <=#Tp 1'b0;endalways @ (posedge WB_CLK_I or posedge Reset)begin  if(Reset)    TxRetryPacket_NotCleared <=#Tp 1'b0;  else  if(StartTxBDRead)    TxRetryPacket_NotCleared <=#Tp 1'b0;  else  if(TxRetry_wb & !tx_burst_en & MasterWbTX & MasterAccessFinished & !TxRetryPacketBlocked |      TxRetry_wb & !MasterWbTX & !TxRetryPacketBlocked)    TxRetryPacket_NotCleared <=#Tp 1'b1;endalways @ (posedge WB_CLK_I or posedge Reset)begin  if(Reset)    TxRetryPacketBlocked <=#Tp 1'b0;  else  if(!TxRetry_wb & TxRetry_wb_q)    TxRetryPacketBlocked <=#Tp 1'b0;  else  if(TxRetryPacket)    TxRetryPacketBlocked <=#Tp 1'b1;endreg TxDonePacketBlocked;always @ (posedge WB_CLK_I or posedge Reset)begin  if(Reset)    TxDonePacket <=#Tp 1'b0;  else  if(TxDone_wb & !tx_burst_en & MasterWbTX & MasterAccessFinished & !TxDonePacketBlocked |      TxDone_wb & !MasterWbTX & !TxDonePacketBlocked)    TxDonePacket <=#Tp 1'b1;  else    TxDonePacket <=#Tp 1'b0;endalways @ (posedge WB_CLK_I or posedge Reset)begin  if(Reset)    TxDonePacket_NotCleared <=#Tp 1'b0;  else  if(TxEn & TxEn_q & TxDonePacket_NotCleared)    TxDonePacket_NotCleared <=#Tp 1'b0;  else  if(TxDone_wb & !tx_burst_en & MasterWbTX & MasterAccessFinished & (~TxDonePacketBlocked) |      TxDone_wb & !MasterWbTX & (~TxDonePacketBlocked))    TxDonePacket_NotCleared <=#Tp 1'b1;endalways @ (posedge WB_CLK_I or posedge Reset)begin  if(Reset)    TxDonePacketBlocked <=#Tp 1'b0;  else  if(!TxDone_wb & TxDone_wb_q)    TxDonePacketBlocked <=#Tp 1'b0;  else  if(TxDonePacket)    TxDonePacketBlocked <=#Tp 1'b1;end// Indication of the last wordalways @ (posedge MTxClk or posedge Reset)begin  if(Reset)    LastWord <=#Tp 1'b0;  else  if((TxEndFrm | TxAbort | TxRetry) & Flop)    LastWord <=#Tp 1'b0;  else  if(TxUsedData & Flop & TxByteCnt == 2'h3)    LastWord <=#Tp TxEndFrm_wb;end// Tx end frame generationalways @ (posedge MTxClk or posedge Reset)begin  if(Reset)    TxEndFrm <=#Tp 1'b0;  else  if(Flop & TxEndFrm | TxAbort | TxRetry_q)    TxEndFrm <=#Tp 1'b0;          else  if(Flop & LastWord)    begin      case (TxValidBytesLatched)  // synopsys parallel_case        1 : TxEndFrm <=#Tp TxByteCnt == 2'h0;        2 : TxEndFrm <=#Tp TxByteCnt == 2'h1;        3 : TxEndFrm <=#Tp TxByteCnt == 2'h2;        0 : TxEndFrm <=#Tp TxByteCnt == 2'h3;        default : TxEndFrm <=#Tp 1'b0;      endcase    endend// Tx data selection (latching)always @ (posedge MTxClk or posedge Reset)begin  if(Reset)    TxData <=#Tp 0;  else  if(TxStartFrm_sync2 & ~TxStartFrm)    case(TxPointerLSB)  // synopsys parallel_case      2'h0 : TxData <=#Tp TxData_wb[31:24];                  // Big Endian Byte Ordering      2'h1 : TxData <=#Tp TxData_wb[23:16];                  // Big Endian Byte Ordering      2'h2 : TxData <=#Tp TxData_wb[15:08];                  // Big Endian Byte Ordering      2'h3 : TxData <=#Tp TxData_wb[07:00];                  // Big Endian Byte Ordering    endcase  else  if(TxStartFrm & TxUsedData & TxPointerLSB==2'h3)    TxData <=#Tp TxData_wb[31:24];                           // Big Endian Byte Ordering  else  if(TxUsedData & Flop)    begin      case(TxByteCnt)  // synopsys parallel_case        0 : TxData <=#Tp TxDataLatched[31:24];               // Big Endian Byte Ordering        1 : TxData <=#Tp TxDataLatched[23:16];        2 : TxData <=#Tp TxDataLatched[15:8];        3 : TxData <=#Tp TxDataLatched[7:0];      endcase    endend// Latching tx dataalways @ (posedge MTxClk or posedge Reset)begin  if(Reset)    TxDataLatched[31:0] <=#Tp 32'h0;  else if(TxStartFrm_sync2 & ~TxStartFrm | TxUsedData & Flop & TxByteCnt == 2'h3 | TxStartFrm & TxUsedData & Flop & TxByteCnt == 2'h0)    TxDataLatched[31:0] <=#Tp TxData_wb[31:0];end// Tx under runalways @ (posedge WB_CLK_I or posedge Reset)begin  if(Reset)    TxUnderRun_wb <=#Tp 1'b0;  else  if(TxAbortPulse)    TxUnderRun_wb <=#Tp 1'b0;  else  if(TxBufferEmpty & ReadTxDataFromFifo_wb)    TxUnderRun_wb <=#Tp 1'b1;endreg TxUnderRun_sync1;// Tx under runalways @ (posedge MTxClk or posedge Reset)begin  if(Reset)    TxUnderRun_sync1 <=#Tp 1'b0;  else  if(TxUnderRun_wb)    TxUnderRun_sync1 <=#Tp 1'b1;  else  if(BlockingTxStatusWrite_sync2)    TxUnderRun_sync1 <=#Tp 1'b0;end// Tx under runalways @ (posedge MTxClk or posedge Reset)begin  if(Reset)    TxUnderRun <=#Tp 1'b0;  else  if(BlockingTxStatusWrite_sync2)    TxUnderRun <=#Tp 1'b0;  else  if(TxUnderRun_sync1)    TxUnderRun <=#Tp 1'b1;end// Tx Byte counteralways @ (posedge MTxClk or posedge Reset)begin  if(Reset)    TxByteCnt <=#Tp 2'h0;  else  if(TxAbort_q | TxRetry_q)    TxByteCnt <=#Tp 2'h0;  else  if(TxStartFrm & ~TxUsedData)    case(TxPointerLSB)  // synopsys parallel_case      2'h0 : TxByteCnt <=#Tp 2'h1;      2'h1 : TxByteCnt <=#Tp 2'h2;      2'h2 : TxByteCnt <=#Tp 2'h3;      2'h3 : TxByteCnt <=#Tp 2'h0;    endcase  else  if(TxUsedData & Flop)    TxByteCnt <=#Tp TxByteCnt + 1'b1;end// Start: Generation of the ReadTxDataFromFifo_tck signal and synchronization to the WB_CLK_Ireg ReadTxDataFromFifo_sync1;reg ReadTxDataFromFifo_sync2;reg ReadTxDataFromFifo_sync3;reg ReadTxDataFromFifo_syncb1;reg ReadTxDataFromFifo_syncb2;reg ReadTxDataFromFifo_syncb3;always @ (posedge MTxClk or posedge Reset)begin  if(Reset)    ReadTxDataFromFifo_tck <=#Tp 1'b0;  else  if(TxStartFrm_sync2 & ~TxStartFrm | TxUsedData & Flop & TxByteCnt == 2'h3 & ~LastWord | TxStartFrm & TxUsedData & Flop & TxByteCnt == 2'h0)     ReadTxDataFromFifo_tck <=#Tp 1'b1;  else  if(ReadTxDataFromFifo_syncb2 & ~ReadTxDataFromFifo_syncb3)    ReadTxDataFromFifo_tck <=#Tp 1'b0;end// Synchronizing TxStartFrm_wb to MTxClkalways @ (posedge WB_CLK_I or posedge Reset)begin  if(Reset)    ReadTxDataFromFifo_sync1 <=#Tp 1'b0;  else    ReadTxDataFromFifo_sync1 <=#Tp ReadTxDataFromFifo_tck;endalways @ (posedge WB_CLK_I or posedge Reset)begin  if(Reset)    ReadTxDataFromFifo_sync2 <=#Tp 1'b0;  else    ReadTxDataFromFifo_sync2 <=#Tp ReadTxDataFromFifo_sync1;endalways @ (posedge MTxClk or posedge Reset)begin  if(Reset)    ReadTxDataFromFifo_syncb1 <=#Tp 1'b0;  else    ReadTxDataFromFifo_syncb1 <=#Tp ReadTxDataFromFifo_sync2;endalways @ (posedge MTxClk or posedge Reset)begin  if(Reset)    ReadTxDataFromFifo_syncb2 <=#Tp 1'b0;  else    ReadTxDataFromFifo_syncb2 <=#Tp ReadTxDataFromFifo_syncb1;endalways @ (posedge MTxClk or posedge Reset)begin  if(Reset)    ReadTxDataFromFifo_syncb3 <=#Tp 1'b0;  else    ReadTxDataFromFifo_syncb3 <=#Tp ReadTxDataFromFifo_syncb2;endalways @ (posedge WB_CLK_I or posedge Reset)begin  if(Reset)    ReadTxDataFromFifo_sync3 <=#Tp 1'b0;  else    ReadTxDataFromFifo_sync3 <=#Tp ReadTxDataFromFifo_sync2;endassign ReadTxDataFromFifo_wb = ReadTxDataFromFifo_sync2 & ~ReadTxDataFromFifo_sync3;// End: Generation of the ReadTxDataFromFifo_tck signal and synchronization to the WB_CLK_I// Synchronizing TxRetry signal (synchronized to WISHBONE clock)always @ (posedge WB_CLK_I or posedge Reset)begin  if(Reset)    TxRetrySync1 <=#Tp 1'b0;  else    TxRetrySync1 <=#Tp TxRetry;endalways @ (posedge WB_CLK_I or posedge Reset)begin  if(Reset)    TxRetry_wb <=#Tp 1'b0;  else    TxRetry_wb <=#Tp TxRetrySync1;end// Synchronized TxDone_wb signal (synchronized to WISHBONE clock)always @ (posedge WB_CLK_I or posedge Reset)begin  if(Reset)    TxDoneSync1 <=#Tp 1'b0;  else    TxDoneSync1 <=#Tp TxDone;endalways @ (posedge WB_CLK_I or posedge Reset)begin  if(Reset)    TxDone_wb <=#Tp 1'b0;  else    TxDone_wb <=#Tp TxDoneSync1;end// Synchronizing TxAbort signal (synchronized to WISHBONE clock)always @ (posedge WB_CLK_I or posedge Reset)begin  if(Reset)    TxAbortSync1 <=#Tp 1'b0;  else    TxAbortSync1 <=#Tp TxAbort;endalways @ (posedge WB_CLK_I or posedge Reset)begin  if(Reset)    TxAbort_wb <=#Tp 1'b0;  else    TxAbort_wb <=#Tp TxAbortSync1;endreg RxAbortSync1;reg RxAbortSync2;reg RxAbortSync3;reg RxAbortSync4;reg RxAbortSyncb1;reg RxAbortSyncb2;assign StartRxBDRead = RxStatusWrite | RxAbortSync3 & ~RxAbortSync4 | r_RxEn & ~r_RxEn_q;// Reading the Rx buffer descriptoralways @ (posedge WB_CLK_I or posedge Reset)begin  if(Reset)    RxBDRead <=#Tp 1'b0;  else  if(StartRxBDRead & ~RxReady)    RxBDRead <=#Tp 1'b1;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -