标签:
文档版本 | 开发工具 | 测试平台 | 工程名字 | 日期 | 作者 | 备注 |
---|---|---|---|---|---|---|
V1.0 | ise14.7 | DBF板 | Day4/PCIETest | 2016.03.31 | lutianfei | none |
PIO模式
是一种通过CPU执行I/O端口指令来进行数据的读写的数据交换模式。是最早先的硬盘数据传输模式,数据传输速率低下,CPU占有率也很高,大量传输数据时会因为占用过多的CPU资源而导致系统停顿,无法进行其它的操作。数据传输速率从3.3MB/s到16.6MB/s不等。传输速率低下和极高的CPU占有率。
PIO模式在No_16_0328 Virtex6 PCIe2.5(一) 仿真学习.md中已经测试过,这里不再赘述。不同的地方在于仿真使用的是v2.5版本ip核,而DMA参考xapp1052
方案设计,顾改为1.7版ip核,既不再使用AXI总线设计。
sys_reset_n
: 输入,异步复位,时间至少大于1500nssys_clk
:输入,可选频率为100Mhz,125Mhz,250Mhztrn_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
同时为低时有效。 trn_td[63:0]
trn_td[63:32]
trn_tsrc_rdy_n
: 输入,发送源(用户)准备就绪;用户已将有效数据放入trn_td
。trn_tdst_rdy_n
: 输出,发送目的(核)准备就绪;表示核已经准备好接收在trn_td
上的数据。当其与trn_tsrc_rdy_n
同时有效时表示数据已成功传至trn_td
。
trn_tdst_rdy_n
拉低trn_tsrc_rdy_n
和trn_tsof_n
拉低,并与trn_td
第一个数据前沿对齐。trn_tsof_n
在下个时钟周期即可拉高。trn_tsrc_rdy_n
,trn_teof_n
同时拉低,且与trn_td
最后一个数据前沿对齐。(trn_trem_n
视情况而定)trn_tsrc_rdy_n
,trn_teof_n
制信号在下个trn_clk
同时拉高。
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
同时为低时有效。
trn_rd[63:0]
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_rdst_rdy_n
拉低。trn_rsof_n
、trn_rsrc_rdy_n
拉低,并与trn_rd
第一个数据前沿对齐。trn_rsof_n
拉高,并继续输出数据trn_rsrc_rdy_n
与trn_reof_n
拉低,并与trn_rd
最后一行数据前沿对齐。(trn_rrem_n
视情况而定)trn_rsrc_rdy_n
、trn_reof_n
拉高。
cfg_interrupt_n
: 输入,中断请求信号,用户将此信号拉低,来告诉PCIe核所选择的中断信息。此信号必须保持到cfg_interrupt_rdy_n
为低后。
cfg_interrupt_rdy_n
: 输出,中断确认信号,当此信号与cfg_interrupt_n
信号同时为低时表示PCIe核成功传输了中断信息。
cfg_interrupt_assert_n
: 输入,传统中断置有效无效选择。
cfg_interrupt_di[7:0]
: 输入,对于传统中断,只支持INTA,所以时钟填00h。
板卡发送中断过程说明:
用户
cfg_interrupt_n
、cfg_interrupt_assert_n
拉低,请求中断。cfg_interrupt_di[7:0]
始终置为00h。cfg_interrupt_rdy_n
拉低cfg_interrupt_n
拉高置为无效。cfg_interrupt_assert_n
拉高置无效,同时将cfg_interrupt_n
拉低。cfg_interrupt_rdy_n
拉低置有效,表示接受中断取消信号。cfg_interrupt_n
拉高。板卡接收中断说明:
中断置位TLP:0x3400_0000_0100_0020, 0x0000_0000_0000_0000
中断撤销TLP:0x3400_0000_0100_0024, 0x0000_0000_0000_0000,
PC
申请物理地址连续的一段内存空间。FPGA
准备好发送数据后向PC发送中断,通知PC读取这些数据。PC
接收并分析该中断,向BAR0空间内寄存器,写如下命令:物理地址的起始地址、空间大小,并且 启动DMA。FPGA
内的 DMA 引擎接收到启动** DMA 的命令后,主动将数据组织成**MWr包发送到 PC。DMA 引擎会自动填充 TPL 包逐一增加的地址等信息,直到达到用户设定的长度。在此过程完成后,FPGA向主机发送一个中断。PC
接收到中断后,然后读取 BAR0 空间状态寄存器判断中断类型,然后做相应的判断。将这段物理地址的数据拷贝到用户程序能够访问的空间中,然后回到步骤 2。PC
申请物理地址连续的一段内存空间。FPGA
准备好接收数据后向* PC
* 发送中断,通知 PC 发送数据。PC
接收并分析该中断,写 BAR0 空间内寄存器,包含上述物理地址的起始地址、空间大小,然后启动 DMA。FPGA
内的 DMA 引擎接收到启动 DMA 的命令后,主动组织Mrd包发送到 PC
。DMA 引擎会自动填充 TPL 包逐一增加的地址等信息,直到达到用户设定的长度。PC
收到读请求,会自动将上述物理空间的数据组织成* Completion TLPs* 回送给 FPGA
,FPGA
接收分析后按顺序存放在相应的缓冲内。在此过程完成后,FPGA 向主机发送一个中断。PC
接收到中断后,然后读取 BAR0 空间状态寄存器判断是中断类型,然后做相应的判断。将这段用户程序中新的数据拷贝到物理空间中,然后回到步骤 2。TX_Engine
用于组织和传输转发事务、非转发事务和完成事务的数据包。在这个设计中,TX_Engine 可以产生存储器写转发的请求(MWr) 、非转发的读请求(MRd)和带数据的完成(CplD) 。产生的数据发送到 TRN 接口。
RX_Engine
用于从 TRN 接口中接收数据,并根据事务的种类,将对应的数据放在 Ingress FIFO
中或控制和状态寄存器
中。RX Engine 也通过 Read Request Wrapper
通知TX Engine
还未发送的请求。RX Engine 支持完成事务、存储器读事务和存储器写事务。
DMA Control and Status Wrapper
该模块是和 CPU 通讯的主要模块,也是 DMA 控制的主要模块,包含内部状态控制模块Internal Control Block
和 DMA 控制/状态寄存器 DMA Control/Status Register
内部状态解析 CPU 的命令,并作出相应的执行。DMA 控制/状态寄存器被映射到 PCI 的地址空间中,同时也和其他的用户逻辑相连接。CPU 通过读写这些寄存器达到控制其他逻辑的运行。
Egress Data Presenter
此模块提供外部不同来源不同位宽的数据到 TX Engine
的通道。
Read Request Wrapper
用于 TX Engine
和 RX Engine
的通讯。TX Engine
将尚未发送的非转发事务信息发送给 RX Engine
。这个信息存储在 32 位位宽的双端口 RAM 中。
Egress/Ingress FIFO
和其他数据来源连接。接口为 Xilinx 标准 FIFO接口,可方便的集成用户自定义的外设。
1、复位Initiator
2、清除Initiator的复位
3、填写DMA寄存器相关信息,在此之前需要PC先申请一块物理地址连续的缓冲区。
DMA目的起始地址
:PC向BARO空间 WDMATLPA(0x008)地址,写 DMA目的起始地址。TLP包大小
: PC向BARO空间 WDMATLPS(0x00c)地址,写 TLP包大小。TLP包个数
: PC向BARO空间 WDMATLPC(0x010)地址,写 TLP包个数。4、启动DMA
5、处理DMA完成
标签:
原文地址:http://blog.csdn.net/lutianfeiml/article/details/51035756