2021-08-11 20:34:44 +08:00
|
|
|
"""Auxiliary controller, common to satellite and master"""
|
|
|
|
|
2021-08-18 18:36:17 +08:00
|
|
|
from artiq.gateware.drtio.aux_controller import Transmitter, Receiver
|
2021-08-11 20:34:44 +08:00
|
|
|
from migen.fhdl.simplify import FullMemoryWE
|
|
|
|
from misoc.interconnect.csr import *
|
2021-08-18 18:36:17 +08:00
|
|
|
from migen_axi.interconnect.sram import SRAM
|
2021-08-11 20:34:44 +08:00
|
|
|
from migen_axi.interconnect import axi
|
|
|
|
|
|
|
|
max_packet = 1024
|
|
|
|
|
2021-08-13 19:06:10 +08:00
|
|
|
|
2021-08-11 20:34:44 +08:00
|
|
|
# TODO: FullMemoryWE should be applied by migen.build
|
|
|
|
@FullMemoryWE()
|
2021-08-17 19:16:02 +08:00
|
|
|
class DRTIOAuxControllerAxi(Module):
|
2021-08-11 20:34:44 +08:00
|
|
|
def __init__(self, link_layer):
|
|
|
|
self.bus = axi.Interface()
|
2021-08-13 19:06:10 +08:00
|
|
|
self.submodules.transmitter = Transmitter(link_layer, len(self.bus.w.data))
|
|
|
|
self.submodules.receiver = Receiver(link_layer, len(self.bus.w.data))
|
2021-08-11 20:34:44 +08:00
|
|
|
|
2021-08-13 19:06:10 +08:00
|
|
|
# probably will need to make axi.SRAM based on wb code
|
|
|
|
tx_sdram_if = SRAM(self.transmitter.mem, read_only=False)
|
|
|
|
rx_sdram_if = SRAM(self.receiver.mem, read_only=True)
|
2021-08-17 19:16:02 +08:00
|
|
|
wsb = log2_int(len(self.bus.w.data)//8)
|
2021-08-20 21:13:56 +08:00
|
|
|
aw_decoder = axi.AddressDecoder(self.bus.aw,
|
|
|
|
[(lambda a: a[log2_int(max_packet)-wsb] == 0, tx_sdram_if.bus.aw),
|
|
|
|
(lambda a: a[log2_int(max_packet)-wsb] == 1, rx_sdram_if.bus.aw)],
|
2021-08-11 20:34:44 +08:00
|
|
|
register=True)
|
2021-08-20 21:13:56 +08:00
|
|
|
ar_decoder = axi.AddressDecoder(self.bus.ar,
|
|
|
|
[(lambda a: a[log2_int(max_packet)-wsb] == 0, tx_sdram_if.bus.ar),
|
|
|
|
(lambda a: a[log2_int(max_packet)-wsb] == 1, rx_sdram_if.bus.ar)],
|
|
|
|
register=True)
|
|
|
|
self.submodules += tx_sdram_if, rx_sdram_if, aw_decoder, ar_decoder
|
2021-08-11 20:34:44 +08:00
|
|
|
|
|
|
|
def get_csrs(self):
|
|
|
|
return self.transmitter.get_csrs() + self.receiver.get_csrs()
|