版权声明:本文为CSDN博主「CLGo」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/cllovexyh/article/details/79855813

简介
    这是学习PCIe DMA传输的第二篇博客,在前一篇中叙述了PCIe DMA传输的部分基础知识,并且较为详细的分析了接收引擎的各个状态,这里接着分析第二个关键模块:发送引擎(BMD_64_TX_ENGINE.v)。
    软件:VIVADO2017.4
第一步:模块功能分析
    在分析发送引擎的具体操作之前,需要多这个模块实现的功能进行简单的分析。如下是发送引擎中的标头类型

由图可知,这个模块包含5种类型的标头,这里先简单的说明这几种标头的应用场景,BMD_64_CPLD_FMT_TYPE 标志着发送一个带数据的完成包,这个使用在PC端向FPGA发送一个存储器读请求后,FPGA通过这个报文将存储器信息返回到PC端,这是PIO模式;
    BMD_64_MWR_FMT_TYPE和BMD_64_MWR64_FMT_TYPE标志着FPGA发送存储器写请求TLPs,这个使用在启动DMA写时,发送引擎组建存储器写请求包将数据发送到PC上;
    BMD_64_MRD_FMT_TYPE和BMD_64_MRD64_FMT_TYPE标志着FPGA发送存储读请求TLPs,这个使用在PC配置启动DMA读时,发送引擎组建存储器读请求包,PC发送带数据的完成包到FPGA上,被接收引擎接收(上一篇博客中分析的带数据的完成包)。
    以上就是几种标头的应用场景,了解清楚这些对分析发送引擎的结构很有帮助。接下来就开始分析发送引擎。
第二步:具体代码分析
    观察状态机跳转

首先进入复位状态BMD_64_TX_RST_STATE,这个状态中有多个判断条件,包含发送完成包、DMA读操作和DMA写操作,接下来就逐个分析。

1、假设首先发送完成包。设置compl_done_o 为0,表示完成包未发送完成,这个信号会进入接收引擎来判断PC发送的存储器读请求是否完成。然后是条件判断,req_compl_q 是从接收引擎引入的信号,其目的是让发送引擎发送完成包;compl_done_o 是上文说的完成包是否发送完成标志信号;trn_tdst_rdy_n 是从机是否准备好接收数据标志信号,此时是FPGA发送数据给PC,所以PC是从机,这个信号表示PC端是否准备好接收数据;trn_tdst_dsc_n 这个信号在FPGA上被置1了。
    设置帧开始信号(trn_tsof_n)有效、帧结束信号(trn_teof_n)无效、主机准备好发送数据(trn_tsrc_rdy_n)之后,就开始组装完成包头;组装的信息来自接收引擎和PCIe IP核,这就完成了发送完成包标头的前2DW。跳转到下一状态。

由于完成包是3DW标头,所以在这个状态中发送1DW标头+1DW数据。
    首先判断从机是否准备好接收数据,准备好后设置帧起始无效,由于这是PIO模式,因此只有两帧,所以这是最后一帧,设置帧结束有效,接着设置主机准备好发送数据,然后发送第二帧(1DW标头+1DW数据),然后设置trn_trem_n 有效,表明这一帧数据都有效,然后compl_done_o 表示完成包发送完成,状态跳转到BMD_64_TX_CPLD_WIT 。

这个状态中设置关键的4个信号无效,然后跳转到复位状态,准备下一次传输。
    2、假设进入DMA写存储器操作,

首先判断是否启动DMA写操作、DMA写操作完成等信号,其中serv_mwr 信号是用轮询操作控制DMA写操作的进行。接着和上面完成报文传输的格式差不多,trn_trem_n为0表示这一帧的两个DW都有效,cur_mwr_dw_count表示这一个TLP中数据的数量(单位DW),拼接发送第一帧数据,即2DW标头。接着就进入轮询操作。

轮询操作的目的是在发送一段时间的存储器写TLP之后,停止一次,然后判断此时是否有DMA读存储器开始信号,如果有的话就去执行DMA读操作,否则就是停止一次传输,下一个周期开始又继续DMA写操作。其中tmwr_wrr_cnt 信号统计发送TLP的数量,而mwr_wrr_cnt_i 信号则是设定轮询操作的TLP的量,这个值是在寄存器中配置的,当这两个值相等时就发生一次轮询操作。
    通过mwr_64b_en_i 信号判断发送的存储器写请求的标头是3DW还是4DW,这和完成包不一样,因为完成包只有3DW标头,而存储器写或者读的TLP有3DW和4DW两种。
    先分析3DW标头,此时跳转到BMD_64_TX_MWR_QW1状态

这个状态是发送第二帧数据,包含1DW标头(地址)+1DW数据,同样设置主机有效信号,然后通过cur_wr_count判断这是不是第一个TLP,因为第几个TLP决定着需要存入存储器的地址,mwr_addr是PC端申请的连续内存的首个地址,所以cur_wr_count为0,则要存入的地址为连续内存的首地址,之后就按照每个TLP中的数据量改变下一个TLP数据的存储地址。
    cur_mwr_dw_count信号初值是一个TLP中的数据量(DW),如果当前cur_mwr_dw_count为1,则表示这是最后一个数据了,那么这时通过cur_wr_count分析这是否是最后一个包,如果是最后一个包那么说明这个TLP只有两帧(3DW标头+1DW数据),此次DMA传输完全结束,mwr_done_o置1;若不是最后一个数据,说明这个TLP不止两帧数据,则跳转BMD_64_TX_MWR_QWN 状态。

一个TLP传输到最后有可能还剩下1个或者2个DW数据,所以程序中就设计两种情况,如果只有1个DW,那么还需要组装1DW无用数据,同时使用trn_trem_n 信号来表明最后一个DW无效;如果刚好还剩两个DW数据,则刚好一次传输完,此时设置trn_trem_n 为0来表示这一帧中两个DW数据都是有效的。如果还剩的数据大于2DW,则就直接每次传输2DW数据,直到出现只剩下1个或者2个DW数据。
    至此,DMA写操作的流程已经分析完成了,至于DMA读操作,以及3DW或4DW标头的分析都与分析类似,就不再分析了。
    此外,BMD_EP_MEM.v 以及BMD_EP_MEM_ACCESS.v两个模块可以参照PIO中的分析,BMD_EP_MEM.v中的寄存器可以参照官方资料xapp1052,在这里就不过多叙述了。
结束
    以上就是PCIe DMA的全部分析,后期会上传一些参考资料及有详细注释的.v文件,有需要的同学可以下载(https://download.csdn.net/download/cllovexyh/10335472)。

转载 PCIe学习(三):PCIe DMA关键模块分析之二相关推荐

  1. 转载 PCIe学习(二):PCIe DMA关键模块分析之一

    版权声明:本文为CSDN博主「CLGo」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明. 原文链接:https://blog.csdn.net/cllovexyh/a ...

  2. PCIe学习(二):PCIe DMA关键模块分析之一

    简介     经过一段时间的学习,这里将PCIe DMA模式的学习结果做一个总结,由于手里没有包含PCIe的板子,因此和学习PIO一样对DMA模式中的关键模块的代码进行逐条分析,希望对和我一样的初学者 ...

  3. <2021SC@SDUSC>【Overload游戏引擎】OvUI源码模块分析(二)——ImGui

    <2021SC@SDUSC>[Overload游戏引擎]OvUI源码模块分析(二) 前言 案例分析 程序框架 1.基本案例 2.实现定制绑定/定制引擎 渲染函数 总结 前言 本篇我们来分析 ...

  4. 后缀数组的学习(三):SA数组实现代码分析

    在前面的博文里面分析了SA数组和rank数组的实现过程,实际上也就是倍增算法的思想分析!虽然思想上面懂了,但是代码实现还是很难理解的!因为代码里面做了太多的优化. 整个代码的实现可以分成两部分:1.对 ...

  5. 乐鑫wifi模块二次开发_米家部分智能硬件拆解,ZigBee/WIFI模块分析及二次开发

    点击"蓝字"关注我们 最近小编都在培训,几天没有更新,大家有没有想死小编学习啊~这周天气骤冷,秋裤可以穿起来啦~ 正文开始 ▲左到右依次是:门磁传感器,温湿度传感器,无线开关,人体 ...

  6. 【转载】WinCE6.0 Camera驱动源码分析(二)

    转载自:http://jazka.blog.51cto.com/809003/719130 本文分析从应用程序启动到开始预览整个过程中,驱动代码的执行流程.开发环境是WinCE6.0+Android6 ...

  7. <2021SC@SDUSC>【Overload游戏引擎】OvCore源码模块分析(二)—— ESC

    前言 本篇分析接着分析ESC模块的剩余部分. ESC Actor Actor是ECS的主类,它对应于实体,由成分和行为(脚本)组成. OvCore::ECS::Actor::Actor(int64_t ...

  8. 安卓USB模块分析(二)- API使用

    Android USB 支持两种模式:1. 主机模式:2. 配件模式:这里我们主要梳理HOST模式的使用: USB 模块的使用可参考官方文档: USB 主机和配件概览  |  Android 开发者 ...

  9. pcie总线连接两台电脑_基于PCIe总线的多路复用DMA高速传输系统的设计

    摘要:文章针对双处理器设备问的数据通信提出了基于PCIe非透明桥的高速传输系统的设计方法.该方法应用于视频转码设备,实验结果表明当转码设备作为外设与PC主机进行通信时,采用多路虚拟DMA方法的数据传输 ...

最新文章

  1. docker搭建gitlab
  2. 商业级全局负载均衡器 zeus.ZXTM 实施方案
  3. HttpClient在传参和返回结果的中文乱码问题
  4. java在己有的类创子类怎么创_使用Java创建自己的异常子类
  5. flask的第一个hello word 程序
  6. 邪恶的Java技巧使JVM忘记检查异常
  7. 计算机系统组成_网络教育统考计算机应用基础题库(计算机系统的组成2)
  8. 比tween更有效的tween包.
  9. php 云端桌面,开源云桌面程序DZZ v1.2新版功能预览
  10. Linux: 系统设置与备份策略
  11. 国内信息安全行业常见法律法规介绍及个人理解
  12. 【华为编程大赛】投票问题
  13. PPT不能编辑,如何取消PPT的只读模式?
  14. 项目训练营模块学习---Oled屏幕
  15. Unity3D 网页插件Embedded Browser(ZFBrowser)PC端打包文件无法加载网页解决方法
  16. python应届生工资待遇_讲真,应届生一般工资多少啊?
  17. 华宇法律人工智能平台:用新一代的科技推动新时代的法律服务达到完全互联、无所不在 |百万人学AI评选
  18. 英语二-常用写作范文参考
  19. 木马点击器泛滥 点击欺诈威胁互联网广告
  20. 【JVM】内存结构(下)

热门文章

  1. MVC4 jquery 样式 主题 用法(案例)
  2. fpga实操训练(vga测试)
  3. 智能操作外卖订单 聚归客V2.0平台多维赋能餐饮商户
  4. 年轻的乔布斯也会哭泣
  5. Shelve Silently 静默搁置 Android Studio Git 功能
  6. php如何平铺背景图片,css如何让背景图片平铺?css背景图片平铺四种方式介绍
  7. cocos creator jsc 逆向解码为js
  8. 超低功耗LoRa无线通信应用实践
  9. ORALC 抛出ORA-12154的错误
  10. 4.3 CISC和RISC的基本概念