3 from liteeth
.common
import *
5 def _decode_header(h_dict
, h_signal
, obj
):
7 for k
, v
in sorted(h_dict
.items()):
8 start
= v
.byte
*8+v
.offset
10 r
.append(getattr(obj
, k
).eq(h_signal
[start
:end
]))
13 class LiteEthMACDepacketizer(Module
):
15 self
.sink
= sink
= Sink(eth_mac_description(8))
16 self
.source
= source
= Source(eth_phy_description(8))
19 header
= Signal(mac_header_length
*8)
20 counter
= Counter(max=mac_header_length
)
21 self
.submodules
+= counter
23 fsm
= FSM(reset_state
="IDLE")
24 self
.submodules
+= fsm
31 NextState("RECEIVE_HEADER")
34 fsm
.act("RECEIVE_HEADER",
39 If(counter
.value
== mac_header_length
-2,
45 If(fsm
.before_entering("COPY"),
47 ).Elif(source
.stb
& source
.ack
,
52 source
.eop
.eq(sink
.eop
),
53 source
.data
.eq(sink
.data
),
54 source
.error
.eq(sink
.error
),
55 _decode_header(mac_header
, header
, source
)
58 sink
.ack
.eq(source
.ack
),
59 source
.stb
.eq(sink
.stb
),
60 If(source
.stb
& source
.ack
& source
.eop
,