1 from liteeth
.common
import *
3 class LiteEthPHYMIITX(Module
):
4 def __init__(self
, pads
):
5 self
.sink
= sink
= Sink(eth_description(8))
11 pads
.tx_en
.eq(tx_en_r
),
12 pads
.tx_data
.eq(tx_data_r
),
15 fsm
= FSM(reset_state
="IDLE")
16 self
.submodules
+= fsm
19 If(sink
.stb
& sink
.sop
,
25 tx_data_r
.eq(sink
.d
[0:4]),
30 tx_data_r
.eq(sink
.d
[4:8]),
33 If(sink
.stb
& sink
.eop
,
40 class LiteEthPHYMIIRX(Module
):
41 def __init__(self
, pads
):
42 self
.source
= source
= Source(eth_description(8))
56 load_nibble
= Signal(2)
60 ).Elif(load_nibble
[1],
64 source
.d
.eq(Cat(lo
, hi
))
67 fsm
= FSM(reset_state
="IDLE")
68 self
.submodules
+= fsm
92 class LiteEthPHYMIICRG(Module
, AutoCSR
):
93 def __init__(self
, clock_pads
, pads
):
94 self
._reset
= CSRStorage()
96 self
.sync
.base50
+= clock_pads
.phy
.eq(~clock_pads
.phy
)
98 self
.clock_domains
.cd_eth_rx
= ClockDomain()
99 self
.clock_domains
.cd_eth_tx
= ClockDomain()
100 self
.comb
+= self
.cd_eth_rx
.clk
.eq(clock_pads
.rx
)
101 self
.comb
+= self
.cd_eth_tx
.clk
.eq(clock_pads
.tx
)
103 reset
= self
._reset
.storage
104 self
.comb
+= pads
.rst_n
.eq(~reset
)
106 AsyncResetSynchronizer(self
.cd_eth_tx
, reset
),
107 AsyncResetSynchronizer(self
.cd_eth_rx
, reset
),
110 class LiteEthPHYMII(Module
, AutoCSR
):
111 def __init__(self
, clock_pads
, pads
):
113 self
.submodules
.crg
= LiteEthPHYMIICRG(clock_pads
, pads
)
114 self
.submodules
.tx
= RenameClockDomains(LiteEthPHYMIITX(pads
), "eth_tx")
115 self
.submodules
.rx
= RenameClockDomains(LiteEthPHYMIIRX(pads
), "eth_rx")
116 self
.sink
, self
.source
= self
.tx
.sink
, self
.rx
.source