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(eth_udp_user_description(8))
24 self
.source
= Source(eth_ipv4_user_description(8))
26 packetizer
= LiteEthUDPPacketizer()
27 self
.submodules
+= packetizer
29 packetizer
.sink
.stb
.eq(self
.sink
.stb
),
30 packetizer
.sink
.sop
.eq(self
.sink
.sop
),
31 packetizer
.sink
.eop
.eq(self
.sink
.eop
),
32 self
.sink
.ack
.eq(packetizer
.sink
.ack
),
33 packetizer
.sink
.src_port
.eq(self
.sink
.src_port
),
34 packetizer
.sink
.dst_port
.eq(self
.sink
.dst_port
),
35 packetizer
.sink
.length
.eq(self
.sink
.length
+ udp_header_len
),
36 packetizer
.sink
.checksum
.eq(0),
37 packetizer
.sink
.data
.eq(self
.sink
.data
)
39 sink
= packetizer
.source
41 self
.submodules
.fsm
= fsm
= FSM(reset_state
="IDLE")
44 If(sink
.stb
& sink
.sop
,
50 Record
.connect(packetizer
.source
, self
.source
),
51 self
.source
.length
.eq(packetizer
.sink
.length
+ ipv4_header_len
),
52 self
.source
.protocol
.eq(udp_protocol
),
53 self
.source
.ip_address
.eq(self
.sink
.ip_address
),
54 If(self
.source
.stb
& self
.source
.eop
& self
.source
.ack
,
59 class LiteEthUDPRX(Module
):
60 def __init__(self
, ip_address
):
61 self
.sink
= Sink(eth_ipv4_user_description(8))
62 self
.source
= source
= Source(eth_udp_user_description(8))
64 depacketizer
= LiteEthUDPDepacketizer()
65 self
.submodules
+= depacketizer
66 self
.comb
+= Record
.connect(self
.sink
, depacketizer
.sink
)
67 sink
= depacketizer
.source
69 self
.submodules
.fsm
= fsm
= FSM(reset_state
="IDLE")
72 If(sink
.stb
& sink
.sop
,
78 self
.comb
+= valid
.eq(
80 (self
.sink
.protocol
== udp_protocol
)
91 source
.sop
.eq(sink
.sop
),
92 source
.eop
.eq(sink
.eop
),
93 source
.src_port
.eq(sink
.src_port
),
94 source
.dst_port
.eq(sink
.dst_port
),
95 source
.ip_address
.eq(0),
96 source
.length
.eq(sink
.length
- udp_header_len
),
97 source
.data
.eq(sink
.data
),
98 source
.error
.eq(sink
.error
)
101 source
.stb
.eq(sink
.stb
),
102 sink
.ack
.eq(source
.ack
),
103 If(source
.stb
& source
.eop
& source
.ack
,
109 If(sink
.stb
& sink
.eop
& sink
.ack
,
114 class LiteEthUDP(Module
):
115 def __init__(self
, ip
, ip_address
):
116 self
.submodules
.tx
= LiteEthUDPTX(ip_address
)
117 self
.submodules
.rx
= LiteEthUDPRX(ip_address
)
118 ip_port
= ip
.crossbar
.get_port(udp_protocol
)
120 Record
.connect(self
.tx
.source
, ip_port
.sink
),
121 Record
.connect(ip_port
.source
, self
.rx
.sink
)
123 self
.sink
, self
.source
= self
.tx
.sink
, self
.rx
.source