<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 : 输入。异步复位。时间至少大于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_ntrn_tsrc_rdy_ntrn_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_ntrn_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_ntrn_rsrc_rdy_ntrn_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_ntrn_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_ntrn_rsrc_rdy_n拉低,并与trn_rd第一个数据前沿对齐。

      • trn_rsof_n拉高,并继续输出数据
      • trn_rsrc_rdy_ntrn_reof_n拉低,并与trn_rd最后一行数据前沿对齐。

        trn_rrem_n视情况而定)

      • 在下一个时钟,将trn_rsrc_rdy_ntrn_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_ncfg_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包发送到 PCDMA 引擎会自己主动填充 TPL 包逐一添加的地址等信息,直到达到用户设定的长度。PC 收到读请求,会自己主动将上述物理空间的数据组织成* Completion TLPs* 回送给 FPGAFPGA 接收分析后按顺序存放在对应的缓冲内。

    在此过程完毕后,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 BlockDMA 控制/状态寄存器 DMA Control/Status Register 内部状态解析 CPU 的命令。并作出对应的运行。DMA 控制/状态寄存器被映射到 PCI 的地址空间中,同一时候也和其它的用户逻辑相连接。CPU 通过读写这些寄存器达到控制其它逻辑的运行。

  • Egress Data Presenter 此模块提供外部不同来源不同位宽的数据到 TX Engine 的通道。

  • Read Request Wrapper 用于 TX EngineRX 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方...

Java进阶学习第二十二天——上传与下载

文件上传 文件上传步骤 FileUpload上传操作核心API JavaScript的多文件上传表单 多文件上传 上传文件存在的问题 上传文件在server端保存位置问题 上传文件在同一个文件夹重名问题 乱码...

Java基础学习第二十一天——递归与字节流

递归 递归注意事项 递归解决这个问题的思想 递归求阶乘案例 递归练习 IO流 IO流分类 IO流经常使用基类 字节流写数据 字节流写数据的方式 字节流写数据常见问题 字节流写数据增加异常处理 字节流读取数据 ...

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

PCIe TLP事物层协议解析 配置空间概述 配置空间寄存器说明 BAR空间概述 BAR空间与DMA空间映射关系举例 存储器读、写请求TLP包头格式 完毕包报文头格式 配置读写请求报文头格式 消息请求...

Spring MVC入门第1天--框架说明与高速入门

springmvc框架 springmvc业务流程框架 springmvc框架组件说明 Spring MVC入门程序 配置前端控制器 配置处理器适配器 开发Handler 视图编写 配置Handler...

Spring入门第1天--IOC高速入门

Spring框架学习路线 Spring框架的概述 Spring的核心 Spring长处 Spring体系结构 Spring的高速入门 Spring框架载入配置文件 IOC容器装配Bean Spring...

Java进阶学习第二十一天——Filter学习

javaWeb过滤器 Fileter介绍 Filter怎样实现拦截 开发Fileter步骤 Filter链 Filter的生命周期 FilterConfig接口 注冊与映射Filter Filter示...

Java基础学习第二十二天——转换流之字符流应用

转换流 转换流出现的原因及思想 编码表 常见编码表 字符串中的编码问题 转换流概述 OutputStreamWriter写数据 字符流操作要注意的问题 InputStreamReader读数据 字符流...

Spring MVC入门第4天--springmvc高级功能

异常处理 上传图片 springmvc进行json交互 RESTful支持 拦截器 拦截器应用(实现登陆认证)

MyBatis入门第2天--MyBatis基础知识(二)

mybatis开发dao的方法 SqlSession使用范围 原始dao开发方法 原始dao开发问题 mapper代理方法 mapper代理开发规范 SqlMapConfig.xml配置文件 prop...
  • 微博
    微信
    QQ
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多仅仅同意输入30个字)

posted @ 2017-08-17 09:58  cxchanpin  阅读(228)  评论(0编辑  收藏  举报