下行报文载入寄存器
This commit is contained in:
@@ -35,42 +35,87 @@ abstract class SlaveParserBase extends Module{
|
|||||||
val downStateCurr = RegNext(downStateNext, STATE_IDLE(4.W))
|
val downStateCurr = RegNext(downStateNext, STATE_IDLE(4.W))
|
||||||
|
|
||||||
val lengthCnt = Reg(UInt(11.W)) //动态计数器
|
val lengthCnt = Reg(UInt(11.W)) //动态计数器
|
||||||
val subMsgCnt = Reg(UInt(7.W)) //子报文不超过64个?
|
//val subMsgCnt = Reg(UInt(7.W)) //子报文不超过128个
|
||||||
val subMsgLenAim = Reg(UInt(11.W)) //子报文长度
|
val subMsgLenAim = Reg(UInt(12.W)) //子报文长度
|
||||||
val FrameLenAim = Reg(UInt(11.W)) //帧长度目标
|
val frameLenAim = Reg(UInt(12.W)) //帧长度目标
|
||||||
val FrameLenCnt = Reg(UInt(11.W)) //帧长度计数
|
val frameLenCnt = Reg(UInt(12.W)) //帧长度计数
|
||||||
val isCrcPass: Bool
|
val isCrcPass: Bool
|
||||||
val isTxEnd: Bool
|
val isTxEnd: Bool
|
||||||
val isShortRx: Bool //接收长度小于预期
|
val isShortRx: Bool //接收长度小于预期
|
||||||
|
val frameStyle = Reg(UInt(2.W)) //包类型
|
||||||
|
val devIndex = Reg(UInt(14.W)) //当前设备索引
|
||||||
|
val subMsg_devIndex = Reg(UInt(14.W)) // 子报文中设备索引
|
||||||
|
val subMsg_style = Reg(UInt(2.W)) // 子报文类型
|
||||||
|
val subMsg_address = Reg(UInt(16.W)) //子报文地址
|
||||||
|
val subMsg_operator = Reg(UInt(4.W)) //子报文命令类型
|
||||||
|
val subMsg_length = Reg(UInt(12.W)) //子报文负载长度
|
||||||
|
val subMsg_workCnt = Reg(UInt(16.W)) //子报文工作计数
|
||||||
|
|
||||||
|
|
||||||
|
when( downStateCurr === STATE_HEADER & lengthCnt === 0.U ){
|
||||||
|
frameLenAim := io.downIn.bits.tdata << 4
|
||||||
|
} .elsewhen( downStateCurr === STATE_HEADER & lengthCnt === 1.U ){
|
||||||
|
frameLenAim := frameLenAim | io.downIn.bits.tdata(7,4)
|
||||||
|
frameStyle := io.downIn.bits.tdata(1,0)
|
||||||
|
}
|
||||||
|
|
||||||
|
when( downStateCurr === STATE_PAYLOAD_INDEX_STYLE & lengthCnt === 0.U ){
|
||||||
|
subMsg_devIndex := io.downIn.bits.tdata << 6
|
||||||
|
} .elsewhen( downStateCurr === STATE_PAYLOAD_INDEX_STYLE & lengthCnt === 1.U ){
|
||||||
|
subMsg_devIndex := subMsg_devIndex | io.downIn.bits.tdata(7,2)
|
||||||
|
subMsg_style := io.downIn.bits.tdata(1,0)
|
||||||
|
}
|
||||||
|
|
||||||
|
when( downStateCurr === STATE_PAYLOAD_ADDR & lengthCnt === 0.U ){
|
||||||
|
subMsg_address := io.downIn.bits.tdata << 8
|
||||||
|
} .elsewhen( downStateCurr === STATE_PAYLOAD_ADDR & lengthCnt === 1.U ){
|
||||||
|
subMsg_address := subMsg_address | io.downIn.bits.tdata
|
||||||
|
}
|
||||||
|
|
||||||
|
when( downStateCurr === STATE_PAYLOAD_OP_LENGTH & lengthCnt === 0.U ){
|
||||||
|
subMsg_operator := io.downIn.bits.tdata(7,4)
|
||||||
|
subMsg_length := io.downIn.bits.tdata(3,0) << 8
|
||||||
|
} .elsewhen( downStateCurr === STATE_PAYLOAD_OP_LENGTH & lengthCnt === 1.U ){
|
||||||
|
subMsg_length := subMsg_length | io.downIn.bits.tdata(7,0)
|
||||||
|
}
|
||||||
|
|
||||||
|
when( downStateCurr === STATE_PAYLOAD_WORKCNT & lengthCnt === 0.U ){
|
||||||
|
subMsg_workCnt := io.downIn.bits.tdata(7,0) << 8
|
||||||
|
} .elsewhen( downStateCurr === STATE_PAYLOAD_WORKCNT & lengthCnt === 1.U ){
|
||||||
|
subMsg_workCnt := subMsg_workCnt | io.downIn.bits.tdata(7,0)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
downStateNext :=
|
downStateNext :=
|
||||||
Mux1H(Seq(
|
Mux1H(Seq(
|
||||||
//必须使用上升沿触发,以避免前一帧长度超过预期
|
//必须使用上升沿触发,以避免前一帧长度超过预期
|
||||||
( downStateCurr === STATE_IDLE ) -> Mux( ~RegNext(io.downIn.axis.valid) & io.downIn.axis.valid, STATE_HEADER, STATE_IDLE ),
|
( downStateCurr === STATE_IDLE ) -> Mux( ~RegNext(io.downIn.axis.valid) & io.downIn.axis.valid, STATE_HEADER, STATE_IDLE ),
|
||||||
( downStateCurr === STATE_HEADER ) -> Mux( isShortRx, STATE_ERROR,
|
( downStateCurr === STATE_HEADER ) -> Mux( isShortRx, STATE_ERROR,
|
||||||
|
Mux( lengthCnt === 0, STATE_HEADER,
|
||||||
MuxCase( STATE_ERROR, Array(
|
MuxCase( STATE_ERROR, Array(
|
||||||
( io.downIn.axis.bits(1,0) === FRAME_STYLE_COMMON ) -> STATE_PAYLOAD_INDEX_STYLE,
|
( io.downIn.axis.bits(1,0) === FRAME_STYLE_COMMON ) -> STATE_PAYLOAD_INDEX_STYLE,
|
||||||
( io.downIn.axis.bits(1,0) === FRAME_STYLE_PROBE ) -> STATE_CRC,
|
( io.downIn.axis.bits(1,0) === FRAME_STYLE_PROBE ) -> STATE_CRC,
|
||||||
))
|
))
|
||||||
|
)
|
||||||
),
|
),
|
||||||
( downStateCurr === STATE_PAYLOAD_INDEX_STYLE ) -> Mux( isShortRx, STATE_ERROR,
|
( downStateCurr === STATE_PAYLOAD_INDEX_STYLE ) -> Mux( isShortRx, STATE_ERROR,
|
||||||
STATE_PAYLOAD_ADDR
|
Mux( lengthCnt === 0, STATE_PAYLOAD_INDEX_STYLE, STATE_PAYLOAD_ADDR )
|
||||||
),
|
),
|
||||||
( downStateCurr === STATE_PAYLOAD_ADDR ) -> Mux( isShortRx,
|
( downStateCurr === STATE_PAYLOAD_ADDR ) -> Mux( isShortRx, STATE_ERROR,
|
||||||
STATE_PAYLOAD_OP_LENGTH
|
Mux( lengthCnt === 0, STATE_PAYLOAD_ADDR, STATE_PAYLOAD_OP_LENGTH )
|
||||||
),
|
),
|
||||||
( downStateCurr === STATE_PAYLOAD_OP_LENGTH ) -> Mux( isShortRx,
|
( downStateCurr === STATE_PAYLOAD_OP_LENGTH ) -> Mux( isShortRx, STATE_ERROR,
|
||||||
STATE_PAYLOAD_WORKCNT
|
Mux( lengthCnt === 0, STATE_PAYLOAD_OP_LENGTH, STATE_PAYLOAD_WORKCNT )
|
||||||
),
|
),
|
||||||
( downStateCurr === STATE_PAYLOAD_WORKCNT ) -> Mux( isShortRx,
|
( downStateCurr === STATE_PAYLOAD_WORKCNT ) -> Mux( isShortRx, STATE_ERROR,
|
||||||
Mux( lengthCnt === (2 - 1).U, STATE_PAYLOAD_DATA, STATE_PAYLOAD_WORKCNT )
|
Mux( lengthCnt === 0.U, STATE_PAYLOAD_WORKCNT, STATE_PAYLOAD_DATA )
|
||||||
),
|
),
|
||||||
( downStateCurr === STATE_PAYLOAD_DATA ) -> Mux( isShortRx,
|
( downStateCurr === STATE_PAYLOAD_DATA ) -> Mux( isShortRx, STATE_ERROR,
|
||||||
Mux( lengthCnt === (subMsgLen - 1.U),
|
Mux( lengthCnt === (subMsgLen - 1.U),
|
||||||
Mux(FrameLenCnt === FrameLenAim, STATE_CRC, STATE_PAYLOAD_INDEX_STYLE
|
Mux(frameLenCnt === frameLenAim, STATE_CRC, STATE_PAYLOAD_INDEX_STYLE
|
||||||
), STATE_PAYLOAD_DATA )
|
), STATE_PAYLOAD_DATA )
|
||||||
),
|
),
|
||||||
( downStateCurr === STATE_CRC ) -> Mux( isShortRx,
|
( downStateCurr === STATE_CRC ) -> Mux( isShortRx, STATE_ERROR,
|
||||||
Mux( lengthCnt === (4 - 1).U, Mux( isCrcPass, STATE_IDLE, STATE_ERROR), STATE_CRC )
|
Mux( lengthCnt === (4 - 1).U, Mux( isCrcPass, STATE_IDLE, STATE_ERROR), STATE_CRC )
|
||||||
),
|
),
|
||||||
( downStateCurr === STATE_ERROR ) -> Mux( isTxEnd, STATE_IDLE, STATE_ERROR ),
|
( downStateCurr === STATE_ERROR ) -> Mux( isTxEnd, STATE_IDLE, STATE_ERROR ),
|
||||||
|
|||||||
Reference in New Issue
Block a user