devices: create periphery keys for all devices
Standardize how they are connected to the periphery bus
This commit is contained in:
committed by
Henry Cook
parent
03be9aba67
commit
baccd5ada2
@ -3,9 +3,8 @@ package sifive.blocks.devices.pwm
|
||||
|
||||
import Chisel._
|
||||
import Chisel.ImplicitConversions._
|
||||
import config._
|
||||
import config.Parameters
|
||||
import regmapper._
|
||||
import rocketchip.PeripheryBusConfig
|
||||
import uncore.tilelink2._
|
||||
import util._
|
||||
|
||||
@ -13,7 +12,7 @@ import sifive.blocks.util.GenericTimer
|
||||
|
||||
// Core PWM Functionality & Register Interface
|
||||
|
||||
class PWM(val ncmp: Int = 4, val cmpWidth: Int = 16)(implicit p: Parameters) extends GenericTimer {
|
||||
class PWM(val ncmp: Int = 4, val cmpWidth: Int = 16) extends GenericTimer {
|
||||
protected def countWidth = ((1 << scaleWidth) - 1) + cmpWidth
|
||||
protected lazy val countAlways = RegEnable(io.regs.cfg.write.bits(12), Bool(false), io.regs.cfg.write.valid && unlocked)
|
||||
protected lazy val feed = count.carryOut(scale + UInt(cmpWidth))
|
||||
@ -38,35 +37,31 @@ class PWM(val ncmp: Int = 4, val cmpWidth: Int = 16)(implicit p: Parameters) ext
|
||||
countEn := countAlways || oneShot
|
||||
}
|
||||
|
||||
case class PWMConfig(
|
||||
case class PWMParams(
|
||||
address: BigInt,
|
||||
size: Int = 0x1000,
|
||||
regBytes: Int = 4,
|
||||
ncmp: Int = 4,
|
||||
cmpWidth: Int = 16)
|
||||
|
||||
trait HasPWMParameters {
|
||||
implicit val p: Parameters
|
||||
val params: PWMConfig
|
||||
val c = params
|
||||
trait HasPWMBundleContents extends Bundle {
|
||||
val params: PWMParams
|
||||
val gpio = Vec(params.ncmp, Bool()).asOutput
|
||||
}
|
||||
|
||||
trait PWMBundle extends Bundle with HasPWMParameters {
|
||||
val gpio = Vec(c.ncmp, Bool()).asOutput
|
||||
}
|
||||
trait HasPWMModuleContents extends Module with HasRegMap {
|
||||
val io: HasPWMBundleContents
|
||||
val params: PWMParams
|
||||
|
||||
trait PWMModule extends Module with HasRegMap with HasPWMParameters {
|
||||
val io: PWMBundle
|
||||
|
||||
val pwm = Module(new PWM(c.ncmp, c.cmpWidth))
|
||||
val pwm = Module(new PWM(params.ncmp, params.cmpWidth))
|
||||
|
||||
interrupts := pwm.io.ip
|
||||
io.gpio := pwm.io.gpio
|
||||
|
||||
regmap((GenericTimer.timerRegMap(pwm, 0, c.regBytes)):_*)
|
||||
regmap((GenericTimer.timerRegMap(pwm, 0, params.regBytes)):_*)
|
||||
}
|
||||
|
||||
class TLPWM(c: PWMConfig)(implicit p: Parameters)
|
||||
extends TLRegisterRouter(c.address, interrupts = c.ncmp, size = c.size, beatBytes = p(PeripheryBusConfig).beatBytes)(
|
||||
new TLRegBundle(c, _) with PWMBundle)(
|
||||
new TLRegModule(c, _, _) with PWMModule)
|
||||
class TLPWM(w: Int, c: PWMParams)(implicit p: Parameters)
|
||||
extends TLRegisterRouter(c.address, interrupts = c.ncmp, size = c.size, beatBytes = w)(
|
||||
new TLRegBundle(c, _) with HasPWMBundleContents)(
|
||||
new TLRegModule(c, _, _) with HasPWMModuleContents)
|
||||
|
@ -2,24 +2,28 @@
|
||||
package sifive.blocks.devices.pwm
|
||||
|
||||
import Chisel._
|
||||
import config._
|
||||
import config.Field
|
||||
import diplomacy.LazyModule
|
||||
import rocketchip.{TopNetwork,TopNetworkModule}
|
||||
import rocketchip.{
|
||||
HasTopLevelNetworks,
|
||||
HasTopLevelNetworksBundle,
|
||||
HasTopLevelNetworksModule
|
||||
}
|
||||
import uncore.tilelink2.TLFragmenter
|
||||
import util.HeterogeneousBag
|
||||
|
||||
import sifive.blocks.devices.gpio._
|
||||
|
||||
class PWMPortIO(c: PWMConfig)(implicit p: Parameters) extends Bundle {
|
||||
class PWMPortIO(c: PWMParams) extends Bundle {
|
||||
val port = Vec(c.ncmp, Bool()).asOutput
|
||||
override def cloneType: this.type = new PWMPortIO(c).asInstanceOf[this.type]
|
||||
}
|
||||
|
||||
class PWMPinsIO(c: PWMConfig)(implicit p: Parameters) extends Bundle {
|
||||
class PWMPinsIO(c: PWMParams) extends Bundle {
|
||||
val pwm = Vec(c.ncmp, new GPIOPin)
|
||||
}
|
||||
|
||||
class PWMGPIOPort(c: PWMConfig)(implicit p: Parameters) extends Module {
|
||||
class PWMGPIOPort(c: PWMParams) extends Module {
|
||||
val io = new Bundle {
|
||||
val pwm = new PWMPortIO(c).flip()
|
||||
val pins = new PWMPinsIO(c)
|
||||
@ -28,31 +32,28 @@ class PWMGPIOPort(c: PWMConfig)(implicit p: Parameters) extends Module {
|
||||
GPIOOutputPinCtrl(io.pins.pwm, io.pwm.port.asUInt)
|
||||
}
|
||||
|
||||
trait PeripheryPWM {
|
||||
this: TopNetwork { val pwmConfigs: Seq[PWMConfig] } =>
|
||||
case object PeripheryPWMKey extends Field[Seq[PWMParams]]
|
||||
|
||||
val pwm = (pwmConfigs.zipWithIndex) map { case (c, i) =>
|
||||
val pwm = LazyModule(new TLPWM(c))
|
||||
pwm.node := TLFragmenter(peripheryBusConfig.beatBytes, cacheBlockBytes)(peripheryBus.node)
|
||||
trait HasPeripheryPWM extends HasTopLevelNetworks {
|
||||
val pwmParams = p(PeripheryPWMKey)
|
||||
val pwms = pwmParams map { params =>
|
||||
val pwm = LazyModule(new TLPWM(peripheryBusBytes, params))
|
||||
pwm.node := TLFragmenter(peripheryBusBytes, cacheBlockBytes)(peripheryBus.node)
|
||||
intBus.intnode := pwm.intnode
|
||||
pwm
|
||||
}
|
||||
}
|
||||
|
||||
trait PeripheryPWMBundle {
|
||||
this: {
|
||||
val p: Parameters
|
||||
val pwmConfigs: Seq[PWMConfig]
|
||||
} =>
|
||||
val pwms = HeterogeneousBag(pwmConfigs.map(new PWMPortIO(_)(p)))
|
||||
trait HasPeripheryPWMBundle extends HasTopLevelNetworksBundle {
|
||||
val outer: HasPeripheryPWM
|
||||
val pwms = HeterogeneousBag(outer.pwmParams.map(new PWMPortIO(_)))
|
||||
}
|
||||
|
||||
trait PeripheryPWMModule {
|
||||
this: TopNetworkModule {
|
||||
val outer: PeripheryPWM
|
||||
val io: PeripheryPWMBundle
|
||||
} =>
|
||||
(io.pwms.zipWithIndex zip outer.pwm) foreach { case ((io, i), device) =>
|
||||
trait HasPeripheryPWMModule extends HasTopLevelNetworksModule {
|
||||
val outer: HasPeripheryPWM
|
||||
val io: HasPeripheryPWMBundle
|
||||
|
||||
(io.pwms zip outer.pwms) foreach { case (io, device) =>
|
||||
io.port := device.module.io.gpio
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user