timing close
This commit is contained in:
@@ -22,15 +22,19 @@ class CDR4MultiInIO() extends Bundle{
|
||||
class CDR4MultiIn() extends Module{
|
||||
val io: CDR4MultiInIO = IO(new CDR4MultiInIO())
|
||||
|
||||
val inBusToAsync = Wire( new AsyncBundle(new CDRData) )
|
||||
val latValidSet = Wire(Bool())
|
||||
|
||||
val latValidSetAsync = ShiftRegister( latValidSet, 2, false.B, true.B )
|
||||
val latValidReset = RegNext(latValidSetAsync, false.B)
|
||||
|
||||
val transInfo = Wire(new CDRData)
|
||||
|
||||
withClockAndReset( io.clk4.asClock, reset ){
|
||||
val latAValid = RegInit(false.B)
|
||||
val latAInfo = Reg(new CDRData)
|
||||
val shiftDat = RegInit( 0.U( ((1+6+8+32+16)*4+2).W ) )
|
||||
val latAReady = Wire(Bool())
|
||||
val latValidSetReg = RegInit(false.B); latValidSet := latValidSetReg
|
||||
val latValidResetAsync = ShiftRegister(latValidReset, 2, false.B, true.B)
|
||||
|
||||
val shiftDat = RegInit( 0.U( ((1+6+8+32+16)*4+2).W ) )
|
||||
|
||||
val transInfo = Wire(new CDRData)
|
||||
|
||||
transInfo :=
|
||||
Cat(
|
||||
@@ -38,25 +42,31 @@ class CDR4MultiIn() extends Module{
|
||||
).asTypeOf(new CDRData)
|
||||
|
||||
|
||||
when( latAValid & latAReady ){
|
||||
when( latValidSetReg & latValidResetAsync ){
|
||||
shiftDat := 0.U
|
||||
latAValid := false.B
|
||||
latValidSetReg := false.B
|
||||
} .elsewhen( shiftDat.extract(0) =/= 1.U ){
|
||||
shiftDat := Cat(io.dat, shiftDat( ((1+6+8+32+16)*4+2)-1, 1) )
|
||||
} .elsewhen( shiftDat.extract(0) === 1.U ){
|
||||
latAValid := true.B
|
||||
latAInfo := transInfo
|
||||
latValidSetReg := true.B
|
||||
}
|
||||
|
||||
val inBusASyncIO = Wire( new DecoupledIO(new CDRData) )
|
||||
inBusASyncIO.valid := latAValid
|
||||
inBusASyncIO.bits := latAInfo
|
||||
latAReady := inBusASyncIO.ready
|
||||
inBusToAsync <> ToAsyncBundle( inBusASyncIO, AsyncQueueParams(sync=2) )
|
||||
|
||||
}
|
||||
|
||||
val latDatValid = RegInit(false.B)
|
||||
val latDatInfo = Reg(new CDRData)
|
||||
|
||||
when( io.latDat.fire ){
|
||||
latDatValid := false.B
|
||||
} .elsewhen( latValidSetAsync & ~latValidReset){
|
||||
latDatValid := true.B
|
||||
latDatInfo := transInfo
|
||||
}
|
||||
|
||||
io.latDat.valid := latDatValid
|
||||
io.latDat.bits := latDatInfo
|
||||
|
||||
io.latDat <> FromAsyncBundle( inBusToAsync, 2 )
|
||||
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user