artiq/artiq/gateware/drtio/rt_controller_repeater.py

43 lines
1.4 KiB
Python

from migen import *
from misoc.interconnect.csr import *
from artiq.gateware.rtio.cdc import BlindTransfer
class RTController(Module, AutoCSR):
def __init__(self, rt_packet):
self.set_time = CSR()
self.protocol_error = CSR(4)
set_time_stb = Signal()
set_time_ack = Signal()
self.submodules += CrossDomainRequest("rtio",
set_time_stb, set_time_ack, None,
rt_packet.set_time_stb, rt_packet.set_time_ack, None)
self.sync += [
If(set_time_ack, set_time_stb.eq(0)),
If(self.set_time.re, set_time_stb.eq(1))
]
self.comb += self.set_time.w.eq(set_time_stb)
errors = [
(rt_packet.err_unknown_packet_type, "rtio_rx"),
(rt_packet.err_packet_truncated, "rtio_rx"),
(rt_packet.err_command_missed, "rtio"),
(rt_packet.err_buffer_space_timeout, "rtio")
]
for n, (err_i, err_cd) in enumerate(errors):
xfer = BlindTransfer(err_cd, "sys")
self.submodules += xfer
self.comb += xfer.i.eq(err_i)
err_pending = Signal()
self.sync += [
If(self.protocol_error.re & self.protocol_error.r[n], err_pending.eq(0)),
If(xfer.o, err_pending.eq(1))
]
self.comb += self.protocol_error.w[n].eq(err_pending)