mirror of
https://github.com/rdolbeau/NuBusFPGA.git
synced 2024-12-24 23:29:58 +00:00
44 lines
1.6 KiB
Python
44 lines
1.6 KiB
Python
from math import log2
|
|
|
|
from migen import *
|
|
|
|
from litedram.frontend.dma import LiteDRAMDMAReader;
|
|
|
|
# LiteDRAMDFBMAReader --------------------------------------------------------------------------------
|
|
# Hardwire the loop, uses control signals instead of CSRs
|
|
|
|
class LiteDRAMFBDMAReader(LiteDRAMDMAReader):
|
|
def __init__(self, port, fifo_depth=16, default_base=0, default_length=0):
|
|
LiteDRAMDMAReader.__init__(self = self, port = port, fifo_depth = fifo_depth, fifo_buffered = True, with_csr = False)
|
|
|
|
self.enable = Signal(reset = 0)
|
|
self.base = Signal(32, reset = default_base)
|
|
self.length = Signal(32, reset = default_length)
|
|
|
|
shift = log2_int(self.port.data_width//8)
|
|
base = Signal(self.port.address_width)
|
|
length = Signal(self.port.address_width)
|
|
offset = Signal(self.port.address_width, reset = 0)
|
|
self.comb += base.eq(self.base[shift:])
|
|
self.comb += length.eq(self.length[shift:])
|
|
|
|
fsm = FSM(reset_state="IDLE")
|
|
fsm = ResetInserter()(fsm)
|
|
self.submodules.fsm = fsm
|
|
self.comb += fsm.reset.eq(~self.enable)
|
|
fsm.act("IDLE",
|
|
NextValue(offset, 0),
|
|
NextState("RUN"),
|
|
)
|
|
fsm.act("RUN",
|
|
self.sink.valid.eq(1),
|
|
self.sink.last.eq(offset == (length - 1)),
|
|
self.sink.address.eq(base + offset),
|
|
If(self.sink.ready,
|
|
NextValue(offset, offset + 1),
|
|
If(self.sink.last,
|
|
NextValue(offset, 0)
|
|
)
|
|
)
|
|
)
|