xapp1052是xilinx官方给出的一个有关DMA数据传输的样例,用于PC端和FPGA端之间的DMA数据传输。首先需要说的是,xapp1052并不是一个完整的DMA数据传输的终端硬件设计,这在下面会有详细解释。

首先说一下xapp1052模块的组成结构:顶层模块是xilinx_pci_exp_ep,在顶层模块中包含pci_exp_64b_app和bmd_design两个模块,其中pci_exp_64b_app就是我们要介绍的重点,而bmd_design则是实现PCIE协议的底层模块。

下面就详细说一下pci_exp_64b_app的模块结构:
pci_exp_64b_app
|
|__BMD
|
|__BMD_EP
| |
| |__BMD_EP_MEM_ACCESS
| | |_BMD_EP_MEM
| |
| |__BMD_RX_ENGINE
| |__BMD_TX_ENGINE
| |__BMD_INTR_CTRL
|
| |__BMD_GEN2
| |__BMD_RD_THROTTLE
|
|__BMD_TO_CTRL
|__BMD_CFG_CTRL

1,BMD_RX_ENGINE的设计:这个模块的作用就是接受来自PC的TLP包(trn_rd[63:0]),并根据不同的情况对包进行拆解,首先根据trn_rd[62:56]位判断包的类型,如果是32位地址读请求(BMD_MEM_RD32_FMT_TYPE),那么就转到32位读对应的状态(BMD_64_RX_MEM_RD32_QW1);如果是32位地址写请求(BMD_MEM_WR32_FMT_TYPE),那么久转到32位写对应的状态(BMD_64_RX_MEM_WR32_QW1);如果是不带数据的完成类型(BMD_CPL_FMT_TYPE),那么就转到完成请求对应的状态(BMD_64_RX_CPL_QW1);如果是带数据的完成类型(BMD_CPLD_FMT_TYPE),那么就转到带数据完成对应的状态(BMD_64_RX_CPLD_QW1)。

上面是状态机的第一次过渡,下面看状态的第二次过渡,在状态是BMD_MEM_RD32_FMT_QW1时,这个时候TLP包的第二个DWORD已经传来,从第二个DWORD中可以得到读请求的地址addr_o,这个地址时输入到memory模块下用于读出对应地址下的数据的;然后过渡到下一个状态(BMD_64_RX_MEM_32_WT),在这个状态下,RX模块会一直检测从TX返回的compl_done_i信号,当读请求申请的对应地址下的数据由TX发送出去时,compl_done_i信号就为1,这个时候RX就会返回到RST状态。当状态是BMD_MEM_WR32_FMT_QW1时,这个时候RX也接受到了TLP包的第二个DWORD,从这个DWORD中可以拆分出地址(addr_o)和要写的数据(wr_data_o),同时在这个状态写使能值为有效(we_en_o),然后过渡到下一个状态(BMD_64_RX_MEM_WR32_WT),在这一个状态,RX会一直检测从memory模块出来的信号(wr_busy_i)是不是为0,如果为0,说明写操作完成,RX回到RST状态。当状态是BMD_64_RX_CPL_QW1的时候,说明这是一个不带数据的完成,其他并没有什么操作。当状态是BMD_64_RX_CPLD_QW1时,说明这是一个带数据的完成,为什么完成信号要携带数据呢,原因就是为了检验传输的数据是否正确,在这个状态下以及它的过渡状态中,RX会一次检测传输到PC端的数据和设备内存的数据是否相同,如果不相同,说明数据传输失败,返回失败传输信号(cpld_malformed)。

从上面的描述可以看出,BMD中的RX是不支持连续的写数据的(往设备内存写数据),所以往设备内存写数据的DMA操作,xapp1052是不支持的,那么这里发送和接收的数据到底是什么呢,其实这里RX并不是要发送和接收存储数据,而是发送和接收配置数据,即DMA的配置数据。

2,BMD_TX_ENGINE的设计:这个模块是往PC端发送TLP包(trn_td[63:0]),这个模块是xapp1052DMA的核心模块,它包含DMA控制器的所有操作,当然这里只是发送端的DMA控制器。TX要解决的问题就是要在不同的情况下发送对应的TLP包。

第一种情况:发送带数据的完成TLP,这是TX最优先处理的(这一点不是很确定,个人感觉xapp1052写的有点问题)。首先在RST状态会产生一个带数据类型的包头。然后过渡到下一个状态:BMD_64_TX_CPLD_QW1。在这个状态里要发送TLP的第二个DWORD,主要包含地址和数据,然后进入下一个状态(BMD_64_TX_CPLD_QW1)。

第二种情况:开启DMA发送操作,在mwr_start_i和cfg_bm_en有效的情况下,开始发送TLP的包头,DMA的包头也只是一个普通的写数据请求;在DMA发送模式下,有几个参数是特别重要的:要发送的TLP数目、每个TLP中包含的数据长度、每个TLP对应PC端的起始写入地址。进入下一个状态(BMD_64_TX_MWR_QW1)的时候,TX首先会根据已经发送的TLP包的个数来计算PC端写入的起始地址(tmwr_addr),根据计算出的起始地址发送TLP的第二个DWORD,然后进入下一个状态:BMD_64_TX_MWR_QWN。在这个状态中,TX首先会判断一个TLP包中的数据长度是多少,如果是1,则在发送下一个DWORD之后,TX会进入RST状态;如果是2,则下一个DWORD会包含两个数据,但是同样在发送完下一个DWORD之后,TX会进入RST状态,在进入RST状态之前,TX又会判断当前发送的TLP数目是否已经等于预先设定的数,如果相等,则会返回mwr_done_o信号;如果当前数据长度大于2,那么在发完下一个DWORD的时候,TX还会继续发送数据,知道余下的数据长度小于2。这就是TX的发送DMA操作,但是现在有一个问题就是在每个TLP中的数据长度大于2的时候,发向PC端的地址该由谁控制累加呢,这在TX模块中并没有体现,这里我猜测是在PC端地址会由相应的模块控制自动累加。还有这里的TX的DMA其实也是有一定问题的,DMA发送的数据不是由内存读取出来的,而是一个始终不变的数,虽然表面上看是由内存中读取出来的,说明xapp1052的TX的DMA设计也只是存粹验证一下DMA控制器的正确性,数据的来源xapp1052却并没有涉及。

文章转载自:Buyi_Shizi

转载:http://xilinx.eetrend.com/blog/12252

Xilinx中的xapp1052理解的更多相关文章

  1. 【再话FPGA】在xilinx中PCIe IP Core使用方法

    采用Xilinx Virtex-5 XC5VSX50T-FF1136 FPGA或者Xilinx Virtex-5 XC5VSX95T-FF1136的板子.采用ISE13.2环境.步骤:一.建立一个IS ...

  2. Fouandation(NSString ,NSArray,NSDictionary,NSSet) 中常见的理解错误区

    Fouandation 中常见的理解错误区 1.NSString //快速创建(实例和类方法) 存放的地址是 常量区 NSString * string1 = [NSString alloc]init ...

  3. linux中socket的理解

    对linux中socket的理解 一.socket 一般来说socket有一个别名也叫做套接字. socket起源于Unix,都可以用“打开open –> 读写write/read –> ...

  4. 谈谈我对Java中CallBack的理解

    谈谈我对Java中CallBack的理解 http://www.cnblogs.com/codingmyworld/archive/2011/07/22/2113514.html CallBack是回 ...

  5. JavaScript中的闭包理解

    原创文章,转载请注明:JavaScript中的闭包理解  By Lucio.Yang 1.JavaScript闭包 在小学期开发项目的时候,用node.js开发了服务器,过程中遇到了node.js的第 ...

  6. 网站开发进阶(三十四)编码中的setCharacterEncoding 理解

    编码中的setCharacterEncoding 理解 1.pageEncoding="UTF-8"的作用是设置JSP编译成Servlet时使用的编码. 2.contentType ...

  7. 关于zynq7 中MIO的理解

    关于zynq7 中MIO的理解 Zynq7000有54个MIO,分配在GPIO的Bank0和Bank1,属于PS部分,这些IO与PS直接相连,不需要添加引脚约束,MIO信号对PL部分是不可见的,对MI ...

  8. Java 泛型 <? super T> 中 super 怎么 理解?与 < ? extends T>有何不同?

    Java 泛型 <? super T> 中 super 怎么 理解?与 extends 有何不同? 简介 前两篇文章介绍了泛型的基本用法.类型擦除以及泛型数组.在泛型的使用中,还有个重要的 ...

  9. 沉淀再出发:关于java中的AQS理解

    沉淀再出发:关于java中的AQS理解 一.前言 在java中有很多锁结构都继承自AQS(AbstractQueuedSynchronizer)这个抽象类如果我们仔细了解可以发现AQS的作用是非常大的 ...

随机推荐

  1. CAD打开慢,卡在99%

    问题描述 打开AutoCAD的时候,软件停留在加载99%,点击出现[无法响应],要么等待,要么强行关闭,若平时正常关闭CAD时也异常缓慢. 原因分析 破解版,没有联网就激活了.CAD默认启动需要联网, ...

  2. ios backgroundColor

    loginView.backgroundColor=[UIColorcolorWithHue:0saturation:0brightness:0.9alpha:0.85]; 可随意调

  3. uva 11181 - Probability|Given(概率)

    题目链接:uva 11181 - Probability|Given 题目大意:有n个人去超市买东西,给出r,每个人买东西的概率是p[i],当有r个人买东西的时候,第i个人恰好买东西的概率. 解题思路 ...

  4. java指令备忘

    javap  查看class文件用 指令码 助记符 说明 0x00 nop 什么都不做 0x01 aconst_null 将null推送至栈顶 0x02 iconst_m1 将int型-1推送至栈顶 ...

  5. Access denied with payslip工资条非同部门员工不能创建bug

    Access Denied The requested operation cannot be completed due to security restrictions. Please conta ...

  6. OpenERP 负载平衡

    OpenERP 7.0 带来了许多新特性,架构上也有许多改进.其中可配置 worker 参数,可使 OpenERP 运行在多进程模式,突破GIL的限制,有效利用了现代多核CPU的性能.但默认情况下,O ...

  7. [Done]ftp使用小结

    基本命令: put 本地文件名 ftp文件名 get ftp文件名 本地文件名 mget ftp文件多个文件  注意使用该命令时先用 lcd切换本地路径 还有一些常用的  ls mkdir 等,参考 ...

  8. doGet和doPost区别

    1,form运行方式 当form框里面的method为get时,执行doGet方法当form框里面的method为post时,执行doPost方法 2,生成方式 get方式有四种:1)直接在URL地址 ...

  9. Start-Sleep 帮助信息

    如下说明是翻译: help Start-Sleep 产生的帮助信息.译者: Edengundam(马涛) Start-Sleep 大纲使shell, 脚本, 或运行空间的活动挂起指定的时间. 语法St ...

  10. 【J2EE之web应用】java集群概念

    在学习web应用进行部署的时候,遇到一个名词java集群,(事实上遇到非常多名词╭(╯^╰)╮~~~).不懂意思就查一查! 在这里做个笔记! 没有什么高深见解,就搞明确几个概念,java集群的特点 . ...