6.0 KiB
6.0 KiB
SlaveRecParser
以下为用户区域
- 从站接收解析器使用状态机,将输入的数据流解析,获取到帧头,子报文头,负载数据,子报文尾,CRC校验等部分
SlaveRecParser在SlaveParser模块中例化2个,分别解析上行和下行方向接收到的数据
接口
rec数据流输入接口,以axis协议传输data以decoupledIO握手协议下的8bits数据传输,将负载数据传输到下一级逻辑stateNext组合逻辑输出下一拍状态机状态输出stateCurr当前状态机状态寄存器输出frameReq以``validIO`握手协议输出帧头的信息,完整帧头信息以结构体打包subMsgHeadReq以``validIO`握手协议输出子报文头的信息,完整子报文头信息以结构体打包subMsgTailReq以``validIO`握手协议输出子报文尾的信息,完整子报文尾信息以结构体打包isError输出Bool下的错误状态,当状态机进入错误状态,则为真stat输出传输状态isHeaderError帧头错误isSubHeaderError子报文头错误isPayloadError负载错误isSubTailError子报文尾错误isCRCErrorCRC错误isFinish传输正确完成isRecByteAck接收到一个字节
flush软件复位
状态机
状态机有如下状态
-
STATE_IDLE空闲 -
STATE_HEADER解析帧头 -
STATE_SUBMSG_HEADER解析子报文头 -
STATE_PAYLOAD_DATA解析负载 -
STATE_SUBMSG_TAIL解析子报文尾 -
STATE_CRCCRC校验 -
STATE_ERROR传输错误 -
上电复位或者软件复位后,状态机应该处在空闲状态
-
在
STATE_IDLE- 当输入的
rec的valid从0跳1,则进入STATE_HEADER - 其余状况保持
- 当输入的
-
在
STATE_HEADER- 当
recfire时,tlast为1(传输结束),进入STATE_ERROR状态 - 当
recfire,tlast为0,接收帧头长度到达3(4byte),判断解析的帧类型- 如果为常规包
FRAME_STYLE_COMMON,进入解析子报文头STATE_SUBMSG_HEADER,此时为时刻1 - 如果为探测包
FRAME_STYLE_PROBE,进入CRC校验STATE_CRC,此时为时刻1 - 以上均不是则是错误,进入
STATE_ERROR
- 如果为常规包
- 其余状况保持
- 当
-
在
STATE_SUBMSG_HEADER- 当
recfire时,tlast为1(传输结束),进入STATE_ERROR状态 - 当
recfire,tlast为0,接收子报文头长度到达5(6byte),进入解析负载STATE_PAYLOAD_DATA,此时为时刻2 - 其余状况保持
- 当
-
在
STATE_PAYLOAD_DATA- 当
recfire时,tlast为1(传输结束)或者data端口上溢出isDataRejErr(valid为1而ready为0),进入STATE_ERROR状态 - 当
recfire,tlast为0,接收子报文长度到达子报文头信息标示的长度-1,进入子报文尾解析STATE_SUBMSG_TAIL - 其余状况保持
- 当
-
在
STATE_SUBMSG_TAIL- 当
recfire时,tlast为1(传输结束),进入STATE_ERROR状态 - 当
recfire,tlast为0,接收子报文尾长度到达1(2byte)- 若已接受帧长度到达帧头标示的长度-1,进入
STATE_CRC,此时为时刻3 - 若未达到,进入
STATE_SUBMSG_HEADER接收下一个子报文,此时为时刻3
- 若已接受帧长度到达帧头标示的长度-1,进入
- 其余状况保持
- 当
-
在
STATE_CRC- 当
recfire时,tlast为1(传输结束),- 传输长度达到3(4byte)且CRC校验通过,返回
STATE_IDLE,解析正确完成 - 否则,进入
STATE_ERROR,长度不一致或者CRC校验失败
- 传输长度达到3(4byte)且CRC校验通过,返回
- 其余状况保持
- 当
-
在
STATE_ERROR- 保持
STATE_ERROR,只能通过软复位或者全局复位清除错误
- 保持
帧结构
-
帧头4byte
- frameLenAim(12bits)帧长度目标
- Null(2bits) 留空
- frameStyle (2bits) 包类型
FRAME_STYLE_COMMON普通包 0FRAME_STYLE_PROBE嗅探包 1
- frameInfo (16bits)其它信息
-
子报文头 6byte
- devIndex (14bits) 子报文中设备索引
- style (2bits) 子报文类型
- SeqIndex 0 顺序索引
- LgcIndex 2 逻辑索引
- address (16bits) 子报文地址
- operator (4bits) 子报文命令类型
SUBMSG_OPERATOR_UNIREAD单独读 0SUBMSG_OPERATOR_UNIWRITE单独写 1SUBMSG_OPERATOR_UNIRDWR单独读写 2SUBMSG_OPERATOR_SYNCA时间同步操作A 0xaSUBMSG_OPERATOR_INDEX索引 0xbSUBMSG_OPERATOR_SYNCC时间同步操作C 0xcSUBMSG_OPERATOR_BOARDREAD广播读 0xdSUBMSG_OPERATOR_BOARDWRITE广播写 0xeSUBMSG_OPERATOR_BOARDRDWR广播读写 0xf
- length (12bits) 子报文负载长度
-
子报文尾 2byte
- 包含
workCnt工作计数
- 包含
信息交换
- 在时刻1,
frameReq的valid为高,将帧头信息使用结构体传输到SlaveParser模块 - 在时刻2,
subMsgHeadReq的valid为高,将子报文头信息使用结构体传输到SlaveParser模块 - 在时刻3,
subMsgTailReq的valid为高,将子报文尾信息使用结构体传输到SlaveParser模块 - 在
STATE_PAYLOAD_DATA状态,data的valid始终为高,将负载数据传输到SlaveParser模块SlaveParser模块需要保证data的ready在valid为高是也为高,否则触发上溢出isDataRejErr
CRC
SlaveRecParser内部例化一个CRC32的8比特输入模块- 当
recfire时,且状态机处于STATE_HEADERSTATE_SUBMSG_HEADERSTATE_PAYLOAD_DATASTATE_SUBMSG_TAIL时,将数据输入模块进行计算 - 当状态机处于
STATE_IDLE时,或者软件复位时,清空CRC模块状态 - 当接收的最后4byte和CRC模块计算值匹配时,CRC通过
以下是大模型补充区域