device pins: Create classes that can be something other than a Pin subclass
This commit is contained in:
		| @@ -6,13 +6,18 @@ import chisel3.experimental.{withClockAndReset} | ||||
| import freechips.rocketchip.util.SyncResetSynchronizerShiftReg | ||||
| import sifive.blocks.devices.pinctrl.{Pin, PinCtrl} | ||||
|  | ||||
| class I2CPins[T <: Pin](pingen: () => T) extends Bundle { | ||||
| class I2CSignals[T <: Data](pingen: () => T) extends Bundle { | ||||
|  | ||||
|   val scl: T = pingen() | ||||
|   val sda: T = pingen() | ||||
|  | ||||
|   override def cloneType: this.type = | ||||
|     this.getClass.getConstructors.head.newInstance(pingen).asInstanceOf[this.type] | ||||
| } | ||||
|  | ||||
| class I2CPins[T <: Pin](pingen: () => T) extends I2CSignals[T](pingen) { | ||||
|   override def cloneType: this.type = | ||||
|     this.getClass.getConstructors.head.newInstance(pingen).asInstanceOf[this.type] | ||||
|  | ||||
|   def fromPort(i2c: I2CPort, clock: Clock, reset: Bool, syncStages: Int = 0) = { | ||||
|     withClockAndReset(clock, reset) { | ||||
|   | ||||
| @@ -13,10 +13,17 @@ class PWMPortIO(val c: PWMParams) extends Bundle { | ||||
|   override def cloneType: this.type = new PWMPortIO(c).asInstanceOf[this.type] | ||||
| } | ||||
|  | ||||
| class PWMPins[T <: Pin] (pingen: ()=> T, val c: PWMParams) extends Bundle { | ||||
| class PWMSignals[T <: Data] (pingen: ()=> T, val c: PWMParams) extends Bundle { | ||||
|  | ||||
|   val pwm: Vec[T] = Vec(c.ncmp, pingen()) | ||||
|  | ||||
|   override def cloneType: this.type = | ||||
|     this.getClass.getConstructors.head.newInstance(pingen, c).asInstanceOf[this.type] | ||||
| } | ||||
|  | ||||
|  | ||||
| class PWMPins[T <: Pin] (pingen: ()=> T, val c: PWMParams) extends PWMSignals[T](pingen, c) { | ||||
|  | ||||
|   override def cloneType: this.type = | ||||
|     this.getClass.getConstructors.head.newInstance(pingen, c).asInstanceOf[this.type] | ||||
|  | ||||
|   | ||||
| @@ -4,10 +4,8 @@ package sifive.blocks.devices.uart | ||||
| import Chisel._ | ||||
| import chisel3.experimental.{withClockAndReset} | ||||
| import freechips.rocketchip.config.Field | ||||
| import freechips.rocketchip.util.SyncResetSynchronizerShiftReg | ||||
| import freechips.rocketchip.coreplex.{HasPeripheryBus, PeripheryBusKey, HasInterruptBus} | ||||
| import freechips.rocketchip.diplomacy.{LazyModule, LazyMultiIOModuleImp} | ||||
| import sifive.blocks.devices.pinctrl.{Pin} | ||||
|  | ||||
| case object PeripheryUARTKey extends Field[Seq[UARTParams]] | ||||
|  | ||||
| @@ -39,20 +37,3 @@ trait HasPeripheryUARTModuleImp extends LazyMultiIOModuleImp with HasPeripheryUA | ||||
|     io <> device.module.io.port | ||||
|   } | ||||
| } | ||||
|  | ||||
| class UARTPins[T <: Pin] (pingen: () => T) extends Bundle { | ||||
|   val rxd = pingen() | ||||
|   val txd = pingen() | ||||
|  | ||||
|   override def cloneType: this.type = | ||||
|     this.getClass.getConstructors.head.newInstance(pingen).asInstanceOf[this.type] | ||||
|  | ||||
|   def fromPort(uart: UARTPortIO, clock: Clock, reset: Bool, syncStages: Int = 0) { | ||||
|     withClockAndReset(clock, reset) { | ||||
|       txd.outputPin(uart.txd) | ||||
|       val rxd_t = rxd.inputPin() | ||||
|       uart.rxd := SyncResetSynchronizerShiftReg(rxd_t, syncStages, init = Bool(true), name = Some("uart_rxd_sync")) | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
|   | ||||
							
								
								
									
										33
									
								
								src/main/scala/devices/uart/UARTPins.scala
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								src/main/scala/devices/uart/UARTPins.scala
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,33 @@ | ||||
| // See LICENSE for license details. | ||||
| package sifive.blocks.devices.uart | ||||
|  | ||||
| import Chisel._ | ||||
| import chisel3.experimental.{withClockAndReset} | ||||
| import freechips.rocketchip.config.Field | ||||
| import freechips.rocketchip.util.SyncResetSynchronizerShiftReg | ||||
| import freechips.rocketchip.coreplex.{HasPeripheryBus, PeripheryBusKey, HasInterruptBus} | ||||
| import freechips.rocketchip.diplomacy.{LazyModule, LazyMultiIOModuleImp} | ||||
| import sifive.blocks.devices.pinctrl.{Pin} | ||||
|  | ||||
|  | ||||
| class UARTSignals[T <: Data] (pingen: () => T) extends Bundle { | ||||
|   val rxd = pingen() | ||||
|   val txd = pingen() | ||||
|  | ||||
|   override def cloneType: this.type = | ||||
|     this.getClass.getConstructors.head.newInstance(pingen).asInstanceOf[this.type] | ||||
| } | ||||
|  | ||||
| class UARTPins[T <: Pin] (pingen: () => T) extends UARTSignals[T](pingen, c) { | ||||
|   override def cloneType: this.type = | ||||
|     this.getClass.getConstructors.head.newInstance(pingen).asInstanceOf[this.type] | ||||
|  | ||||
|   def fromPort(uart: UARTPortIO, clock: Clock, reset: Bool, syncStages: Int = 0) { | ||||
|     withClockAndReset(clock, reset) { | ||||
|       txd.outputPin(uart.txd) | ||||
|       val rxd_t = rxd.inputPin() | ||||
|       uart.rxd := SyncResetSynchronizerShiftReg(rxd_t, syncStages, init = Bool(true), name = Some("uart_rxd_sync")) | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
		Reference in New Issue
	
	Block a user