1 from liteeth
.common
import *
2 from liteeth
.generic
.depacketizer
import LiteEthDepacketizer
3 from liteeth
.generic
.packetizer
import LiteEthPacketizer
5 class LiteEthUDPDepacketizer(LiteEthDepacketizer
):
7 LiteEthDepacketizer
.__init
__(self
,
8 eth_ipv4_user_description(8),
9 eth_udp_description(8),
13 class LiteEthUDPPacketizer(LiteEthPacketizer
):
15 LiteEthPacketizer
.__init
__(self
,
16 eth_udp_description(8),
17 eth_ipv4_user_description(8),
21 class LiteEthUDPTX(Module
):
22 def __init__(self
, ip_address
):
23 self
.sink
= sink
= Sink(eth_udp_user_description(8))
24 self
.source
= source
= Source(eth_ipv4_user_description(8))
26 self
.submodules
.packetizer
= packetizer
= LiteEthUDPPacketizer()
28 packetizer
.sink
.stb
.eq(sink
.stb
),
29 packetizer
.sink
.sop
.eq(sink
.sop
),
30 packetizer
.sink
.eop
.eq(sink
.eop
),
31 sink
.ack
.eq(packetizer
.sink
.ack
),
32 packetizer
.sink
.src_port
.eq(sink
.src_port
),
33 packetizer
.sink
.dst_port
.eq(sink
.dst_port
),
34 packetizer
.sink
.length
.eq(sink
.length
+ udp_header_len
),
35 packetizer
.sink
.checksum
.eq(0), # Disabled (MAC CRC is enough)
36 packetizer
.sink
.data
.eq(sink
.data
)
39 self
.submodules
.fsm
= fsm
= FSM(reset_state
="IDLE")
41 packetizer
.source
.ack
.eq(1),
42 If(packetizer
.source
.stb
& packetizer
.source
.sop
,
43 packetizer
.source
.ack
.eq(0),
48 Record
.connect(packetizer
.source
, source
),
49 source
.length
.eq(packetizer
.sink
.length
),
50 source
.protocol
.eq(udp_protocol
),
51 source
.ip_address
.eq(sink
.ip_address
),
52 If(source
.stb
& source
.eop
& source
.ack
,
57 class LiteEthUDPRX(Module
):
58 def __init__(self
, ip_address
):
59 self
.sink
= sink
= Sink(eth_ipv4_user_description(8))
60 self
.source
= source
= Source(eth_udp_user_description(8))
62 self
.submodules
.depacketizer
= depacketizer
= LiteEthUDPDepacketizer()
63 self
.comb
+= Record
.connect(sink
, depacketizer
.sink
)
65 self
.submodules
.fsm
= fsm
= FSM(reset_state
="IDLE")
67 depacketizer
.source
.ack
.eq(1),
68 If(depacketizer
.source
.stb
& depacketizer
.source
.sop
,
69 depacketizer
.source
.ack
.eq(0),
74 self
.comb
+= valid
.eq(
75 depacketizer
.source
.stb
&
76 (sink
.protocol
== udp_protocol
)
87 source
.sop
.eq(depacketizer
.source
.sop
),
88 source
.eop
.eq(depacketizer
.source
.eop
),
89 source
.src_port
.eq(depacketizer
.source
.src_port
),
90 source
.dst_port
.eq(depacketizer
.source
.dst_port
),
91 source
.ip_address
.eq(sink
.ip_address
),
92 source
.length
.eq(depacketizer
.source
.length
- udp_header_len
),
93 source
.data
.eq(depacketizer
.source
.data
),
94 source
.error
.eq(depacketizer
.source
.error
)
97 source
.stb
.eq(depacketizer
.source
.stb
),
98 depacketizer
.source
.ack
.eq(source
.ack
),
99 If(source
.stb
& source
.eop
& source
.ack
,
104 depacketizer
.source
.ack
.eq(1),
105 If(depacketizer
.source
.stb
& depacketizer
.source
.eop
& depacketizer
.source
.ack
,
110 class LiteEthUDP(Module
):
111 def __init__(self
, ip
, ip_address
, with_loopback
):
112 self
.submodules
.tx
= tx
= LiteEthUDPTX(ip_address
)
113 self
.submodules
.rx
= rx
= LiteEthUDPRX(ip_address
)
114 ip_port
= ip
.crossbar
.get_port(udp_protocol
)
116 Record
.connect(tx
.source
, ip_port
.sink
),
117 Record
.connect(ip_port
.source
, rx
.sink
)
120 self
.submodules
.fifo
= fifo
= SyncFIFO(eth_udp_user_description(8), 2048, buffered
=True)
122 Record
.connect(rx
.source
, fifo
.sink
),
123 Record
.connect(fifo
.source
, tx
.sink
)
126 self
.sink
, self
.source
= self
.tx
.sink
, self
.rx
.source