cdrout 每128byte发送无意义“b0000000010”用于解锁cdrin并重新上锁
需要配平fifo,覆盖每个长度端,长度边缘,解锁在crc位置,不同preamble长度
This commit is contained in:
@@ -110,12 +110,12 @@ trait CDRInMultiSample{ this: CDRInBase =>
|
|||||||
(sampleReg_sync(i+0) & sampleReg_sync(i+1))
|
(sampleReg_sync(i+0) & sampleReg_sync(i+1))
|
||||||
}
|
}
|
||||||
|
|
||||||
val clearCnt = Reg(UInt(4.W))
|
val clearCnt = Reg(UInt(3.W))
|
||||||
val arbLock = Reg(UInt( clkNum.W ))
|
val arbLock = Reg(UInt( clkNum.W ))
|
||||||
val isLock = RegInit(false.B)
|
val isLock = RegInit(false.B)
|
||||||
|
|
||||||
when( sampleReg.reduce(_|_) === false.B ){
|
when( sampleReg.reduce(_|_) === false.B ){
|
||||||
when( clearCnt =/= 10.U ){
|
when( clearCnt =/= 6.U ){
|
||||||
clearCnt := clearCnt + 1.U
|
clearCnt := clearCnt + 1.U
|
||||||
}
|
}
|
||||||
} .otherwise{
|
} .otherwise{
|
||||||
@@ -132,7 +132,7 @@ trait CDRInMultiSample{ this: CDRInBase =>
|
|||||||
isLock := true.B
|
isLock := true.B
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} .elsewhen( clearCnt === 10.U ){
|
} .elsewhen( clearCnt === 6.U ){
|
||||||
isLock := false.B
|
isLock := false.B
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -171,6 +171,7 @@ trait CDRInAxis{ this: CDRInBase =>
|
|||||||
val checkSFD = RegInit( 0.U(20.W) ); checkSFD := Cat( checkSFD(18,0), syncSerDat )
|
val checkSFD = RegInit( 0.U(20.W) ); checkSFD := Cat( checkSFD(18,0), syncSerDat )
|
||||||
|
|
||||||
val shiftData = Dualb4b5Decoder(checkSFD(9,0))
|
val shiftData = Dualb4b5Decoder(checkSFD(9,0))
|
||||||
|
val isReleaseLock = checkSFD(9,0) === "b0000000010".U
|
||||||
|
|
||||||
val payloadLen = RegInit(0.U(12.W))
|
val payloadLen = RegInit(0.U(12.W))
|
||||||
when( byteCnt === 0.U & bitCnt === 9.U & stateCurr === STATE_HEADER ){
|
when( byteCnt === 0.U & bitCnt === 9.U & stateCurr === STATE_HEADER ){
|
||||||
@@ -206,8 +207,9 @@ trait CDRInAxis{ this: CDRInBase =>
|
|||||||
when( stateCurr === STATE_HEADER ){
|
when( stateCurr === STATE_HEADER ){
|
||||||
byteCnt := Mux( byteCnt =/= (HeaderByte-1).U, byteCnt + 1.U, 0.U )
|
byteCnt := Mux( byteCnt =/= (HeaderByte-1).U, byteCnt + 1.U, 0.U )
|
||||||
assert( byteCnt <= (HeaderByte-1).U )
|
assert( byteCnt <= (HeaderByte-1).U )
|
||||||
|
assert(~isReleaseLock)
|
||||||
} .elsewhen( stateCurr === STATE_PAYLOAD ){
|
} .elsewhen( stateCurr === STATE_PAYLOAD ){
|
||||||
byteCnt := Mux( byteCnt =/= (payloadLen+ (4-1).U), byteCnt + 1.U, 0.U )
|
byteCnt := Mux( byteCnt =/= (payloadLen+ (4-1).U), Mux( isReleaseLock, byteCnt, byteCnt + 1.U ), 0.U )
|
||||||
assert( byteCnt <= ( payloadLen+ (4-1).U ) )
|
assert( byteCnt <= ( payloadLen+ (4-1).U ) )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -229,7 +231,7 @@ trait CDRInAxis{ this: CDRInBase =>
|
|||||||
|
|
||||||
when( io.axis.fire ){
|
when( io.axis.fire ){
|
||||||
axis_valid := false.B
|
axis_valid := false.B
|
||||||
} .elsewhen( bitCnt === 9.U & ( stateCurr === STATE_HEADER | stateCurr === STATE_PAYLOAD ) ){
|
} .elsewhen( bitCnt === 9.U & ( stateCurr === STATE_HEADER | (stateCurr === STATE_PAYLOAD & ~isReleaseLock) ) ){
|
||||||
axis_valid := true.B
|
axis_valid := true.B
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ class CDROut extends Module{
|
|||||||
|
|
||||||
|
|
||||||
val bitCnt = Reg(UInt(4.W))
|
val bitCnt = Reg(UInt(4.W))
|
||||||
val byteCnt = Reg(UInt(3.W)) //payload dont need to count
|
val byteCnt = Reg(UInt(7.W)) //payload 计数用于插入解锁位
|
||||||
|
|
||||||
val shiftData = RegInit(0.U(10.W))
|
val shiftData = RegInit(0.U(10.W))
|
||||||
|
|
||||||
@@ -47,7 +47,7 @@ class CDROut extends Module{
|
|||||||
|
|
||||||
io.serDat := shiftData.extract(9)
|
io.serDat := shiftData.extract(9)
|
||||||
io.axis.ready :=
|
io.axis.ready :=
|
||||||
bitCnt === 9.U & (
|
bitCnt === 9.U & ~byteCnt.andR & (
|
||||||
(stateCurr === STATE_PREAMBLE & byteCnt === (PRE_NUM-1).U) |
|
(stateCurr === STATE_PREAMBLE & byteCnt === (PRE_NUM-1).U) |
|
||||||
(stateCurr === STATE_PAYLOAD)
|
(stateCurr === STATE_PAYLOAD)
|
||||||
)
|
)
|
||||||
@@ -71,10 +71,14 @@ class CDROut extends Module{
|
|||||||
( byteCnt === (PRE_NUM-1).U ) -> Dualb4b5Encoder(io.axis.bits.tdata),
|
( byteCnt === (PRE_NUM-1).U ) -> Dualb4b5Encoder(io.axis.bits.tdata),
|
||||||
))
|
))
|
||||||
} .elsewhen( stateCurr === STATE_PAYLOAD ){
|
} .elsewhen( stateCurr === STATE_PAYLOAD ){
|
||||||
|
when( byteCnt.andR ){//全1用于提示接收解锁
|
||||||
|
shiftData := "b0000000010".U
|
||||||
|
} .otherwise{
|
||||||
shiftData := Dualb4b5Encoder(io.axis.bits.tdata)
|
shiftData := Dualb4b5Encoder(io.axis.bits.tdata)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
when( stateCurr === STATE_IDLE ){ //PRE
|
when( stateCurr === STATE_IDLE ){ //PRE
|
||||||
@@ -87,7 +91,7 @@ class CDROut extends Module{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
when( (stateCurr === STATE_IDLE) | (stateCurr === STATE_PAYLOAD) ){
|
when( (stateCurr === STATE_IDLE) ){
|
||||||
byteCnt := 0.U
|
byteCnt := 0.U
|
||||||
} .elsewhen( bitCnt === 9.U ){
|
} .elsewhen( bitCnt === 9.U ){
|
||||||
byteCnt := byteCnt + 1.U
|
byteCnt := byteCnt + 1.U
|
||||||
|
|||||||
Reference in New Issue
Block a user