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

📄 eth_wishbone.v

📁 这是一个很好的Verilog 编写的8位RISC CPU源码(可做为MCU)
💻 V
📖 第 1 页 / 共 5 页
字号:
endassign ReadTxDataFromFifo_wb = ReadTxDataFromFifo_sync2 & ~ReadTxDataFromFifo_sync3;// End: Generation of the ReadTxDataFromFifo_tck signal and synchronization to the WB_CLK_I*/// 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 | RxAbortLatched;assign StartRxBDRead = RxStatusWrite | RxAbortSync3 & ~RxAbortSync4;// Reading the Rx buffer descriptoralways @ (posedge WB_CLK_I or posedge Reset)begin  if(Reset)    RxBDRead <=#Tp 1'b1;  else  if(StartRxBDRead & ~RxBDReady)    RxBDRead <=#Tp 1'b1;  else  if(RxBDReady)    RxBDRead <=#Tp 1'b0;end// Reading of the next receive buffer descriptor starts after reception status is// written to the previous one.// Latching READY status of the Rx buffer descriptoralways @ (posedge WB_CLK_I or posedge Reset)begin  if(Reset)    RxBDReady <=#Tp 1'b0;  else  if(ShiftEnded | RxAbortSync2 & ~RxAbortSync3)    RxBDReady <=#Tp 1'b0;  else  if(RxEn & RxEn_q & RxBDRead)    RxBDReady <=#Tp ram_do[15]; // RxBDReady is sampled only once at the beginningend// Latching Rx buffer descriptor status// Data is avaliable one cycle after the access is started (at that time signal RxEn is not active)always @ (posedge WB_CLK_I or posedge Reset)begin  if(Reset)    RxStatus <=#Tp 2'h0;  else  if(RxEn & RxEn_q & RxBDRead)    RxStatus <=#Tp ram_do[14:13];end// Reading Rx BD pointerassign StartRxPointerRead = RxBDRead & RxBDReady;// Reading Tx BD Pointeralways @ (posedge WB_CLK_I or posedge Reset)begin  if(Reset)    RxPointerRead <=#Tp 1'b0;  else  if(StartRxPointerRead)    RxPointerRead <=#Tp 1'b1;  else  if(RxEn_q)    RxPointerRead <=#Tp 1'b0;end//Latching Rx buffer pointer from buffer descriptor;always @ (posedge WB_CLK_I or posedge Reset)begin  if(Reset)    RxPointer <=#Tp 32'h0;  else  if(RxEn & RxEn_q & RxPointerRead)    RxPointer <=#Tp {ram_do[31:2], 2'h0};  else  if(MasterWbRX & m_wb_ack_i)      RxPointer <=#Tp RxPointer + 3'h4; // Word access  (always word access. m_wb_sel_o are used for selecting bytes)end//Latching last addresses from buffer descriptor (used as byte-half-word indicator);always @ (posedge WB_CLK_I or posedge Reset)begin  if(Reset)    RxPointerLatched[1:0] <=#Tp 0;  else  if(MasterWbRX & m_wb_ack_i)                 // After first write all m_wb_sel_tmp_rx are active    RxPointerLatched[1:0] <=#Tp 0;  else  if(RxEn & RxEn_q & RxPointerRead)    RxPointerLatched[1:0] <=#Tp ram_do[1:0];endalways @ (RxPointerLatched)begin  case(RxPointerLatched[1:0])  // synopsys parallel_case    2'h0 : m_wb_sel_tmp_rx[3:0] = 4'hf;    2'h1 : m_wb_sel_tmp_rx[3:0] = 4'h7;    2'h2 : m_wb_sel_tmp_rx[3:0] = 4'h3;    2'h3 : m_wb_sel_tmp_rx[3:0] = 4'h1;  endcaseendalways @ (posedge WB_CLK_I or posedge Reset)begin  if(Reset)    RxEn_needed <=#Tp 1'b0;  else  if(~RxBDReady & r_RxEn & WbEn & ~WbEn_q)    RxEn_needed <=#Tp 1'b1;  else  if(RxPointerRead & RxEn & RxEn_q)    RxEn_needed <=#Tp 1'b0;end// Reception status is written back to the buffer descriptor after the end of frame is detected.assign RxStatusWrite = ShiftEnded & RxEn & RxEn_q;reg RxStatusWriteLatched;reg RxStatusWrite_rck;always @ (posedge WB_CLK_I or posedge Reset)begin  if(Reset)    RxStatusWriteLatched <=#Tp 1'b0;  else  if(RxStatusWrite & ~RxStatusWrite_rck)    RxStatusWriteLatched <=#Tp 1'b1;  else  if(RxStatusWrite_rck)    RxStatusWriteLatched <=#Tp 1'b0;endalways @ (posedge MRxClk or posedge Reset)begin  if(Reset)    RxStatusWrite_rck <=#Tp 1'b0;  else  if(RxStatusWriteLatched)    RxStatusWrite_rck <=#Tp 1'b1;  else    RxStatusWrite_rck <=#Tp 1'b0;endreg RxEnableWindow;// Indicating that last byte is being reveivedalways @ (posedge MRxClk or posedge Reset)begin  if(Reset)    LastByteIn <=#Tp 1'b0;  else  if(ShiftWillEnd & (&RxByteCnt) | RxAbort)    LastByteIn <=#Tp 1'b0;  else  if(RxValid & RxBDReady & RxEndFrm & ~(&RxByteCnt) & RxEnableWindow)    LastByteIn <=#Tp 1'b1;endreg ShiftEnded_tck;reg ShiftEndedSync1;reg ShiftEndedSync2;reg ShiftEndedSync3;reg ShiftEndedSync_c1;reg ShiftEndedSync_c2;wire StartShiftWillEnd;//assign StartShiftWillEnd = LastByteIn & (&RxByteCnt) | RxValid & RxEndFrm & (&RxByteCnt) & RxEnableWindow;assign StartShiftWillEnd = LastByteIn  | RxValid & RxEndFrm & (&RxByteCnt) & RxEnableWindow;// Indicating that data reception will endalways @ (posedge MRxClk or posedge Reset)begin  if(Reset)    ShiftWillEnd <=#Tp 1'b0;  else  if(ShiftEnded_tck | RxAbort)    ShiftWillEnd <=#Tp 1'b0;  else  if(StartShiftWillEnd)    ShiftWillEnd <=#Tp 1'b1;end// Receive byte counteralways @ (posedge MRxClk or posedge Reset)begin  if(Reset)    RxByteCnt <=#Tp 2'h0;  else  if(ShiftEnded_tck | RxAbort)    RxByteCnt <=#Tp 2'h0;  else  if(RxValid & RxStartFrm & RxBDReady)    case(RxPointerLatched)  // synopsys parallel_case      2'h0 : RxByteCnt <=#Tp 2'h1;      2'h1 : RxByteCnt <=#Tp 2'h2;      2'h2 : RxByteCnt <=#Tp 2'h3;      2'h3 : RxByteCnt <=#Tp 2'h0;    endcase  else  if(RxValid & RxEnableWindow & RxBDReady | LastByteIn)    RxByteCnt <=#Tp RxByteCnt + 1'b1;end// Indicates how many bytes are valid within the last wordalways @ (posedge MRxClk or posedge Reset)begin  if(Reset)    RxValidBytes <=#Tp 2'h1;  else  if(RxValid & RxStartFrm)    case(RxPointerLatched)  // synopsys parallel_case      2'h0 : RxValidBytes <=#Tp 2'h1;      2'h1 : RxValidBytes <=#Tp 2'h2;      2'h2 : RxValidBytes <=#Tp 2'h3;      2'h3 : RxValidBytes <=#Tp 2'h0;    endcase  else  if(RxValid & ~LastByteIn & ~RxStartFrm & RxEnableWindow)    RxValidBytes <=#Tp RxValidBytes + 1;endalways @ (posedge MRxClk or posedge Reset)begin  if(Reset)    RxDataLatched1       <=#Tp 24'h0;  else  if(RxValid & RxBDReady & ~LastByteIn)    if(RxStartFrm)    begin      case(RxPointerLatched)     // synopsys parallel_case        2'h0:        RxDataLatched1[31:24] <=#Tp RxData;            // Big Endian Byte Ordering        2'h1:        RxDataLatched1[23:16] <=#Tp RxData;        2'h2:        RxDataLatched1[15:8]  <=#Tp RxData;        2'h3:        RxDataLatched1        <=#Tp RxDataLatched1;      endcase    end    else if (RxEnableWindow)    begin      case(RxByteCnt)     // synopsys parallel_case        2'h0:        RxDataLatched1[31:24] <=#Tp RxData;            // Big Endian Byte Ordering        2'h1:        RxDataLatched1[23:16] <=#Tp RxData;        2'h2:        RxDataLatched1[15:8]  <=#Tp RxData;        2'h3:        RxDataLatched1        <=#Tp RxDataLatched1;      endcase    endendwire SetWriteRxDataToFifo;// Assembling data that will be written to the rx_fifoalways @ (posedge MRxClk or posedge Reset)begin  if(Reset)    RxDataLatched2 <=#Tp 32'h0;  else  if(SetWriteRxDataToFifo & ~ShiftWillEnd)    RxDataLatched2 <=#Tp {RxDataLatched1[31:8], RxData};              // Big Endian Byte Ordering  else  if(SetWriteRxDataToFifo & ShiftWillEnd)    case(RxValidBytes)  // synopsys parallel_case//      0 : RxDataLatched2 <=#Tp {RxDataLatched1[31:8],  RxData};       // Big Endian Byte Ordering//      1 : RxDataLatched2 <=#Tp {RxDataLatched1[31:24], 24'h0};//      2 : RxDataLatched2 <=#Tp {RxDataLatched1[31:16], 16'h0};//      3 : RxDataLatched2 <=#Tp {RxDataLatched1[31:8],   8'h0};      0 : RxDataLatched2 <=#Tp {RxDataLatched1[31:8],  RxData};       // Big Endian Byte Ordering      1 : RxDataLatched2 <=#Tp {RxDataLatched1[31:24], 24'h0};      2 : RxDataLatched2 <=#Tp {RxDataLatched1[31:16], 16'h0};      3 : RxDataLatched2 <=#Tp {RxDataLatched1[31:8],   8'h0};    endcaseendreg WriteRxDataToFifoSync1;reg WriteRxDataToFifoSync2;reg WriteRxDataToFifoSync3;// Indicating start of the reception process//assign SetWriteRxDataToFifo = (RxValid & RxBDReady & ~RxStartFrm & RxEnableWindow & (&RxByteCnt)) | (ShiftWillEnd & LastByteIn & (&RxByteCnt));assign SetWriteRxDataToFifo = (RxValid & RxBDReady & ~RxStartFrm & RxEnableWindow & (&RxByteCnt)) | (RxValid & RxBDReady & RxStartFrm & (&RxPointerLatched)) | (ShiftWillEnd & LastByteIn & (&RxByteCnt));/*always @ (posedge MRxClk or posedge Reset)begin  if(Reset)    WriteRxDataToFifo <=#Tp 1'b0;  else  if(SetWriteRxDataToFifo & ~RxAbort)    WriteRxDataToFifo <=#Tp 1'b1;  else  if(WriteRxDataToFifoSync1 | RxAbort)    WriteRxDataToFifo <=#Tp 1'b0;endalways @ (posedge WB_CLK_I or posedge Reset)begin  if(Reset)    WriteRxDataToFifoSync1 <=#Tp 1'b0;  else  if(WriteRxDataToFifo)    WriteRxDataToFifoSync1 <=#Tp 1'b1;  else    WriteRxDataToFifoSync1 <=#Tp 1'b0;endalways @ (posedge WB_CLK_I or posedge Reset)begin  if(Reset)    WriteRxDataToFifoSync2 <=#Tp 1'b0;  else    WriteRxDataToFifoSync2 <=#Tp WriteRxDataToFifoSync1;endwire WriteRxDataToFifo_wb;assign WriteRxDataToFifo_wb = WriteRxDataToFifoSync1 & ~WriteRxDataToFifoSync2;*/always @ (posedge MRxClk or posedge Reset)begin  if(Reset)    WriteRxDataToFifo <=#Tp 1'b0;  else

⌨️ 快捷键说明

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