Skip to content

Commit

Permalink
phy/rmii: Cleanup LiteEthPHYRMIISpeedDetect.
Browse files Browse the repository at this point in the history
- Avoid CSR that was useful for debug.
- Make signals local.
- Add crs_dv/crs_last/rx_data argument to LiteEthPHYRMIISpeedDetect.
- Avoid exposing count threshold since internal.
  • Loading branch information
enjoy-digital committed Feb 14, 2025
1 parent 942cdb0 commit 1cfc2cf
Showing 1 changed file with 32 additions and 39 deletions.
71 changes: 32 additions & 39 deletions liteeth/phy/rmii.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,47 +41,44 @@ def __init__(self, speed):
# LiteEth PHY RMII Speed Detect --------------------------------------------------------------------

class LiteEthPHYRMIISpeedDetect(LiteXModule):
def __init__(self, speed_counter_threshold=20):
self.crs_dv = Signal()
self.rx_data = Signal()
self.fsm_rst = Signal()
self.speed = Signal() # 0: 10Mbps, 1: 100Mbps.

self._speed_cnt = CSRStatus(10, description="CRS_DV to RX_DATA0 Delay.")
def __init__(self, csr_dv, crs_last, rx_data):
self.speed = Signal() # 0: 10Mbps, 1: 100Mbps.

# # #

self.crs_dv_d = Signal()
self.rx_data0_d = Signal()
self.cnt = Signal(10) # FIXME: too big

self.comb += self._speed_cnt.status.eq(self.cnt)
# Signals.
crs_dv_d = Signal()
rx_data_d = Signal()
count = Signal(8)

self.fsm = fsm = FSM(reset_state="IDLE")
# FSM.
self.fsm = fsm = ResetInserter()(FSM(reset_state="IDLE"))
self.comb += fsm.reset.eq(crs_last)
fsm.act("IDLE",
If(self.crs_dv,
NextValue(self.cnt, 0),
If(crs_dv,
NextValue(count, 0),
NextState("DETECT")
)
)

fsm.act("DETECT",
NextValue(self.cnt, self.cnt + 1),
If(~self.rx_data0_d & self.rx_data,
If((self.cnt < speed_counter_threshold),
NextValue(count, count + 1),
If(~rx_data_d & rx_data,
If(count < 20,
NextValue(self.speed, 1), # 100Mbps
).Else(
NextValue(self.speed, 0), # 10Mbps
),
NextState("HOLD_SPEED"),
NextState("HOLD"),
),
If(~self.crs_dv, # If packet ends too soon
NextState("HOLD_SPEED")
# If packet ends too soon, hold speed.
If(~crs_dv,
NextState("HOLD")
)
)

fsm.act("HOLD_SPEED",
If(self.fsm_rst, NextState("IDLE"))
fsm.act("HOLD",
NextState("HOLD")
)

# LiteEth PHY RMII TX ------------------------------------------------------------------------------
Expand Down Expand Up @@ -172,6 +169,15 @@ def __init__(self, pads, clk_signal, speed_counter_threshold=20):
If(crs_last, crs_run.eq(0)),
]

# Speed Detection.
# ----------------
self.speed_detect = LiteEthPHYRMIISpeedDetect(
crs_dv = csr_dv_i,
crs_last = crs_last,
rx_data = rx_data_i,
)
self.comb += self.speed.eq(self.speed_detect.speed)

# Datapath: Input -> Delay -> Converter -> Source.
# ------------------------------------------------
self.comb += [
Expand All @@ -186,16 +192,6 @@ def __init__(self, pads, clk_signal, speed_counter_threshold=20):
converter.source.connect(source),
]

# Speed Detection.
# ----------------
self.speed_detect = LiteEthPHYRMIISpeedDetect(speed_counter_threshold)
self.comb += [
self.speed_detect.crs_dv.eq(crs_dv_i),
self.speed_detect.rx_data.eq(rx_data_i),
self.speed_detect.fsm_rst.eq(crs_last),
self.speed.eq(self.speed_detect.speed),
]

# LiteEth PHY RMII CRG -----------------------------------------------------------------------------

class LiteEthPHYRMIICRG(LiteXModule):
Expand Down Expand Up @@ -251,7 +247,7 @@ class LiteEthPHYRMII(LiteXModule):
dw = 8
tx_clk_freq = 50e6
rx_clk_freq = 50e6
def __init__(self, clock_pads, pads, refclk_cd="eth", speed_counter_threshold=20,
def __init__(self, clock_pads, pads, refclk_cd="eth",
with_hw_init_reset = True,
with_refclk_ddr_output = True):

Expand All @@ -265,11 +261,8 @@ def __init__(self, clock_pads, pads, refclk_cd="eth", speed_counter_threshold=20
# TX/RX.
# ------
self.tx = ClockDomainsRenamer("eth_tx")(LiteEthPHYRMIITX(pads, self.crg.clk_signal))
self.rx = ClockDomainsRenamer("eth_rx")(LiteEthPHYRMIIRX(pads,
clk_signal = self.crg.clk_signal,
speed_counter_threshold = speed_counter_threshold
))
self.comb += self.tx.speed.eq(self.rx.speed)
self.rx = ClockDomainsRenamer("eth_rx")(LiteEthPHYRMIIRX(pads, self.crg.clk_signal))
self.comb += self.tx.speed.eq(self.rx.speed)
self.sink, self.source = self.tx.sink, self.rx.source

# MDIO.
Expand Down

0 comments on commit 1cfc2cf

Please sign in to comment.