锁定后允许在正负3相位之间校准

This commit is contained in:
Ruige Lee
2025-08-21 18:57:28 +08:00
parent a20ee39087
commit 06996d6945

View File

@@ -113,7 +113,8 @@ trait CDRInMultiSample{ this: CDRInBase =>
val clearCnt = Reg(UInt(4.W)) val clearCnt = Reg(UInt(4.W))
val checkCnt = Reg(UInt(4.W)) val checkCnt = Reg(UInt(4.W))
val arbLock = Reg(UInt( (log2Ceil(clkNum)+1).W )) val arbLock = Reg(UInt( (log2Ceil(2*clkNum)).W ))
val arbCali = Reg(UInt( (log2Ceil(2*clkNum)).W ))
val isLock = RegInit(false.B) val isLock = RegInit(false.B)
when( sampleReg.reduce(_|_) === false.B ){ when( sampleReg.reduce(_|_) === false.B ){
@@ -132,40 +133,45 @@ trait CDRInMultiSample{ this: CDRInBase =>
//优先级电路,优先选择跳变的后一相进行操作,电路上需要做成可调的 //优先级电路,优先选择跳变的后一相进行操作,电路上需要做成可调的
for( i <- 0 + 4 until clkNum + 4 ){ // val diff = Wire(UInt( (log2Ceil(clkNum)).W ))
val j = clkNum + 4 - i -1 // diff := arbLock - j.U
val diff = Wire(UInt( (log2Ceil(clkNum)).W )) when( ~isLock ){
diff := arbLock - j.U for( i <- 3 until 19 ){
when( flitReg(j) ^ flitReg(j+1) ){ val j = 19 - i - 1
when( ~isLock ){ when( flitReg(j) ^ flitReg(j+1) ){
arbLock := j.U arbLock := j.U
isLock := true.B arbCali := j.U
} .elsewhen( checkCnt.andR ){ //锁定之后只允许每16cycle移动一相位 }
when( diff > 8.U ){ }
arbLock := arbLock + 1.U }.elsewhen( checkCnt.andR ){ //锁定之后只允许每16cycle移动一相位
} .elsewhen( diff < 8.U ){ for( i <- 0 until 22 ){
arbLock := arbLock - 1.U val j = 22 - i -1
when( flitReg(j) ^ flitReg(j+1) ){
when( (j.U < arbCali) && ((j+3).U >= arbLock) ){
arbCali := arbCali - 1.U
} .elsewhen( (j.U > arbCali) && (j.U <= arbLock + 3.U) ){
arbCali := arbCali + 1.U
}
} }
} }
} }
}
when( ~isLock ){ when( ~isLock ){
for( i <- 0 until clkNum ){ for( i <- 3 until 19 ){
val j = clkNum - i -1 val j = 19 - i - 1
when( flitReg(j) ^ flitReg(j+1) ){ when( flitReg(j) ^ flitReg(j+1) ){
isLock := true.B isLock := true.B
} }
} }
}.elsewhen( clearCnt === 10.U ){ } .elsewhen( clearCnt === 10.U ){
isLock := false.B isLock := false.B
} }
val asyncSerDat = val asyncSerDat =
Mux1H( Mux1H(
(for { i <- 4 until clkNum+4 } yield { (for { i <- 0 until 22 } yield {
(arbLock === i.U) -> flitReg(i+(clkNum/2)) (arbCali === i.U) -> flitReg(i+(8))
}) })
) )