弃用高频率采样CDR的例化

Merge branch 'mp_eb_dev_多采样全表决' into mp_eb_dev

* mp_eb_dev_多采样全表决:
  调整解锁条件为10个连续0
  增加一个锁定可以暂时解决发送失败问题
  滤波 表决 鉴相同时存在
  enhance 要求先跨时钟,再进行后续表决
  Revert "16相位改8相位"
  16相位改8相位
  bug: 16相位补充相 欠了一相
  Revert "改6相位,从一个pll出,测试"
  Revert "尝试3相位"
  尝试3相位
  改6相位,从一个pll出,测试
  拉出测试IO
  Revert "4多相位效果明显更好"
  4多相位效果明显更好
  16相位操作还是卡

# Conflicts:
#	src/main/scala/backBoard/ebus/CDRIn.scala
This commit is contained in:
Ruige Lee
2025-08-19 10:00:25 +08:00

View File

@@ -70,90 +70,82 @@ trait CDRInMultiSample{ this: CDRInBase =>
//multiCLK 需要按照滞后相位接线即0为最先到达1次先 //multiCLK 需要按照滞后相位接线即0为最先到达1次先
val multiCLK = IO(Input(Vec(16, Bool()))) val multiCLK = IO(Input(Vec(clkNum, Bool())))
// val sampleReg = withClockAndReset(io.overCLK.asClock, reset.asBool){ ShiftRegisters( RegNext(io.serDat), sampleRate ) }
val sampleReg = for( i <- 0 until 16 ) yield {
withClockAndReset(multiCLK(i).asClock, reset.asBool){ ShiftRegister( io.serDat, 2 ) } val sampleReg = Wire(Vec(clkNum, Bool()))
for( i <- 0 until clkNum ) {
sampleReg(i) := withClockAndReset(multiCLK(i).asClock, reset.asBool){ ShiftRegister( io.serDat, 2 ) }
} }
val sampleReg_sync = Wire(Vec(2*clkNum,Bool()))
for( i <- 0 until clkNum ){
sampleReg_sync(i) := ShiftRegister(sampleReg(i), 2)
}
for( i <- clkNum until 2*clkNum ){
sampleReg_sync(i) := ShiftRegister(sampleReg(i-clkNum), 1)
}
/*
val flitReg =
for( i <- 1 until 22 ) yield {
(sampleReg_sync(i-1) & sampleReg_sync(i+0)) |
(sampleReg_sync(i-1) & sampleReg_sync(i+1)) |
(sampleReg_sync(i+0) & sampleReg_sync(i+1))
}
val asyncSerDat = PopCount(flitReg) >= 11.U
*/
val flitReg = val flitReg =
if(false){ for( i <- 1 until (2*clkNum)-1 ) yield {
for( i <- 0 until 16 ) yield { (sampleReg_sync(i-1) & sampleReg_sync(i+0)) |
sampleReg(i) (sampleReg_sync(i-1) & sampleReg_sync(i+1)) |
(sampleReg_sync(i+0) & sampleReg_sync(i+1))
} }
} else if (false){ //5选3 多数投票 滤波
for( i <- 0 until 16 ) yield { val clearCnt = Reg(UInt(4.W))
withClockAndReset(multiCLK((i+3)%16).asClock, reset.asBool){ RegNext( val arbLock = Reg(UInt( clkNum.W ))
(sampleReg((i-2+16)%16) & sampleReg((i-1+16)%16) & sampleReg((i+0)%16)) | val isLock = RegInit(false.B)
(sampleReg((i-2+16)%16) & sampleReg((i-1+16)%16) & sampleReg((i+1)%16)) |
(sampleReg((i-2+16)%16) & sampleReg((i-1+16)%16) & sampleReg((i+2)%16)) | when( sampleReg.reduce(_|_) === false.B ){
(sampleReg((i-2+16)%16) & sampleReg((i+0)%16) & sampleReg((i+1)%16)) | when( clearCnt =/= 10.U ){
(sampleReg((i-2+16)%16) & sampleReg((i+0)%16) & sampleReg((i+2)%16)) | clearCnt := clearCnt + 1.U
(sampleReg((i-2+16)%16) & sampleReg((i+1)%16) & sampleReg((i+2)%16)) |
(sampleReg((i-1+16)%16) & sampleReg((i+0)%16) & sampleReg((i+1)%16)) |
(sampleReg((i-1+16)%16) & sampleReg((i+0)%16) & sampleReg((i+2)%16)) |
(sampleReg((i-1+16)%16) & sampleReg((i+1)%16) & sampleReg((i+2)%16)) |
(sampleReg((i-0)%16) & sampleReg((i+1)%16) & sampleReg((i+2)%16))
)}
}
} else { //3选2 多数投票 滤波
for( i <- 0 until 16 ) yield {
withClockAndReset(multiCLK((i+2)%16).asClock, reset.asBool){ RegNext(
(sampleReg((i-1+16)%16) & sampleReg((i+0)%16)) |
(sampleReg((i-1+16)%16) & sampleReg((i+1)%16)) |
(sampleReg((i+0)%16) & sampleReg((i+1)%16))
)}
} }
} .otherwise{
clearCnt := 0.U
} }
val arbLock = Reg(UInt( 16.W ))
//优先级电路,优先选择跳变的后一相进行操作,电路上需要做成可调的 //优先级电路,优先选择跳变的后一相进行操作,电路上需要做成可调的
when( flitReg(0) ^ flitReg(1) ){ when( ~isLock ){
arbLock := "b1".U(16.W) << 2 for( i <- 0 until clkNum ){
} .elsewhen( flitReg(1) ^ flitReg(2) ){ val j = clkNum - i -1
arbLock := "b1".U(16.W) << 3 when( flitReg(j) ^ flitReg(j+1) ){
} .elsewhen( flitReg(2) ^ flitReg(3) ){ arbLock := "b1".U(clkNum.W) << j
arbLock := "b1".U(16.W) << 4 isLock := true.B
} .elsewhen( flitReg(3) ^ flitReg(4) ){ }
arbLock := "b1".U(16.W) << 5 }
} .elsewhen( flitReg(4) ^ flitReg(5) ){ } .elsewhen( clearCnt === 10.U ){
arbLock := "b1".U(16.W) << 6 isLock := false.B
} .elsewhen( flitReg(5) ^ flitReg(6) ){ }
arbLock := "b1".U(16.W) << 7
} .elsewhen( flitReg(6) ^ flitReg(7) ){
arbLock := "b1".U(16.W) << 8
} .elsewhen( flitReg(7) ^ flitReg(8) ){
arbLock := "b1".U(16.W) << 9
} .elsewhen( flitReg(8) ^ flitReg(9) ){
arbLock := "b1".U(16.W) << 10
} .elsewhen( flitReg(9) ^ flitReg(10) ){
arbLock := "b1".U(16.W) << 11
} .elsewhen( flitReg(10) ^ flitReg(11) ){
arbLock := "b1".U(16.W) << 12
} .elsewhen( flitReg(11) ^ flitReg(12) ){
arbLock := "b1".U(16.W) << 13
} .elsewhen( flitReg(12) ^ flitReg(13) ){
arbLock := "b1".U(16.W) << 14
} .elsewhen( flitReg(13) ^ flitReg(14) ){
arbLock := "b1".U(16.W) << 15
} .elsewhen( flitReg(14) ^ flitReg(15) ){
arbLock := "b1".U(16.W) << 0
} .elsewhen( flitReg(15) ^ flitReg(0) ){
arbLock := "b1".U(16.W) << 1
}
val asyncSerDat = val asyncSerDat =
Mux1H( Mux1H(
(for { i <- 0 until clkNum } yield { (for { i <- 0 until clkNum } yield {
(arbLock === (1.U << i)) -> flitReg(i) (arbLock === (1.U << i)) -> flitReg(i+(clkNum/2))
}) })
) )
syncSerDat := ShiftRegister( asyncSerDat, 2 )
syncSerDat := asyncSerDat
} }
@@ -245,7 +237,9 @@ trait CDRInAxis{ this: CDRInBase =>
class CDRIn extends CDRInBase class CDRIn extends CDRInBase
with CDRInAxis with CDRInAxis
with CDRInOverSample with CDRInOverSample{
require(false)
}
class MPCDRIn extends CDRInBase class MPCDRIn extends CDRInBase
with CDRInAxis with CDRInAxis