Files
eb001/doc/spec/SlaveRecParser.md

148 lines
6.0 KiB
Markdown
Raw Permalink Normal View History

2026-07-28 17:28:49 +08:00
# 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接收帧头长度到达34byte判断解析的帧类型
+ 如果为常规包`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接收子报文头长度到达56byte进入解析负载`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接收子报文尾长度到达12byte
+ 若已接受帧长度到达帧头标示的长度-1进入`STATE_CRC`,此时为***时刻3***
+ 若未达到,进入`STATE_SUBMSG_HEADER`接收下一个子报文,此时为***时刻3***
- 其余状况保持
*`STATE_CRC`
-`rec`fire时`tlast`为1传输结束
+ 传输长度达到34byte且CRC校验通过返回`STATE_IDLE`,解析正确完成
+ 否则,进入`STATE_ERROR`长度不一致或者CRC校验失败
- 其余状况保持
*`STATE_ERROR`
- 保持`STATE_ERROR`,只能通过软复位或者全局复位清除错误
--------------------------------------
## 帧结构
* 帧头4byte
- frameLenAim12bits帧长度目标
- Null2bits 留空
- 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通过
---------------------------------------
以下是大模型补充区域
---------------------------------------