Virtex6 PCIe 超简版基础概念学习(二)
Virtex6 PCIe 超简版基础概念学习(二)
分类:FPGAPCIe
(2081) (0) 举报 收藏
| 文档版本 | 开发工具 | 测试平台 | 工程名字 | 日期 | 作者 | 备注 |
|---|---|---|---|---|---|---|
| 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/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: 输入,异步复位,时间至少大于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 位位宽的双端口 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值,表示对开启DMAk传输。
5、处理DMA完成
- DMA传输完成后FPGA会给PC发送完成中断,PC接到FPGA发来的中断信号后检查自定义寄存器,判断是否为DMA写完成中断。

(二) PC –> FPGA 数据传输具体实现
- 过程与上述类似

- 转载自:http://blog.csdn.net/lutianfeiml/article/details/51035756
Virtex6 PCIe 超简版基础概念学习(二)的更多相关文章
- Virtex6 PCIe 超简版基础概念学习(一)
文档版本 开发工具 测试平台 工程名字 日期 作者 备注 V1.0 ise14.7 DBF板 Day2/PCIETest1 2016.03.31 lutianfei none 参考资料: Sparta ...
- 【Spring源码解析】—— 简单工厂模式的BeanFactory的超简版实现
一.什么是简单工厂模式 设计模式的核心是“分工”,通过分工将对象与职责划分的更细化,进而提升系统设计的可扩展性,使其更容易维护. 开闭原则:对扩展开放,对修改关闭:要增加一个新的处理逻辑,可以开一个新 ...
- react 组件的生命周期 超简版
组件从被创建到被销毁的过程称为组件的 生命周期: 通常,组件的生命周期可以被分为三个阶段:挂载阶段.更新阶段.卸载阶段: 一.挂载阶段 这个阶段组件被创建,执行初始化,并被挂载到DOM中,完成组件的第 ...
- Underscore源码阅读极简版入门
看了网上的一些资料,发现大家都写得太复杂,让新手难以入门.于是写了这个极简版的Underscore源码阅读. 源码: https://github.com/hanzichi/underscore-an ...
- JVM 内部原理(七)— Java 字节码基础之二
JVM 内部原理(七)- Java 字节码基础之二 介绍 版本:Java SE 7 为什么需要了解 Java 字节码? 无论你是一名 Java 开发者.架构师.CxO 还是智能手机的普通用户,Java ...
- FFmpeg简易播放器的实现-最简版
本文为作者原创:https://www.cnblogs.com/leisure_chn/p/10040202.html,转载请注明出处 基于FFmpeg和SDL实现的简易视频播放器,主要分为读取视频文 ...
- Python入门基础学习 二
Python入门基础学习 二 猜数字小游戏进阶版 修改建议: 猜错的时候程序可以给出提示,告诉用户猜测的数字偏大还是偏小: 没运行一次程序只能猜测一次,应该提供多次机会给用户猜测: 每次运行程序,答案 ...
- typescript 简版跳一跳
typescript 简版跳一跳 学习typescript,第一步应该是学习官方文档,理解最基础的语法.第二步开始用typescript实现一些js+css 或者canvas类型的游行.现在开始我们用 ...
- Hive框架基础(二)
* Hive框架基础(二) 我们继续讨论hive框架 * Hive的外部表与内部表 内部表:hive默认创建的是内部表 例如: create table table001 (name string , ...
随机推荐
- 数学图形(1.20)N叶草
有N个叶子的草 相关软件参见:数学图形可视化工具,使用自己定义语法的脚本代码生成数学图形.该软件免费开源.QQ交流群: 367752815 vertices = t = to (*PI) r = n ...
- utf8_general_ci、utf8_unicode_ci和utf8_bin的区别
utf8_general_ci 不区分大小写,这个你在注册用户名和邮箱的时候就要使用. utf8_general_cs 区分大小写,如果用户名和邮箱用这个就会照成不良后果. utf8_bin: com ...
- 【python】gevent学习
之前测试了stackless,感觉不太好. 不过python作为最火的脚本语言,还是吸引力难挡. python的协程方案,除了stackless,还有greenlet, 相应的事件框架也有gevent ...
- Rust 格式输出
格式输出由一系列定义在 std::fmt 中的宏提供. 包含: format! : 输出格式化的字符串. print! : 输出格式化的字符串到控制台(终端)println!: 添加一个换行,输出格 ...
- 手动脱UPX 壳实战
作者:Fly2015 Windows平台的加壳软件还是比較多的,因此有非常多人对于PC软件的脱壳乐此不彼,本人菜鸟一枚,也学习一下PC的脱壳.要对软件进行脱壳.首先第一步就是 查壳.然后才是 脱壳. ...
- 数据挖掘学习指引<一>
对于当前热门的大数据.云计算等技术,被百度.阿里等国内互联网巨头炒的非常火,数据挖掘作为一门非常有用的技术,在商业管理.市场分析.科学计算等大数据方面发挥着大作用. 数据挖掘技术也变得非常火,why? ...
- 苹果开发——App内购以及验证store的收据(一)
原地址:http://zengwu3915.blog.163.com/blog/static/27834897201375105236580?suggestedreading 发了几天时间在网上折腾了 ...
- Android API Guides---Tasks and Back Stack
一个应用程序通常包括多个活动.每一个活动应环绕行动的用户能够运行,而且能够启动其它活动的特定种类进行设计.比如,电子邮件应用程序可能具有一个活动,以显示新的消息的列表.当用户选择一个信息.一个新的活动 ...
- TCP/IP 工具Ping
TCP/IP 工具Ping 在网络中Ping 是一个十分好用的TCP/IP工具.它主要的功能是用来检测网络的连通情况和分析网络速度. C:\Users\gechong>ping /? 用法: p ...
- react 中使用 lodash 中的 _.throttle
1.场景: 首次调用执行一次,一定时间内再次调用,不再执行. 2.实现 debounce (函数去抖) 多次触发,只在最后一次触发时,执行目标函数. _.debounce(func, [wait=0] ...