All Downloads are FREE. Search and download functionalities are using the official Maven repository.

spinal.lib.com.spi.xdr.TilelinkSpiXdrMasterCtrl.scala Maven / Gradle / Ivy

package spinal.lib.com.spi.xdr

import spinal.core._
import spinal.core.fiber.Fiber
import spinal.lib._
import spinal.lib.bus.tilelink._
import spinal.lib.com.spi.ddr.{SpiXdrMaster, SpiXdrMasterCtrl}
import spinal.lib.misc.InterruptNode


object TilelinkSpiXdrMasterCtrl{
  def getSupported(proposed: M2sSupport) = SlaveFactory.getSupported(
    addressWidth = addressWidth,
    dataWidth = 32,
    allowBurst = false,
    proposed = proposed
  )

  def addressWidth = 12
}


case class TilelinkSpiXdrMasterCtrl(p : SpiXdrMasterCtrl.MemoryMappingParameters, ctrlParameter : BusParameter) extends Component{
  val io = new Bundle {
    val ctrl = slave(Bus(ctrlParameter))
    val xip = ifGen(p.xip != null) (slave(SpiXdrMasterCtrl.XipBus(p.xip)))
    val spi = master(SpiXdrMaster(p.ctrl.spi))
    val interrupt = out Bool()
  }

  val ctrl = SpiXdrMasterCtrl(p.ctrl)
  val factory = new SlaveFactory(io.ctrl, false)
  val mapping = SpiXdrMasterCtrl.driveFrom(ctrl, factory)(p)
  if(p.xip != null) io.xip <> mapping.xip.xipBus
  io.spi <> ctrl.io.spi
  io.interrupt <> mapping.interruptCtrl.interrupt
}


case class TilelinkSpiXdrMasterFiber(param : SpiXdrMasterCtrl.MemoryMappingParameters) extends Area{
  val ctrl = fabric.Node.up()
  val interrupt = InterruptNode.master()

  val logic = Fiber build new Area{
    ctrl.m2s.supported.load(TilelinkSpiXdrMasterCtrl.getSupported(ctrl.m2s.proposed))
    ctrl.s2m.none()

    val core = TilelinkSpiXdrMasterCtrl(param, ctrl.bus.p)
    core.io.ctrl <> ctrl.bus
    core.io.interrupt <> interrupt.flag
    val spi = core.io.spi.toIo
  }
}





© 2015 - 2025 Weber Informatics LLC | Privacy Policy