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

234 lines
5.5 KiB
Scala
Raw Normal View History

2023-07-31 22:56:09 +08:00
package BACK
import chisel3._
import chisel3.util._
2023-08-23 19:32:41 +08:00
2023-08-16 22:25:30 +08:00
class FSMC_Port_Bundle extends Bundle{
2023-09-08 16:37:31 +08:00
val addr = Input(UInt(11.W))
val dataIn = Input(UInt(16.W))
val dataOut = Output(UInt(16.W))
2023-08-16 22:25:30 +08:00
val dataOEn = Output(Bool())
val cen = Input(Bool())
val oen = Input(Bool())
val wen = Input(Bool())
}
2023-07-31 22:56:09 +08:00
class BackBoardMstIO extends Bundle{
2023-08-16 06:12:49 +00:00
val FSMC = new FSMC_Port_Bundle
2023-07-31 22:56:09 +08:00
2023-08-16 06:12:49 +00:00
val reset = Input(Bool())
val oser_pclk = Input(Bool())
val oser_fclk = Input(Bool())
2023-08-16 22:25:30 +08:00
val ides_pclk = Input(Bool())
2023-08-16 06:12:49 +00:00
val ides_fclk = Input(Bool())
2023-07-31 22:56:09 +08:00
2023-08-16 06:12:49 +00:00
val lvds_down_dout = Output(Bool())
val lvds_up_din = Input(Bool())
2023-07-31 22:56:09 +08:00
}
2023-08-18 12:10:47 +00:00
class BackBoardMstBase extends RawModule{
2023-07-31 22:56:09 +08:00
val io: BackBoardMstIO = IO(new BackBoardMstIO)
2023-08-07 10:15:56 +08:00
2023-08-16 06:12:49 +00:00
2023-08-16 22:25:30 +08:00
val lvdsMst = Module(new Lvds_Bus_Master)
2023-09-08 16:37:31 +08:00
val mirrorDown = Module(new MirrorSRAMDown())
val mirrorUp = Module(new MirrorSRAMUp())
2023-08-16 22:25:30 +08:00
2023-09-08 16:37:31 +08:00
val status = Wire(UInt(16.W))
2023-08-20 15:50:11 +08:00
val slvNum = Wire(UInt(5.W))
2023-08-16 06:12:49 +00:00
2023-08-31 17:39:12 +08:00
mirrorDown.io.clockw := io.ides_pclk.asBool
mirrorDown.io.clockr := io.oser_pclk.asBool
mirrorUp.io.clockw := io.oser_pclk.asBool
mirrorUp.io.clockr := io.ides_pclk.asBool
2023-08-18 12:10:47 +00:00
}
2023-08-16 06:12:49 +00:00
2023-08-16 22:25:30 +08:00
2023-08-18 12:10:47 +00:00
trait BackBoardMstFSMC{ this: BackBoardMstBase =>
2023-08-16 22:25:30 +08:00
2023-08-18 12:10:47 +00:00
withClockAndReset( io.ides_pclk.asClock, io.reset ){
2023-09-08 16:37:31 +08:00
val statusReg = RegInit(0.U(16.W)); status := statusReg
2023-08-31 15:10:18 +08:00
val slvNumReg = RegInit(1.U(5.W)); slvNum := slvNumReg
2023-08-20 15:50:11 +08:00
2023-08-18 12:10:47 +00:00
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 )
2023-08-16 22:25:30 +08:00
2023-08-18 12:10:47 +00:00
io.FSMC.dataOEn := io.FSMC.oen
2023-08-16 22:25:30 +08:00
2023-08-23 19:32:41 +08:00
2023-09-08 16:37:31 +08:00
val isWriteSRAM = ~fsmcAddrSync.extract(10) & fsmcAddrSync.extract(9)
val isReadSRAM = ~fsmcAddrSync.extract(10) & ~fsmcAddrSync.extract(9)
val isAccessReg = fsmcAddrSync.extract(10)
val activeAddr = fsmcAddrSync(8,0)
val regOut = Wire(UInt(16.W))
2023-08-18 12:10:47 +00:00
2023-09-08 16:37:31 +08:00
mirrorDown.io.enw := (~fsmcCEnSync & isWriteSRAM & (~fsmcWEnSync) )
mirrorDown.io.addrw := activeAddr
mirrorDown.io.dataw := fsmcdataInSync
2023-08-16 22:25:30 +08:00
2023-08-18 12:10:47 +00:00
2023-09-08 16:37:31 +08:00
mirrorUp.io.enr := (~fsmcCEnSync & isReadSRAM & (~fsmcOEnSync) )
mirrorUp.io.addrr := activeAddr
2023-08-16 22:25:30 +08:00
2023-09-08 16:37:31 +08:00
io.FSMC.dataOut := Mux( isAccessReg, regOut, mirrorUp.io.datar)
2023-08-16 22:25:30 +08:00
2023-08-18 12:10:47 +00:00
regOut := Mux1H(Seq(
2023-09-08 16:37:31 +08:00
( activeAddr === 0.U) -> status,
( activeAddr === 1.U) -> slvNum,
2023-08-18 12:10:47 +00:00
))
2023-08-16 22:25:30 +08:00
2023-09-08 16:37:31 +08:00
when( (~fsmcCEnSync & isAccessReg & (~fsmcWEnSync) ) & ( activeAddr === 0.U) ){
2023-08-20 15:50:11 +08:00
statusReg := fsmcdataInSync
2023-08-18 12:10:47 +00:00
}
2023-08-16 22:25:30 +08:00
2023-09-08 16:37:31 +08:00
when( (~fsmcCEnSync & isAccessReg & (~fsmcWEnSync) ) & ( activeAddr === 1.U) ){
2023-08-20 15:50:11 +08:00
slvNumReg := fsmcdataInSync
2023-08-18 12:10:47 +00:00
}
2023-08-16 22:25:30 +08:00
2023-08-18 12:10:47 +00:00
}
2023-08-16 22:25:30 +08:00
}
trait BackBoardMstLVDS{ this: BackBoardMstBase =>
2023-08-16 06:12:49 +00:00
lvdsMst.io.rst_n := ~io.reset
lvdsMst.io.oser_pclk := io.oser_pclk
lvdsMst.io.oser_fclk := io.oser_fclk
lvdsMst.io.ides_pclk := io.ides_pclk
lvdsMst.io.ides_fclk := io.ides_fclk
2023-08-15 08:42:56 +00:00
2023-08-16 06:12:49 +00:00
io.lvds_down_dout := lvdsMst.io.lvds_down_dout
lvdsMst.io.lvds_up_din := io.lvds_up_din
2023-08-16 22:25:30 +08:00
lvdsMst.io.tx_start := false.B
2023-08-18 12:10:47 +00:00
2023-08-30 17:32:19 +08:00
val trigger_wire = Wire(Bool())
val stateCur_wire = Wire( UInt(4.W) )
2023-08-18 12:10:47 +00:00
2023-08-30 17:32:19 +08:00
withClockAndReset( io.oser_pclk.asClock, io.reset ){
2023-08-18 12:10:47 +00:00
2023-08-30 17:32:19 +08:00
val stateCur = RegInit(3.U(4.W))
stateCur_wire := stateCur
2023-08-18 12:10:47 +00:00
2023-09-08 16:37:31 +08:00
val ( _, trigger ) = Counter(Range( 0,1000) )
2023-08-30 17:32:19 +08:00
trigger_wire := trigger
2023-08-18 12:10:47 +00:00
2023-08-30 17:32:19 +08:00
val isSync = RegInit(false.B)
2023-08-18 12:10:47 +00:00
2023-08-30 17:32:19 +08:00
val frame_info_update_en = RegInit(false.B)
2023-08-18 12:10:47 +00:00
2023-08-30 17:32:19 +08:00
val slave_type_num = RegInit(0.U(8.W))
val slave_data_length = RegInit(0.U(8.W))
val tx_start = RegInit(false.B)
2023-08-18 12:10:47 +00:00
2023-08-30 17:32:19 +08:00
lvdsMst.io.frame_info_update_en := frame_info_update_en
lvdsMst.io.slave_type_num := slave_type_num
lvdsMst.io.slave_data_length := slave_data_length
lvdsMst.io.tx_start := tx_start
2023-08-18 12:10:47 +00:00
2023-08-30 17:32:19 +08:00
when( trigger ){ //reset
stateCur := 0.U
2023-08-18 12:10:47 +00:00
2023-08-30 17:32:19 +08:00
frame_info_update_en := false.B
slave_type_num := 0.U
slave_data_length := 0.U
2023-08-18 12:10:47 +00:00
2023-08-30 17:32:19 +08:00
tx_start := false.B
isSync := ~isSync
2023-08-18 12:10:47 +00:00
2023-08-30 17:32:19 +08:00
} .elsewhen( stateCur === 0.U ){ //setting
stateCur := 1.U
2023-08-18 12:10:47 +00:00
2023-08-30 17:32:19 +08:00
frame_info_update_en := true.B
2023-08-31 15:10:18 +08:00
slave_type_num := Mux(isSync, Cat( "b000".U(3.W), slvNum ), Cat( "b100".U(3.W), slvNum ) )
2023-09-08 16:37:31 +08:00
slave_data_length := ((8/8)*16-1).U
2023-08-18 12:10:47 +00:00
2023-08-30 17:32:19 +08:00
tx_start := false.B
} .elsewhen( stateCur === 1.U ){ // tx start
stateCur := 2.U
2023-08-18 12:10:47 +00:00
2023-08-30 17:32:19 +08:00
frame_info_update_en := false.B
tx_start := true.B
2023-08-18 12:10:47 +00:00
2023-08-30 17:32:19 +08:00
} .elsewhen( stateCur === 2.U ){ //waiting for busy drop
2023-08-18 12:10:47 +00:00
2023-08-30 17:32:19 +08:00
tx_start := false.B
when( RegNext(lvdsMst.io.downstream_busy, false.B) & ~lvdsMst.io.downstream_busy ){
stateCur := 3.U
}
2023-08-18 12:10:47 +00:00
2023-08-30 17:32:19 +08:00
} .elsewhen( stateCur === 3.U ){
} .otherwise{
2023-08-18 12:10:47 +00:00
assert(false.B)
}
2023-08-31 17:39:12 +08:00
2023-09-08 16:37:31 +08:00
val addrr = RegInit(0.U(10.W))
val addrw = RegInit(0.U(10.W))
2023-08-30 17:32:19 +08:00
when( trigger_wire ){
addrw := 0.U
2023-08-31 17:39:12 +08:00
} .elsewhen( lvdsMst.io.rx_data_valid & ~isSync){
2023-08-30 17:32:19 +08:00
assert( (stateCur_wire === 2.U) || (stateCur_wire === 3.U) )
2023-08-18 12:10:47 +00:00
addrw := addrw + 1.U
}
2023-08-30 17:32:19 +08:00
when( trigger_wire ){
addrr := 0.U
2023-08-31 17:39:12 +08:00
} .elsewhen( lvdsMst.io.tx_data_ready & ~isSync){
2023-08-30 17:32:19 +08:00
addrr := addrr + 1.U
}
2023-08-23 19:32:41 +08:00
2023-08-31 17:39:12 +08:00
mirrorDown.io.enr := (stateCur_wire === 1.U || stateCur_wire === 2.U) & ~isSync
2023-08-18 12:10:47 +00:00
lvdsMst.io.tx_data_in := mirrorDown.io.datar
mirrorDown.io.addrr := addrr
2023-08-16 22:25:30 +08:00
2023-08-31 17:39:12 +08:00
mirrorUp.io.enw := lvdsMst.io.rx_data_valid & ~isSync
2023-08-18 12:10:47 +00:00
mirrorUp.io.dataw := lvdsMst.io.rx_data_out
mirrorUp.io.addrw := addrw
2023-08-16 22:25:30 +08:00
}
2023-08-16 06:12:49 +00:00
2023-08-16 22:25:30 +08:00
2023-08-16 06:12:49 +00:00
2023-08-16 22:25:30 +08:00
2023-08-16 06:12:49 +00:00
2023-08-16 22:25:30 +08:00
}
2023-08-20 15:50:11 +08:00
class BackBoardMst extends BackBoardMstBase with BackBoardMstFSMC with BackBoardMstLVDS