Skip to content

Commit

Permalink
genlib/fifo: add flush, expose level in SyncFIFO
Browse files Browse the repository at this point in the history
AsyncFIFO would need versions of flush and level in each clock domain
plus some handshaking on double flush.

Signed-off-by: Robert Jordens <jordens@gmail.com>
jordens authored and sbourdeauducq committed Mar 16, 2014
1 parent bf6ab2b commit b03d9f4
Showing 1 changed file with 18 additions and 6 deletions.
24 changes: 18 additions & 6 deletions migen/genlib/fifo.py
Original file line number Diff line number Diff line change
@@ -70,12 +70,21 @@ class SyncFIFO(Module, _FIFOInterface):
If different clock domains are needed, use :class:`AsyncFIFO`.
{interface}
level : out
Number of unread entries.
flush : in
Flush the FIFO discarding pending write.
In the next cycle `readable` will be deasserted
and `writable` will be asserted, `level` will be zero.
"""
__doc__ = __doc__.format(interface=_FIFOInterface.__doc__)

def __init__(self, width_or_layout, depth):
_FIFOInterface.__init__(self, width_or_layout, depth)

self.flush = Signal()
self.level = Signal(max=depth+1)

###

do_write = Signal()
@@ -85,7 +94,6 @@ def __init__(self, width_or_layout, depth):
do_read.eq(self.readable & self.re)
]

level = Signal(max=depth+1)
produce = Signal(max=depth)
consume = Signal(max=depth)
storage = Memory(self.width, depth)
@@ -109,15 +117,19 @@ def __init__(self, width_or_layout, depth):
self.sync += If(do_read, _inc(consume, depth))

self.sync += [
If(do_write,
If(~do_read, level.eq(level + 1))
If(self.flush,
produce.eq(0),
consume.eq(0),
self.level.eq(0),
).Elif(do_write,
If(~do_read, self.level.eq(self.level + 1))
).Elif(do_read,
level.eq(level - 1)
self.level.eq(self.level - 1)
)
]
self.comb += [
self.writable.eq(level != depth),
self.readable.eq(level != 0)
self.writable.eq(self.level != depth),
self.readable.eq(self.level != 0)
]

class AsyncFIFO(Module, _FIFOInterface):

0 comments on commit b03d9f4

Please sign in to comment.