转载自:https://blog.csdn.net/lutianfeiml/article/details/51035756

参考资料: 
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
(二) 事物接口
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]
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]
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值,表示对开启DMA传输。
5、处理DMA完成

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

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

Virtex6 PCIe 超简版基础概念学习(二)(转载)相关推荐

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

    文档版本 开发工具 测试平台 工程名字 日期 作者 备注 V1.0 ise14.7 DBF板 Day4/PCIETest 2016.03.31 lutianfei none 参考资料: Spartan ...

  2. XP图片查看器的替代软件-超简版ACDSee

    (图1)Win2000下可以达到WinXp图片查看器效果的软件. .Win2000Sp4是个很不错的系统除了主题和部份小功能外其兼容性及实用性可以说超过xp. 可能因为Win2000刚出来给人们的印象 ...

  3. 收支系统(超超超简版)1.0

    从小到大都是对金钱没什么概念的孩纸...这学期突然决定好好管管自己生活费了!于是先做了个超级超级超级简易版的收支记录簿 接下来有时间会改进的! ps:第二篇博客了!还是一样 欢迎大家指错哦~ 步骤 1 ...

  4. matlab在管理学中的应用简matlab基础【二】

    1.MATLAB语言概述 1.1 MATLAB语言的发展 matlab语言是由美国的Clever Moler博士于1980年开发的 MATLAB = Matrix Laboratory 它将一个优秀软 ...

  5. DM数据库——模式、表、索引管理基础(超详细版)

    DM数据库--模式.表.索引管理基础(超详细版) 一.管理模式对象的空间 1.DM8对普通表和索引提供的参数 2.DM8对HUGE表提供的参数 3.空间限制 4.查看占用的空间 二.管理表 1.设计表 ...

  6. 初识react(二) 实现一个简版的html+redux.js的demo

    回顾 初识react(一) 揭开jsx语法和虚拟DOM面纱 初识react(二) 实现一个简版的html+redux.js的demo 初识react(三)在 react中使用redux来实现简版计数器 ...

  7. 大数据基础学习二:在VMware虚拟机上安装Ubuntu完整步骤及需要注意的问题(以VMware Workstation 15.1.0 Pro和Ubuntu18.04.3优麒麟版为例)

    大数据基础学习二:在VMware虚拟机上安装Ubuntu完整步骤及需要注意的问题 (以VMware Workstation 15.1.0 Pro for Windows和Ubuntu18.04.3优麒 ...

  8. ubuntu 安装中文输入法(超简靠谱版)

    ubuntu 安装中文输入法(超简靠谱版教程) 1.下载搜狗输入法的安装包(链接: link) 点击立即下载后,出现上述界面,由于我的系统是amd64的 因此选择x86_64版本下载 2.添加中文语言 ...

  9. 计算机应用基础第二版在线作业c,计算机应用基础作业二(答案)

    计算机应用基础作业二 一.单选题(40题,每题1分,共40分) 1.第一台电子数字计算机的运算速度为每秒______. A:5,000,000次 B:500,000次 C:50,000次 D:5000 ...

  10. 【极简版GH60】【GH60剖析】【二】原理图的分析

    说完了配件的选择,下面分析下原理图,因为我要做的是极简的GH60,所以PCB上的原件有很多都不需要焊上去,我们来分析下GH60revQE原理图. 首先可以看到大概有61个按键,然后每个按键由一个轴,一 ...

最新文章

  1. SAP RETAIL 通过自动补货功能触发的采购申请有些啥特殊的地方?
  2. 第一个 Hello Worlds ,打开 opener_server.pl 的大门。OPener_Server 第 3 弹
  3. 功率电感器基础讲座-第1章-2_转载自村田官网
  4. 神策数据上线“点击分析”,深度感知用户点击行为
  5. ASP.Net Core WebApi几种版本控制对比
  6. Using Artica Squid Open Source Project to Build Powerful and Safe but Simple to Use Proxy
  7. 基于linux的智能小车_商汤首款原创机器人SenseRover X自动驾驶小车斩获Red Dot Award...
  8. Java虚拟机(一)——内存管理
  9. 4538: [Hnoi2016]网络
  10. java案例代码4-数组的复制
  11. 【定位】TOF与TDOA
  12. MAC caps lock大小写切换电脑卡顿
  13. 各编程语言用途及分类
  14. 【POJ 1187】 陨石的秘密(dp)
  15. android SurfaceView + Camera全屏自适应屏幕尺寸
  16. [转]内存与进程管理器
  17. Ubuntu下安装PCL1.12.1点云库经验分享
  18. 解决obsidian无法加载第三方插件(社区插件)的问题
  19. [转载]点评阿里云、盛大云等国内IaaS产业
  20. PVE(proxmox vm) 命令行关闭虚拟机

热门文章

  1. 百思不得其姐的注意点
  2. 美国FICO评分系统简介
  3. 应用StarRocks实现存储引擎的收敛,保障高查询并发及低延迟要求
  4. 1753: [Usaco2005 qua]Who's in the Middle (快速排序)
  5. bean named 'transactionManager' available: No matching PlatformTransactionManager bean found for qua
  6. 数据库MySQL创库、创表基本命令
  7. springboot中如何graceful关闭服务器
  8. 【 unity3d 】NGUI playTween与Tween动画 脚本的使用
  9. 微软因果推理的框架DoWhy github 介绍
  10. 一个非常好用的数学函数图像生成工具