xapp1052 BMD

编程入门 行业动态 更新时间:2024-10-23 09:35:15

xapp1052 <a href=https://www.elefans.com/category/jswz/34/1748638.html style=BMD"/>

xapp1052 BMD

目录

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

状态转移如下图所示:

 

 

1.1 RX_RST状态

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

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

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

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等相关信息。第二帧数据,含地址信息。

1.3 PIO写访问

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

1.4 CPL事务

 

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
  
  

 

 

 

 

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

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

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

2.0、RST_STATE

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

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

 

首先判断是否启动DMA写操作、DMA写操作完成等信号,其中serv_mwr 信号是用轮询操作控制DMA写操作的进行。接着trn_trem_n为0表示这一帧的两个DW都有效,cur_mwr_dw_count表示这一个TLP中数据的数量(单位DW),拼接发送第一帧数据,即2DW标头。接着就进入轮询操作。

通过mwr_64b_en_i 信号判断发送的存储器写请求的标头是3DW还是4DW,这和完成包不一样,因为完成包只有3DW标头,而存储器写或者读的TLP有3DW和4DW两种。
 

2.1 CPLD事务

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

2.2 DMA写操作

核心就两个计数器和访问地址:

  1. TLP    SIZE   CNT:cur_mwr_dw_count 当前TLP报文里传输的负载数据量(传输DW的个数),单位DW。
  2. TLP COUNT CNT:cur_wr_count          连续传输TLP报文的个数。
  3. TLP  H/W  ADDR :tmwr_addr                

 

2.2.1、MWR_QW1状态

在该状态计算当前访问地址、并发送1DW地址和1DW数据TLP COUNT CNT + 1

 

 

 

为便于理解,该小节引用自博客:

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

cur_mwr_dw_count信号初值是一个TLP中的总共待传输的数据量(DW);

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

如果cur_mwr_dw_count不等于1或2,则表明不是最后一个TLP数据包,需要发送2DW的数据量。

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

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

 

2.3 DMA读操作

3代码下载

rx接收模块 :

tx发送模块:

 

 

 

更多推荐

xapp1052 BMD

本文发布于:2024-02-06 11:25:43,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1748416.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:BMD

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!