def __init__(self, **kwargs):
        VirtualMiniSoC.__init__(self,
                                ethmac_nrxslots=4,
                                ethmac_ntxslots=4,
                                **kwargs)
        AMPSoC.__init__(self)
        add_identifier(self)
        self.config["HAS_DDS"] = None
        self.clock_domains.rtio = ClockDomain()
        self.comb += self.rtio.clk.eq(ClockSignal("sys"))

        self.submodules.rtio_tsc = rtio.TSC("async", glbl_fine_ts_width=3)
Exemple #2
0
 def add_rtio(self, top, rtio_channels):
     #self.submodules.rtio_crg = _RTIOCRG(self.platform, self.crg.cd_sys.clk)
     #self.csr_devices.append("rtio_crg")
     #self.config["HAS_RTIO_CLOCK_SWITCH"] = None
     top.submodules.rtio_tsc = rtio.TSC("sync", glbl_fine_ts_width=3)
     top.submodules.rtio_core = rtio.Core(top.rtio_tsc,
                                          rtio_channels,
                                          lane_count=2)
     #self.submodules.rtio_core = rtio.Core(rtio_channels)
     top.csr_devices.append("rtio_core")
     top.submodules.rtio = rtio.KernelInitiator(top.rtio_tsc)
     #self.submodules.rtio_dma = ClockDomainsRenamer("sys_kernel")(
     #    rtio.DMA(self.get_native_sdram_if()))
     #self.register_kernel_cpu_csrdevice("rtio")
     #self.register_kernel_cpu_csrdevice("rtio_dma")
     top.submodules.cri_con = rtio.CRIInterconnectShared(
         [top.rtio.cri],  #self.rtio_dma.cri],
         [top.rtio_core.cri])
     #self.register_kernel_cpu_csrdevice("cri_con")
     top.submodules.rtio_moninj = rtio.MonInj(rtio_channels)
     top.csr_devices.append("rtio_moninj")
Exemple #3
0
    def __init__(self, gateware_identifier_str=None, **kwargs):
        MiniSoC.__init__(self,
                         cpu_type="vexriscv",
                         sdram_controller_type="minicon",
                         l2_size=128*1024,
                         integrated_sram_size=8192,
                         ethmac_nrxslots=4,
                         ethmac_ntxslots=4,
                         **kwargs)
        AMPSoC.__init__(self)
        add_identifier(self, gateware_identifier_str=gateware_identifier_str)

        if isinstance(self.platform.toolchain, XilinxVivadoToolchain):
            self.platform.toolchain.bitstream_commands.extend([
                "set_property BITSTREAM.GENERAL.COMPRESS True [current_design]",
            ])
        if isinstance(self.platform.toolchain, XilinxISEToolchain):
            self.platform.toolchain.bitgen_opt += " -g compress"

        platform = self.platform
        platform.add_extension(_reprogrammed3v3_io)
        platform.add_extension(_ams101_dac)

        self.comb += platform.request("sfp_tx_disable_n_33").eq(1)
        data_pads = [
            platform.request("sfp"), platform.request("user_sma_mgt")
        ]

        # 1000BASE_BX10 Ethernet compatible, 125MHz RTIO clock
        self.submodules.drtio_transceiver = gtx_7series.GTX(
            clock_pads=platform.request("si5324_clkout"),
            pads=data_pads,
            sys_clk_freq=self.clk_freq)
        self.csr_devices.append("drtio_transceiver")

        self.submodules.rtio_tsc = rtio.TSC("async", glbl_fine_ts_width=3)

        drtio_csr_group = []
        drtioaux_csr_group = []
        drtioaux_memory_group = []
        self.drtio_cri = []
        for i in range(len(self.drtio_transceiver.channels)):
            core_name = "drtio" + str(i)
            coreaux_name = "drtioaux" + str(i)
            memory_name = "drtioaux" + str(i) + "_mem"
            drtio_csr_group.append(core_name)
            drtioaux_csr_group.append(coreaux_name)
            drtioaux_memory_group.append(memory_name)

            cdr = ClockDomainsRenamer({"rtio_rx": "rtio_rx" + str(i)})

            core = cdr(DRTIOMaster(
                self.rtio_tsc, self.drtio_transceiver.channels[i]))
            setattr(self.submodules, core_name, core)
            self.drtio_cri.append(core.cri)
            self.csr_devices.append(core_name)

            coreaux = cdr(DRTIOAuxController(core.link_layer))
            setattr(self.submodules, coreaux_name, coreaux)
            self.csr_devices.append(coreaux_name)

            memory_address = self.mem_map["drtioaux"] + 0x800*i
            self.add_wb_slave(memory_address, 0x800,
                              coreaux.bus)
            self.add_memory_region(memory_name, memory_address | self.shadow_base, 0x800)
        self.config["HAS_DRTIO"] = None
        self.config["HAS_DRTIO_ROUTING"] = None
        self.add_csr_group("drtio", drtio_csr_group)
        self.add_csr_group("drtioaux", drtioaux_csr_group)
        self.add_memory_group("drtioaux_mem", drtioaux_memory_group)

        self.config["RTIO_FREQUENCY"] = str(self.drtio_transceiver.rtio_clk_freq/1e6)
        self.submodules.si5324_rst_n = gpio.GPIOOut(platform.request("si5324_33").rst_n)
        self.csr_devices.append("si5324_rst_n")
        i2c = self.platform.request("i2c")
        self.submodules.i2c = gpio.GPIOTristate([i2c.scl, i2c.sda])
        self.csr_devices.append("i2c")
        self.config["I2C_BUS_COUNT"] = 1
        self.config["HAS_SI5324"] = None
        self.config["SI5324_AS_SYNTHESIZER"] = None

        self.comb += [
            platform.request("user_sma_clock_p").eq(ClockSignal("rtio_rx0")),
            platform.request("user_sma_clock_n").eq(ClockSignal("rtio"))
        ]

        rtio_clk_period = 1e9/self.drtio_transceiver.rtio_clk_freq
        # Constrain TX & RX timing for the first transceiver channel
        # (First channel acts as master for phase alignment for all channels' TX)
        gtx0 = self.drtio_transceiver.gtxs[0]
        platform.add_period_constraint(gtx0.txoutclk, rtio_clk_period)
        platform.add_period_constraint(gtx0.rxoutclk, rtio_clk_period)
        platform.add_false_path_constraints(
            self.crg.cd_sys.clk,
            gtx0.txoutclk, gtx0.rxoutclk)
        # Constrain RX timing for the each transceiver channel
        # (Each channel performs single-lane phase alignment for RX)
        for gtx in self.drtio_transceiver.gtxs[1:]:
            platform.add_period_constraint(gtx.rxoutclk, rtio_clk_period)
            platform.add_false_path_constraints(
                self.crg.cd_sys.clk, gtx0.txoutclk, gtx.rxoutclk)

        self.submodules.rtio_crg = _RTIOClockMultiplier(self.drtio_transceiver.rtio_clk_freq)
        self.csr_devices.append("rtio_crg")
        fix_serdes_timing_path(platform)