3 from misoc
.interconnect
.csr
import *
4 from misoc
.interconnect
.stream
import *
5 from misoc
.cores
.liteeth_mini
.common
import *
8 def converter_description(dw
):
9 payload_layout
= [("data", dw
)]
10 return EndpointDescription(payload_layout
, packetized
=True)
13 class LiteEthPHYMIITX(Module
):
14 def __init__(self
, pads
, pads_register
=True):
15 self
.sink
= sink
= Sink(eth_phy_description(8))
19 if hasattr(pads
, "tx_er"):
20 self
.sync
+= pads
.tx_er
.eq(0)
21 converter
= Converter(converter_description(8),
22 converter_description(4))
23 self
.submodules
+= converter
25 converter
.sink
.stb
.eq(sink
.stb
),
26 converter
.sink
.data
.eq(sink
.data
),
27 sink
.ack
.eq(converter
.sink
.ack
),
28 converter
.source
.ack
.eq(1)
31 pads
.tx_en
.eq(converter
.source
.stb
),
32 pads
.tx_data
.eq(converter
.source
.data
)
40 class LiteEthPHYMIIRX(Module
):
41 def __init__(self
, pads
):
42 self
.source
= source
= Source(eth_phy_description(8))
49 self
.sync
+= If(sop_set
, sop
.eq(1)).Elif(sop_clr
, sop
.eq(0))
51 converter
= Converter(converter_description(4),
52 converter_description(8))
53 converter
= ResetInserter()(converter
)
54 self
.submodules
+= converter
57 converter
.reset
.eq(~pads
.dv
),
58 converter
.sink
.stb
.eq(1),
59 converter
.sink
.data
.eq(pads
.rx_data
)
66 converter
.sink
.sop
.eq(sop
),
67 converter
.sink
.eop
.eq(~pads
.dv
)
69 self
.comb
+= Record
.connect(converter
.source
, source
)
72 class LiteEthPHYMIICRG(Module
, AutoCSR
):
73 def __init__(self
, clock_pads
, pads
, with_hw_init_reset
):
74 self
._reset
= CSRStorage()
78 if hasattr(clock_pads
, "phy"):
79 self
.sync
.base50
+= clock_pads
.phy
.eq(~clock_pads
.phy
)
81 self
.clock_domains
.cd_eth_rx
= ClockDomain()
82 self
.clock_domains
.cd_eth_tx
= ClockDomain()
83 self
.comb
+= self
.cd_eth_rx
.clk
.eq(clock_pads
.rx
)
84 self
.comb
+= self
.cd_eth_tx
.clk
.eq(clock_pads
.tx
)
86 if with_hw_init_reset
:
88 counter_done
= Signal()
89 self
.submodules
.counter
= counter
= Counter(max=512)
91 counter_done
.eq(counter
.value
== 256),
92 counter
.ce
.eq(~counter_done
),
93 reset
.eq(~counter_done | self
._reset
.storage
)
96 reset
= self
._reset
.storage
97 self
.comb
+= pads
.rst_n
.eq(~reset
)
99 AsyncResetSynchronizer(self
.cd_eth_tx
, reset
),
100 AsyncResetSynchronizer(self
.cd_eth_rx
, reset
),
104 class LiteEthPHYMII(Module
, AutoCSR
):
105 def __init__(self
, clock_pads
, pads
, with_hw_init_reset
=True):
107 self
.submodules
.crg
= LiteEthPHYMIICRG(clock_pads
, pads
, with_hw_init_reset
)
108 self
.submodules
.tx
= ClockDomainsRenamer("eth_tx")(LiteEthPHYMIITX(pads
))
109 self
.submodules
.rx
= ClockDomainsRenamer("eth_tx")(LiteEthPHYMIIRX(pads
))
110 self
.sink
, self
.source
= self
.tx
.sink
, self
.rx
.source