Skip to content

Commit

Permalink
liteeth: just check for SFD and ignore preamble corruption
Browse files Browse the repository at this point in the history
IEEE 802.3-2008 clause 35 allows all seven preamble bytes to
be lost or corrupted. The only reliable byte to start a frame
is the SFD.

closes #64
jordens committed Dec 6, 2017
1 parent 1d4f17e commit 9791213
Showing 1 changed file with 3 additions and 55 deletions.
58 changes: 3 additions & 55 deletions misoc/cores/liteeth_mini/mac/preamble.py
Original file line number Diff line number Diff line change
@@ -86,73 +86,21 @@ class LiteEthMACPreambleChecker(Module):
Pulses every time a preamble error is detected.
"""
def __init__(self, dw):
assert dw == 8
self.sink = sink = stream.Endpoint(eth_phy_layout(dw))
self.source = source = stream.Endpoint(eth_phy_layout(dw))

self.error = Signal()

# # #

preamble = Signal(64, reset=eth_preamble)
cnt_max = (64//dw) - 1
cnt = Signal(max=cnt_max+1)
clr_cnt = Signal()
inc_cnt = Signal()

self.sync += \
If(clr_cnt,
cnt.eq(0)
).Elif(inc_cnt,
cnt.eq(cnt+1)
)

discard = Signal()
clr_discard = Signal()
set_discard = Signal()

self.sync += \
If(clr_discard,
discard.eq(0)
).Elif(set_discard,
discard.eq(1)
)

ref = Signal(dw)
match = Signal()
self.comb += [
chooser(preamble, cnt, ref),
match.eq(sink.data == ref),
self.error.eq(sink.stb & ~discard & set_discard),
]

fsm = FSM(reset_state="IDLE")
self.submodules += fsm

fsm.act("IDLE",
sink.ack.eq(1),
clr_cnt.eq(1),
clr_discard.eq(1),
If(sink.stb,
clr_cnt.eq(0),
inc_cnt.eq(1),
clr_discard.eq(0),
set_discard.eq(~match),
NextState("CHECK"),
)
)
fsm.act("CHECK",
sink.ack.eq(1),
If(sink.stb,
set_discard.eq(~match),
If(cnt == cnt_max,
If(discard | (~match),
NextState("IDLE")
).Else(
NextState("COPY")
)
).Else(
inc_cnt.eq(1)
)
If(sink.stb & (sink.data == eth_preamble >> 56),
NextState("COPY")
)
)
self.comb += [

0 comments on commit 9791213

Please sign in to comment.