xapp1052 BMD_64读写模块代码分析

目录

1、BMD_64_RX模块STG

1.1 RX_RST状态

1.2 PIO读访问

1.3 PIO写访问

1.4 CPL事务

1.5 CPLD事务

2、BMD_64_TX模块STG

2.0、RST_STATE

2.1 CPLD事务

2.2 DMA写操作

2.2.1、MWR_QW1状态

2.2.2、MWR64_QW1状态

2.2.3、MWR_QWN状态

3 代码下载


 

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 带数据的完成包事务;

状态转移如下图所示:

xapp1052 BMD_64读写模块代码分析_第1张图片

 

xapp1052 BMD_64读写模块代码分析_第2张图片

 

xapp1052 BMD_64读写模块代码分析_第3张图片

1.1 RX_RST状态

 在该状态,对TLP头包类型进行判断,trn[63:32]对应下图的byte0那一行,trn[31:0]对应下图的byte4那一行。

xapp1052 BMD_64读写模块代码分析_第4张图片

 该状态接收TLP报文的第一帧,trn_rx是64位,含FMT/TYPE/Length/requester ID/DW BE等相关信息。

  • 若是PIO读访问:解析出相关信息;
  • 若是PIO写访问:解析出该数据帧中的Last DW BE/1st DW BE信息。
  • 若是CLP事务 :
  • 若是CLPD事务:

xapp1052 BMD_64读写模块代码分析_第5张图片

cpld_data_size_o 将所有的Length 累加起来,用于统计所有完成包一共返回了多少DW数据。
cpld_tlp_size 表示当前完成包中的数据的量(DW),这里只截取了Length 的低7位应该会出问题,因为上位机配置每个包的负载时128个DW,Length中的低7位为0,尽管如此,分析后发现这也不影响DMA传输。
 cpld_found_o 用于统计完成包的数量。cpld_real_size 统计当前完成包中数据的量(DW),当前完成包传输完成后,该值与cpld_tlp_size 进行比较。跳转到下一状态
   
   

 

1.2 PIO读访问

PIO读访问,3DW,该TLP报有两帧数据,第一帧数据64位,含FMT/TYPE/Length/requester ID/DW BE等相关信息。第二帧数据,含地址信息。

xapp1052 BMD_64读写模块代码分析_第6张图片

1.3 PIO写访问

PIO写访问,3DW,该TLP报有两帧数据,第一帧数据64位,含FMT/TYPE/Length/requester ID/DW BE等相关信息。第二帧数据,含写地址和写数据信息。下图是该3DW TLP报文的第二帧。

xapp1052 BMD_64读写模块代码分析_第7张图片

1.4 CPL事务

xapp1052 BMD_64读写模块代码分析_第8张图片

 

1.5 CPLD事务

系统接口
sys_reset_n 输入,异步复位,时间至少大于1500ns
sys_clk 输入,可选频率为100Mhz,125Mhz,250Mhz
事物接口:通用事物接口
trn_clk 输出, 传输、配置、物理层控制、状态接口操作都与此时钟同步
trn_reset_n 输出,用户逻辑与传输和配置接口交互时使用此复位恢复到初始状态;与trn_clk同步,与sys_reset_n异步
trn_lnk_up_n 输出,当核与连接对象已连接且准备好交换数据时有效
trn_fc_* 输出,各种流控制信号
trn_fc_sel[2:0] 输入:选择流控制信息呈现在哪个trn_fc_*上
事物接口:发送事物接口
trn_tsof_n 输入,发送帧开始表示,仅在trn_tsrc_rdy_n信号为低时,有效
trn_teof_n 输入,发送帧结束标志,仅在trn_tsrc_rdy_n信号为低时,有效
trn_td 输入,发送数据接口
trn_trem_n

输入,发送数据余数。仅在trn_teof_n 、trn_tsrc_rdy_n、trn_tdst_rdy_n同时为低时有效。

为0表示数据在trn_td[63:0]
为1表示数据在trn_td[63:32]

trn_tsrc_rdy_n 输入,发送源(用户)准备就绪;用户已将有效数据放入trn_td
trn_tdst_rdy_n 输出,发送目的(核)准备就绪;表示核已经准备好接收在trn_td上的数据。当其与trn_tsrc_rdy_n同时有效时表示数据已成功传至trn_td。
事物接口:接收事物接口
trn_rsof_n 输出,接收帧开始标志,仅在trn_rsrc_rdy_n为低时有效
trn_reof_n 输出,接收帧结束标志,仅在trn_rsrc_rdy_n为低时有效
trn_rd 输出,接收到的数据,仅在trn_rsrc_rdy_n为低时有效
trn_rrem_n

输出,接收数据余数。仅在trn_reof_n 、trn_rsrc_rdy_n、trn_rdst_rdy_n同时为低时有效。

为0表示数据在trn_rd[63:0]
为1表示数据在trn_rd[63:32]

trn_rerrfwd_n 输出,表示收到错误数据。
trn_rsrc_rdy_n: 输出,表示接收源(核)准备就绪。表示,核将数据传至trn_rd。
trn_rdst_rdy_n 输入,表示接收目的(用户)准备就绪。表示,用户准备好接收来自trn_rd的数据
trn_rsrc_dsc_n 输出,表示核将当前包丢掉
trn_rnp_ok_n 输入,表示用户准备好接收一个Non-Posted TLP包
trn_rbar_hit_n[6:0]

输出,表示当前包在哪个BAR空间,在trn_rsof_n 到 trn_reof_n有效

trn_rbar_hit_n[0]: BAR0
trn_rbar_hit_n[1]: BAR1
trn_rbar_hit_n[2]: BAR2
trn_rbar_hit_n[3]: BAR3
trn_rbar_hit_n[4]: BAR4
trn_rbar_hit_n[5]: BAR5
trn_rbar_hit_n[6]: Expansion ROM Addres

中断事物接口
cfg_interrupt_n 输入,中断请求信号,用户将此信号拉低,来告诉PCIe核所选择的中断信息。此信号必须保持到cfg_interrupt_rdy_n为低后。
cfg_interrupt_rdy_n 输出,中断确认信号,当此信号与cfg_interrupt_n信号同时为低时表示PCIe核成功传输了中断信息。
cfg_interrupt_assert_n

输入,传统中断置有效无效选择。

为1表示有效
为0表示无效

cfg_interrupt_di[7:0] 输入,对于传统中断,只支持INTA,所以时钟填00h
   
   

 

 

 

 

xapp1052 BMD_64读写模块代码分析_第9张图片

下面状态对应CPLD TLP包的第二帧:含一个1DW有效数据。

在DMA事务状态中,需要判断当前TLP包是否是最后一个TLP包,若是最后一个TLP数据包,则其中是否仅含1个DW数据。详细代码如下图所示。

xapp1052 BMD_64读写模块代码分析_第10张图片

cpld_malformed_o <= 1'b1表示完成包畸形

 

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事务类型。

xapp1052 BMD_64读写模块代码分析_第11张图片

xapp1052 BMD_64读写模块代码分析_第12张图片

xapp1052 BMD_64读写模块代码分析_第13张图片

xapp1052 BMD_64读写模块代码分析_第14张图片

2.0、RST_STATE

在该状态,需要判断,并组装TLP报文头包

  • req_compl_q=1,启动组装发送CPLD报文头包;
  • mwr_start_i  =1,启动组装DMA写操作报文头包;
  • mrd_start_i   =1,启动组装DMA读操作报文头包;

xapp1052 BMD_64读写模块代码分析_第15张图片

xapp1052 BMD_64读写模块代码分析_第16张图片

xapp1052 BMD_64读写模块代码分析_第17张图片

首先判断是否启动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 CPLD事务

CLPD TLP报文共有两帧。在RST_STATE状态,已经发送完成CPLD TLP报文的第一帧;这里是TLP报文的第二帧,在该状态发送:1DW标头+1DW数据。

xapp1052 BMD_64读写模块代码分析_第18张图片

2.2 DMA写操作

2.2.1、MWR_QW1状态

在该状态发送32bit地址和1DW数据。

为便于理解,该小节引用自博客:https://blog.csdn.net/cllovexyh/article/details/79855813

xapp1052 BMD_64读写模块代码分析_第19张图片

这个状态是发送第二帧数据,包含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.2、MWR64_QW1状态

在该状态发送64bit地址

 

2.2.3、MWR_QWN状态

在该状态需要判断是否是最后一个TLP数据包,若是最后一个,则判断是否仅含1个DW或2个DW。

如果只有一个DW,使用trn_trem_n 信号来表明最后一个DW无效。

若有两个DW,则trn_trem_n=0,表明2个DW都有效。

xapp1052 BMD_64读写模块代码分析_第20张图片

2.3 DMA读操作

xapp1052 BMD_64读写模块代码分析_第21张图片

 

3代码下载

rx接收模块 : https://download.csdn.net/download/qq_22168673/12414472

tx发送模块:https://download.csdn.net/download/qq_22168673/12418259

 

 

 

你可能感兴趣的:(FPGA基础进阶)