35 lines
1010 B
Python
35 lines
1010 B
Python
from migen.fhdl.std import *
|
|
from migen.bank.description import *
|
|
from migen.bank.eventmanager import *
|
|
|
|
|
|
class Timer(Module, AutoCSR):
|
|
def __init__(self, width=32):
|
|
self._load = CSRStorage(width)
|
|
self._reload = CSRStorage(width)
|
|
self._en = CSRStorage()
|
|
self._update_value = CSR()
|
|
self._value = CSRStatus(width)
|
|
|
|
self.submodules.ev = EventManager()
|
|
self.ev.zero = EventSourceProcess()
|
|
self.ev.finalize()
|
|
|
|
###
|
|
|
|
value = Signal(width)
|
|
self.sync += [
|
|
If(self._en.storage,
|
|
If(value == 0,
|
|
# set reload to 0 to disable reloading
|
|
value.eq(self._reload.storage)
|
|
).Else(
|
|
value.eq(value - 1)
|
|
)
|
|
).Else(
|
|
value.eq(self._load.storage)
|
|
),
|
|
If(self._update_value.re, self._value.status.eq(value))
|
|
]
|
|
self.comb += self.ev.zero.trigger.eq(value != 0)
|