FPGA-PCIe开发

/*Ver. 1.0*/

说在前面:在接触PCIe之前学习了点DDR3的理论知识,在Xilinx的V709上跑了一遍例程,自己也例化了MIG核通过控制逻辑实现了简单的DDR3读写数据,这部分内容分享在新浪博客里边,这里就不累赘重述了,此博客单单是总结、记录在接触PCIe后从一只小白到一只菜鸟的进阶过程(难免有些没记录到,希望可以CSDN的博客能支持续编辑)。感谢CC师姐,LH师兄,DM师兄还有实验室小伙伴,特别感谢EETOP的XD前辈,感谢你们的指点。

环境说明:PCIe总线版本gen2_x1lane(前期是gen2_x4lane);PCIe开发平台Vivado2017.02(前期是2016.02);仿真平台Modelsim10.5(前期是10.4);芯片型号及封装形式Xilinx-xc7a100t-fgg484(前期是Xilinx-xc7z045-fgg900);PCIe驱动开发环境X86(前期是用WinDriver作一些BAR空间寄存器1dw数据的简单读写)

博客纲要:

  • 1.入门——1.1.理论入门——1.2.实践入门
  • 2.进阶——进阶中遇到的问题
  • 3.提高——3.1.性能提高——3.2.提高中遇到的问题
  • 4.简单描述DMA读写流程

一.入门

1.1.理论入门

        网上有很多关于PCIe入门的理论知识,比如各种包的定义,PIO和DMA等相关知识,我也就跳过了,只在这里说点重要的。

        首先,必须必备的当然是PCIe总线规范“PCI Express Base Specification Revision 3.0”(860Pages)了,毕竟这是PCIe的根本规范嘛,类似的一本书是“PCI Express System Architecture”(1109Pages),,,我猜你们也是只有遇到问题时才会看的,其实我也还没看完。

        其次,推荐一本书“PCI Express体系结构导读 王齐著”这就是PCIe规范大致翻译成中文版了,也是我看的正经书籍之一,对我的PCIe开发帮助很大。

        最后,推荐一些关于理论入门博客及相关内容。链接1:http://lib.csdn.net/article/deeplearning/53873(此博主总结了理论入门还有我接下来要提及的实践入门);链接2:https://wenku.baidu.com/view/d890041b59eef8c75fbfb3ff.html(此文档PCIe入门必读,优质内容);链接3:http://www.ssdfans.com/?p=3683(此博主相较于链接一的博主更加侧重讲述了各种TLP包);当然一些PCIe的速率性能就链接4:https://en.wikipedia.org/wiki/PCI_Expres(Wiki)自行科普吧。

1.2.实践入门

        既然是入门,那就从简单的搞起,PIO(Programmed Input-Output)模式就是PCIe的简单入门,PIO模式下可以实现在PCIe总线上读写32bit(1DW=4Byte=32bit)数据。要说明的是PIO模式所用的总线标准是AXIS总线。

        怎么实现呢?用Vivado2017.02建一个PCIe IP(7 Series Integrated Block for PCI Express ver.3.3)核,然后右键IP核选择“generate example design”,这样Vivado基于这个IP核新建了一个工程,此工程含有PIO功能的仿真和测试文件,详细的模块描述和仿真分析在1.1章中的链接1中,其PIO读写操作大致流程是RX模块接收到RC侧(直接理解成PC也无大错)发来的带32bit数据写请求包MWR,然后EP侧将其存储在MEM模块,然后RX模块又接收到RC侧发来的不带数据的读请求包MRD,EP侧将MEM模块存储的数据封装成读完成包CplD响应收到读请求包,将数据返还RC侧。仿真的话,如果是用Vivado2016.02的话联调Modelsim10.4,用Vivado2017.02的话联调Modelsim10.5,只要编译的库没有问题,那么设置Modelsim仿真时长为150us(user_link_up拉高)就能看到完整的PIO流程。

        关于example design中PIO模式更详细的官方说明可以Xilinx官网下载pg054(英文版),或链接5:http://www.docin.com/p-1964324614.html(中文版),下图1是2016.2平台PCIe核example design工作在PIO模式下的仿真结果:

                                                        图1:PIO模式下PCIe IP核example design仿真结果

二.进阶

        单次PIO操作只能搬运32bit,效率低,而且还会占用CPU总线权,所以我们要使用DMA模式,最开始接触到的是Xilinx官网给的一份PCIe工作在DMA模式下的例程:xapp1052,例程虽然只是用于测试PCIe性能(该不足见链接6:http://xilinx.eetrend.com/blog/9829),但是好在它的模块划分很清晰,相关理论文章博客也不少,重点推荐两三个,链接7:https://blog.csdn.net/lutianfeiml/article/details/51035756(此博主对比了PIO和DMA,并介绍了DMA读写流程);链接8:https://www.cnblogs.com/yuzeren48/p/3896138.html(按照此博主的步骤可以实现1052例程的板级验证)

        关于进阶部分我提一下注意事项:

       2.1.例程适用性评估

       xapp1052开发环境是win XP和win 32,而项目要求是在win32上实现,故参考此例程并无问题。

       2.2.xapp1052安装自带的上位机报错

        该上位机仅仅是用于测试性能,同一个32bit数据Pattern进行在TX模块封装成写请求包DMA写至PC,接着TX模块读请求,读取PC缓存的数据,最后RX模块接收来自PC的读完成包,拆包对比每个数据是否为Pattern,若是则error为“0”。刚开始安

  • 23
    点赞
  • 282
    收藏
    觉得还不错? 一键收藏
  • 16
    评论
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值