mirror of
https://github.com/enjoy-digital/litex.git
synced 2025-01-04 09:52:26 -05:00
Add timer
This commit is contained in:
parent
8ad251c94c
commit
94245517f2
3 changed files with 37 additions and 3 deletions
|
@ -4,6 +4,7 @@
|
||||||
#define UART_BASE 0xe0000000
|
#define UART_BASE 0xe0000000
|
||||||
#define DFII_BASE 0xe0000800
|
#define DFII_BASE 0xe0000800
|
||||||
#define ID_BASE 0xe0001000
|
#define ID_BASE 0xe0001000
|
||||||
#define MINIMAC_BASE 0xe0001800
|
#define TIMER0_BASE 0xe0001800
|
||||||
|
#define MINIMAC_BASE 0xe0002000
|
||||||
|
|
||||||
#endif /* __CSRBASE_H */
|
#endif /* __CSRBASE_H */
|
||||||
|
|
30
milkymist/timer/__init__.py
Normal file
30
milkymist/timer/__init__.py
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
from migen.fhdl.structure import *
|
||||||
|
from migen.bank.description import *
|
||||||
|
from migen.bank.eventmanager import *
|
||||||
|
from migen.bank import csrgen
|
||||||
|
|
||||||
|
class Timer:
|
||||||
|
def __init__(self, address, width=32):
|
||||||
|
self._en = RegisterField("en")
|
||||||
|
self._value = RegisterField("value", width, access_dev=READ_WRITE)
|
||||||
|
self._reload = RegisterField("reload", width)
|
||||||
|
regs = [self._en, self._value, self._reload]
|
||||||
|
|
||||||
|
self.event = EventSourceLevel()
|
||||||
|
self.events = EventManager(self.event)
|
||||||
|
|
||||||
|
self.bank = csrgen.Bank(regs + self.events.get_registers(), address=address)
|
||||||
|
|
||||||
|
def get_fragment(self):
|
||||||
|
comb = [
|
||||||
|
If(self._value.field.r == 0,
|
||||||
|
self._value.field.w.eq(self._reload.field.r)
|
||||||
|
).Else(
|
||||||
|
self._value.field.w.eq(self._value.field.r - 1)
|
||||||
|
),
|
||||||
|
self._value.field.we.eq(self._en.field.r),
|
||||||
|
self.event.trigger.eq(self._value.field.r != 0)
|
||||||
|
]
|
||||||
|
return Fragment(comb) \
|
||||||
|
+ self.events.get_fragment() \
|
||||||
|
+ self.bank.get_fragment()
|
7
top.py
7
top.py
|
@ -5,7 +5,7 @@ from migen.fhdl.structure import *
|
||||||
from migen.fhdl import verilog, autofragment
|
from migen.fhdl import verilog, autofragment
|
||||||
from migen.bus import wishbone, wishbone2asmi, csr, wishbone2csr, dfi
|
from migen.bus import wishbone, wishbone2asmi, csr, wishbone2csr, dfi
|
||||||
|
|
||||||
from milkymist import m1crg, lm32, norflash, uart, sram, s6ddrphy, dfii, asmicon, identifier, minimac3
|
from milkymist import m1crg, lm32, norflash, uart, sram, s6ddrphy, dfii, asmicon, identifier, timer, minimac3
|
||||||
from cmacros import get_macros
|
from cmacros import get_macros
|
||||||
from constraints import Constraints
|
from constraints import Constraints
|
||||||
|
|
||||||
|
@ -117,10 +117,12 @@ def get():
|
||||||
#
|
#
|
||||||
uart0 = uart.UART(csr_offset("UART"), clk_freq, baud=115200)
|
uart0 = uart.UART(csr_offset("UART"), clk_freq, baud=115200)
|
||||||
identifier0 = identifier.Identifier(csr_offset("ID"), 0x4D31, version)
|
identifier0 = identifier.Identifier(csr_offset("ID"), 0x4D31, version)
|
||||||
|
timer0 = timer.Timer(csr_offset("TIMER0"))
|
||||||
csrcon0 = csr.Interconnect(wishbone2csr0.csr, [
|
csrcon0 = csr.Interconnect(wishbone2csr0.csr, [
|
||||||
uart0.bank.interface,
|
uart0.bank.interface,
|
||||||
dfii0.bank.interface,
|
dfii0.bank.interface,
|
||||||
identifier0.bank.interface,
|
identifier0.bank.interface,
|
||||||
|
timer0.bank.interface,
|
||||||
minimac0.bank.interface
|
minimac0.bank.interface
|
||||||
])
|
])
|
||||||
|
|
||||||
|
@ -129,7 +131,8 @@ def get():
|
||||||
#
|
#
|
||||||
interrupts = Fragment([
|
interrupts = Fragment([
|
||||||
cpu0.interrupt[0].eq(uart0.events.irq),
|
cpu0.interrupt[0].eq(uart0.events.irq),
|
||||||
cpu0.interrupt[1].eq(minimac0.events.irq)
|
cpu0.interrupt[1].eq(timer0.events.irq),
|
||||||
|
cpu0.interrupt[2].eq(minimac0.events.irq)
|
||||||
])
|
])
|
||||||
|
|
||||||
#
|
#
|
||||||
|
|
Loading…
Reference in a new issue