1 from liteeth
.common
import *
3 def _encode_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(h_signal
[start
:end
].eq(reverse_bytes(getattr(obj
, k
))))
11 class LiteEthPacketizer(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
)
16 header
= Signal(header_length
*8)
17 header_reg
= Signal(header_length
*8)
20 counter
= Counter(max=header_length
)
21 self
.submodules
+= counter
23 self
.comb
+= _encode_header(header_type
, header
, sink
)
28 header_reg
.eq(Cat(header_reg
[8:], Signal(8)))
32 fsm
= FSM(reset_state
="IDLE")
33 self
.submodules
+= fsm
38 If(sink
.stb
& sink
.sop
,
43 source
.data
.eq(header
[:8]),
44 If(source
.stb
& source
.ack
,
46 NextState("SEND_HEADER"),
50 fsm
.act("SEND_HEADER",
53 source
.eop
.eq(sink
.eop
),
54 source
.data
.eq(header_reg
[8:16]),
55 If(source
.stb
& source
.ack
,
58 If(counter
.value
== header_length
-2,
64 source
.stb
.eq(sink
.stb
),
66 source
.eop
.eq(sink
.eop
),
67 source
.data
.eq(sink
.data
),
68 source
.error
.eq(sink
.error
),
69 If(source
.stb
& source
.ack
,