📄 eth_top.v
字号:
input mtx_clk_pad_i; // Transmit clock (from PHY)output [3:0] mtxd_pad_o; // Transmit nibble (to PHY)output mtxen_pad_o; // Transmit enable (to PHY)output mtxerr_pad_o; // Transmit error (to PHY)// Rxinput mrx_clk_pad_i; // Receive clock (from PHY)input [3:0] mrxd_pad_i; // Receive nibble (from PHY)input mrxdv_pad_i; // Receive data valid (from PHY)input mrxerr_pad_i; // Receive data error (from PHY)// Common Tx and Rxinput mcoll_pad_i; // Collision (from PHY)input mcrs_pad_i; // Carrier sense (from PHY)// MII Management interfaceinput md_pad_i; // MII data input (from I/O cell)output mdc_pad_o; // MII Management data clock (to PHY)output md_pad_o; // MII data output (to I/O cell)output md_padoe_o; // MII data output enable (to I/O cell)output int_o; // Interrupt output// Bist`ifdef ETH_BISTinput mbist_si_i; // bist scan serial inoutput mbist_so_o; // bist scan serial outinput [`ETH_MBIST_CTRL_WIDTH - 1:0] mbist_ctrl_i; // bist chain shift control`endifwire [7:0] r_ClkDiv;wire r_MiiNoPre;wire [15:0] r_CtrlData;wire [4:0] r_FIAD;wire [4:0] r_RGAD;wire r_WCtrlData;wire r_RStat;wire r_ScanStat;wire NValid_stat;wire Busy_stat;wire LinkFail;wire [15:0] Prsd; // Read Status Data (data read from the PHY)wire WCtrlDataStart;wire RStatStart;wire UpdateMIIRX_DATAReg;wire TxStartFrm;wire TxEndFrm;wire TxUsedData;wire [7:0] TxData;wire TxRetry;wire TxAbort;wire TxUnderRun;wire TxDone;reg WillSendControlFrame_sync1;reg WillSendControlFrame_sync2;reg WillSendControlFrame_sync3;reg RstTxPauseRq;reg TxPauseRq_sync1;reg TxPauseRq_sync2;reg TxPauseRq_sync3;reg TPauseRq;// Connecting Miim moduleeth_miim miim1( .Clk(wb_clk_i), .Reset(wb_rst_i), .Divider(r_ClkDiv), .NoPre(r_MiiNoPre), .CtrlData(r_CtrlData), .Rgad(r_RGAD), .Fiad(r_FIAD), .WCtrlData(r_WCtrlData), .RStat(r_RStat), .ScanStat(r_ScanStat), .Mdi(md_pad_i), .Mdo(md_pad_o), .MdoEn(md_padoe_o), .Mdc(mdc_pad_o), .Busy(Busy_stat), .Prsd(Prsd), .LinkFail(LinkFail), .Nvalid(NValid_stat), .WCtrlDataStart(WCtrlDataStart), .RStatStart(RStatStart), .UpdateMIIRX_DATAReg(UpdateMIIRX_DATAReg));wire [3:0] RegCs; // Connected to registerswire [31:0] RegDataOut; // Multiplexed to wb_dat_owire r_RecSmall; // Receive small frameswire r_LoopBck; // Loopbackwire r_TxEn; // Tx Enablewire r_RxEn; // Rx Enablewire MRxDV_Lb; // Muxed MII receive data validwire MRxErr_Lb; // Muxed MII Receive Errorwire [3:0] MRxD_Lb; // Muxed MII Receive Datawire Transmitting; // Indication that TxEthMAC is transmittingwire r_HugEn; // Huge packet enablewire r_DlyCrcEn; // Delayed CRC enabledwire [15:0] r_MaxFL; // Maximum frame lengthwire [15:0] r_MinFL; // Minimum frame lengthwire ShortFrame;wire DribbleNibble; // Extra nibble receivedwire ReceivedPacketTooBig; // Received packet is too bigwire [47:0] r_MAC; // MAC addresswire LoadRxStatus; // Rx status was loadedwire [31:0] r_HASH0; // HASH table, lower 4 byteswire [31:0] r_HASH1; // HASH table, upper 4 byteswire [7:0] r_TxBDNum; // Receive buffer descriptor numberwire [6:0] r_IPGT; // wire [6:0] r_IPGR1; // wire [6:0] r_IPGR2; // wire [5:0] r_CollValid; // wire [15:0] r_TxPauseTV; // Transmit PAUSE valuewire r_TxPauseRq; // Transmit PAUSE requestwire [3:0] r_MaxRet; //wire r_NoBckof; // wire r_ExDfrEn; // wire r_TxFlow; // Tx flow control enablewire r_IFG; // Minimum interframe gap for incoming packetswire TxB_IRQ; // Interrupt Tx Bufferwire TxE_IRQ; // Interrupt Tx Errorwire RxB_IRQ; // Interrupt Rx Bufferwire RxE_IRQ; // Interrupt Rx Errorwire Busy_IRQ; // Interrupt Busy (lack of buffers)//wire DWord;wire ByteSelected;wire BDAck;wire [31:0] BD_WB_DAT_O; // wb_dat_o that comes from the Wishbone module (for buffer descriptors read/write)wire [3:0] BDCs; // Buffer descriptor CSwire CsMiss; // When access to the address between 0x800 and 0xfff occurs, acknowledge is set // but data is not valid.wire r_Pad;wire r_CrcEn;wire r_FullD;wire r_Pro;wire r_Bro;wire r_NoPre;wire r_RxFlow;wire r_PassAll;wire TxCtrlEndFrm;wire StartTxDone;wire SetPauseTimer;wire TxUsedDataIn;wire TxDoneIn;wire TxAbortIn;wire PerPacketPad;wire PadOut;wire PerPacketCrcEn;wire CrcEnOut;wire TxStartFrmOut;wire TxEndFrmOut;wire ReceivedPauseFrm;wire ControlFrmAddressOK;wire RxStatusWriteLatched_sync2;wire LateCollision;wire DeferIndication;wire LateCollLatched;wire DeferLatched;wire RstDeferLatched;wire CarrierSenseLost;wire temp_wb_ack_o;wire [31:0] temp_wb_dat_o;wire temp_wb_err_o;`ifdef ETH_REGISTERED_OUTPUTS reg temp_wb_ack_o_reg; reg [31:0] temp_wb_dat_o_reg; reg temp_wb_err_o_reg;`endif//assign DWord = &wb_sel_i;assign ByteSelected = |wb_sel_i;assign RegCs[3] = wb_stb_i & wb_cyc_i & ByteSelected & ~wb_adr_i[11] & ~wb_adr_i[10] & wb_sel_i[3]; // 0x0 - 0x3FFassign RegCs[2] = wb_stb_i & wb_cyc_i & ByteSelected & ~wb_adr_i[11] & ~wb_adr_i[10] & wb_sel_i[2]; // 0x0 - 0x3FFassign RegCs[1] = wb_stb_i & wb_cyc_i & ByteSelected & ~wb_adr_i[11] & ~wb_adr_i[10] & wb_sel_i[1]; // 0x0 - 0x3FFassign RegCs[0] = wb_stb_i & wb_cyc_i & ByteSelected & ~wb_adr_i[11] & ~wb_adr_i[10] & wb_sel_i[0]; // 0x0 - 0x3FFassign BDCs[3] = wb_stb_i & wb_cyc_i & ByteSelected & ~wb_adr_i[11] & wb_adr_i[10] & wb_sel_i[3]; // 0x400 - 0x7FFassign BDCs[2] = wb_stb_i & wb_cyc_i & ByteSelected & ~wb_adr_i[11] & wb_adr_i[10] & wb_sel_i[2]; // 0x400 - 0x7FFassign BDCs[1] = wb_stb_i & wb_cyc_i & ByteSelected & ~wb_adr_i[11] & wb_adr_i[10] & wb_sel_i[1]; // 0x400 - 0x7FFassign BDCs[0] = wb_stb_i & wb_cyc_i & ByteSelected & ~wb_adr_i[11] & wb_adr_i[10] & wb_sel_i[0]; // 0x400 - 0x7FFassign CsMiss = wb_stb_i & wb_cyc_i & ByteSelected & wb_adr_i[11]; // 0x800 - 0xfFFassign temp_wb_dat_o = ((|RegCs) & ~wb_we_i)? RegDataOut : BD_WB_DAT_O;assign temp_wb_err_o = wb_stb_i & wb_cyc_i & (~ByteSelected | CsMiss);`ifdef ETH_REGISTERED_OUTPUTS assign wb_ack_o = temp_wb_ack_o_reg; assign wb_dat_o[31:0] = temp_wb_dat_o_reg; assign wb_err_o = temp_wb_err_o_reg;`else assign wb_ack_o = temp_wb_ack_o; assign wb_dat_o[31:0] = temp_wb_dat_o; assign wb_err_o = temp_wb_err_o;`endif`ifdef ETH_AVALON_BUS // As Avalon has no corresponding "error" signal, I (erroneously) will // send an ack to Avalon, even when accessing undefined memory. This // is a grey area in Avalon vs. Wishbone specs: My understanding // is that Avalon expects all memory addressable by the addr bus feeding // a slave to be, at the very minimum, readable. assign temp_wb_ack_o = (|RegCs) | BDAck | CsMiss;`else // WISHBONE assign temp_wb_ack_o = (|RegCs) | BDAck;`endif`ifdef ETH_REGISTERED_OUTPUTS always @ (posedge wb_clk_i or posedge wb_rst_i) begin if(wb_rst_i) begin temp_wb_ack_o_reg <=#Tp 1'b0; temp_wb_dat_o_reg <=#Tp 32'h0; temp_wb_err_o_reg <=#Tp 1'b0; end else begin temp_wb_ack_o_reg <=#Tp temp_wb_ack_o & ~temp_wb_ack_o_reg; temp_wb_dat_o_reg <=#Tp temp_wb_dat_o; temp_wb_err_o_reg <=#Tp temp_wb_err_o & ~temp_wb_err_o_reg; end end`endif// Connecting Ethernet registerseth_registers ethreg1( .DataIn(wb_dat_i), .Address(wb_adr_i[9:2]), .Rw(wb_we_i), .Cs(RegCs), .Clk(wb_clk_i), .Reset(wb_rst_i), .DataOut(RegDataOut), .r_RecSmall(r_RecSmall), .r_Pad(r_Pad), .r_HugEn(r_HugEn), .r_CrcEn(r_CrcEn), .r_DlyCrcEn(r_DlyCrcEn), .r_FullD(r_FullD), .r_ExDfrEn(r_ExDfrEn), .r_NoBckof(r_NoBckof), .r_LoopBck(r_LoopBck), .r_IFG(r_IFG), .r_Pro(r_Pro), .r_Iam(), .r_Bro(r_Bro), .r_NoPre(r_NoPre), .r_TxEn(r_TxEn), .r_RxEn(r_RxEn), .Busy_IRQ(Busy_IRQ), .RxE_IRQ(RxE_IRQ), .RxB_IRQ(RxB_IRQ), .TxE_IRQ(TxE_IRQ), .TxB_IRQ(TxB_IRQ), .r_IPGT(r_IPGT), .r_IPGR1(r_IPGR1), .r_IPGR2(r_IPGR2), .r_MinFL(r_MinFL), .r_MaxFL(r_MaxFL), .r_MaxRet(r_MaxRet), .r_CollValid(r_CollValid), .r_TxFlow(r_TxFlow), .r_RxFlow(r_RxFlow), .r_PassAll(r_PassAll), .r_MiiNoPre(r_MiiNoPre), .r_ClkDiv(r_ClkDiv), .r_WCtrlData(r_WCtrlData), .r_RStat(r_RStat), .r_ScanStat(r_ScanStat), .r_RGAD(r_RGAD), .r_FIAD(r_FIAD), .r_CtrlData(r_CtrlData), .NValid_stat(NValid_stat), .Busy_stat(Busy_stat), .LinkFail(LinkFail), .r_MAC(r_MAC), .WCtrlDataStart(WCtrlDataStart), .RStatStart(RStatStart), .UpdateMIIRX_DATAReg(UpdateMIIRX_DATAReg), .Prsd(Prsd), .r_TxBDNum(r_TxBDNum), .int_o(int_o), .r_HASH0(r_HASH0), .r_HASH1(r_HASH1), .r_TxPauseRq(r_TxPauseRq), .r_TxPauseTV(r_TxPauseTV), .RstTxPauseRq(RstTxPauseRq), .TxCtrlEndFrm(TxCtrlEndFrm), .StartTxDone(StartTxDone), .TxClk(mtx_clk_pad_i), .RxClk(mrx_clk_pad_i), .SetPauseTimer(SetPauseTimer) );wire [7:0] RxData;wire RxValid;wire RxStartFrm;wire RxEndFrm;wire RxAbort;wire WillTransmit; // Will transmit (to RxEthMAC)wire ResetCollision; // Reset Collision (for synchronizing collision)wire [7:0] TxDataOut; // Transmit Packet Data (to TxEthMAC)wire WillSendControlFrame;wire ReceiveEnd;wire ReceivedPacketGood;wire ReceivedLengthOK;wire InvalidSymbol;wire LatchedCrcError;wire RxLateCollision;wire [3:0] RetryCntLatched; wire [3:0] RetryCnt; wire StartTxAbort; wire MaxCollisionOccured; wire RetryLimit; wire StatePreamble; wire [1:0] StateData; // Connecting MACControleth_maccontrol maccontrol1( .MTxClk(mtx_clk_pad_i), .TPauseRq(TPauseRq), .TxPauseTV(r_TxPauseTV), .TxDataIn(TxData), .TxStartFrmIn(TxStartFrm), .TxEndFrmIn(TxEndFrm), .TxUsedDataIn(TxUsedDataIn), .TxDoneIn(TxDoneIn), .TxAbortIn(TxAbortIn), .MRxClk(mrx_clk_pad_i), .RxData(RxData), .RxValid(RxValid), .RxStartFrm(RxStartFrm), .RxEndFrm(RxEndFrm), .ReceiveEnd(ReceiveEnd), .ReceivedPacketGood(ReceivedPacketGood), .TxFlow(r_TxFlow), .RxFlow(r_RxFlow), .DlyCrcEn(r_DlyCrcEn), .MAC(r_MAC), .PadIn(r_Pad | PerPacketPad), .PadOut(PadOut), .CrcEnIn(r_CrcEn | PerPacketCrcEn), .CrcEnOut(CrcEnOut), .TxReset(wb_rst_i), .RxReset(wb_rst_i), .ReceivedLengthOK(ReceivedLengthOK), .TxDataOut(TxDataOut), .TxStartFrmOut(TxStartFrmOut), .TxEndFrmOut(TxEndFrmOut), .TxUsedDataOut(TxUsedData), .TxDoneOut(TxDone), .TxAbortOut(TxAbort), .WillSendControlFrame(WillSendControlFrame), .TxCtrlEndFrm(TxCtrlEndFrm), .ReceivedPauseFrm(ReceivedPauseFrm), .ControlFrmAddressOK(ControlFrmAddressOK), .SetPauseTimer(SetPauseTimer), .RxStatusWriteLatched_sync2(RxStatusWriteLatched_sync2), .r_PassAll(r_PassAll));wire TxCarrierSense; // Synchronized CarrierSense (to Tx clock)wire Collision; // Synchronized Collisionreg CarrierSense_Tx1;reg CarrierSense_Tx2;reg Collision_Tx1;reg Collision_Tx2;reg RxEnSync; // Synchronized Receive Enablereg WillTransmit_q;reg WillTransmit_q2;// Muxed MII receive data valid
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -