3 from migen
.bank
import csrgen
4 from migen
.bus
import wishbone
, csr
5 from migen
.bus
import wishbone2csr
6 from migen
.genlib
.cdc
import *
7 from migen
.genlib
.resetsync
import AsyncResetSynchronizer
8 from migen
.bank
.description
import *
10 from misoclib
import identifier
12 from litescope
.common
import *
13 from litescope
.bridge
.uart2wb
import LiteScopeUART2WB
14 from litescope
.frontend
.la
import LiteScopeLA
15 from litescope
.core
.port
import LiteScopeTerm
17 from liteeth
.common
import *
18 from liteeth
.phy
.gmii
import LiteEthPHYGMII
19 from liteeth
.core
import LiteEthUDPIPCore
22 def __init__(self
, platform
):
23 self
.clock_domains
.cd_sys
= ClockDomain()
26 clk200
= platform
.request("clk200")
28 self
.specials
+= Instance("IBUFDS", i_I
=clk200
.p
, i_IB
=clk200
.n
, o_O
=clk200_se
)
34 Instance("PLLE2_BASE",
35 p_STARTUP_WAIT
="FALSE", o_LOCKED
=pll_locked
,
38 p_REF_JITTER1
=0.01, p_CLKIN1_PERIOD
=5.0,
39 p_CLKFBOUT_MULT
=5, p_DIVCLK_DIVIDE
=1,
40 i_CLKIN1
=clk200_se
, i_CLKFBIN
=pll_fb
, o_CLKFBOUT
=pll_fb
,
43 p_CLKOUT0_DIVIDE
=6, p_CLKOUT0_PHASE
=0.0, o_CLKOUT0
=pll_sys
,
45 p_CLKOUT1_DIVIDE
=2, p_CLKOUT1_PHASE
=0.0, #o_CLKOUT1=,
47 p_CLKOUT2_DIVIDE
=2, p_CLKOUT2_PHASE
=0.0, #o_CLKOUT2=,
49 p_CLKOUT3_DIVIDE
=2, p_CLKOUT3_PHASE
=0.0, #o_CLKOUT3=,
51 p_CLKOUT4_DIVIDE
=2, p_CLKOUT4_PHASE
=0.0, #o_CLKOUT4=
53 Instance("BUFG", i_I
=pll_sys
, o_O
=self
.cd_sys
.clk
),
54 AsyncResetSynchronizer(self
.cd_sys
, ~pll_locked | platform
.request("cpu_reset") | self
.reset
),
66 def __init__(self
, platform
, clk_freq
):
67 self
.clk_freq
= clk_freq
68 # UART <--> Wishbone bridge
69 self
.submodules
.bridge
= LiteScopeUART2WB(platform
.request("serial"), clk_freq
, baud
=921600)
71 # CSR bridge 0x00000000 (shadow @0x00000000)
72 self
.submodules
.wishbone2csr
= wishbone2csr
.WB2CSR(bus_csr
=csr
.Interface(self
.csr_data_width
))
73 self
._wb
_masters
= [self
.bridge
.wishbone
]
74 self
._wb
_slaves
= [(lambda a
: a
[23:25] == 0, self
.wishbone2csr
.wishbone
)]
75 self
.cpu_csr_regions
= [] # list of (name, origin, busword, csr_list/Memory)
78 self
.submodules
.identifier
= identifier
.Identifier(0, int(clk_freq
), 0)
80 def add_cpu_memory_region(self
, name
, origin
, length
):
81 self
.cpu_memory_regions
.append((name
, origin
, length
))
83 def add_cpu_csr_region(self
, name
, origin
, busword
, obj
):
84 self
.cpu_csr_regions
.append((name
, origin
, busword
, obj
))
86 def do_finalize(self
):
88 self
.submodules
.wishbonecon
= wishbone
.InterconnectShared(self
._wb
_masters
,
89 self
._wb
_slaves
, register
=True)
92 self
.submodules
.csrbankarray
= csrgen
.BankArray(self
,
93 lambda name
, memory
: self
.csr_map
[name
if memory
is None else name
+ "_" + memory
.name_override
],
94 data_width
=self
.csr_data_width
)
95 self
.submodules
.csrcon
= csr
.Interconnect(self
.wishbone2csr
.csr
, self
.csrbankarray
.get_buses())
96 for name
, csrs
, mapaddr
, rmap
in self
.csrbankarray
.banks
:
97 self
.add_cpu_csr_region(name
, 0xe0000000+0x800*mapaddr
, flen(rmap
.bus
.dat_w
), csrs
)
98 for name
, memory
, mapaddr
, mmap
in self
.csrbankarray
.srams
:
99 self
.add_cpu_csr_region(name
, 0xe0000000+0x800*mapaddr
, flen(rmap
.bus
.dat_w
), memory
)
101 class UDPIPBISTGeneratorUnit(Module
):
103 self
.start
= Signal()
104 self
.src_port
= Signal(16)
105 self
.dst_port
= Signal(16)
106 self
.ip_address
= Signal(32)
107 self
.length
= Signal(16)
110 self
.source
= source
= Source(eth_udp_user_description(8))
113 counter
= Counter(bits_sign
=16)
114 self
.submodules
+= counter
116 self
.fsm
= fsm
= FSM(reset_state
="IDLE")
117 self
.submodules
+= fsm
126 source
.sop
.eq(counter
.value
== 0),
127 source
.eop
.eq(counter
.value
== (self
.length
-1)),
128 source
.src_port
.eq(self
.src_port
),
129 source
.dst_port
.eq(self
.dst_port
),
130 source
.length
.eq(self
.length
),
131 source
.ip_address
.eq(self
.ip_address
),
132 source
.data
.eq(counter
.value
)
136 If(source
.stb
& source
.ack
,
144 class UDPIPBISTGenerator(UDPIPBISTGeneratorUnit
, AutoCSR
):
147 self
._src
_port
= CSRStorage(16)
148 self
._dst
_port
= CSRStorage(16)
149 self
._ip
_address
= CSRStorage(32)
150 self
._length
= CSRStorage(16)
151 self
._done
= CSRStatus()
153 UDPIPBISTGeneratorUnit
.__init
__(self
)
156 self
.start
.eq(self
._start
.r
& self
._start
.re
),
157 self
.src_port
.eq(self
._src
_port
.storage
),
158 self
.dst_port
.eq(self
._dst
_port
.storage
),
159 self
.ip_address
.eq(self
._ip
_address
.storage
),
160 self
.length
.eq(self
._length
.storage
),
161 self
._done
.status
.eq(self
.done
)
164 class UDPIPSoC(GenSoC
, AutoCSR
):
165 default_platform
= "kc705"
171 csr_map
.update(GenSoC
.csr_map
)
172 def __init__(self
, platform
):
173 clk_freq
= 166*1000000
174 GenSoC
.__init
__(self
, platform
, clk_freq
)
175 self
.submodules
.crg
= _CRG(platform
)
177 # Ethernet PHY and UDP/IP
178 self
.submodules
.ethphy
= LiteEthPHYGMII(platform
.request("eth_clocks"), platform
.request("eth"))
179 self
.submodules
.udpip_core
= LiteEthUDPIPCore(self
.ethphy
, 0x10e2d5000000, convert_ip("192.168.1.40"), clk_freq
)
182 self
.submodules
.bist_generator
= UDPIPBISTGenerator()
184 Record
.connect(self
.bist_generator
.source
, self
.udpip_core
.sink
),
185 self
.udpip_core
.source
.ack
.eq(1)
188 class UDPIPSoCDevel(UDPIPSoC
, AutoCSR
):
192 csr_map
.update(UDPIPSoC
.csr_map
)
193 def __init__(self
, platform
):
194 UDPIPSoC
.__init
__(self
, platform
)
196 self
.udpip_core_udp_rx_fsm_state
= Signal(4)
197 self
.udpip_core_udp_tx_fsm_state
= Signal(4)
198 self
.udpip_core_ip_rx_fsm_state
= Signal(4)
199 self
.udpip_core_ip_tx_fsm_state
= Signal(4)
200 self
.udpip_core_arp_rx_fsm_state
= Signal(4)
201 self
.udpip_core_arp_tx_fsm_state
= Signal(4)
202 self
.udpip_core_arp_table_fsm_state
= Signal(4)
205 self
.udpip_core
.mac
.core
.sink
.stb
,
206 self
.udpip_core
.mac
.core
.sink
.sop
,
207 self
.udpip_core
.mac
.core
.sink
.eop
,
208 self
.udpip_core
.mac
.core
.sink
.ack
,
209 self
.udpip_core
.mac
.core
.sink
.data
,
211 self
.udpip_core
.mac
.core
.source
.stb
,
212 self
.udpip_core
.mac
.core
.source
.sop
,
213 self
.udpip_core
.mac
.core
.source
.eop
,
214 self
.udpip_core
.mac
.core
.source
.ack
,
215 self
.udpip_core
.mac
.core
.source
.data
,
217 self
.ethphy
.sink
.stb
,
218 self
.ethphy
.sink
.sop
,
219 self
.ethphy
.sink
.eop
,
220 self
.ethphy
.sink
.ack
,
221 self
.ethphy
.sink
.data
,
223 self
.ethphy
.source
.stb
,
224 self
.ethphy
.source
.sop
,
225 self
.ethphy
.source
.eop
,
226 self
.ethphy
.source
.ack
,
227 self
.ethphy
.source
.data
,
229 self
.udpip_core_udp_rx_fsm_state
,
230 self
.udpip_core_udp_tx_fsm_state
,
231 self
.udpip_core_ip_rx_fsm_state
,
232 self
.udpip_core_ip_tx_fsm_state
,
233 self
.udpip_core_arp_rx_fsm_state
,
234 self
.udpip_core_arp_tx_fsm_state
,
235 self
.udpip_core_arp_table_fsm_state
,
239 self
.submodules
.la
= LiteScopeLA(debug
, 2048)
240 self
.la
.trigger
.add_port(LiteScopeTerm(self
.la
.dw
))
241 atexit
.register(self
.exit
, platform
)
243 def do_finalize(self
):
244 UDPIPSoC
.do_finalize(self
)
246 self
.udpip_core_udp_rx_fsm_state
.eq(self
.udpip_core
.udp
.rx
.fsm
.state
),
247 self
.udpip_core_udp_tx_fsm_state
.eq(self
.udpip_core
.udp
.tx
.fsm
.state
),
248 self
.udpip_core_ip_rx_fsm_state
.eq(self
.udpip_core
.ip
.rx
.fsm
.state
),
249 self
.udpip_core_ip_tx_fsm_state
.eq(self
.udpip_core
.ip
.tx
.fsm
.state
),
250 self
.udpip_core_arp_rx_fsm_state
.eq(self
.udpip_core
.arp
.rx
.fsm
.state
),
251 self
.udpip_core_arp_tx_fsm_state
.eq(self
.udpip_core
.arp
.tx
.fsm
.state
),
252 self
.udpip_core_arp_table_fsm_state
.eq(self
.udpip_core
.arp
.table
.fsm
.state
)
255 def exit(self
, platform
):
256 if platform
.vns
is not None:
257 self
.la
.export(platform
.vns
, "../test/la.csv")
259 default_subtarget
= UDPIPSoC