code clean up
[litex.git] / liteeth / core / udp / __init__.py
1 from liteeth.common import *
2 from liteeth.generic.depacketizer import LiteEthDepacketizer
3 from liteeth.generic.packetizer import LiteEthPacketizer
4
5 class LiteEthUDPDepacketizer(LiteEthDepacketizer):
6 def __init__(self):
7 LiteEthDepacketizer.__init__(self,
8 eth_ipv4_user_description(8),
9 eth_udp_description(8),
10 udp_header,
11 udp_header_len)
12
13 class LiteEthUDPPacketizer(LiteEthPacketizer):
14 def __init__(self):
15 LiteEthPacketizer.__init__(self,
16 eth_udp_description(8),
17 eth_ipv4_user_description(8),
18 udp_header,
19 udp_header_len)
20
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))
25 ###
26 self.submodules.packetizer = packetizer = LiteEthUDPPacketizer()
27 self.comb += [
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)
37 ]
38
39 self.submodules.fsm = fsm = FSM(reset_state="IDLE")
40 fsm.act("IDLE",
41 packetizer.source.ack.eq(1),
42 If(packetizer.source.stb & packetizer.source.sop,
43 packetizer.source.ack.eq(0),
44 NextState("SEND")
45 )
46 )
47 fsm.act("SEND",
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,
53 NextState("IDLE")
54 )
55 )
56
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))
61 ###
62 self.submodules.depacketizer = depacketizer = LiteEthUDPDepacketizer()
63 self.comb += Record.connect(sink, depacketizer.sink)
64
65 self.submodules.fsm = fsm = FSM(reset_state="IDLE")
66 fsm.act("IDLE",
67 depacketizer.source.ack.eq(1),
68 If(depacketizer.source.stb & depacketizer.source.sop,
69 depacketizer.source.ack.eq(0),
70 NextState("CHECK")
71 )
72 )
73 valid = Signal()
74 self.comb += valid.eq(
75 depacketizer.source.stb &
76 (sink.protocol == udp_protocol)
77 )
78
79 fsm.act("CHECK",
80 If(valid,
81 NextState("PRESENT")
82 ).Else(
83 NextState("DROP")
84 )
85 )
86 self.comb += [
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)
95 ]
96 fsm.act("PRESENT",
97 source.stb.eq(depacketizer.source.stb),
98 depacketizer.source.ack.eq(source.ack),
99 If(source.stb & source.eop & source.ack,
100 NextState("IDLE")
101 )
102 )
103 fsm.act("DROP",
104 depacketizer.source.ack.eq(1),
105 If(depacketizer.source.stb & depacketizer.source.eop & depacketizer.source.ack,
106 NextState("IDLE")
107 )
108 )
109
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)
115 self.comb += [
116 Record.connect(tx.source, ip_port.sink),
117 Record.connect(ip_port.source, rx.sink)
118 ]
119 if with_loopback:
120 self.submodules.fifo = fifo = SyncFIFO(eth_udp_user_description(8), 2048, buffered=True)
121 self.comb += [
122 Record.connect(rx.source, fifo.sink),
123 Record.connect(fifo.source, tx.sink)
124 ]
125 else:
126 self.sink, self.source = self.tx.sink, self.rx.source