FSMC
This commit is contained in:
83
src/main/scala/backBoard/FSMC.scala
Normal file
83
src/main/scala/backBoard/FSMC.scala
Normal file
@@ -0,0 +1,83 @@
|
||||
package BACK
|
||||
|
||||
import chisel3._
|
||||
import chisel3.util._
|
||||
|
||||
|
||||
class FSMC_Port_Bundle extends Bundle{
|
||||
// val clk = Input(Bool())
|
||||
val addr = Input(UInt(2.W))
|
||||
val dataIn = Input(UInt(8.W))
|
||||
val dataOut = Output(UInt(8.W))
|
||||
val dataOEn = Output(Bool())
|
||||
val cen = Input(Bool())
|
||||
val oen = Input(Bool())
|
||||
val wen = Input(Bool())
|
||||
}
|
||||
|
||||
// class FSMC_Status_Bundle extends Bundle{
|
||||
// val op = UInt(2.W)
|
||||
// val isBusy = Bool()
|
||||
// val isError = Bool()
|
||||
// }
|
||||
|
||||
|
||||
class FSMCSlvIO extends Bundle{
|
||||
val FSMC = new FSMC_Port_Bundle
|
||||
|
||||
val CDRIn = Flipped(Valid(new CDRData))
|
||||
val CDROut = Valid(new CDRData)
|
||||
}
|
||||
|
||||
class FSMCSlv extends Module{
|
||||
val io: FSMCSlvIO = IO(new FSMCSlvIO)
|
||||
|
||||
val fsmcAddrSync = ShiftRegister( io.FSMC.addr, 2, 0.U, true.B )
|
||||
val fsmcdataInSync = ShiftRegister( io.FSMC.dataIn, 2, 0.U, true.B )
|
||||
val fsmcCEnSync = ShiftRegister( io.FSMC.cen, 2, true.B, true.B )
|
||||
val fsmcOEnSync = ShiftRegister( io.FSMC.oen, 2, true.B, true.B )
|
||||
val fsmcWEnSync = ShiftRegister( io.FSMC.wen, 2, true.B, true.B )
|
||||
|
||||
io.FSMC.dataOEn := io.FSMC.oen
|
||||
|
||||
|
||||
|
||||
val status = RegInit(0.U(8.W))
|
||||
val address = Reg(UInt(8.W))
|
||||
val data = Reg(UInt(8.W))
|
||||
val none = Reg(UInt(8.W))
|
||||
|
||||
val dataOutReg = RegInit(0.U(8.W)); io.FSMC.dataOut := dataOutReg
|
||||
|
||||
|
||||
|
||||
when( ~fsmcCEnSync & ~fsmcOEnSync ){
|
||||
dataOutReg :=
|
||||
Mux1H(Seq(
|
||||
(fsmcAddrSync === 0.U) -> status,
|
||||
(fsmcAddrSync === 1.U) -> address,
|
||||
(fsmcAddrSync === 2.U) -> data,
|
||||
(fsmcAddrSync === 3.U) -> none,
|
||||
))
|
||||
} .elsewhen( ~fsmcCEnSync & ~fsmcWEnSync ){
|
||||
when( fsmcAddrSync === 0.U ){
|
||||
status := fsmcdataInSync
|
||||
}
|
||||
when( fsmcAddrSync === 1.U ){
|
||||
address := fsmcdataInSync
|
||||
}
|
||||
when( fsmcAddrSync === 2.U ){
|
||||
data := fsmcdataInSync
|
||||
}
|
||||
when( fsmcAddrSync === 3.U ){
|
||||
none := fsmcdataInSync
|
||||
}
|
||||
}
|
||||
|
||||
when( io.CDRIn.fire ){
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user