1 from liteeth
.common
import *
3 def _decode_header(h_dict
, h_signal
, obj
):
5 for k
, v
in sorted(h_dict
.items()):
6 start
= v
.byte
*8+v
.offset
8 r
.append(getattr(obj
, k
).eq(reverse_bytes(h_signal
[start
:end
])))
11 class LiteEthDepacketizer(Module
):
12 def __init__(self
, sink_description
, source_description
, header_type
, header_length
):
13 self
.sink
= sink
= Sink(sink_description
)
14 self
.source
= source
= Source(source_description
)
17 header
= Signal(header_length
*8)
18 counter
= Counter(max=header_length
)
19 self
.submodules
+= counter
23 header
.eq(Cat(header
[8:], sink
.data
))
27 fsm
= FSM(reset_state
="IDLE")
28 self
.submodules
+= fsm
35 NextState("RECEIVE_HEADER")
38 fsm
.act("RECEIVE_HEADER",
43 If(counter
.value
== header_length
-2,
49 If(fsm
.before_entering("COPY"),
51 ).Elif(source
.stb
& source
.ack
,
55 source
.eop
.eq(sink
.eop
),
56 source
.data
.eq(sink
.data
),
57 source
.error
.eq(sink
.error
),
58 _decode_header(header_type
, header
, source
)
61 sink
.ack
.eq(source
.ack
),
62 source
.stb
.eq(sink
.stb
),
63 If(source
.stb
& source
.ack
& source
.eop
,