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

📄 eth_wishbone.v

📁 这是一个很好的Verilog 编写的8位RISC CPU源码(可做为MCU)
💻 V
📖 第 1 页 / 共 5 页
字号:
        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 + -