Line 39... |
Line 39... |
//////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////
|
//
|
//
|
// CVS Revision History
|
// CVS Revision History
|
//
|
//
|
// $Log: not supported by cvs2svn $
|
// $Log: not supported by cvs2svn $
|
|
// Revision 1.11 2002/02/15 17:07:39 mohor
|
|
// Status was not written correctly when frames were discarted because of
|
|
// address mismatch.
|
|
//
|
// Revision 1.10 2002/02/15 12:17:39 mohor
|
// Revision 1.10 2002/02/15 12:17:39 mohor
|
// RxStartFrm cleared when abort or retry comes.
|
// RxStartFrm cleared when abort or retry comes.
|
//
|
//
|
// Revision 1.9 2002/02/15 11:59:10 mohor
|
// Revision 1.9 2002/02/15 11:59:10 mohor
|
// Changes that were lost when updating from 1.5 to 1.8 fixed.
|
// Changes that were lost when updating from 1.5 to 1.8 fixed.
|
Line 76... |
Line 80... |
//
|
//
|
//
|
//
|
//
|
//
|
//
|
//
|
|
|
// igor !!!
|
// Build pause frame
|
// Napravi, pause frame
|
// Check GotData and evaluate data (abort or something like that comes before StartFrm)
|
|
// m_wb_err_i should start status underrun or uverrun
|
// Poskusi spremeniti vse signale na wb strani da bodo imeli enake koncnice (npr _wb),
|
// r_RecSmall not used
|
// vsi na MTxClk strani pa _txclk
|
|
// Evaluiraj dato da pre start framom ni prisel abort ali kaj podobnega (kot je bilo v GotData, ki ga zbrisi)
|
|
|
|
// Naj m_wb_err_i vzge status underrun ali uverrun
|
|
|
|
`include "eth_defines.v"
|
`include "eth_defines.v"
|
`include "timescale.v"
|
`include "timescale.v"
|
|
|
|
|
Line 96... |
Line 96... |
|
|
// WISHBONE common
|
// WISHBONE common
|
WB_CLK_I, WB_DAT_I, WB_DAT_O,
|
WB_CLK_I, WB_DAT_I, WB_DAT_O,
|
|
|
// WISHBONE slave
|
// WISHBONE slave
|
WB_ADR_I, WB_SEL_I, WB_WE_I, WB_ACK_O,
|
WB_ADR_I, WB_WE_I, WB_ACK_O,
|
BDCs,
|
BDCs,
|
|
|
Reset,
|
Reset,
|
|
|
// WISHBONE master
|
// WISHBONE master
|
Line 115... |
Line 115... |
|
|
//RX
|
//RX
|
MRxClk, RxData, RxValid, RxStartFrm, RxEndFrm, RxAbort,
|
MRxClk, RxData, RxValid, RxStartFrm, RxEndFrm, RxAbort,
|
|
|
// Register
|
// Register
|
r_TxEn, r_RxEn, r_TxBDNum, r_DmaEn, TX_BD_NUM_Wr, r_RecSmall,
|
r_TxEn, r_RxEn, r_TxBDNum, TX_BD_NUM_Wr, r_RecSmall,
|
|
|
WillSendControlFrame, TxCtrlEndFrm, // igor !!! WillSendControlFrame gre najbrz ven
|
WillSendControlFrame, TxCtrlEndFrm, // igor !!! WillSendControlFrame gre najbrz ven
|
|
|
// Interrupts
|
// Interrupts
|
TxB_IRQ, TxE_IRQ, RxB_IRQ, RxF_IRQ, Busy_IRQ,
|
TxB_IRQ, TxE_IRQ, RxB_IRQ, RxE_IRQ, Busy_IRQ, TxC_IRQ, RxC_IRQ,
|
|
|
// Rx Status
|
// Rx Status
|
InvalidSymbol, LatchedCrcError, RxLateCollision, ShortFrame, DribbleNibble,
|
InvalidSymbol, LatchedCrcError, RxLateCollision, ShortFrame, DribbleNibble,
|
ReceivedPacketTooBig, RxLength, LoadRxStatus,
|
ReceivedPacketTooBig, RxLength, LoadRxStatus, ReceivedPacketGood,
|
|
|
// Tx Status
|
// Tx Status
|
RetryCntLatched, RetryLimit, LateCollLatched, DeferLatched, CarrierSenseLost
|
RetryCntLatched, RetryLimit, LateCollLatched, DeferLatched, CarrierSenseLost
|
|
|
);
|
);
|
Line 141... |
Line 141... |
input [31:0] WB_DAT_I; // WISHBONE data input
|
input [31:0] WB_DAT_I; // WISHBONE data input
|
output [31:0] WB_DAT_O; // WISHBONE data output
|
output [31:0] WB_DAT_O; // WISHBONE data output
|
|
|
// WISHBONE slave
|
// WISHBONE slave
|
input [9:2] WB_ADR_I; // WISHBONE address input
|
input [9:2] WB_ADR_I; // WISHBONE address input
|
input [3:0] WB_SEL_I; // WISHBONE byte select input
|
|
input WB_WE_I; // WISHBONE write enable input
|
input WB_WE_I; // WISHBONE write enable input
|
input BDCs; // Buffer descriptors are selected
|
input BDCs; // Buffer descriptors are selected
|
output WB_ACK_O; // WISHBONE acknowledge output
|
output WB_ACK_O; // WISHBONE acknowledge output
|
|
|
// WISHBONE master
|
// WISHBONE master
|
Line 168... |
Line 167... |
input ShortFrame; // Frame shorter then the minimum size (r_MinFL) was received while small packets are enabled (r_RecSmall)
|
input ShortFrame; // Frame shorter then the minimum size (r_MinFL) was received while small packets are enabled (r_RecSmall)
|
input DribbleNibble; // Extra nibble received
|
input DribbleNibble; // Extra nibble received
|
input ReceivedPacketTooBig;// Received packet is bigger than r_MaxFL
|
input ReceivedPacketTooBig;// Received packet is bigger than r_MaxFL
|
input [15:0] RxLength; // Length of the incoming frame
|
input [15:0] RxLength; // Length of the incoming frame
|
input LoadRxStatus; // Rx status was loaded
|
input LoadRxStatus; // Rx status was loaded
|
|
input ReceivedPacketGood;// Received packet's length and CRC are good
|
|
|
// Tx Status signals
|
// Tx Status signals
|
input [3:0] RetryCntLatched; // Latched Retry Counter
|
input [3:0] RetryCntLatched; // Latched Retry Counter
|
input RetryLimit; // Retry limit reached (Retry Max value + 1 attempts were made)
|
input RetryLimit; // Retry limit reached (Retry Max value + 1 attempts were made)
|
input LateCollLatched; // Late collision occured
|
input LateCollLatched; // Late collision occured
|
Line 205... |
Line 205... |
|
|
//Register
|
//Register
|
input r_TxEn; // Transmit enable
|
input r_TxEn; // Transmit enable
|
input r_RxEn; // Receive enable
|
input r_RxEn; // Receive enable
|
input [7:0] r_TxBDNum; // Receive buffer descriptor number
|
input [7:0] r_TxBDNum; // Receive buffer descriptor number
|
input r_DmaEn; // DMA enable
|
|
input TX_BD_NUM_Wr; // RxBDNumber written
|
input TX_BD_NUM_Wr; // RxBDNumber written
|
input r_RecSmall; // Receive small frames igor !!! tega uporabi
|
input r_RecSmall; // Receive small frames igor !!! tega uporabi
|
|
|
// Interrupts
|
// Interrupts
|
output TxB_IRQ;
|
output TxB_IRQ;
|
output TxE_IRQ;
|
output TxE_IRQ;
|
output RxB_IRQ;
|
output RxB_IRQ;
|
output RxF_IRQ;
|
output RxE_IRQ;
|
output Busy_IRQ;
|
output Busy_IRQ;
|
|
output TxC_IRQ;
|
|
output RxC_IRQ;
|
|
|
|
|
|
reg TxB_IRQ;
|
|
reg TxE_IRQ;
|
|
reg RxB_IRQ;
|
|
reg RxE_IRQ;
|
|
|
|
|
reg TxStartFrm;
|
reg TxStartFrm;
|
reg TxEndFrm;
|
reg TxEndFrm;
|
reg [7:0] TxData;
|
reg [7:0] TxData;
|
|
|
Line 302... |
Line 310... |
wire StartTxBDRead;
|
wire StartTxBDRead;
|
|
|
wire TxIRQEn;
|
wire TxIRQEn;
|
wire WrapTxStatusBit;
|
wire WrapTxStatusBit;
|
|
|
|
wire RxIRQEn;
|
wire WrapRxStatusBit;
|
wire WrapRxStatusBit;
|
|
|
wire [1:0] TxValidBytes;
|
wire [1:0] TxValidBytes;
|
|
|
wire [7:0] TempTxBDAddress;
|
wire [7:0] TempTxBDAddress;
|
Line 405... |
Line 414... |
WbEn <=#Tp 1'b1;
|
WbEn <=#Tp 1'b1;
|
RxEn <=#Tp 1'b0;
|
RxEn <=#Tp 1'b0;
|
TxEn <=#Tp 1'b0;
|
TxEn <=#Tp 1'b0;
|
ram_addr <=#Tp 8'h0;
|
ram_addr <=#Tp 8'h0;
|
ram_di <=#Tp 32'h0;
|
ram_di <=#Tp 32'h0;
|
|
BDRead <=#Tp 1'b0;
|
|
BDWrite <=#Tp 1'b0;
|
end
|
end
|
else
|
else
|
begin
|
begin
|
// Switching between three stages depends on enable signals
|
// Switching between three stages depends on enable signals
|
casex ({WbEn_q, RxEn_q, TxEn_q, RxEn_needed, TxEn_needed}) // synopsys parallel_case
|
casex ({WbEn_q, RxEn_q, TxEn_q, RxEn_needed, TxEn_needed}) // synopsys parallel_case
|
Line 960... |
Line 971... |
|
|
assign TxIRQEn = TxStatus[14];
|
assign TxIRQEn = TxStatus[14];
|
assign WrapTxStatusBit = TxStatus[13];
|
assign WrapTxStatusBit = TxStatus[13];
|
assign PerPacketPad = TxStatus[12];
|
assign PerPacketPad = TxStatus[12];
|
assign PerPacketCrcEn = TxStatus[11];
|
assign PerPacketCrcEn = TxStatus[11];
|
//assign TxPauseRq = TxStatus[9]; // already used Ta gre ven, ker bo stvar izvedena preko registrov
|
|
|
|
|
|
|
assign RxIRQEn = RxStatus[14];
|
assign WrapRxStatusBit = RxStatus[13];
|
assign WrapRxStatusBit = RxStatus[13];
|
|
|
|
|
// Temporary Tx and Rx buffer descriptor address
|
// 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 TempTxBDAddress[7:0] = {8{ TxStatusWrite & ~WrapTxStatusBit}} & (TxBDAddress + 2'h2) ; // Tx BD increment or wrap (last BD)
|
Line 989... |
Line 1000... |
always @ (posedge WB_CLK_I or posedge Reset)
|
always @ (posedge WB_CLK_I or posedge Reset)
|
begin
|
begin
|
if(Reset)
|
if(Reset)
|
RxBDAddress <=#Tp 8'h0;
|
RxBDAddress <=#Tp 8'h0;
|
else
|
else
|
if(TX_BD_NUM_Wr) // When r_TxBDNum is updated, RxBDAddress is also igor !!! ta del bi se lahko popravil
|
if(TX_BD_NUM_Wr) // When r_TxBDNum is updated, RxBDAddress is also
|
RxBDAddress <=#Tp WB_DAT_I[7:0];
|
RxBDAddress <=#Tp WB_DAT_I[7:0];
|
else
|
else
|
if(RxStatusWrite)
|
if(RxStatusWrite)
|
RxBDAddress <=#Tp TempRxBDAddress;
|
RxBDAddress <=#Tp TempRxBDAddress;
|
end
|
end
|
Line 1691... |
Line 1702... |
if(RxStartFrm)
|
if(RxStartFrm)
|
RxAbortLatched <=#Tp 1'b0;
|
RxAbortLatched <=#Tp 1'b0;
|
end
|
end
|
|
|
|
|
|
|
|
|
|
|
// Interrupts
|
|
assign TxB_IRQ = 1'b0;
|
|
assign TxE_IRQ = 1'b0;
|
|
assign RxB_IRQ = 1'b0;
|
|
assign RxF_IRQ = 1'b0;
|
|
assign Busy_IRQ = 1'b0;
|
|
|
|
|
|
|
|
reg LoadStatusBlocked;
|
reg LoadStatusBlocked;
|
|
|
always @ (posedge MRxClk or posedge Reset)
|
always @ (posedge MRxClk or posedge Reset)
|
begin
|
begin
|
if(Reset)
|
if(Reset)
|
Line 1754... |
Line 1753... |
if(RxBufferFull & WriteRxDataToFifo_wb)
|
if(RxBufferFull & WriteRxDataToFifo_wb)
|
RxOverrun <=#Tp 1'b1;
|
RxOverrun <=#Tp 1'b1;
|
end
|
end
|
|
|
|
|
|
|
|
wire TxError;
|
|
assign TxError = TxUnderRun | RetryLimit | LateCollLatched | CarrierSenseLost;
|
|
|
|
wire RxError;
|
|
assign RxError = |RxStatusInLatched[6:0];
|
|
|
|
// Tx Done Interrupt
|
|
always @ (posedge WB_CLK_I or posedge Reset)
|
|
begin
|
|
if(Reset)
|
|
TxB_IRQ <=#Tp 1'b0;
|
|
else
|
|
if(TxStatusWrite & TxIRQEn)
|
|
TxB_IRQ <=#Tp ~TxError;
|
|
else
|
|
TxB_IRQ <=#Tp 1'b0;
|
|
end
|
|
|
|
|
|
// Tx Error Interrupt
|
|
always @ (posedge WB_CLK_I or posedge Reset)
|
|
begin
|
|
if(Reset)
|
|
TxE_IRQ <=#Tp 1'b0;
|
|
else
|
|
if(TxStatusWrite & TxIRQEn)
|
|
TxE_IRQ <=#Tp TxError;
|
|
else
|
|
TxE_IRQ <=#Tp 1'b0;
|
|
end
|
|
|
|
|
|
// Rx Done Interrupt
|
|
always @ (posedge WB_CLK_I or posedge Reset)
|
|
begin
|
|
if(Reset)
|
|
RxB_IRQ <=#Tp 1'b0;
|
|
else
|
|
if(RxStatusWrite & RxIRQEn)
|
|
RxB_IRQ <=#Tp ReceivedPacketGood;
|
|
else
|
|
RxB_IRQ <=#Tp 1'b0;
|
|
end
|
|
|
|
|
|
// Rx Error Interrupt
|
|
always @ (posedge WB_CLK_I or posedge Reset)
|
|
begin
|
|
if(Reset)
|
|
RxE_IRQ <=#Tp 1'b0;
|
|
else
|
|
if(RxStatusWrite & RxIRQEn)
|
|
RxE_IRQ <=#Tp RxError;
|
|
else
|
|
RxE_IRQ <=#Tp 1'b0;
|
|
end
|
|
|
|
|
|
assign RxC_IRQ = 1'b0;
|
|
assign TxC_IRQ = 1'b0;
|
|
assign Busy_IRQ = 1'b0;
|
|
|
|
|
|
|
|
|
|
|
// TX
|
// TX
|
// bit 15 ready
|
// bit 15 ready
|
// bit 14 interrupt
|
// bit 14 interrupt
|
// bit 13 wrap
|
// bit 13 wrap
|
// bit 12 pad
|
// bit 12 pad
|