CDRIn采样率改为8x,允许参数化

This commit is contained in:
Ruige Lee
2025-04-02 15:44:32 +08:00
parent eec4d5c18a
commit 6c6cce1222
3 changed files with 42 additions and 33 deletions

View File

@@ -13,8 +13,7 @@ class CDRInIO extends Bundle{
abstract class CDRInBase extends Module{ abstract class CDRInBase extends Module{
def sampleRate: Int = 4 def sampleRate: Int = 8
require( sampleRate == 4 )
val io: CDRInIO = IO(new CDRInIO) val io: CDRInIO = IO(new CDRInIO)
@@ -45,34 +44,44 @@ trait CDRInOverSample{ this: CDRInBase =>
// val syncSerDat = // val syncSerDat =
// Mux1H( (0 until sampleRate).map{ i => (( arbSel === i.U ) -> ShiftRegister( sampleReg(i), 2) ) } ) // Mux1H( (0 until sampleRate).map{ i => (( arbSel === i.U ) -> ShiftRegister( sampleReg(i), 2) ) } )
val arbCnt = withClockAndReset(io.overCLK.asClock, reset.asBool){ RegInit("b0001".U(sampleRate.W)) } val arbCnt = withClockAndReset(io.overCLK.asClock, reset.asBool){ RegInit("b00000001".U(sampleRate.W)) }
arbCnt := Cat( arbCnt(2,0), arbCnt.extract(3) ) arbCnt := Cat( arbCnt(sampleRate-2,0), arbCnt.extract(sampleRate-1) )
val arbLock = withClockAndReset(io.overCLK.asClock, reset.asBool){ Reg(UInt( sampleRate.W )) } val arbLock = withClockAndReset(io.overCLK.asClock, reset.asBool){ Reg(UInt( sampleRate.W )) }
when( sampleReg(0) ^ sampleReg(1) ){ when( sampleReg(0) ^ sampleReg(1) ){
arbLock := arbCnt arbLock := arbCnt
} }
val asyncSerDat = Mux1H(Seq( val asyncSerDat = withClockAndReset(io.overCLK.asClock, reset.asBool){ RegNext(
(arbLock === "b0001".U & arbCnt === "b0001".U) -> sampleReg(3), Mux1H(
(arbLock === "b0001".U & arbCnt === "b0010".U) -> sampleReg(0), // Seq(
(arbLock === "b0001".U & arbCnt === "b0100".U) -> sampleReg(1), // //(arbLock === "b0001".U & arbCnt === "b0001".U) -> sampleReg(3),
(arbLock === "b0001".U & arbCnt === "b1000".U) -> sampleReg(2), // (arbLock === (1.U << 0) & arbCnt === (1.U << 0)) -> sampleReg(3),
// (arbLock === (1.U << 0) & arbCnt === (1.U << 1)) -> sampleReg(0),
// (arbLock === (1.U << 0) & arbCnt === (1.U << 2)) -> sampleReg(1),
// (arbLock === (1.U << 0) & arbCnt === (1.U << 3)) -> sampleReg(2),
(arbLock === "b0010".U & arbCnt === "b0001".U) -> sampleReg(2), // (arbLock === (1.U << 1) & arbCnt === (1.U << 0)) -> sampleReg(2),
(arbLock === "b0010".U & arbCnt === "b0010".U) -> sampleReg(3), // (arbLock === (1.U << 1) & arbCnt === (1.U << 1)) -> sampleReg(3),
(arbLock === "b0010".U & arbCnt === "b0100".U) -> sampleReg(0), // (arbLock === (1.U << 1) & arbCnt === (1.U << 2)) -> sampleReg(0),
(arbLock === "b0010".U & arbCnt === "b1000".U) -> sampleReg(1), // (arbLock === (1.U << 1) & arbCnt === (1.U << 3)) -> sampleReg(1),
(arbLock === "b0100".U & arbCnt === "b0001".U) -> sampleReg(1), // (arbLock === (1.U << 2) & arbCnt === (1.U << 0)) -> sampleReg(1),
(arbLock === "b0100".U & arbCnt === "b0010".U) -> sampleReg(2), // (arbLock === (1.U << 2) & arbCnt === (1.U << 1)) -> sampleReg(2),
(arbLock === "b0100".U & arbCnt === "b0100".U) -> sampleReg(3), // (arbLock === (1.U << 2) & arbCnt === (1.U << 2)) -> sampleReg(3),
(arbLock === "b0100".U & arbCnt === "b1000".U) -> sampleReg(0), // (arbLock === (1.U << 2) & arbCnt === (1.U << 3)) -> sampleReg(0),
(arbLock === "b1000".U & arbCnt === "b0001".U) -> sampleReg(0), // (arbLock === (1.U << 3) & arbCnt === (1.U << 0)) -> sampleReg(0),
(arbLock === "b1000".U & arbCnt === "b0010".U) -> sampleReg(1), // (arbLock === (1.U << 3) & arbCnt === (1.U << 1)) -> sampleReg(1),
(arbLock === "b1000".U & arbCnt === "b0100".U) -> sampleReg(2), // (arbLock === (1.U << 3) & arbCnt === (1.U << 2)) -> sampleReg(2),
(arbLock === "b1000".U & arbCnt === "b1000".U) -> sampleReg(3), // (arbLock === (1.U << 3) & arbCnt === (1.U << 3)) -> sampleReg(3),
)) // )
(for { i <- 0 until sampleRate; j <- 0 until sampleRate } yield {
//跳变沿到来锁定的位置 锁定拍当前所在的位置 选择锁定拍后一拍的值认为是正确值
((arbLock === (1.U << i)) & (arbCnt === (1.U << j))) -> sampleReg((sampleRate - 1 - i + j) % sampleRate)
})
)
)}
val syncSerDat = ShiftRegister( asyncSerDat, 2 ) val syncSerDat = ShiftRegister( asyncSerDat, 2 )

View File

@@ -13,7 +13,7 @@ module SimTop (
input clock, //100MHz input clock, //100MHz
input reset, input reset,
input clk400, input clk800,
output [7:0] gpio_o, output [7:0] gpio_o,
input [7:0] gpio_i input [7:0] gpio_i
@@ -205,7 +205,7 @@ ExampleRocketSystem s_rocket_mst(
.interrupts(2'b0), .interrupts(2'b0),
.cdrInIO_overCLK(clk400), .cdrInIO_overCLK(clk800),
.cdrInIO_dDatIn(1'b0), .cdrInIO_dDatIn(1'b0),
.cdrInIO_uDatIn(uDatSer[0]), .cdrInIO_uDatIn(uDatSer[0]),
.cdrInIO_isLast(1'b0), .cdrInIO_isLast(1'b0),
@@ -398,7 +398,7 @@ ExampleRocketSystem s_rocket_slv0(
.interrupts(2'b0), .interrupts(2'b0),
.cdrInIO_overCLK(clk400), .cdrInIO_overCLK(clk800),
.cdrInIO_dDatIn(dDatSer[0]), .cdrInIO_dDatIn(dDatSer[0]),
.cdrInIO_uDatIn(uDatSer[1]), .cdrInIO_uDatIn(uDatSer[1]),
.cdrInIO_isLast(1'b0), .cdrInIO_isLast(1'b0),
@@ -591,7 +591,7 @@ ExampleRocketSystem s_rocket_slv1(
.interrupts(2'b0), .interrupts(2'b0),
.cdrInIO_overCLK(clk400), .cdrInIO_overCLK(clk800),
.cdrInIO_dDatIn(dDatSer[1]), .cdrInIO_dDatIn(dDatSer[1]),
.cdrInIO_uDatIn(uDatSer[2]), .cdrInIO_uDatIn(uDatSer[2]),
.cdrInIO_isLast(1'b0), .cdrInIO_isLast(1'b0),
@@ -784,7 +784,7 @@ ExampleRocketSystem s_rocket_slv2(
.interrupts(2'b0), .interrupts(2'b0),
.cdrInIO_overCLK(clk400), .cdrInIO_overCLK(clk800),
.cdrInIO_dDatIn(dDatSer[2]), .cdrInIO_dDatIn(dDatSer[2]),
.cdrInIO_uDatIn(), .cdrInIO_uDatIn(),
.cdrInIO_isLast(1'b1), .cdrInIO_isLast(1'b1),

View File

@@ -125,7 +125,7 @@ int main(int argc, char **argv, char **env) {
top->reset = 1; top->reset = 1;
top->clock = 0; top->clock = 0;
top->clk400 = 0; top->clk800 = 0;
while(!Verilated::gotFinish()) { while(!Verilated::gotFinish()) {
@@ -172,11 +172,11 @@ static void init_and_clock(){
main_cycle ++; main_cycle ++;
} }
uint8_t phase = 4; uint8_t phase = 1;
if ( main_time % 10 == (0+phase) ) { if ( main_time % 5 == (0+phase) ) {
top->clk400 = 1; top->clk800 = 1;
} else if ( main_time % 10 == (5+phase) ) { } else if ( main_time % 5 == (2+phase) ) {
top->clk400 = 0; top->clk800 = 0;
} }