拆分初始化,同步流程,交给软件控制

This commit is contained in:
RuigeLee
2024-03-20 11:41:43 +08:00
parent 5f61a4265e
commit 8b44141214

View File

@@ -34,23 +34,6 @@ val reset_calib = Input(Bool())
} }
// class Master_Status_Bundle extends Bundle{
// val zero = UInt(11.W)
// val cdrErr = Bool()
// val crcErr = Bool()
// val linkErr = Bool()
// val synchronize = Bool()
// val initialization = Bool()
// }
// class Master_Control_Bundle extends Bundle{
// val zero = UInt(13.W)
// val transmit = Bool()
// val synchronize = Bool()
// val initialization = Bool()
// }
class BackBoardMstBase extends Module{ //10M class BackBoardMstBase extends Module{ //10M
val io: BackBoardMstIO = IO(new BackBoardMstIO) val io: BackBoardMstIO = IO(new BackBoardMstIO)
@@ -73,6 +56,7 @@ class BackBoardMstBase extends Module{ //10M
val slvNum = RegInit(0.U(6.W)) val slvNum = RegInit(0.U(6.W))
val slvOffLine = RegInit(0.U(6.W)) val slvOffLine = RegInit(0.U(6.W))
val linkNum = RegInit(0.U(7.W))
val testReg = RegInit("haa55".U(16.W)) val testReg = RegInit("haa55".U(16.W))
val interrupt = RegInit(false.B); io.interrupt := interrupt val interrupt = RegInit(false.B); io.interrupt := interrupt
@@ -163,6 +147,7 @@ trait BackBoardMstFSMC{ this: BackBoardMstBase =>
( activeAddr === 2.U) -> slvNum, ( activeAddr === 2.U) -> slvNum,
( activeAddr === 3.U) -> slvOffLine, ( activeAddr === 3.U) -> slvOffLine,
( activeAddr === 4.U) -> testReg, ( activeAddr === 4.U) -> testReg,
( activeAddr === 5.U) -> linkNum,
)) ))
@@ -265,15 +250,12 @@ with BackBoardMstFSMC
} }
trait BackBoardMstLVDSInitialization{ this: BackBoardMstLVDSBase => trait BackBoardMstLVDSInit{ this: BackBoardMstLVDSBase =>
val isInitCntReset = ( ~RegNext(ctrlInit) & ctrlInit ) | (stateCur === 3.U) | (stateCur === 8.U)
val ( _, isInitTimeout ) = Counter(Range( 0,5200), ctrlInit, isInitCntReset)
val synchCnt = Reg(UInt(3.W))
val isInitStart = ~RegNext(ctrlInit, false.B) & ctrlInit
when(ctrlInit){ when(ctrlInit){
when( isInitTimeout ){ when( isInitStart ){
stateCur := 0.U stateCur := 0.U
@@ -302,104 +284,55 @@ trait BackBoardMstLVDSInitialization{ this: BackBoardMstLVDSBase =>
tx_start := false.B tx_start := false.B
when( lvdsMst.io.slave_link_num_valid ){ when( lvdsMst.io.slave_link_num_valid ){
slvNum := lvdsMst.io.slave_link_num - 1.U linkNum := lvdsMst.io.slave_link_num
stateCur := 3.U stateCur := 3.U
}
} .elsewhen( stateCur === 3.U ){
frame_info_update_en := false.B
slave_type_num := 0.U
slave_data_length := 0.U
tx_start := false.B
stateCur := 4.U
} .elsewhen( stateCur === 4.U ){
stateCur := 5.U
frame_info_update_en := true.B
slave_type_num := Cat( "b00".U(2.W), slvNum )
slave_data_length := ((8/8)*32-1).U
tx_start := false.B
} .elsewhen( stateCur === 5.U ){ // tx start
stateCur := 6.U
frame_info_update_en := false.B
tx_start := true.B
} .elsewhen( stateCur === 6.U ){
tx_start := false.B
when( lvdsMst.io.slave_link_num_valid ){
when( slvNum === lvdsMst.io.slave_link_num - 1.U ){
stateCur := 7.U
} .otherwise{
printf("Initialization failed, waitting for timeout!\n")
}
}
} .elsewhen( stateCur === 7.U ){
when( ctrlSynch ){
stateCur := 8.U
synchCnt := 0.U
} .otherwise{
stateCur := 14.U
statusInit := true.B statusInit := true.B
ctrlInit := false.B ctrlInit := false.B
interrupt := true.B interrupt := true.B
} }
} .elsewhen( stateCur === 8.U ){ //synch } .elsewhen( stateCur === 3.U ){
}
}
}
trait BackBoardMstLVDSSync{ this: BackBoardMstLVDSBase =>
val isSyncStart = ~RegNext( ctrlSynch, false.B) & ctrlSynch
when( ctrlSynch ){
when( isSyncStart ){
stateCur := 0.U
frame_info_update_en := false.B frame_info_update_en := false.B
slave_type_num := 0.U slave_type_num := 0.U
slave_data_length := 0.U slave_data_length := 0.U
tx_start := false.B tx_start := false.B
}.elsewhen( stateCur === 0.U ){
stateCur := 9.U stateCur := 1.U
} .elsewhen( stateCur === 9.U ){
stateCur := 10.U
frame_info_update_en := true.B frame_info_update_en := true.B
slave_type_num := Cat( "b01".U(2.W), slvNum ) slave_type_num := Cat( "b01".U(2.W), slvNum )
slave_data_length := ((8/8)*32-1).U slave_data_length := ((8/8)*32-1).U
tx_start := false.B tx_start := false.B
} .elsewhen( stateCur === 10.U ){ // tx start } .elsewhen( stateCur === 1.U ){ // tx start
stateCur := 11.U stateCur := 2.U
frame_info_update_en := false.B frame_info_update_en := false.B
tx_start := true.B tx_start := true.B
} .elsewhen( stateCur === 11.U ){ } .elsewhen( stateCur === 2.U ){
tx_start := false.B tx_start := false.B
when( RegNext(lvdsMst.io.downstream_busy, false.B) & ~lvdsMst.io.downstream_busy ){ when( RegNext(lvdsMst.io.downstream_busy, false.B) & ~lvdsMst.io.downstream_busy ){
stateCur := 12.U stateCur := 3.U
synchCnt := synchCnt + 1.U
}
} .elsewhen( stateCur === 12.U ){
when( synchCnt === 4.U ){
stateCur := 13.U
} .otherwise{
stateCur := 8.U
}
} .elsewhen( stateCur === 13.U ){
stateCur := 14.U
statusSynch := true.B statusSynch := true.B
statusInit := true.B
ctrlSynch := false.B ctrlSynch := false.B
ctrlInit := false.B
interrupt := true.B interrupt := true.B
} .elsewhen( stateCur === 14.U ){ }
} .elsewhen( stateCur === 15.U ){ } .elsewhen( stateCur === 3.U ){
} }
.otherwise{ .otherwise{
@@ -407,17 +340,15 @@ trait BackBoardMstLVDSInitialization{ this: BackBoardMstLVDSBase =>
} }
} }
} }
trait BackBoardMstLVDSTransmit{ this: BackBoardMstLVDSBase => trait BackBoardMstLVDSTransmit{ this: BackBoardMstLVDSBase =>
val trigger = ctrlTransmit & ~RegNext(ctrlTransmit, false.B) val isTransStart = ctrlTransmit & ~RegNext(ctrlTransmit, false.B)
when(ctrlTransmit){ when(ctrlTransmit){
when( trigger ){ //reset when( isTransStart ){ //reset
stateCur := 0.U stateCur := 0.U
frame_info_update_en := false.B frame_info_update_en := false.B
@@ -462,14 +393,14 @@ trait BackBoardMstLVDSTransmit{ this: BackBoardMstLVDSBase =>
val addrr = RegInit(0.U(11.W)) val addrr = RegInit(0.U(11.W))
val addrw = RegInit(0.U(11.W)) val addrw = RegInit(0.U(11.W))
when( trigger ){ when( isTransStart ){
addrw := 0.U addrw := 0.U
} .elsewhen( lvdsMst.io.rx_data_valid & ctrlTransmit){ } .elsewhen( lvdsMst.io.rx_data_valid & ctrlTransmit){
assert( (stateCur === 2.U) || (stateCur === 3.U) ) assert( (stateCur === 2.U) || (stateCur === 3.U) )
addrw := addrw + 1.U addrw := addrw + 1.U
} }
when( trigger ){ when( isTransStart ){
addrr := 0.U addrr := 0.U
} .elsewhen( lvdsMst.io.tx_data_ready & ctrlTransmit){ } .elsewhen( lvdsMst.io.tx_data_ready & ctrlTransmit){
addrr := addrr + 1.U addrr := addrr + 1.U
@@ -505,6 +436,7 @@ trait BackBoardMstLVDSError{ this: BackBoardMstLVDSBase =>
} }
class BackBoardMst extends BackBoardMstLVDSBase class BackBoardMst extends BackBoardMstLVDSBase
with BackBoardMstLVDSInitialization with BackBoardMstLVDSInit
with BackBoardMstLVDSSync
with BackBoardMstLVDSTransmit with BackBoardMstLVDSTransmit
with BackBoardMstLVDSError with BackBoardMstLVDSError