调整解锁条件为10个连续0

This commit is contained in:
Ruige Lee
2025-08-18 17:39:32 +08:00
parent 2afd3f722a
commit 2fb450673f
2 changed files with 38 additions and 57 deletions

View File

@@ -17,14 +17,7 @@ abstract class CDRInBase extends Module{
val io: CDRInIO = IO(new CDRInIO) val io: CDRInIO = IO(new CDRInIO)
val STATE_IDLE = 0.U val syncSerDat = Wire(Bool())
val STATE_HEADER = 1.U
val STATE_PAYLOAD = 2.U
val stateNext = Wire(UInt(2.W))
val stateCurr = RegNext( stateNext, STATE_IDLE )
val syncSerDat = Wire(Bool())
} }
trait CDRInOverSample{ this: CDRInBase => trait CDRInOverSample{ this: CDRInBase =>
@@ -71,30 +64,30 @@ trait CDRInOverSample{ this: CDRInBase =>
} }
trait CDRInMultiSample{ this: CDRInBase => trait CDRInMultiSample{ this: CDRInBase =>
val testIO = IO(Output(UInt(10.W)))
val clkNum: Int = 16 val clkNum: Int = 16
//multiCLK 需要按照滞后相位接线即0为最先到达1次先 //multiCLK 需要按照滞后相位接线即0为最先到达1次先
val multiCLK = IO(Input(Vec(8, Bool()))) val multiCLK = IO(Input(Vec(clkNum, Bool())))
val sampleReg = Wire(Vec(8, Bool()))
val sampleReg = Wire(Vec(clkNum, Bool()))
for( i <- 0 until 8 ) { for( i <- 0 until clkNum ) {
sampleReg(i) := withClockAndReset(multiCLK(i).asClock, reset.asBool){ ShiftRegister( io.serDat, 2 ) } sampleReg(i) := withClockAndReset(multiCLK(i).asClock, reset.asBool){ ShiftRegister( io.serDat, 2 ) }
} }
val sampleReg_sync = Wire(Vec(16,Bool())) val sampleReg_sync = Wire(Vec(2*clkNum,Bool()))
for( i <- 0 until 8 ){ for( i <- 0 until clkNum ){
sampleReg_sync(i) := ShiftRegister(sampleReg(i), 2) sampleReg_sync(i) := ShiftRegister(sampleReg(i), 2)
} }
for( i <- 8 until 16 ){ for( i <- clkNum until 2*clkNum ){
sampleReg_sync(i) := ShiftRegister(sampleReg(i-8), 1) sampleReg_sync(i) := ShiftRegister(sampleReg(i-clkNum), 1)
} }
/* /*
@@ -109,63 +102,49 @@ trait CDRInMultiSample{ this: CDRInBase =>
*/ */
val flitReg = val flitReg =
for( i <- 1 until 15 ) yield { for( i <- 1 until (2*clkNum)-1 ) yield {
(sampleReg_sync(i-1) & sampleReg_sync(i+0)) | (sampleReg_sync(i-1) & sampleReg_sync(i+0)) |
(sampleReg_sync(i-1) & sampleReg_sync(i+1)) | (sampleReg_sync(i-1) & sampleReg_sync(i+1)) |
(sampleReg_sync(i+0) & sampleReg_sync(i+1)) (sampleReg_sync(i+0) & sampleReg_sync(i+1))
} }
val clearCnt = Reg(UInt(4.W))
val arbLock = Reg(UInt( 8.W )) val arbLock = Reg(UInt( clkNum.W ))
val isLock = RegInit(false.B) val isLock = RegInit(false.B)
when( sampleReg.reduce(_|_) === false.B ){
when( clearCnt =/= 10.U ){
clearCnt := clearCnt + 1.U
}
} .otherwise{
clearCnt := 0.U
}
//优先级电路,优先选择跳变的后一相进行操作,电路上需要做成可调的 //优先级电路,优先选择跳变的后一相进行操作,电路上需要做成可调的
when( ~isLock ){ when( ~isLock ){
when( flitReg(0) ^ flitReg(1) ){ for( i <- 0 until clkNum ){
arbLock := "b1".U(16.W) << 0 val j = clkNum - i -1
isLock := true.B when( flitReg(j) ^ flitReg(j+1) ){
} .elsewhen( flitReg(1) ^ flitReg(2) ){ arbLock := "b1".U(clkNum.W) << j
arbLock := "b1".U(16.W) << 1 isLock := true.B
isLock := true.B }
} .elsewhen( flitReg(2) ^ flitReg(3) ){
arbLock := "b1".U(16.W) << 2
isLock := true.B
} .elsewhen( flitReg(3) ^ flitReg(4) ){
arbLock := "b1".U(16.W) << 3
isLock := true.B
} .elsewhen( flitReg(4) ^ flitReg(5) ){
arbLock := "b1".U(16.W) << 4
isLock := true.B
} .elsewhen( flitReg(5) ^ flitReg(6) ){
arbLock := "b1".U(16.W) << 5
isLock := true.B
} .elsewhen( flitReg(6) ^ flitReg(7) ){
arbLock := "b1".U(16.W) << 6
isLock := true.B
} .elsewhen( flitReg(7) ^ flitReg(8) ){
arbLock := "b1".U(16.W) << 7
isLock := true.B
} }
} .elsewhen( stateNext === STATE_IDLE & stateCurr === STATE_PAYLOAD ){ } .elsewhen( clearCnt === 10.U ){
isLock := false.B isLock := false.B
} }
val asyncSerDat = val asyncSerDat =
Mux1H( Mux1H(
(for { i <- 0 until 8 } yield { (for { i <- 0 until clkNum } yield {
(arbLock === (1.U << i)) -> flitReg(i+4) (arbLock === (1.U << i)) -> flitReg(i+(clkNum/2))
}) })
) )
syncSerDat := asyncSerDat
syncSerDat := asyncSerDat //ShiftRegister( asyncSerDat, 2 )
testIO := Cat( syncSerDat, Cat(flitReg), io.serDat )
} }
@@ -177,6 +156,13 @@ trait CDRInAxis{ this: CDRInBase =>
val ETH_PRE = "b1100010001".U(10.W) val ETH_PRE = "b1100010001".U(10.W)
val ETH_SFD = "b0110100111".U(10.W) val ETH_SFD = "b0110100111".U(10.W)
val STATE_IDLE = 0.U
val STATE_HEADER = 1.U
val STATE_PAYLOAD = 2.U
val stateNext = Wire(UInt(2.W))
val stateCurr = RegNext( stateNext, STATE_IDLE )
val bitCnt = Reg(UInt(4.W)) val bitCnt = Reg(UInt(4.W))

View File

@@ -11,7 +11,7 @@ class ShinTopIO extends Bundle{
val uDatIn = Input(Bool()) val uDatIn = Input(Bool())
val uDatOut = Output(Bool()) val uDatOut = Output(Bool())
val multiCLK = Input(Vec(8, Bool())) val multiCLK = Input(Vec(16, Bool()))
val iqspi = new QSPIInterfaceIO val iqspi = new QSPIInterfaceIO
val ospi = new SSPIInterfaceIO val ospi = new SSPIInterfaceIO
@@ -37,7 +37,6 @@ class ShinTopIO extends Bundle{
val xtal = Output(UInt(12.W)) val xtal = Output(UInt(12.W))
val spiSel = Output(UInt(2.W)) val spiSel = Output(UInt(2.W))
val testIO = Output(UInt(12.W))
} }
@@ -76,10 +75,6 @@ abstract class ShinTopBase extends Module{
io.ledTest := RegNext( Cat(slaveParser.io.intHWTrig(0), slaveParser.io.intHWTrig(1)) ) io.ledTest := RegNext( Cat(slaveParser.io.intHWTrig(0), slaveParser.io.intHWTrig(1)) )
io.testIO := Cat(
downCDROut.io.serDat, downCDRIn.testIO, clock.asBool
)
io.isSoftReset := interface.io.isSoftReset io.isSoftReset := interface.io.isSoftReset
io.interrupt := interface.io.interrupt io.interrupt := interface.io.interrupt