您的位置:首页 > 其它

Virtex6 PCIe 超简版基础概念学习(二)

2016-04-01 12:03 411 查看
文档版本开发工具测试平台工程名字日期作者备注
V1.0ise14.7DBF板Day4/PCIETest2016.03.31lutianfeinone
参考资料:

Spartan 6 PCIE_V2.4 真教程(一)

Spartan 6 PCIE_V2.4 真教程(二)

菜鸟5小时速成FPGA_PCIE设计高手教程.pdf

ug671_V6_IntBlock_PCIe.pdf

PCI+EXPRESS体系结构导读.pdf

一、PIO模式

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总线设计。

二、PCIe核接口定义

(一) 系统接口

sys_reset_n
: 输入,异步复位,时间至少大于1500ns

sys_clk
:输入,可选频率为100Mhz,125Mhz,250Mhz

(二) 事物接口

[b]2.1 通用事物接口[/b]

trn_clk
: 输出, 传输、配置、物理层控制、状态接口操作都与此时钟同步。

trn_reset_n
: 输出,用户逻辑与传输和配置接口交互时使用此复位恢复到初始状态;与
trn_clk
同步,与
sys_reset_n
步。

trn_lnk_up_n
: 输出,当核与连接对象已连接且准备好交换数据时有效。

trn_fc_*
: 输出,各种流控制信号

trn_fc_sel[2:0]
: 输入:选择流控制信息呈现在哪个
trn_fc_*
上。

[b]2.2 发送事物接口[/b]

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






发送TLP工作流程:



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
同时拉高。







[b]2.3 接收事物接口[/b]

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





接收TLP工作流程:

用户

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
拉高。





[b]2.4 中断事物接口[/b]

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

板卡发送中断过程说明:





用户

cfg_interrupt_n
cfg_interrupt_assert_n
,请求中断。
cfg_interrupt_di[7:0]
始终置为00h



cfg_interrupt_rdy_n


用户

下一个时钟周期,将
cfg_interrupt_n
置为无效。

:将中断产生消息发送出去。(保证PCI Command寄存器的Interrupt Disable位置0)

用户:中断请求被接受时

cfg_interrupt_assert_n
置无效,同时将
cfg_interrupt_n




cfg_interrupt_rdy_n
拉低置有效,表示接受中断取消信号。

用户

在下一个时钟,将
cfg_interrupt_n
拉高。



发送中断取消消息

板卡接收中断说明:

中断置位TLP:0x3400_0000_0100_0020, 0x0000_0000_0000_0000

Fmt 为 2’b01,Type 为 5’b10100,是消息请求

Message Code:8‘b0010_0000中断( INTx)消息

assert_inta 拉高表示收到中断INTA#。



中断撤销TLP:0x3400_0000_0100_0024, 0x0000_0000_0000_0000,

Fmt 为 2’b01, Type 为 5’b10100,是消息请求,

Message Code 为 8’b0010_0100,是中断( INTx)撤销消息

received_deassert_inta 为 1,收到 INTA#中断撤销消息



三 、PCIe DMA模式

PCI设备与存储器直接进行数据交换的过程被称为DMA。

(一) 数据从FPGA搬移到PC

1 .
PC
申请物理地址连续的一段内存空间。

2 .
FPGA
准备好发送数据后向PC发送中断,通知PC读取这些数据。

3 .
PC
接收并分析该中断,向BAR0空间内寄存器,写如下命令:物理地址的起始地址空间大小,并且 启动DMA

4 .
FPGA
内的 DMA 引擎接收到启动** DMA 的命令后,主动将数据组织成**MWr包发送到 PC。DMA 引擎会自动填充 TPL 包逐一增加的地址等信息,直到达到用户设定的长度。在此过程完成后,FPGA向主机发送一个中断

5 .
PC
接收到中断后,然后读取 BAR0 空间状态寄存器判断中断类型,然后做相应的判断。将这段物理地址的数据拷贝到用户程序能够访问的空间中,然后回到步骤 2

(二) 数据从 PC 搬移到FPGA的过程

1 .
PC
申请物理地址连续的一段内存空间。

2 .
FPGA
准备好接收数据后向*
PC
* 发送中断,通知 PC 发送数据。

3 .
PC
接收并分析该中断,写 BAR0 空间内寄存器,包含上述物理地址的起始地址空间大小,然后启动 DMA

4 .
FPGA
内的 DMA 引擎接收到启动 DMA 的命令后,主动组织Mrd包发送到
PC
DMA 引擎会自动填充 TPL 包逐一增加的地址等信息,直到达到用户设定的长度。
PC
收到读请求,会自动将上述物理空间的数据组织成* Completion TLPs* 回送给
FPGA
FPGA
接收分析后按顺序存放在相应的缓冲内。在此过程完成后,FPGA 向主机发送一个中断

5 .
PC
接收到中断后,然后读取 BAR0 空间状态寄存器判断是中断类型,然后做相应的判断。将这段用户程序中新的数据拷贝到物理空间中,然后回到步骤 2

(三) DMA控制逻辑



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接口,可方便的集成用户自定义的外设。

四 XAPP1052 DMA设计

[b](一) FPGA –> PC 数据传输具体实现[/b]

1、复位Initiator

PC向BARO空间 DCR1(0x0)地址,写0x1值,表示对PCIe 初始化复位。

2、清除Initiator的复位

PC向BARO空间 DCR1(0x0)地址,写0x0值,表示清除对PCIe 初始化复位。

3、填写DMA寄存器相关信息,在此之前需要PC先申请一块物理地址连续的缓冲区。

DMA目的起始地址
PC向BARO空间 WDMATLPA(0x008)地址,写 DMA目的起始地址。

TLP包大小
: PC向BARO空间 WDMATLPS(0x00c)地址,写 TLP包大小。

TLP包个数
: PC向BARO空间 WDMATLPC(0x010)地址,写 TLP包个数。

4、启动DMA

PC向BARO空间 DCR2(0x4)地址,写0x1值,表示对开启DMA传输。

5、处理DMA完成

DMA传输完成后FPGA会给PC发送完成中断,PC接到FPGA发来的中断信号后检查自定义寄存器,判断是否为DMA写完成中断。



[b](二) PC –> FPGA 数据传输具体实现[/b]

过程与上述类似

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: