Skip to content

Commit

Permalink
Merge pull request #2004 from enjoy-digital/wishbone_dma_ctrl
Browse files Browse the repository at this point in the history
Wishbone DMA: Split add_csr() method in add_ctrl()/add_csr().
  • Loading branch information
enjoy-digital committed Jun 26, 2024
2 parents 06a26b7 + 4b745f9 commit 3dd3477
Showing 1 changed file with 70 additions and 26 deletions.
96 changes: 70 additions & 26 deletions litex/soc/cores/dma.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,29 +71,30 @@ def __init__(self, bus, endianness="little", fifo_depth=16, with_csr=False):

# CSRs.
if with_csr:
self.add_ctrl()
self.add_csr()

def add_csr(self, default_base=0, default_length=0, default_enable=0, default_loop=0):
self._base = CSRStorage(64, reset=default_base)
self._length = CSRStorage(32, reset=default_length)
self._enable = CSRStorage(reset=default_enable)
self._done = CSRStatus()
self._loop = CSRStorage(reset=default_loop)
self._offset = CSRStatus(32)
def add_ctrl(self, default_base=0, default_length=0, default_enable=0, default_loop=0):
self.base = Signal(64, reset=default_base)
self.length = Signal(32, reset=default_length)
self.enable = Signal(reset=default_enable)
self.done = Signal()
self.loop = Signal(reset=default_loop)
self.offset = Signal(32)

# # #

shift = log2_int(self.bus.data_width//8)
base = Signal(self.bus.adr_width)
offset = Signal(self.bus.adr_width)
length = Signal(self.bus.adr_width)
self.comb += base.eq(self._base.storage[shift:])
self.comb += length.eq(self._length.storage[shift:])
self.comb += base.eq(self.base[shift:])
self.comb += length.eq(self.length[shift:])

self.comb += self._offset.status.eq(offset)
self.comb += self.offset.eq(offset)

self.fsm = fsm = ResetInserter()(FSM(reset_state="IDLE"))
self.comb += fsm.reset.eq(~self._enable.storage)
self.comb += fsm.reset.eq(~self.enable)
fsm.act("IDLE",
NextValue(offset, 0),
NextState("RUN"),
Expand All @@ -105,15 +106,36 @@ def add_csr(self, default_base=0, default_length=0, default_enable=0, default_lo
If(self.sink.ready,
NextValue(offset, offset + 1),
If(self.sink.last,
If(self._loop.storage,
If(self.loop,
NextValue(offset, 0)
).Else(
NextState("DONE")
)
)
)
)
fsm.act("DONE", self._done.status.eq(1))
fsm.act("DONE", self.done.eq(1))

def add_csr(self, default_base=0, default_length=0, default_enable=0, default_loop=0):
self._base = CSRStorage(64, reset=default_base)
self._length = CSRStorage(32, reset=default_length)
self._enable = CSRStorage(reset=default_enable)
self._done = CSRStatus()
self._loop = CSRStorage(reset=default_loop)
self._offset = CSRStatus(32)

# # #

self.comb += [
# Control.
self.base.eq(self._base.storage),
self.length.eq(self._length.storage),
self.enable.eq(self._enable.storage),
self.loop.eq(self._loop.storage),
# Status.
self._done.status.eq(self.done),
self._offset.status.eq(self.offset),
]

# WishboneDMAWriter --------------------------------------------------------------------------------

Expand Down Expand Up @@ -151,32 +173,33 @@ def __init__(self, bus, endianness="little", with_csr=False):

# CSRs.
if with_csr:
self.add_ctrl()
self.add_csr()

def add_csr(self, default_base=0, default_length=0, default_enable=0, default_loop=0, ready_on_idle=1):
def add_ctrl(self, default_base=0, default_length=0, default_enable=0, default_loop=0, ready_on_idle=1):
self._sink = self.sink
self.sink = stream.Endpoint([("data", self.bus.data_width)])

self._base = CSRStorage(64, reset=default_base)
self._length = CSRStorage(32, reset=default_length)
self._enable = CSRStorage(reset=default_enable)
self._done = CSRStatus()
self._loop = CSRStorage(reset=default_loop)
self._offset = CSRStatus(32)
self.base = Signal(64, reset=default_base)
self.length = Signal(32, reset=default_length)
self.enable = Signal(reset=default_enable)
self.done = Signal()
self.loop = Signal(reset=default_loop)
self.offset = Signal(32)

# # #

shift = log2_int(self.bus.data_width//8)
base = Signal(self.bus.adr_width)
offset = Signal(self.bus.adr_width)
length = Signal(self.bus.adr_width)
self.comb += base.eq(self._base.storage[shift:])
self.comb += length.eq(self._length.storage[shift:])
self.comb += base.eq(self.base[shift:])
self.comb += length.eq(self.length[shift:])

self.comb += self._offset.status.eq(offset)
self.comb += self.offset.eq(offset)

self.fsm = fsm = ResetInserter()(FSM(reset_state="IDLE"))
self.comb += fsm.reset.eq(~self._enable.storage)
self.comb += fsm.reset.eq(~self.enable)
fsm.act("IDLE",
self.sink.ready.eq(ready_on_idle),
NextValue(offset, 0),
Expand All @@ -191,12 +214,33 @@ def add_csr(self, default_base=0, default_length=0, default_enable=0, default_lo
If(self.sink.valid & self.sink.ready,
NextValue(offset, offset + 1),
If(self._sink.last,
If(self._loop.storage,
If(self.loop,
NextValue(offset, 0)
).Else(
NextState("DONE")
)
)
)
)
fsm.act("DONE", self._done.status.eq(1))
fsm.act("DONE", self.done.eq(1))

def add_csr(self, default_base=0, default_length=0, default_enable=0, default_loop=0):
self._base = CSRStorage(64, reset=default_base)
self._length = CSRStorage(32, reset=default_length)
self._enable = CSRStorage(reset=default_enable)
self._done = CSRStatus()
self._loop = CSRStorage(reset=default_loop)
self._offset = CSRStatus(32)

# # #

self.comb += [
# Control.
self.base.eq(self._base.storage),
self.length.eq(self._length.storage),
self.enable.eq(self._enable.storage),
self.loop.eq(self._loop.storage),
# Status.
self._done.status.eq(self.done),
self._offset.status.eq(self.offset),
]

0 comments on commit 3dd3477

Please sign in to comment.