📄 eth_wishbone.v
字号:
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 + -