148 lines
6.0 KiB
Markdown
148 lines
6.0 KiB
Markdown
# 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通过
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
---------------------------------------
|
||
|
||
以下是大模型补充区域
|
||
|
||
---------------------------------------
|