spi compile pass
This commit is contained in:
57
src/main/scala/backBoard/BackBoardMst.scala
Normal file
57
src/main/scala/backBoard/BackBoardMst.scala
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
package BACK
|
||||||
|
|
||||||
|
import chisel3._
|
||||||
|
import chisel3.util._
|
||||||
|
|
||||||
|
|
||||||
|
class BackBoardMstIO extends Bundle{
|
||||||
|
val downStreamReqDat = Input( Bool() )
|
||||||
|
val downStreamRespdat = Output(Bool())
|
||||||
|
|
||||||
|
val CS = Input(Bool())
|
||||||
|
val MISO = Output(Bool())
|
||||||
|
val MOSI = Input(Bool())
|
||||||
|
val SCK = Input(Bool())
|
||||||
|
|
||||||
|
val interrupt = Output(Bool())
|
||||||
|
|
||||||
|
val clk4 = Input( Bool() )
|
||||||
|
|
||||||
|
val reset = Input(Bool())
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class BackBoardMst extends RawModule{
|
||||||
|
val io: BackBoardMstIO = IO(new BackBoardMstIO)
|
||||||
|
|
||||||
|
withClockAndReset( io.SCK.asClock, io.reset.asAsyncReset ){
|
||||||
|
val spi = Module( new SpiSlv )
|
||||||
|
val in = Module( new CDR4MultiIn )
|
||||||
|
val out = Module( new CDROutBus )
|
||||||
|
|
||||||
|
spi.io.CS := io.CS
|
||||||
|
io.MISO := spi.io.MISO
|
||||||
|
spi.io.MOSI := io.MOSI
|
||||||
|
|
||||||
|
io.interrupt := spi.io.interrupt
|
||||||
|
|
||||||
|
spi.io.CDRIn <> in.io.latDat
|
||||||
|
spi.io.CDROut <> out.io.pkgDat
|
||||||
|
|
||||||
|
in.io.clk4 := io.clk4
|
||||||
|
|
||||||
|
in.io.dat := io.downStreamReqDat
|
||||||
|
io.downStreamRespdat := out.io.dat
|
||||||
|
|
||||||
|
spi.clock := io.SCK.asClock
|
||||||
|
in.clock := io.SCK.asClock
|
||||||
|
out.clock := io.SCK.asClock
|
||||||
|
|
||||||
|
spi.reset := io.reset.asAsyncReset
|
||||||
|
in.reset := io.reset.asAsyncReset
|
||||||
|
out.reset := io.reset.asAsyncReset
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
85
src/main/scala/backBoard/SpiSlv.scala
Normal file
85
src/main/scala/backBoard/SpiSlv.scala
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
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
|
||||||
|
io.MISO := centReg.asUInt.extract( 6+8+32+2+16-1 )
|
||||||
|
|
||||||
|
when( ~io.CS ){
|
||||||
|
|
||||||
|
centReg := Cat(centReg.asUInt << 1, io.MOSI).asTypeOf(new CDR_Master_Interface_Bundle)
|
||||||
|
} .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
|
||||||
|
} .elsewhen( centReg.op === OPMSTT & ~CDROutValid ){
|
||||||
|
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
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -14,7 +14,7 @@ import org.chipsalliance.cde.config._
|
|||||||
object testModule extends App {
|
object testModule extends App {
|
||||||
(new chisel3.stage.ChiselStage).execute( Array("--target-dir", "generated/", "-e", "verilog" ) ++ args, Seq(
|
(new chisel3.stage.ChiselStage).execute( Array("--target-dir", "generated/", "-e", "verilog" ) ++ args, Seq(
|
||||||
ChiselGeneratorAnnotation(() => {
|
ChiselGeneratorAnnotation(() => {
|
||||||
new BackBoardSlvTest
|
new BackBoardMst
|
||||||
})
|
})
|
||||||
))
|
))
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user