1 //////////////////////////////////////////////////////////////////////
3 //// eth_maccontrol.v ////
5 //// This file is part of the Ethernet IP core project ////
6 //// http://www.opencores.org/projects/ethmac/ ////
9 //// - Igor Mohor (igorM@opencores.org) ////
11 //// All additional information is avaliable in the Readme.txt ////
14 //////////////////////////////////////////////////////////////////////
16 //// Copyright (C) 2001 Authors ////
18 //// This source file may be used and distributed without ////
19 //// restriction provided that this copyright statement is not ////
20 //// removed from the file and that any derivative work contains ////
21 //// the original copyright notice and the associated disclaimer. ////
23 //// This source file is free software; you can redistribute it ////
24 //// and/or modify it under the terms of the GNU Lesser General ////
25 //// Public License as published by the Free Software Foundation; ////
26 //// either version 2.1 of the License, or (at your option) any ////
27 //// later version. ////
29 //// This source is distributed in the hope that it will be ////
30 //// useful, but WITHOUT ANY WARRANTY; without even the implied ////
31 //// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
32 //// PURPOSE. See the GNU Lesser General Public License for more ////
35 //// You should have received a copy of the GNU Lesser General ////
36 //// Public License along with this source; if not, download it ////
37 //// from http://www.opencores.org/lgpl.shtml ////
39 //////////////////////////////////////////////////////////////////////
41 // CVS Revision History
43 // $Log: eth_maccontrol.v,v $
44 // Revision 1.7 2003/01/22 13:49:26 tadejm
45 // When control packets were received, they were ignored in some cases.
47 // Revision 1.6 2002/11/22 01:57:06 mohor
48 // Rx Flow control fixed. CF flag added to the RX buffer descriptor. RxAbort
51 // Revision 1.5 2002/11/21 00:14:39 mohor
52 // TxDone and TxAbort changed so they're not propagated to the wishbone
53 // module when control frame is transmitted.
55 // Revision 1.4 2002/11/19 17:37:32 mohor
56 // When control frame (PAUSE) was sent, status was written in the
57 // eth_wishbone module and both TXB and TXC interrupts were set. Fixed.
58 // Only TXC interrupt is set.
60 // Revision 1.3 2002/01/23 10:28:16 mohor
61 // Link in the header changed.
63 // Revision 1.2 2001/10/19 08:43:51 mohor
64 // eth_timescale.v changed to timescale.v This is done because of the
65 // simulation of the few cores in a one joined project.
67 // Revision 1.1 2001/08/06 14:44:29 mohor
68 // A define FPGA added to select between Artisan RAM (for ASIC) and Block Ram (For Virtex).
69 // Include files fixed to contain no path.
70 // File names and module names changed ta have a eth_ prologue in the name.
71 // File eth_timescale.v is used to define timescale
72 // All pin names on the top module are changed to contain _I, _O or _OE at the end.
73 // Bidirectional signal MDIO is changed to three signals (Mdc_O, Mdi_I, Mdo_O
74 // and Mdo_OE. The bidirectional signal must be created on the top level. This
75 // is done due to the ASIC tools.
77 // Revision 1.1 2001/07/30 21:23:42 mohor
78 // Directory structure changed. Files checked and joind together.
80 // Revision 1.1 2001/07/03 12:51:54 mohor
81 // Initial release of the MAC Control module.
88 `include "timescale.v"
91 module eth_maccontrol (MTxClk
, MRxClk
, TxReset
, RxReset
, TPauseRq
, TxDataIn
, TxStartFrmIn
, TxUsedDataIn
,
92 TxEndFrmIn
, TxDoneIn
, TxAbortIn
, RxData
, RxValid
, RxStartFrm
, RxEndFrm
, ReceiveEnd
,
93 ReceivedPacketGood
, ReceivedLengthOK
, TxFlow
, RxFlow
, DlyCrcEn
, TxPauseTV
,
94 MAC
, PadIn
, PadOut
, CrcEnIn
, CrcEnOut
, TxDataOut
, TxStartFrmOut
, TxEndFrmOut
,
95 TxDoneOut
, TxAbortOut
, TxUsedDataOut
, WillSendControlFrame
, TxCtrlEndFrm
,
96 ReceivedPauseFrm
, ControlFrmAddressOK
, SetPauseTimer
, r_PassAll
, RxStatusWriteLatched_sync2
103 input MTxClk
; // Transmit clock (from PHY)
104 input MRxClk
; // Receive clock (from PHY)
105 input TxReset
; // Transmit reset
106 input RxReset
; // Receive reset
107 input TPauseRq
; // Transmit control frame (from host)
108 input [7:0] TxDataIn
; // Transmit packet data byte (from host)
109 input TxStartFrmIn
; // Transmit packet start frame input (from host)
110 input TxUsedDataIn
; // Transmit packet used data (from TxEthMAC)
111 input TxEndFrmIn
; // Transmit packet end frame input (from host)
112 input TxDoneIn
; // Transmit packet done (from TxEthMAC)
113 input TxAbortIn
; // Transmit packet abort (input from TxEthMAC)
114 input PadIn
; // Padding (input from registers)
115 input CrcEnIn
; // Crc append (input from registers)
116 input [7:0] RxData
; // Receive Packet Data (from RxEthMAC)
117 input RxValid
; // Received a valid packet
118 input RxStartFrm
; // Receive packet start frame (input from RxEthMAC)
119 input RxEndFrm
; // Receive packet end frame (input from RxEthMAC)
120 input ReceiveEnd
; // End of receiving of the current packet (input from RxEthMAC)
121 input ReceivedPacketGood
; // Received packet is good
122 input ReceivedLengthOK
; // Length of the received packet is OK
123 input TxFlow
; // Tx flow control (from registers)
124 input RxFlow
; // Rx flow control (from registers)
125 input DlyCrcEn
; // Delayed CRC enabled (from registers)
126 input [15:0] TxPauseTV
; // Transmit Pause Timer Value (from registers)
127 input [47:0] MAC
; // MAC address (from registers)
128 input RxStatusWriteLatched_sync2
;
131 output [7:0] TxDataOut
; // Transmit Packet Data (to TxEthMAC)
132 output TxStartFrmOut
; // Transmit packet start frame (output to TxEthMAC)
133 output TxEndFrmOut
; // Transmit packet end frame (output to TxEthMAC)
134 output TxDoneOut
; // Transmit packet done (to host)
135 output TxAbortOut
; // Transmit packet aborted (to host)
136 output TxUsedDataOut
; // Transmit packet used data (to host)
137 output PadOut
; // Padding (output to TxEthMAC)
138 output CrcEnOut
; // Crc append (output to TxEthMAC)
139 output WillSendControlFrame
;
141 output ReceivedPauseFrm
;
142 output ControlFrmAddressOK
;
143 output SetPauseTimer
;
145 reg TxUsedDataOutDetected
;
146 reg TxAbortInLatched
;
153 wire [7:0] ControlData
;
155 wire SendingCtrlFrm
; // Sending Control Frame (enables padding and CRC)
159 // Signal TxUsedDataOut was detected (a transfer is already in progress)
160 always @ (posedge MTxClk
or posedge TxReset
)
163 TxUsedDataOutDetected
<= #Tp
1'b0;
165 if(TxDoneIn | TxAbortIn
)
166 TxUsedDataOutDetected
<= #Tp
1'b0;
169 TxUsedDataOutDetected
<= #Tp
1'b1;
173 // Latching variables
174 always @ (posedge MTxClk
or posedge TxReset
)
178 TxAbortInLatched
<= #Tp
1'b0;
179 TxDoneInLatched
<= #Tp
1'b0;
183 TxAbortInLatched
<= #Tp TxAbortIn
;
184 TxDoneInLatched
<= #Tp TxDoneIn
;
190 // Generating muxed abort signal
191 always @ (posedge MTxClk
or posedge TxReset
)
194 MuxedAbort
<= #Tp
1'b0;
197 MuxedAbort
<= #Tp
1'b0;
199 if(TxAbortIn
& ~TxAbortInLatched
& TxUsedDataOutDetected
)
200 MuxedAbort
<= #Tp
1'b1;
204 // Generating muxed done signal
205 always @ (posedge MTxClk
or posedge TxReset
)
208 MuxedDone
<= #Tp
1'b0;
211 MuxedDone
<= #Tp
1'b0;
213 if(TxDoneIn
& (~TxDoneInLatched
) & TxUsedDataOutDetected
)
214 MuxedDone
<= #Tp
1'b1;
219 assign TxDoneOut
= CtrlMux?
((~TxStartFrmIn
) & (~BlockTxDone
) & MuxedDone
) :
220 ((~TxStartFrmIn
) & (~BlockTxDone
) & TxDoneIn
);
223 assign TxAbortOut
= CtrlMux?
((~TxStartFrmIn
) & (~BlockTxDone
) & MuxedAbort
) :
224 ((~TxStartFrmIn
) & (~BlockTxDone
) & TxAbortIn
);
227 assign TxUsedDataOut
= ~CtrlMux
& TxUsedDataIn
;
230 assign TxStartFrmOut
= CtrlMux? TxCtrlStartFrm
: (TxStartFrmIn
& ~Pause
);
234 assign TxEndFrmOut
= CtrlMux? TxCtrlEndFrm
: TxEndFrmIn
;
238 assign TxDataOut
[7:0] = CtrlMux? ControlData
[7:0] : TxDataIn
[7:0];
242 assign PadOut
= PadIn | SendingCtrlFrm
;
246 assign CrcEnOut
= CrcEnIn | SendingCtrlFrm
;
250 // Connecting receivecontrol module
251 eth_receivecontrol receivecontrol1
253 .
MTxClk(MTxClk
), .
MRxClk(MRxClk
), .
TxReset(TxReset
), .
RxReset(RxReset
), .
RxData(RxData
),
254 .
RxValid(RxValid
), .
RxStartFrm(RxStartFrm
), .
RxEndFrm(RxEndFrm
), .
RxFlow(RxFlow
),
255 .
ReceiveEnd(ReceiveEnd
), .
MAC(MAC
), .
DlyCrcEn(DlyCrcEn
), .
TxDoneIn(TxDoneIn
),
256 .
TxAbortIn(TxAbortIn
), .
TxStartFrmOut(TxStartFrmOut
), .
ReceivedLengthOK(ReceivedLengthOK
),
257 .
ReceivedPacketGood(ReceivedPacketGood
), .
TxUsedDataOutDetected(TxUsedDataOutDetected
),
258 .
Pause(Pause
), .
ReceivedPauseFrm(ReceivedPauseFrm
), .
AddressOK(ControlFrmAddressOK
),
259 .
r_PassAll(r_PassAll
), .
RxStatusWriteLatched_sync2(RxStatusWriteLatched_sync2
), .
SetPauseTimer(SetPauseTimer
)
263 eth_transmitcontrol transmitcontrol1
265 .
MTxClk(MTxClk
), .
TxReset(TxReset
), .
TxUsedDataIn(TxUsedDataIn
), .
TxUsedDataOut(TxUsedDataOut
),
266 .
TxDoneIn(TxDoneIn
), .
TxAbortIn(TxAbortIn
), .
TxStartFrmIn(TxStartFrmIn
), .
TPauseRq(TPauseRq
),
267 .
TxUsedDataOutDetected(TxUsedDataOutDetected
), .
TxFlow(TxFlow
), .
DlyCrcEn(DlyCrcEn
), .
TxPauseTV(TxPauseTV
),
268 .
MAC(MAC
), .
TxCtrlStartFrm(TxCtrlStartFrm
), .
TxCtrlEndFrm(TxCtrlEndFrm
), .
SendingCtrlFrm(SendingCtrlFrm
),
269 .
CtrlMux(CtrlMux
), .
ControlData(ControlData
), .
WillSendControlFrame(WillSendControlFrame
), .
BlockTxDone(BlockTxDone
)