目录
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 代码下载
RX模块功能说明:接收来自PCIE IP的TLP数据包,并进行解析。xapp1052设置的rx模块处理的数据包类型有四种:
状态转移如下图所示:
在该状态,对TLP头包类型进行判断,trn[63:32]对应下图的byte0那一行,trn[31:0]对应下图的byte4那一行。
该状态接收TLP报文的第一帧,trn_rx是64位,含FMT/TYPE/Length/requester ID/DW BE等相关信息。
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 进行比较。跳转到下一状态 |
PIO读访问,3DW,该TLP报有两帧数据,第一帧数据64位,含FMT/TYPE/Length/requester ID/DW BE等相关信息。第二帧数据,含地址信息。
PIO写访问,3DW,该TLP报有两帧数据,第一帧数据64位,含FMT/TYPE/Length/requester ID/DW BE等相关信息。第二帧数据,含写地址和写数据信息。下图是该3DW TLP报文的第二帧。
系统接口 | |
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] |
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] |
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 |
中断事物接口 | |
cfg_interrupt_n | 输入,中断请求信号,用户将此信号拉低,来告诉PCIe核所选择的中断信息。此信号必须保持到cfg_interrupt_rdy_n为低后。 |
cfg_interrupt_rdy_n | 输出,中断确认信号,当此信号与cfg_interrupt_n信号同时为低时表示PCIe核成功传输了中断信息。 |
cfg_interrupt_assert_n | 输入,传统中断置有效无效选择。 为1表示有效 |
cfg_interrupt_di[7:0] | 输入,对于传统中断,只支持INTA,所以时钟填00h |
下面状态对应CPLD TLP包的第二帧:含一个1DW有效数据。
在DMA事务状态中,需要判断当前TLP包是否是最后一个TLP包,若是最后一个TLP数据包,则其中是否仅含1个DW数据。详细代码如下图所示。
cpld_malformed_o <= 1'b1表示完成包畸形
TX模块功能说明:将待发送的数据组成TLP报文发送给PCIE IP,并进行解析。xapp1052设置的tx模块处理的数据包类型有五种:
在该状态,需要判断,并组装TLP报文头包
首先判断是否启动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两种。
CLPD TLP报文共有两帧。在RST_STATE状态,已经发送完成CPLD TLP报文的第一帧;这里是TLP报文的第二帧,在该状态发送:1DW标头+1DW数据。
在该状态发送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 状态。
在该状态发送64bit地址
在该状态需要判断是否是最后一个TLP数据包,若是最后一个,则判断是否仅含1个DW或2个DW。
如果只有一个DW,使用trn_trem_n 信号来表明最后一个DW无效。
若有两个DW,则trn_trem_n=0,表明2个DW都有效。
rx接收模块 : https://download.csdn.net/download/qq_22168673/12414472
tx发送模块:https://download.csdn.net/download/qq_22168673/12418259