目录
正文
0概述
最近因仪表项目需求,须要上位机PC端通过PCIE插口与FPGA功能子卡进行数据通讯,故开始研究基于XilinxA7FPGA实现PCIE插口功能。
1打算工作
要实现上位机Host端与FPGA子卡设备端通过pcie插口通讯,须要3个必备条件:
(1)上位机应用程序;
(2)pcie驱动程序;可以从Xilinx官网下载对应系统驱动linux下的图形化串口调试工具,之后进行二次开发,添加用户所需的驱动函数
(3)FPGA子卡端PCIE逻辑程序;
须要阅读的Specification和UserGuide如下:
1.PCI.Express.Base.Specification.v2.0-PCIE总线合同说明书
倘若仅从项目应用角度而言,只须要研读一遍,有个大约印象,熟悉高频专业术语即可,不用花大量时间去啃,由于Xilinx官方会提供PCIEIP核,将底层逻辑都封装好qq linux,开发者只需关注用户开发逻辑即可。PS:其实,假如有时间,深入研究肯定更好。
2.DMA/BridgeSubsystemforPCIExpressv4.1(pg195)
xilinx官方用户指南,讲解PCIEXDMAIP核的用法
PS:曾经用ISE开发软件的时侯,因为Xilinx官方提供的PCIEDMA方法是基于xapp1052文档述说的Demo解释器,须要用户去理解Demo工程,并自行降低用户所需的功能逻辑,我那种时侯研究了一段时间后,还是没有完全搞定,就搁置了。
如今Vivado开发软件提供的XDMAIP核封装的更简单linux下的图形化串口调试工具,使用更特别便捷,解决了我这些PCIE小白好多开发障碍,首推。
2.开发流程
(1)Xilinx提供的DMASubsystemforPCIExpressIP是一个高性能,可配置的适用于PCIE2.0,PCIE3.0的SG模式
DMA,提供用户可选择的AXI4插口或则AXI4-Stream插口。
PCIEXDMAIP核配置的关键参数为BAR参数设置。PCIEDMAinterface软件已默认使能,用户可以通过使能PCIEtoAXI_LiteMaster插口与主机端
进行寄存器的读写操作。XDMAIP核是基于AXI4.0总线进行插口封装的,须要用户对AXI总线基础知识有所了解更优。
(2)基于XDMAIP核进行FPGA工程开发,选择BlockDesign开发方法(类似于ISE原理图开发方法),其实直接通过RTL逻辑开发方法也可以,
然而各个模块的插口讯号须要自己去联接,太冗长且容易出错,不如图形化设计便捷。我是参考米联客/黑金开发板教程来设计的FPGA工程,主要实现
两个功能:
a.主机端与FPGA设备端通过DMA形式,进行数据包的发送&接收功能;
b.主机端与FPGA设备端通过BAR形式,进行寄存器的读写功能;
(3)插口说明如下:
BramPORTA_0(writeonly),BramPORTB_0(readonly)这个单向插口是DMA写数据包和回读数据包插口,那么设计而不直接用BlockRam联接linux 下载,是易于用户
降低自己的逻辑:比如用户通过BramPORTA_0写入数据包内容,之后主机端通过BramPORTB_0回读数据包内容。这是常见的用法,例如FPGA子卡为一个数据采集卡,须要将实时采集的视频数据组包后,通过中断形式,通知主机将已打算好的数据包回读到PC端。
3.测试结果
用户通过BramPORTA_0写入数据包内容:0x07_06_05_04_03_02_01_00(每位数据为64位显存)~0xff_fe_fd_fc_fb_fa_f9_f8,循环发送,共计512个数据。
主机通过BramPORTB_0回读数据包内容,之后将回读的数据写入bin文件,进行数据验证。
上图为FPGA写入的数据包内容。FPGA抓取数据点主频设置为32位,为了节约资源。可知,数据点从0x07_06_05_04_03_02_01_00开始。
上图为主机端回读的数据包内容。FPGA抓取数据点主频设置为32位,为了节约资源。可知,起始数据点从0x07_06_05_04_03_02_01_00开始,有一个时钟的延时。因为上位机写入回读数据的bin文件格式须要用UltraEditor来打开,就不贴图了。
4总结
1.参见上图可知,BramPORTA_0_clk该时钟讯号仍然为0,这一点很奇怪,理论上应当与s_axi_clk。所以我在用户逻辑部份,对BramPORTA_0端口操作,模块时钟选择的为axi_clk总线时钟。
2.BAR地址设置:PCIEtoAXITransiation为何设置为0x44A0_0000,是可以FPGA端随便设置,还是由PCIE驱动端与FPGA端共同商定,设置为相同的地址即可,我抽空实测一下。
经过实测可知,BAR地址PCIEtoAXITransiation设置是可以在FPGA端任意设置的,只需各个AXI总线子模块设置的地址范围不同即可。