Files
eb001/doc/spec/SlaveRecParser.md
2026-07-28 17:28:49 +08:00

6.0 KiB
Raw Permalink Blame History

SlaveRecParser


以下为用户区域


  • 从站接收解析器使用状态机将输入的数据流解析获取到帧头子报文头负载数据子报文尾CRC校验等部分
  • SlaveRecParserSlaveParser模块中例化2个分别解析上行和下行方向接收到的数据

接口

  • rec数据流输入接口以axis协议传输
  • datadecoupledIO握手协议下的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_CRCCRC校验

  • STATE_ERROR传输错误

  • 上电复位或者软件复位后,状态机应该处在空闲状态

  • STATE_IDLE

    • 当输入的recvalid从0跳1则进入STATE_HEADER
    • 其余状况保持
  • STATE_HEADER

    • recfire时tlast为1传输结束进入STATE_ERROR状态
    • recfiretlast为0接收帧头长度到达34byte判断解析的帧类型
      • 如果为常规包FRAME_STYLE_COMMON,进入解析子报文头STATE_SUBMSG_HEADER,此时为时刻1
      • 如果为探测包FRAME_STYLE_PROBE进入CRC校验STATE_CRC,此时为时刻1
      • 以上均不是则是错误,进入STATE_ERROR
    • 其余状况保持
  • STATE_SUBMSG_HEADER

    • recfire时tlast为1传输结束进入STATE_ERROR状态
    • recfiretlast为0接收子报文头长度到达56byte进入解析负载STATE_PAYLOAD_DATA,此时为时刻2
    • 其余状况保持
  • STATE_PAYLOAD_DATA

    • recfire时tlast为1传输结束或者data端口上溢出isDataRejErrvalid为1而ready为0进入STATE_ERROR状态
    • recfiretlast为0接收子报文长度到达子报文头信息标示的长度-1进入子报文尾解析STATE_SUBMSG_TAIL
    • 其余状况保持
  • STATE_SUBMSG_TAIL

    • recfire时tlast为1传输结束进入STATE_ERROR状态
    • recfiretlast为0接收子报文尾长度到达12byte
      • 若已接受帧长度到达帧头标示的长度-1进入STATE_CRC,此时为时刻3
      • 若未达到,进入STATE_SUBMSG_HEADER接收下一个子报文,此时为时刻3
    • 其余状况保持
  • STATE_CRC

    • recfire时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,frameReqvalid为高,将帧头信息使用结构体传输到SlaveParser模块
  • 时刻2subMsgHeadReqvalid为高,将子报文头信息使用结构体传输到SlaveParser模块
  • 时刻3subMsgTailReqvalid为高,将子报文尾信息使用结构体传输到SlaveParser模块
  • STATE_PAYLOAD_DATA状态,datavalid始终为高,将负载数据传输到SlaveParser模块
    • SlaveParser模块需要保证datareadyvalid为高是也为高,否则触发上溢出isDataRejErr

CRC

  • SlaveRecParser内部例化一个CRC32的8比特输入模块
  • recfire时且状态机处于STATE_HEADER STATE_SUBMSG_HEADER STATE_PAYLOAD_DATA STATE_SUBMSG_TAIL时,将数据输入模块进行计算
  • 当状态机处于STATE_IDLE或者软件复位时清空CRC模块状态
  • 当接收的最后4byte和CRC模块计算值匹配时CRC通过

以下是大模型补充区域