增加初版CDRIn方案
This commit is contained in:
@@ -282,4 +282,103 @@ class CDRInAxis extends Module with RequireAsyncReset{
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class CDRInOriSample extends Module with RequireAsyncReset{
|
||||||
|
val io: CDRInSampleIO = IO(new CDRInSampleIO)
|
||||||
|
val clkNum: Int = 16
|
||||||
|
require( clkNum == 16 )
|
||||||
|
|
||||||
|
//multiCLK 需要按照滞后相位接线,即0为最先到达,1次先
|
||||||
|
val multiCLK = IO(Input(Vec(clkNum, Bool())))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
val sampleReg = Wire(Vec(clkNum, Bool()))
|
||||||
|
|
||||||
|
for( i <- 0 until clkNum ) {
|
||||||
|
sampleReg(i) := withClockAndReset(multiCLK(i).asClock, reset.asAsyncReset){ ShiftRegister( io.serDat, 2, false.B, true.B ) }
|
||||||
|
}
|
||||||
|
|
||||||
|
val sampleReg_sync = Wire(Vec(2*clkNum,Bool()))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
for( i <- 0 until clkNum ){
|
||||||
|
sampleReg_sync(i) := ShiftRegister(sampleReg(i), 2, false.B, true.B)
|
||||||
|
}
|
||||||
|
|
||||||
|
for( i <- clkNum until 2*clkNum ){
|
||||||
|
sampleReg_sync(i) := ShiftRegister(sampleReg(i-clkNum), 1, false.B, true.B)
|
||||||
|
}
|
||||||
|
|
||||||
|
val flitReg =
|
||||||
|
for( i <- 1 until (2*clkNum)-1 ) 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 clearCnt = RegInit(0.U(4.W))
|
||||||
|
val checkCnt = RegInit(0.U(4.W))
|
||||||
|
val arbLock = RegInit(0.U( (log2Ceil(2*clkNum)).W ))
|
||||||
|
val arbCali = RegInit(0.U( (log2Ceil(2*clkNum)).W ))
|
||||||
|
val isLock = RegInit(false.B)
|
||||||
|
|
||||||
|
when( sampleReg_sync.reduce(_|_) === false.B ){
|
||||||
|
when( clearCnt =/= 10.U ){
|
||||||
|
clearCnt := clearCnt + 1.U
|
||||||
|
}
|
||||||
|
} .otherwise{
|
||||||
|
clearCnt := 0.U
|
||||||
|
}
|
||||||
|
|
||||||
|
when( ~isLock ){
|
||||||
|
checkCnt := 0.U
|
||||||
|
} .otherwise{
|
||||||
|
checkCnt := checkCnt + 1.U
|
||||||
|
}
|
||||||
|
|
||||||
|
//优先级电路,优先选择跳变的后一相进行操作,电路上需要做成可调的
|
||||||
|
|
||||||
|
when( ~isLock ){
|
||||||
|
for( i <- 3 until 19 ){
|
||||||
|
val j = 19 - i - 1
|
||||||
|
when( flitReg(j) ^ flitReg(j+1) ){
|
||||||
|
arbLock := j.U
|
||||||
|
arbCali := j.U
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}.elsewhen( checkCnt.andR ){ //锁定之后,只允许每16cycle移动一相位
|
||||||
|
for( i <- 0 until 22 ){
|
||||||
|
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 ){
|
||||||
|
for( i <- 3 until 19 ){
|
||||||
|
val j = 19 - i - 1
|
||||||
|
when( flitReg(j) ^ flitReg(j+1) ){
|
||||||
|
isLock := true.B
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} .elsewhen( clearCnt === 10.U ){
|
||||||
|
isLock := false.B
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
val asyncSerDat =
|
||||||
|
Mux1H(
|
||||||
|
(for { i <- 0 until 22 } yield {
|
||||||
|
(arbCali === i.U) -> flitReg(i+(8))
|
||||||
|
})
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
io.syncSerDat := asyncSerDat
|
||||||
|
}
|
||||||
|
|||||||
@@ -41,8 +41,8 @@ class ShinTop extends Module with RequireAsyncReset{
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
val downCDRInSampleC = Module(new CDRInMultiSample(clkNum = 16))
|
val downCDRInSampleC = Module(new CDRInOriSample)
|
||||||
val upCDRInSampleC = Module(new CDRInMultiSample(clkNum = 16))
|
val upCDRInSampleC = Module(new CDRInOriSample)
|
||||||
|
|
||||||
downCDRInSampleC.multiCLK := io.multiCLK
|
downCDRInSampleC.multiCLK := io.multiCLK
|
||||||
upCDRInSampleC.multiCLK := io.multiCLK
|
upCDRInSampleC.multiCLK := io.multiCLK
|
||||||
|
|||||||
Reference in New Issue
Block a user