# 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 `子报文尾错误 - `isCRCError `CRC错误 - `isFinish `传输正确完成 - `isRecByteAck `接收到一个字节 * `flush`软件复位 --------------------------------------- ## 状态机 状态机有如下状态 * `STATE_IDLE`空闲 * `STATE_HEADER`解析帧头 * `STATE_SUBMSG_HEADER`解析子报文头 * `STATE_PAYLOAD_DATA`解析负载 * `STATE_SUBMSG_TAIL`解析子报文尾 * `STATE_CRC`CRC校验 * `STATE_ERROR`传输错误 * 上电复位或者软件复位后,状态机应该处在空闲状态 * 在`STATE_IDLE` - 当输入的`rec`的`valid`从0跳1,则进入`STATE_HEADER` - 其余状况保持 * 在`STATE_HEADER` - 当`rec`fire时,`tlast`为1(传输结束),进入`STATE_ERROR`状态 - 当`rec`fire,`tlast`为0,接收帧头长度到达3(4byte),判断解析的帧类型 + 如果为常规包`FRAME_STYLE_COMMON`,进入解析子报文头`STATE_SUBMSG_HEADER`,此时为***时刻1*** + 如果为探测包`FRAME_STYLE_PROBE`,进入CRC校验`STATE_CRC`,此时为***时刻1*** + 以上均不是则是错误,进入`STATE_ERROR` - 其余状况保持 * 在`STATE_SUBMSG_HEADER` - 当`rec`fire时,`tlast`为1(传输结束),进入`STATE_ERROR`状态 - 当`rec`fire,`tlast`为0,接收子报文头长度到达5(6byte),进入解析负载`STATE_PAYLOAD_DATA`,此时为***时刻2*** - 其余状况保持 * 在`STATE_PAYLOAD_DATA` - 当`rec`fire时,`tlast`为1(传输结束)或者`data`端口上溢出`isDataRejErr`(valid为1而ready为0),进入`STATE_ERROR`状态 - 当`rec`fire,`tlast`为0,接收子报文长度到达子报文头信息标示的长度-1,进入子报文尾解析`STATE_SUBMSG_TAIL` - 其余状况保持 * 在`STATE_SUBMSG_TAIL` - 当`rec`fire时,`tlast`为1(传输结束),进入`STATE_ERROR`状态 - 当`rec`fire,`tlast`为0,接收子报文尾长度到达1(2byte) + 若已接受帧长度到达帧头标示的长度-1,进入`STATE_CRC`,此时为***时刻3*** + 若未达到,进入`STATE_SUBMSG_HEADER`接收下一个子报文,此时为***时刻3*** - 其余状况保持 * 在`STATE_CRC` - 当`rec`fire时,`tlast`为1(传输结束), + 传输长度达到3(4byte)且CRC校验通过,返回`STATE_IDLE`,解析正确完成 + 否则,进入`STATE_ERROR`,长度不一致或者CRC校验失败 - 其余状况保持 * 在`STATE_ERROR` - 保持`STATE_ERROR`,只能通过软复位或者全局复位清除错误 -------------------------------------- ## 帧结构 * 帧头4byte - frameLenAim(12bits)帧长度目标 - Null(2bits) 留空 - frameStyle (2bits) 包类型 + `FRAME_STYLE_COMMON` 普通包 0 + `FRAME_STYLE_PROBE` 嗅探包 1 - frameInfo (16bits)其它信息 * 子报文头 6byte - devIndex (14bits) 子报文中设备索引 - style (2bits) 子报文类型 + SeqIndex 0 顺序索引 + LgcIndex 2 逻辑索引 - address (16bits) 子报文地址 - operator (4bits) 子报文命令类型 + `SUBMSG_OPERATOR_UNIREAD ` 单独读 0 + `SUBMSG_OPERATOR_UNIWRITE ` 单独写 1 + `SUBMSG_OPERATOR_UNIRDWR ` 单独读写 2 + `SUBMSG_OPERATOR_SYNCA ` 时间同步操作A 0xa + `SUBMSG_OPERATOR_INDEX ` 索引 0xb + `SUBMSG_OPERATOR_SYNCC ` 时间同步操作C 0xc + `SUBMSG_OPERATOR_BOARDREAD ` 广播读 0xd + `SUBMSG_OPERATOR_BOARDWRITE` 广播写 0xe + `SUBMSG_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比特输入模块 * 当`rec`fire时,且状态机处于`STATE_HEADER` `STATE_SUBMSG_HEADER` `STATE_PAYLOAD_DATA` `STATE_SUBMSG_TAIL`时,将数据输入模块进行计算 * 当状态机处于`STATE_IDLE`时,或者软件复位时,清空CRC模块状态 * 当接收的最后4byte和CRC模块计算值匹配时,CRC通过 --------------------------------------- 以下是大模型补充区域 ---------------------------------------