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

spinal.lib.bus.amba3.ahblite.AhbLite3ToApb3Bridge.scala Maven / Gradle / Ivy

package spinal.lib.bus.amba3.ahblite

import spinal.core._
import spinal.lib._
import spinal.lib.bus.amba3.apb._


object AhbLite3ToApb3BridgePhase extends SpinalEnum{
  val IDLE,SETUP,ACCESS = newElement
}

case class AhbLite3ToApb3Bridge(ahbConfig: AhbLite3Config,apbConfig: Apb3Config) extends Component{
  assert(ahbConfig.addressWidth >= apbConfig.addressWidth)
  assert(ahbConfig.dataWidth == apbConfig.dataWidth)
  assert(apbConfig.selWidth == 1)
  import AhbLite3ToApb3BridgePhase._

  val io = new Bundle{
    val ahb = slave(AhbLite3(ahbConfig))
    val apb = master(Apb3(apbConfig))
  }

  val phase = RegInit(IDLE)
  val write = Reg(Bool)
  val address = Reg(ahbConfig.addressType)
  val readedData = Reg(ahbConfig.dataType)

  switch(phase){
    is(IDLE){
      io.apb.PSEL    := "0"
      io.apb.PENABLE := False
      io.ahb.HREADYOUT := True

      when(io.ahb.HSEL && io.ahb.HTRANS(1) && io.ahb.HREADY){
        phase := SETUP
        address := io.ahb.HADDR
        write := io.ahb.HWRITE
      }
    }
    is(SETUP){
      io.apb.PSEL    := "1"
      io.apb.PENABLE := False
      io.ahb.HREADYOUT := False
      phase := ACCESS
    }
    default{ //is(ACCESS)
      io.apb.PSEL    := "1"
      io.apb.PENABLE := True
      io.ahb.HREADYOUT := False

      when(io.apb.PREADY){
        readedData := io.apb.PRDATA
        phase := IDLE
      }
    }
  }

  io.apb.PADDR  := address.resized
  io.ahb.HRDATA := readedData
  io.apb.PWDATA := io.ahb.HWDATA
  io.apb.PWRITE := write
  io.ahb.HRESP := io.apb.PSLVERROR
}


object AhbLite3ToApb3Bridge{
  def main(args: Array[String]) {
    SpinalVhdl(AhbLite3ToApb3Bridge(AhbLite3Config(16,32),Apb3Config(16,32)))
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy