Introduction

The AMBA3-APB bus is commonly used to interface low bandwidth peripherals.

Configuration and instanciation

First each time you want to create a APB3 bus, you will need a configuration object. This configuration object is an Apb3Config and has following arguments :

Parameter name Type Default Description
addressWidth Int - Width of PADDR (byte granularity)
dataWidth Int - Width of PWDATA and PRDATA
selWidth Int 1 With of PSEL
useSlaveError Boolean false Specify the presence of PSLVERROR

There is in short how the APB3 bus is defined in the SpinalHDL library :

case class Apb3(config: Apb3Config) extends Bundle with IMasterSlave {
  val PADDR      = UInt(config.addressWidth bit)
  val PSEL       = Bits(config.selWidth bits)
  val PENABLE    = Bool
  val PREADY     = Bool
  val PWRITE     = Bool
  val PWDATA     = Bits(config.dataWidth bit)
  val PRDATA     = Bits(config.dataWidth bit)
  val PSLVERROR  = if(config.useSlaveError) Bool else null
  //...
}

There is a short example of usage :

val apbConfig = Apb3Config(
  addressWidth = 12,
  dataWidth    = 32
)
val apbX = Apb3(apbConfig)
val apbY = Apb3(apbConfig)

when(apbY.PENABLE){
  //...
}

Functions and operators

Name Return Description
X » Y - Connect X to Y. Address of Y could be smaller than the one of X
X « Y - Do the reverse of the » operator
Tags: