📄 eth_wishbone.v
字号:
6'b10_00_1_x, 6'b01_00_1_x : begin state <=#Tp 4'h8; MasterWbTX <=#Tp 1'b0; // whatever and no master read or write is needed (ack or err comes finishing previous access) MasterWbRX <=#Tp 1'b0; m_wb_cyc_o <=#Tp 1'b0; m_wb_stb_o <=#Tp 1'b0; IncrTxPointer<=#Tp 1'b0; end 6'b10_00_0_1, 6'b01_00_0_1 : begin state <=#Tp 4'h9; MasterWbTX <=#Tp 1'b0; // Between cyc_cleared request was cleared MasterWbRX <=#Tp 1'b0; m_wb_cyc_o <=#Tp 1'b0; m_wb_stb_o <=#Tp 1'b0; IncrTxPointer<=#Tp 1'b0; end default: // Don't touch begin MasterWbTX <=#Tp MasterWbTX; MasterWbRX <=#Tp MasterWbRX; m_wb_cyc_o <=#Tp m_wb_cyc_o; m_wb_stb_o <=#Tp m_wb_stb_o; m_wb_sel_o <=#Tp m_wb_sel_o; IncrTxPointer<=#Tp IncrTxPointer; end endcase endendwire TxFifoClear;assign TxFifoClear = (TxAbort_wb | TxRetry_wb) & ~TxBDReady;wire [4:0] txfifo_cnt;eth_fifo #(`TX_FIFO_DATA_WIDTH, `TX_FIFO_DEPTH, `TX_FIFO_CNT_WIDTH)tx_fifo ( .data_in(m_wb_dat_i), .data_out(TxData_wb), .clk(WB_CLK_I), .reset(Reset), .write(MasterWbTX & m_wb_ack_i), .read(ReadTxDataFromFifo_wb), .clear(TxFifoClear), .full(TxBufferFull), .almost_full(TxBufferAlmostFull), .almost_empty(TxBufferAlmostEmpty), .empty(TxBufferEmpty), .cnt(txfifo_cnt) );reg StartOccured;reg TxStartFrm_sync1;reg TxStartFrm_sync2;reg TxStartFrm_syncb1;reg TxStartFrm_syncb2;// Start: Generation of the TxStartFrm_wb which is then synchronized to the MTxClkalways @ (posedge WB_CLK_I or posedge Reset)begin if(Reset) TxStartFrm_wb <=#Tp 1'b0; else if(TxBDReady & ~StartOccured & (TxBufferFull | TxLengthEq0)) TxStartFrm_wb <=#Tp 1'b1; else if(TxStartFrm_syncb2) TxStartFrm_wb <=#Tp 1'b0;end// StartOccured: TxStartFrm_wb occurs only ones at the beginning. Then it's blocked.always @ (posedge WB_CLK_I or posedge Reset)begin if(Reset) StartOccured <=#Tp 1'b0; else if(TxStartFrm_wb) StartOccured <=#Tp 1'b1; else if(ResetTxBDReady) StartOccured <=#Tp 1'b0;end// Synchronizing TxStartFrm_wb to MTxClkalways @ (posedge MTxClk or posedge Reset)begin if(Reset) TxStartFrm_sync1 <=#Tp 1'b0; else TxStartFrm_sync1 <=#Tp TxStartFrm_wb;endalways @ (posedge MTxClk or posedge Reset)begin if(Reset) TxStartFrm_sync2 <=#Tp 1'b0; else TxStartFrm_sync2 <=#Tp TxStartFrm_sync1;endalways @ (posedge WB_CLK_I or posedge Reset)begin if(Reset) TxStartFrm_syncb1 <=#Tp 1'b0; else TxStartFrm_syncb1 <=#Tp TxStartFrm_sync2;endalways @ (posedge WB_CLK_I or posedge Reset)begin if(Reset) TxStartFrm_syncb2 <=#Tp 1'b0; else TxStartFrm_syncb2 <=#Tp TxStartFrm_syncb1;endalways @ (posedge MTxClk or posedge Reset)begin if(Reset) TxStartFrm <=#Tp 1'b0; else if(TxStartFrm_sync2) TxStartFrm <=#Tp 1'b1; else if(TxUsedData_q | ~TxStartFrm_sync2 & (TxRetry | TxAbort)) TxStartFrm <=#Tp 1'b0;end// End: Generation of the TxStartFrm_wb which is then synchronized to the MTxClk// TxEndFrm_wb: indicator of the end of framealways @ (posedge WB_CLK_I or posedge Reset)begin if(Reset) TxEndFrm_wb <=#Tp 1'b0; else if(TxLengthLt4 & TxBufferAlmostEmpty & TxUsedData) TxEndFrm_wb <=#Tp 1'b1; else if(TxRetryPulse | TxDonePulse | TxAbortPulse) TxEndFrm_wb <=#Tp 1'b0;end// Marks which bytes are valid within the word.assign TxValidBytes = TxLengthLt4 ? TxLength[1:0] : 2'b0;reg LatchValidBytes;reg LatchValidBytes_q;always @ (posedge WB_CLK_I or posedge Reset)begin if(Reset) LatchValidBytes <=#Tp 1'b0; else if(TxLengthLt4 & TxBDReady) LatchValidBytes <=#Tp 1'b1; else LatchValidBytes <=#Tp 1'b0;endalways @ (posedge WB_CLK_I or posedge Reset)begin if(Reset) LatchValidBytes_q <=#Tp 1'b0; else LatchValidBytes_q <=#Tp LatchValidBytes;end// Latching valid bytesalways @ (posedge WB_CLK_I or posedge Reset)begin if(Reset) TxValidBytesLatched <=#Tp 2'h0; else if(LatchValidBytes & ~LatchValidBytes_q) TxValidBytesLatched <=#Tp TxValidBytes; else if(TxRetryPulse | TxDonePulse | TxAbortPulse) TxValidBytesLatched <=#Tp 2'h0;endassign TxIRQEn = TxStatus[14];assign WrapTxStatusBit = TxStatus[13];assign PerPacketPad = TxStatus[12];assign PerPacketCrcEn = TxStatus[11];assign RxIRQEn = RxStatus[14];assign WrapRxStatusBit = RxStatus[13];// Temporary Tx and Rx buffer descriptor address assign TempTxBDAddress[7:0] = {8{ TxStatusWrite & ~WrapTxStatusBit}} & (TxBDAddress + 2'h2) ; // Tx BD increment or wrap (last BD)assign TempRxBDAddress[7:0] = {8{ WrapRxStatusBit}} & (r_TxBDNum<<1) | // Using first Rx BD {8{~WrapRxStatusBit}} & (RxBDAddress + 2'h2) ; // Using next Rx BD (incremenrement address)// Latching Tx buffer descriptor addressalways @ (posedge WB_CLK_I or posedge Reset)begin if(Reset) TxBDAddress <=#Tp 8'h0; else if(TxStatusWrite) TxBDAddress <=#Tp TempTxBDAddress;end// Latching Rx buffer descriptor addressalways @ (posedge WB_CLK_I or posedge Reset)begin if(Reset) RxBDAddress <=#Tp `ETH_TX_BD_NUM_DEF<<1; else if(TX_BD_NUM_Wr) // When r_TxBDNum is updated, RxBDAddress is also RxBDAddress <=#Tp WB_DAT_I[7:0]<<1; else if(RxStatusWrite) RxBDAddress <=#Tp TempRxBDAddress;endwire [8:0] TxStatusInLatched = {TxUnderRun, RetryCntLatched[3:0], RetryLimit, LateCollLatched, DeferLatched, CarrierSenseLost};assign RxBDDataIn = {LatchedRxLength, 1'b0, RxStatus, 6'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;assign TxRetryPulse_q = TxRetry_wb_q & ~TxRetry_wb_q2;assign TxDonePulse_q = TxDone_wb_q & ~TxDone_wb_q2;assign TxAbortPulse_q = TxAbort_wb_q & ~TxAbort_wb_q2;// 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; TxDone_wb_q2 <=#Tp 1'b0; TxAbort_wb_q2 <=#Tp 1'b0; TxRetry_wb_q2 <=#Tp 1'b0; end else begin TxDone_wb_q <=#Tp TxDone_wb; TxAbort_wb_q <=#Tp TxAbort_wb; TxRetry_wb_q <=#Tp TxRetry_wb; TxDone_wb_q2 <=#Tp TxDone_wb_q; TxAbort_wb_q2 <=#Tp TxAbort_wb_q; TxRetry_wb_q2 <=#Tp TxRetry_wb_q; endend// Sinchronizing and evaluating tx data//assign SetGotData = (TxStartFrm_wb | NewTxDataAvaliable_wb & ~TxAbort_wb & ~TxRetry_wb) & ~WB_CLK_I;assign SetGotData = (TxStartFrm_wb); // igor namesto zgornje// Evaluating data. If abort or retry occured meanwhile than data is ignored.//assign GotDataEvaluate = GotDataSync3 & ~GotData & (~TxRetry & ~TxAbort | (TxRetry | TxAbort) & (TxStartFrm));assign GotDataEvaluate = (~TxRetry & ~TxAbort | (TxRetry | TxAbort) & (TxStartFrm));// 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(TxPointerLatched) // 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 & TxPointerLatched==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;end// Tx under runalways @ (posedge MTxClk or posedge Reset)begin if(Reset) TxUnderRun <=#Tp 1'b0; else if(TxUnderRun_wb) TxUnderRun <=#Tp 1'b1; else if(BlockingTxStatusWrite) TxUnderRun <=#Tp 1'b0;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(TxPointerLatched) // 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;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_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 WB_CLK_I or posedge Reset)begin if(Reset) ReadTxDataFromFifo_sync3 <=#Tp 1'b0; else ReadTxDataFromFifo_sync3 <=#Tp ReadTxDataFromFifo_sync2;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -