Files
eb001/src/main/scala/backBoard/SpiSlv.scala

86 lines
1.8 KiB
Scala
Raw Normal View History

2023-07-31 22:56:09 +08:00
package BACK
import chisel3._
import chisel3.util._
class CDR_Master_Interface_Bundle extends CDRData{
val op = UInt(2.W)
}
class SpiSlvIO extends Bundle{
val CS = Input(Bool())
val MISO = Output(Bool())
val MOSI = Input(Bool())
val CDRIn = Flipped(Decoupled(new CDRData))
val CDROut = Decoupled(new CDRData)
val interrupt = Output(Bool())
}
class SpiSlv extends Module with RequireAsyncReset{
val io: SpiSlvIO = IO(new SpiSlvIO)
// val spiTrans = Reg( new CDR_Master_Interface_Bundle )
val centReg = RegInit(0.U.asTypeOf(new CDR_Master_Interface_Bundle))
io.CDRIn.ready := io.CS
io.interrupt := false.B
2023-08-01 14:44:05 +08:00
io.MISO := RegNext(centReg.asUInt.extract( 6+8+32+2+16-1 ))
2023-07-31 22:56:09 +08:00
when( ~io.CS ){
2023-08-01 14:44:05 +08:00
centReg := Cat(centReg.asUInt( 6+8+32+2+16-2, 0 ), io.MOSI).asTypeOf(new CDR_Master_Interface_Bundle)
2023-07-31 22:56:09 +08:00
} .otherwise{
when( io.CDROut.fire ){
centReg.op := OPBUSY
}
when( io.CDRIn.valid ){
when( centReg.op === OPBUSY & centReg.address === io.CDRIn.bits.address ){
centReg.address := io.CDRIn.bits.address
centReg.register := io.CDRIn.bits.register
centReg.data := io.CDRIn.bits.data
centReg.hash := 0.U
centReg.op := OPIDLE
} .otherwise{
io.interrupt := true.B
}
}
}
val CDROutValid = RegInit(false.B); io.CDROut.valid := CDROutValid
val CDROutInfo = Reg(new CDRData); io.CDROut.bits := CDROutInfo
when( io.CDROut.fire ){
CDROutValid := false.B
2023-08-01 14:44:05 +08:00
} .elsewhen( io.CS & centReg.op === OPMSTT & ~CDROutValid ){
2023-07-31 22:56:09 +08:00
CDROutValid := true.B
CDROutInfo.address := centReg.address
CDROutInfo.register := centReg.register
CDROutInfo.data := centReg.data
CDROutInfo.hash := 0.U
}
def OPIDLE = 0.U
def OPMSTT = 1.U
// def OPSLVT = 2.U
def OPBUSY = 3.U
}