frontend: remove fifo, too complex to get working and too many corner cases (data stuck in pipeline, ...)
This commit is contained in:
parent
369e9308b9
commit
6091c6de60
|
@ -1,124 +0,0 @@
|
||||||
from litex.gen import *
|
|
||||||
|
|
||||||
from litex.soc.interconnect import stream
|
|
||||||
|
|
||||||
from litedram.frontend import dma
|
|
||||||
|
|
||||||
|
|
||||||
def _inc(signal, modulo):
|
|
||||||
if modulo == 2**len(signal):
|
|
||||||
return signal.eq(signal + 1)
|
|
||||||
else:
|
|
||||||
return If(signal == (modulo - 1),
|
|
||||||
signal.eq(0)
|
|
||||||
).Else(
|
|
||||||
signal.eq(signal + 1)
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
class _LiteDRAMFIFOCtrl(Module):
|
|
||||||
def __init__(self, base, depth, read_threshold, write_threshold):
|
|
||||||
self.base = base
|
|
||||||
self.depth = depth
|
|
||||||
self.level = Signal(max=depth+1)
|
|
||||||
|
|
||||||
# # #
|
|
||||||
|
|
||||||
# to buffer write
|
|
||||||
self.writable = Signal()
|
|
||||||
self.write_address = Signal(max=depth)
|
|
||||||
|
|
||||||
# from buffer write
|
|
||||||
self.write = Signal()
|
|
||||||
|
|
||||||
# to buffer read
|
|
||||||
self.readable = Signal()
|
|
||||||
self.read_address = Signal(max=depth)
|
|
||||||
|
|
||||||
# from buffer read
|
|
||||||
self.read = Signal()
|
|
||||||
|
|
||||||
# # #
|
|
||||||
|
|
||||||
produce = self.write_address
|
|
||||||
consume = self.read_address
|
|
||||||
|
|
||||||
self.sync += [
|
|
||||||
If(self.write,
|
|
||||||
_inc(produce, depth)
|
|
||||||
),
|
|
||||||
If(self.read,
|
|
||||||
_inc(consume, depth)
|
|
||||||
),
|
|
||||||
If(self.write & ~self.read,
|
|
||||||
self.level.eq(self.level + 1),
|
|
||||||
).Elif(self.read & ~self.write,
|
|
||||||
self.level.eq(self.level - 1)
|
|
||||||
)
|
|
||||||
]
|
|
||||||
|
|
||||||
self.comb += [
|
|
||||||
self.writable.eq(self.level <= write_threshold),
|
|
||||||
self.readable.eq(self.level >= read_threshold)
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
class _LiteDRAMFIFOWriter(Module):
|
|
||||||
def __init__(self, dw, port, ctrl):
|
|
||||||
self.sink = stream.Endpoint([("data", dw)])
|
|
||||||
|
|
||||||
# # #
|
|
||||||
|
|
||||||
writer = dma.LiteDRAMDMAWriter(port)
|
|
||||||
self.submodules += writer
|
|
||||||
|
|
||||||
self.comb += [
|
|
||||||
writer.sink.valid.eq(self.sink.valid & ctrl.writable),
|
|
||||||
writer.sink.address.eq(ctrl.base + ctrl.write_address),
|
|
||||||
writer.sink.data.eq(self.sink.data),
|
|
||||||
If(writer.sink.valid & writer.sink.ready,
|
|
||||||
ctrl.write.eq(1),
|
|
||||||
self.sink.ready.eq(1)
|
|
||||||
)
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
class _LiteDRAMFIFOReader(Module):
|
|
||||||
def __init__(self, dw, port, ctrl):
|
|
||||||
self.source = source = stream.Endpoint([("data", dw)])
|
|
||||||
|
|
||||||
# # #
|
|
||||||
|
|
||||||
reader = dma.LiteDRAMDMAReader(port)
|
|
||||||
self.submodules += reader
|
|
||||||
|
|
||||||
self.comb += [
|
|
||||||
reader.sink.valid.eq(ctrl.readable),
|
|
||||||
reader.sink.address.eq(ctrl.base + ctrl.read_address),
|
|
||||||
If(reader.sink.valid & reader.sink.ready,
|
|
||||||
ctrl.read.eq(1)
|
|
||||||
)
|
|
||||||
]
|
|
||||||
self.comb += reader.source.connect(self.source)
|
|
||||||
|
|
||||||
|
|
||||||
class LiteDRAMFIFO(Module):
|
|
||||||
def __init__(self, dw, base, depth, write_port, read_port,
|
|
||||||
read_threshold=None, write_threshold=None):
|
|
||||||
self.sink = stream.Endpoint([("data", dw)])
|
|
||||||
self.source = stream.Endpoint([("data", dw)])
|
|
||||||
|
|
||||||
# # #
|
|
||||||
|
|
||||||
if read_threshold is None:
|
|
||||||
read_threshold = 0
|
|
||||||
if write_threshold is None:
|
|
||||||
write_threshold = depth
|
|
||||||
|
|
||||||
self.submodules.ctrl = _LiteDRAMFIFOCtrl(base, depth, read_threshold, write_threshold)
|
|
||||||
self.submodules.writer = _LiteDRAMFIFOWriter(dw, write_port, self.ctrl)
|
|
||||||
self.submodules.reader = _LiteDRAMFIFOReader(dw, read_port, self.ctrl)
|
|
||||||
self.comb += [
|
|
||||||
self.sink.connect(self.writer.sink),
|
|
||||||
self.reader.source.connect(self.source)
|
|
||||||
]
|
|
Loading…
Reference in New Issue