目录
1、BMD_64_RX模块STG
RX模块功能说明:接收来自PCIE IP的TLP数据包,并进行解析。xapp1052设置的rx模块处理的数据包类型有四种:
- 7'b10_00000:PIO 3DW写访问事务;
- 7'b00_00000:PIO 3DW读访问事务;
- 7'b00_01010:不带数据的完成包事务;
- 7'b10_01010:DMA 3DW 带数据的完成包事务;
状态转移如下图所示:
在DMA事务状态中,需要判断当前TLP包是否是最后一个TLP包,若是最后一个TLP数据包,则其中是否仅含1个DW数据。详细代码如下图所示。
2、BMD_64_TX模块STG
TX模块功能说明:将待发送的数据组成TLP报文发送给PCIE IP,并进行解析。xapp1052设置的tx模块处理的数据包类型有五种:
- 7'b10_01010:PIO ,3DW,CPLD带数据的完成包事务。
- 7'b10_00000:存储器写请求,3DW,带数据。DMA事务类型。
- 7'b11_00000:存储器写请求,4DW,带数据。DMA事务类型。
- 7'b00_00000:存储器读请求,3DW,不带数据。DMA事务类型。
- 7'b01_00000:存储器读请求,3DW,不带数据。DMA事务类型。
2.0、RST_STATE
为便于理解,该小节引用自博客:https://blog.csdn.net/cllovexyh/article/details/79855813
首先判断是否启动DMA写操作、DMA写操作完成等信号,其中serv_mwr 信号是用轮询操作控制DMA写操作的进行。接着trn_trem_n为0表示这一帧的两个DW都有效,cur_mwr_dw_count表示这一个TLP中数据的数量(单位DW),拼接发送第一帧数据,即2DW标头。接着就进入轮询操作。
轮询操作的目的是在发送一段时间的存储器写TLP之后,停止一次,然后判断此时是否有DMA读存储器开始信号,如果有的话就去执行DMA读操作,否则就是停止一次传输,下一个周期开始又继续DMA写操作。其中tmwr_wrr_cnt 信号统计发送TLP的数量,而mwr_wrr_cnt_i 信号则是设定轮询操作的TLP的量,这个值是在寄存器中配置的,当这两个值相等时就发生一次轮询操作。
通过mwr_64b_en_i 信号判断发送的存储器写请求的标头是3DW还是4DW,这和完成包不一样,因为完成包只有3DW标头,而存储器写或者读的TLP有3DW和4DW两种。
2.1、MWR_QW1状态
在该状态发送32bit地址和1DW数据。
为便于理解,该小节引用自博客:https://blog.csdn.net/cllovexyh/article/details/79855813
这个状态是发送第二帧数据,包含1DW标头(地址)+1DW数据,同样设置主机有效信号,然后通过cur_wr_count判断这是不是第一个TLP,因为第几个TLP决定着需要存入存储器的地址,mwr_addr是PC端申请的连续内存的首个地址,所以cur_wr_count为0,则要存入的地址为连续内存的首地址,之后就按照每个TLP中的数据量改变下一个TLP数据的存储地址。
cur_mwr_dw_count信号初值是一个TLP中的数据量(DW),如果当前cur_mwr_dw_count为1,则表示这是最后一个数据了,那么这时通过cur_wr_count分析这是否是最后一个包,如果是最后一个包那么说明这个TLP只有两帧(3DW标头+1DW数据),此次DMA传输完全结束,mwr_done_o置1;若不是最后一个数据,说明这个TLP不止两帧数据,则跳转BMD_64_TX_MWR_QWN 状态。
2.2、MWR64_QW1状态
在该状态发送64bit地址
2.3、MWR_QWN状态
在该状态需要判断是否是最后一个TLP数据包,若是最后一个,则判断是否仅含1个DW或2个DW。
如果只有一个DW,使用trn_trem_n 信号来表明最后一个DW无效。
若有两个DW,则trn_trem_n=0,表明2个DW都有效。