<html>
文档版本号 | 开发工具 | 測试平台 | project名字 | 日期 | 作者 | 备注 |
---|---|---|---|---|---|---|
V1.0 | ise14.7 | DBF板 | Day4/PCIETest | 2016.03.31 | lutianfei | none |
- 參考资料:
- 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/Oport指令来进行数据的读写的数据交换模式。是最早先的硬盘传输数据模式。传输数据速率低下。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
: 输入。异步复位。时间至少大于1500nssys_clk
:输入,可选频率为100Mhz,125Mhz,250Mhz
(二) 事物接口
2.1 通用事物接口
trn_clk
: 输出, 传输、配置、物理层控制、状态接口操作都与此时钟同步。trn_reset_n
: 输出,用户逻辑与传输和配置接口交互时使用此复位恢复到初始状态;与trn_clk
同步,与sys_reset_n
异步。trn_lnk_up_n
: 输出。当核与连接对象已连接且准备好交换数据时有效。trn_fc_*
: 输出,各种流控制信号trn_fc_sel[2:0]
: 输入:选择流控制信息呈如今哪个trn_fc_*
上。
2.2 发送事物接口
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]
- 为0表示数据在
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
同一时候拉高。
- 将
- 核:
2.3 接收事物接口
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]
- 为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
- 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
拉高。
- 将
- 用户
2.4 中断事物接口
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 位位宽的双port RAM 中。Egress/Ingress FIFO
和其它数据来源连接。接口为 Xilinx 标准 FIFO接口,可方便的集成用户自己定义的外设。
四 XAPP1052 DMA设计
(一) FPGA –> PC 传输数据详细实现
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写完毕中断。
(二) PC –> FPGA 传输数据详细实现
- 过程与上述相似
- 本文已收录于下面专栏:
相关文章推荐
-
No_16_0328 Virtex6 PCIe2.5 仿真学习
Virtex6-250T的PCIe IP核设置 仿真測试 一些小问题的解决 报错一:找不到XILINX路径 报错二:找不到tests.v文件路径(也可能不报错) 波形分析 PCIe包格式说明 PIO方...- lutianfeiml
- 2016-03-29 10:59
- 1239
-
Java进阶学习第二十二天——上传与下载
文件上传 文件上传步骤 FileUpload上传操作核心API JavaScript的多文件上传表单 多文件上传 上传文件存在的问题 上传文件在server端保存位置问题 上传文件在同一个文件夹重名问题 乱码...- lutianfeiml
- 2016-06-08 10:09
- 1935
-
Java基础学习第二十一天——递归与字节流
递归 递归注意事项 递归解决这个问题的思想 递归求阶乘案例 递归练习 IO流 IO流分类 IO流经常使用基类 字节流写数据 字节流写数据的方式 字节流写数据常见问题 字节流写数据增加异常处理 字节流读取数据 ...- lutianfeiml
- 2016-03-22 20:45
- 464
-
Virtex6 PCIe 超简版基础概念学习(一)
PCIe TLP事物层协议解析 配置空间概述 配置空间寄存器说明 BAR空间概述 BAR空间与DMA空间映射关系举例 存储器读、写请求TLP包头格式 完毕包报文头格式 配置读写请求报文头格式 消息请求...- lutianfeiml
- 2016-03-31 13:35
- 2547
-
Spring MVC入门第1天--框架说明与高速入门
springmvc框架 springmvc业务流程框架 springmvc框架组件说明 Spring MVC入门程序 配置前端控制器 配置处理器适配器 开发Handler 视图编写 配置Handler...- lutianfeiml
- 2016-06-30 22:16
- 3530
-
Spring入门第1天--IOC高速入门
Spring框架学习路线 Spring框架的概述 Spring的核心 Spring长处 Spring体系结构 Spring的高速入门 Spring框架载入配置文件 IOC容器装配Bean Spring...- lutianfeiml
- 2016-06-22 00:44
- 5294
-
Java进阶学习第二十一天——Filter学习
javaWeb过滤器 Fileter介绍 Filter怎样实现拦截 开发Fileter步骤 Filter链 Filter的生命周期 FilterConfig接口 注冊与映射Filter Filter示...- lutianfeiml
- 2016-06-03 23:04
- 2929
-
Java基础学习第二十二天——转换流之字符流应用
转换流 转换流出现的原因及思想 编码表 常见编码表 字符串中的编码问题 转换流概述 OutputStreamWriter写数据 字符流操作要注意的问题 InputStreamReader读数据 字符流...- lutianfeiml
- 2016-03-24 11:22
- 535
-
Spring MVC入门第4天--springmvc高级功能
异常处理 上传图片 springmvc进行json交互 RESTful支持 拦截器 拦截器应用(实现登陆认证)- lutianfeiml
- 2016-07-05 16:55
- 4896
-
MyBatis入门第2天--MyBatis基础知识(二)
mybatis开发dao的方法 SqlSession使用范围 原始dao开发方法 原始dao开发问题 mapper代理方法 mapper代理开发规范 SqlMapConfig.xml配置文件 prop...- lutianfeiml
- 2016-06-28 11:40
- 5967
0条评论