CDRIn采样率改为8x,允许参数化
This commit is contained in:
@@ -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 )
|
||||||
|
|||||||
@@ -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),
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user