增加控制码3个必选,3个可选

This commit is contained in:
RuigeLee
2026-07-28 17:28:49 +08:00
parent 6622bf1c73
commit 43369d87f7
6 changed files with 425 additions and 10 deletions

19
doc/spec/SPI.md Normal file
View File

@@ -0,0 +1,19 @@
# SPI特性
## 同步采样SPI/QSPI
同步采样SPI通过使用系统驱动的时钟将输入的spi/QSPI信号全部当作异步数据信号通过观测CSN以及其余信号和SCK的关系采样SPI/QSPI的输入并给出输出
使用这种方法允许的QSPI传输速度会受到限制使用慢模式时允许的SCK速率为无穷小到1/2主时钟频率当使用快模式时允许的SCK速度为1/2主时钟频率到1倍主时钟频率
## 异步采样SPI/QSPI
异步采样设计的SPI/QSPI端直接使用SCK作为敏感源因此允许更高的传输速度但是SPI数据测和主时钟域需要精确地进行跨时钟域处理

113
doc/spec/SlaveParser.md Normal file
View File

@@ -0,0 +1,113 @@
# SlaveParser
----------------------------
以下为用户区域
---------------------------
* 该模块例化在`MstSlvSwith`模块内,负责从站接收功能实现
* 内部例化了两个`SlaveRecParser``downRecParser``upRecParser`)和两个`SlaveSendGen``downSendGen``upSendGen`
## 接口
* `downIn``Decoupled`封装的axis格式的lvds下行串行数据输入
* `downOut``Decoupled`封装的axis格式的lvds下行串行数据输出
* `upIn``Decoupled`封装的axis格式的lvds上行串行数据输入
* `upOut``Decoupled`封装的axis格式的lvds上行串行数据输出
* `sram_w`接入到4个`SmUnit`的SRAM写接口
* `sram_r`接入到4个`SmUnit`的SRAM读接口
* `dSMenq`接入到4个`SmUnit`的下行写入压栈Bool信号
* `uSMdeq`接入到4个`SmUnit`的上行读出弹出Bool信号
* `localDevIndex`输出本地设备的索引16bits
* `isDevOnRight`表示设备的“右边”下行方向下一级是否还有设备2bits实际只使用了1bits
* `isDevOnRightModify`表示设备的“右边”(下行方向下一级)是否改变过
* `indexOfRightDev`表示设备的“右边”(下行方向下一级)设备的索引号
* `mstDeltaTimeStamp`输出32bits的时间戳信息
* `slvDeltaTime`输出32bits的时间戳信息
* `deltaFinal`输出64bits的时间戳信息
* `isLoop`是否回环Bool
* `cReg`以结构体输入通用寄存器组
* `sReg`以结构体输入从站寄存器组
* `lvds`一个类似sram的访问接口用于允许从lvds总线的访问读写寄存器区域
* `intHWTrig`输出两个Bool硬件中断信号
* `intHWClr`输入两个Bool硬件清除中断信号
* `downRecStat`输出下行接收方向信息
* `upRecStat`输出上行接收方向信息
---------------------------------------------------------
## 主报文转发处理
* 下行发送模块`downSendGen`的帧头请求`frameReq`来自于下行接收`downRecParser`的报文头同步握手,同时`frameInfo`会被更改为本地设备的索引号`lcalDevIndex`
* 上行发送模块`upSendGen`的帧头请求`frameReq`
- 上行接收`upRecParser`的报文头同步握手,此时`frameStyle`需要为普通包`FRAME_STYLE_COMMON`,转发完全相同的上行接收报文头
- 下行接收到的是嗅探包而进入`isAckProbe`状态,发送(回复)嗅探包,`frameLenAim`为0`frameStyle``FRAME_STYLE_PROBE``frameInfo``localDevIndex`
## 子报文处理
* 子报文接收在上、下行各有2个位宽8bits深度20的FIFO`downRecFifo`/`upRecFifo`,以乒乓方式工作,子报文负载信息先进入`RecFifo`,再由发送模块`SendGen`发送
* 子报文接收在上、下行各有2组寄存器分别保存子报文头子报文尾信息以乒乓方式工作发送模块发送时从寄存器中提取和修改信息
## 索引特质
* 当子报文的`operator``SUBMSG_OPERATOR_INDEX`,为索引模式,从站按顺序更新自己的索引
* 更新索引时
- 本设备索引`localDevIndex`更新为子报文尾工作计数`workCnt`加1
- 下行转发的`workCnt`计数也加1`localDevIndex`
- 右边(下行方向)设备索引`indexOfRightDev`
+ 当是最后一个设备记录为0
+ 不是最后一个设备,更新为子报文尾工作计数`workCnt`计数加2
## 读写特质
* 写操作发生在下行阶段
* 读操作发生在上行阶段
* 单独读(和/或)写操作是否执行需要根据子报文头的报文类型`style`进行判定
- 当为顺序索引`SeqIndex`,只需要子报文头的设备索引`devIndex`匹配上本设备的索引`localDevIndex`,则需要进行操作
- 当为逻辑索引`LgcIndex`, 则需要进一步根据EBMMU的配置进行判定
* 广播读(和/或)写操作则均会被执行
* 如果从站对该子报文进行了操作,则转发到下一级从站时,子报文的工作计数`workCnt`需要加1
* lvds的写操作根据地址可以访问
- 寄存器
- SMUnit0
- SMUnit2
- SMUnit4
- SMUnit6
* lvds的写操作根据地址可以访问
- 寄存器
- SMUnit1
- SMUnit3
- SMUnit5
- SMUnit7
* 当lvds的读、写操作到特定地址时触发SMUnit对应的写压入或者读弹出操作
### ebmmu
## 同步特质
## 嗅探特质
##
---------------------------------------
以下是大模型补充区域
---------------------------------------

147
doc/spec/SlaveRecParser.md Normal file
View File

@@ -0,0 +1,147 @@
# 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通过
---------------------------------------
以下是大模型补充区域
---------------------------------------

52
doc/spec/SmUnit.md Normal file
View File

@@ -0,0 +1,52 @@
# SMUnit
---------------------------------------------
以下是用户区域
---------------------------------------------
SMUnit本质是一个SRAM队列FIFO的维护模块
## 接口
对外接口包括:
* sram对外写接口
* sram对外读接口
* enq 输入Bool 压栈
* deq 输入Bool 弹出
* SRAM对内接口接入实际例化的多个SRAM
* cnt 输出当前fifo内有多少个数据
* flush 输入软件复位整个SMUnit
* isComf 输入Bool确认正式写入
* isAbrt 输入Bool放弃写入
-----------------------------------------
## 指针
* FIFO内部除了常见的读指针`rPtr`和写指针`wPtr`,额外增加了一个提交指针`cPtr`
* 提交指针是为了在系统错误写入时进行撤销而设计的当eb01从站接收数据过程中有可能收到了部分数据进而写入fifo并进行压栈但是本次传输并没有完全完成例如后续数据错误crc校验失败。这时我们需要回滚fifo的状态抛弃掉之前写入的数据
-------------------------
* 三个指针的位宽比fifo实际需要位宽多1bits用于指示空满`log2Ceil(depth)+1`
* 当读指针`rPtr`和提交指针`cPtr`相等时fifo为空
* 当读指针`rPtr`和写指针`wPtr`最高位不同其余比特相同fifo为满
* 复位或者使用`flush`软复位时,所有指针归零
*`enq`时且fifo不为满写指针加1
*`isAbrt`了,写指针`wPtr`回退到提交指针`cPtr`的位置
* **对于写指针`wPtr`,当`enq``isAbrt`同时到来,`enq`的优先级更高,对整个大系统工作功能会不会产生问题需要测,或者系统正常运行时不会发生这种情况**
*`deq`且fifo不为空读指针加1
*`isComf`时提交指针`cPtr`前进到写指针`wPtr`的位置
* 根据写指针`wPtr`的有效比特位的值sram对外写接口连接到内部实际例化特定SRAM的写接口其余未指向的接口保持为0不活动或者悬空
* 根据读指针`rPtr`的有效比特位的值sram对外读接口连接到内部实际例化特定SRAM的读接口其余未指向的接口保持为0不活动或者悬空
---------------------------------------
以下是大模型补充区域
---------------------------------------

View File

@@ -0,0 +1,44 @@
# 物理层优化
----------------------------
以下为用户区域
---------------------------
## 8b10b模块
* 停用4b5b特性
- 删除选择寄存器器 h4c寄存器不再有效
* 增加部分控制码
- 所有控制码都有极性
- 控制码有对应原始码
- 额外增加一条控制线
- 控制线由发送状态机控制
- 解码不需要极性控制
* 增加6个控制码
- 同时将`in(4,0)b11100".U``isCtrl`时映射为 `"b001111".U(6.W), "b110000".U(6.W)`
- 3个必选 `in(7,5)`保持不变
val isK28_0 = Output(Bool()) //0x1c
val isK28_3 = Output(Bool()) //0x7c
val isK28_4 = Output(Bool()) //0x9c
- 3个备选使用宏定义控制 `in(7,5)`平衡但需要增加翻转
* val isK28_1 = Output(Bool()) //0x3c IS_ENABLE_K28_1
* val isK28_2 = Output(Bool()) //0x5c IS_ENABLE_K28_2
* val isK28_6 = Output(Bool()) //0xdc IS_ENABLE_K28_6
---------------------------------------
以下是大模型补充区域
---------------------------------------