From 703ad172b82cded418da51de14e26dd8b56fd30a Mon Sep 17 00:00:00 2001 From: Ruige Lee Date: Sat, 5 Apr 2025 09:27:15 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8B=E8=A1=8C=E6=8A=A5=E6=96=87=E8=BD=BD?= =?UTF-8?q?=E5=85=A5=E5=AF=84=E5=AD=98=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../scala/backBoard/shin/SlaveParser.scala | 81 ++++++++++++++----- 1 file changed, 63 insertions(+), 18 deletions(-) diff --git a/src/main/scala/backBoard/shin/SlaveParser.scala b/src/main/scala/backBoard/shin/SlaveParser.scala index 7b59726..f201a9b 100644 --- a/src/main/scala/backBoard/shin/SlaveParser.scala +++ b/src/main/scala/backBoard/shin/SlaveParser.scala @@ -35,42 +35,87 @@ abstract class SlaveParserBase extends Module{ val downStateCurr = RegNext(downStateNext, STATE_IDLE(4.W)) val lengthCnt = Reg(UInt(11.W)) //动态计数器 - val subMsgCnt = Reg(UInt(7.W)) //子报文不超过64个? - val subMsgLenAim = Reg(UInt(11.W)) //子报文长度 - val FrameLenAim = Reg(UInt(11.W)) //帧长度目标 - val FrameLenCnt = Reg(UInt(11.W)) //帧长度计数 + //val subMsgCnt = Reg(UInt(7.W)) //子报文不超过128个 + val subMsgLenAim = Reg(UInt(12.W)) //子报文长度 + val frameLenAim = Reg(UInt(12.W)) //帧长度目标 + val frameLenCnt = Reg(UInt(12.W)) //帧长度计数 val isCrcPass: Bool val isTxEnd: 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 := Mux1H(Seq( //必须使用上升沿触发,以避免前一帧长度超过预期 ( downStateCurr === STATE_IDLE ) -> Mux( ~RegNext(io.downIn.axis.valid) & io.downIn.axis.valid, STATE_HEADER, STATE_IDLE ), ( downStateCurr === STATE_HEADER ) -> Mux( isShortRx, STATE_ERROR, - 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_PROBE ) -> STATE_CRC, - )) + Mux( lengthCnt === 0, STATE_HEADER, + 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_PROBE ) -> STATE_CRC, + )) + ) ), ( 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, - STATE_PAYLOAD_OP_LENGTH + ( downStateCurr === STATE_PAYLOAD_ADDR ) -> Mux( isShortRx, STATE_ERROR, + Mux( lengthCnt === 0, STATE_PAYLOAD_ADDR, STATE_PAYLOAD_OP_LENGTH ) ), - ( downStateCurr === STATE_PAYLOAD_OP_LENGTH ) -> Mux( isShortRx, - STATE_PAYLOAD_WORKCNT + ( downStateCurr === STATE_PAYLOAD_OP_LENGTH ) -> Mux( isShortRx, STATE_ERROR, + Mux( lengthCnt === 0, STATE_PAYLOAD_OP_LENGTH, STATE_PAYLOAD_WORKCNT ) ), - ( downStateCurr === STATE_PAYLOAD_WORKCNT ) -> Mux( isShortRx, - Mux( lengthCnt === (2 - 1).U, STATE_PAYLOAD_DATA, STATE_PAYLOAD_WORKCNT ) + ( downStateCurr === STATE_PAYLOAD_WORKCNT ) -> Mux( isShortRx, STATE_ERROR, + 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(FrameLenCnt === FrameLenAim, STATE_CRC, STATE_PAYLOAD_INDEX_STYLE + Mux(frameLenCnt === frameLenAim, STATE_CRC, STATE_PAYLOAD_INDEX_STYLE ), 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 ) ), ( downStateCurr === STATE_ERROR ) -> Mux( isTxEnd, STATE_IDLE, STATE_ERROR ),