下行报文载入寄存器

This commit is contained in:
Ruige Lee
2025-04-05 09:27:15 +08:00
parent 5bc63aaee2
commit 703ad172b8

View File

@@ -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,
MuxCase( STATE_ERROR, Array( Mux( lengthCnt === 0, STATE_HEADER,
( io.downIn.axis.bits(1,0) === FRAME_STYLE_COMMON ) -> STATE_PAYLOAD_INDEX_STYLE, MuxCase( STATE_ERROR, Array(
( io.downIn.axis.bits(1,0) === FRAME_STYLE_PROBE ) -> STATE_CRC, ( io.downIn.axis.bits(1,0) === FRAME_STYLE_COMMON ) -> STATE_PAYLOAD_INDEX_STYLE,
)) ( 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 ),