多相位时钟可以使用

This commit is contained in:
Ruige Lee
2025-07-22 11:49:33 +08:00
parent acf09cf118
commit 9f88d26ba1
2 changed files with 22 additions and 7 deletions

View File

@@ -58,7 +58,7 @@ trait CDRInMultiSample{ this: CDRInBase =>
val clkNum: Int = 8
require(clkNum >= 4)
//multiCLK 需要按照超前相位接线即0为最到达1次
//multiCLK 需要按照滞后相位接线即0为最到达1次
val multiCLK = IO(Input(Vec(clkNum, Bool())))
// val sampleReg = withClockAndReset(io.overCLK.asClock, reset.asBool){ ShiftRegisters( RegNext(io.serDat), sampleRate ) }
@@ -68,16 +68,30 @@ trait CDRInMultiSample{ this: CDRInBase =>
// val arbCnt = withClockAndReset(io.overCLK.asClock, reset.asBool){ RegInit("b00000001".U(sampleRate.W)) }
// arbCnt := Cat( arbCnt(sampleRate-2,0), arbCnt.extract(sampleRate-1) )
val arbCnt = RegInit("b1".U(clkNum.W))
arbCnt := Cat( arbCnt(clkNum-2,0), arbCnt.extract(clkNum-1) )
// val arbLock = withClockAndReset(io.overCLK.asClock, reset.asBool){ Reg(UInt( sampleRate.W )) }
// when( sampleReg(0) ^ sampleReg(1) ){
// arbLock := arbCnt
// }
val arbLock = Reg(UInt( clkNum.W ))
//优先级电路,优先选择跳变的后一相进行操作,电路上需要做成可调的
when( sampleReg(0) ^ sampleReg(1) ){
arbLock := arbCnt
arbLock := "b1".U(clkNum.W) << 2
} .elsewhen( sampleReg(1) ^ sampleReg(2) ){
arbLock := "b1".U(clkNum.W) << 3
} .elsewhen( sampleReg(2) ^ sampleReg(3) ){
arbLock := "b1".U(clkNum.W) << 4
} .elsewhen( sampleReg(3) ^ sampleReg(4) ){
arbLock := "b1".U(clkNum.W) << 5
} .elsewhen( sampleReg(4) ^ sampleReg(5) ){
arbLock := "b1".U(clkNum.W) << 6
} .elsewhen( sampleReg(5) ^ sampleReg(6) ){
arbLock := "b1".U(clkNum.W) << 7
} .elsewhen( sampleReg(6) ^ sampleReg(7) ){
arbLock := "b1".U(clkNum.W) << 0
} .elsewhen( sampleReg(7) ^ sampleReg(0) ){
arbLock := "b1".U(clkNum.W) << 1
}
@@ -94,7 +108,8 @@ trait CDRInMultiSample{ this: CDRInBase =>
Mux1H(
(for { i <- 0 until clkNum; j <- 0 until clkNum } yield {
//跳变沿到来锁定的位置 锁定拍当前所在的位置 选择锁定拍后一拍的值认为是正确值
((arbLock === (1.U << i)) & (arbCnt === (1.U << j))) -> sampleReg((clkNum - 1 - i + j) % clkNum)
// ((arbLock === (1.U << i)) & (arbCnt === (1.U << j))) -> sampleReg((clkNum - 1 - i + j) % clkNum)
(arbLock === (1.U << i)) -> sampleReg(i)
})
)

View File

@@ -338,7 +338,7 @@ generate
for( genvar i = 0; i < 8; i = i + 1 ) begin
initial begin
multiCLK[i] = 0;
for( integer j = i; j < 8; j = j + 1 ) begin
for( integer j = 0; j < i; j = j + 1 ) begin
#20
;
end