下行报文载入寄存器
This commit is contained in:
@@ -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,
|
||||
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 ),
|
||||
|
||||
Reference in New Issue
Block a user