rtio: use Record

This commit is contained in:
Sebastien Bourdeauducq 2014-11-30 00:59:39 +08:00
parent 901073acf3
commit 9aafe89518
1 changed files with 12 additions and 15 deletions

View File

@ -2,6 +2,7 @@ from fractions import Fraction
from migen.fhdl.std import * from migen.fhdl.std import *
from migen.bank.description import * from migen.bank.description import *
from migen.genlib.record import Record
from migen.genlib.cdc import * from migen.genlib.cdc import *
from migen.genlib.fifo import AsyncFIFO from migen.genlib.fifo import AsyncFIFO
from migen.genlib.resetsync import AsyncResetSynchronizer from migen.genlib.resetsync import AsyncResetSynchronizer
@ -98,29 +99,25 @@ class _RTIOBankO(Module):
signal_underflow = Signal() signal_underflow = Signal()
fifos = [] fifos = []
fifo_layout = [("timestamp", counter.width + fine_ts_width), ev_layout = [("timestamp", counter.width + fine_ts_width),
("value", 2)] ("value", 2)]
for n, chif in enumerate(rbus): for n, chif in enumerate(rbus):
# FIFO # FIFO
fifo = RenameClockDomains(AsyncFIFO(fifo_layout, fifo_depth), fifo = RenameClockDomains(AsyncFIFO(ev_layout, fifo_depth),
{"write": "rsys", "read": "rio"}) {"write": "rsys", "read": "rio"})
self.submodules += fifo self.submodules += fifo
fifos.append(fifo) fifos.append(fifo)
# Buffer # Buffer
buf_valid = Signal() buf_valid = Signal()
buf_timestamp = Signal(counter.width + fine_ts_width) buf = Record(ev_layout)
buf_value = Signal(2)
buf_just_written = Signal() buf_just_written = Signal()
# Buffer read and FIFO write # Buffer read and FIFO write
self.comb += [ self.comb += fifo.din.eq(buf)
fifo.din.timestamp.eq(buf_timestamp),
fifo.din.value.eq(buf_value)
]
in_guard_time = Signal() in_guard_time = Signal()
self.comb += in_guard_time.eq( self.comb += in_guard_time.eq(
buf_timestamp[fine_ts_width:] < counter.o_value_sys + guard_io_cycles) buf.timestamp[fine_ts_width:] < counter.o_value_sys + guard_io_cycles)
self.sync.rsys += If(in_guard_time, buf_valid.eq(0)) self.sync.rsys += If(in_guard_time, buf_valid.eq(0))
self.comb += \ self.comb += \
If(buf_valid, If(buf_valid,
@ -143,8 +140,8 @@ class _RTIOBankO(Module):
# on underflows, which will be correctly reported. # on underflows, which will be correctly reported.
buf_just_written.eq(1), buf_just_written.eq(1),
buf_valid.eq(1), buf_valid.eq(1),
buf_timestamp.eq(self.timestamp), buf.timestamp.eq(self.timestamp),
buf_value.eq(self.value) buf.value.eq(self.value)
) )
] ]
@ -186,7 +183,7 @@ class _RTIOBankI(Module):
readables = [] readables = []
overflows = [] overflows = []
pileup_counts = [] pileup_counts = []
fifo_layout = [("timestamp", counter.width+fine_ts_width), ev_layout = [("timestamp", counter.width+fine_ts_width),
("value", 1)] ("value", 1)]
for n, chif in enumerate(rbus): for n, chif in enumerate(rbus):
if hasattr(chif, "oe"): if hasattr(chif, "oe"):
@ -194,7 +191,7 @@ class _RTIOBankI(Module):
self.sync.rio += If(~chif.oe & chif.o_stb, self.sync.rio += If(~chif.oe & chif.o_stb,
sensitivity.eq(chif.o_value)) sensitivity.eq(chif.o_value))
fifo = RenameClockDomains(AsyncFIFO(fifo_layout, fifo_depth), fifo = RenameClockDomains(AsyncFIFO(ev_layout, fifo_depth),
{"read": "rsys", "write": "rio"}) {"read": "rsys", "write": "rio"})
self.submodules += fifo self.submodules += fifo