米尔电子
直播中

zealsoft

3年用户 696经验值
擅长:可编程逻辑,嵌入式技术
私信 关注
[技术]

【米尔MYD-JX8MMA7开发板-ARM+FPGA架构试用体验】PCIE传输框架RIFF分析

本帖最后由 zealsoft 于 2023-1-30 14:23 编辑

感谢“电子发烧友网”和米尔电子公司提供了本次MYD-JX8MMA7开发板的评测机会。上次介绍了该开发板的基本情况和ARM开发环境的构建,今天来看看其FPGA部分。MYC-JX8MMA7核心板及开发板采用NXP i.MX8M Mini及Xilinx Artix-7处理器,四核 Cortex-A53、Cortex-M4、Artix-7 CPU,1.8GHz主频。MYC-JX8MMA7核心板及开发板是基于ARM+FPGA处理架构,以ARM处理性能为主,FPGA作为辅助的系统。
一、概述
MYD-JX8MMA7 硬件平台采用 Xilinx Artix®-7 XC7A25T 器件,2 万 3 千逻辑门、256MBDDR3 SDRAM、一路 PCIE、dvp 摄像头接口,SD 卡,SFP 接口以及一路QSPIFLASH 接口。该处理板的FPGA和ARM接口采用PCIE方式。在ARM的Linux环境下使用lspci命令可以查看PCIE的接口参数。
厂商提供了3个FPGA的例子:
  • MYIR_PCIE_5T_CMOS 工程:这是一个很有实用价值的例子。它是利用OV5640摄像头(需要另外购买)采集视频数据,由FPGA将采集的视频数据通过PCIE接口发送给ARM,由ARM程序pcie2screen显示到屏幕上。厂商的文档说这个例子是将采集的视频送给HDMI,这容易让人产生误解,因为FPGA直接将视频数据发送给HDMI接口。其实是ARM程序通过PCIE读取数据后,利用Qt和OpenGL将视频显示在屏幕的窗口。
  • myir_riffa_prj_x1_125 - 5T工程:这是一个采用自环方式测试PCIE接口速度的程序。程序很简单,但是适合用来学习RIFFA接口的使用。ARM端的源程序参见:git://github.com/Alex-Hu2020/pcie-driver.git;branch=pcie_app。
  • MYIR_SFP 工程:这是一个回环测试光口能力的程序。
在几个例子中,都提到了RIFFA。RIFFA 是一个集成了DMA 读写功能的模块,而且 RIFFA 模块提供了TX 和 RX 读写接口,因此用可以直接操作 RIFFA 的读写接口,从而来控制 PCIE 模块的读写,有了 RIFFA 模块大大降低了 FPGA 工程师操作 PCIE 模块的难度,降低了后续的 PCIE数据交互时的操作复杂度。
二、RIFFA框架
RIFFA (Reusable Integration Framework for FPGA Accelerators)是加利福尼亚大学圣迭戈分校提供的一个开源框架,自2013年推出以来一直受到工程届的广泛关注。其代码可以从官方网站下载:https://github.com/KastnerRG/riffa。RIFFA 2.0的作者之一Matthew Jacobsen在其个人网站上(https://sites.google.com/a/eng.ucsd.edu/matt-jacobsen/riffa/riffa_2_0)也有一些相关介绍。
RIFFA 支持 Windows 和Linux、Altera 和 Xilinx,具有 C/C++、Python、matlab和 Java 的绑定。适配Xilinx和Intel的FPGA,支持PCIe2.0设计中对底层硬件进行了抽象,用户使用的过程中无需关注底层的硬件,同时上层软件将PCIe的操作抽象为读和写操作,用户直接调用函数即可。
RIFFA 2.0的架构如下图所示。
1.png
在FPGA侧,每个用户提供RX和TX两个FIFO接口,用户只需要根据时序对两个FIFO进行操作即可,完全不用考虑PCIE复杂的接口。RIFFA最多支持12个用户通道,虚拟出来的用户通道可以同时读写。
在主机侧,RIFFA的作者提供了驱动程序和库文件的源代码,米尔科技针对该开发板进行了驱动和库的适配,直接调用即可。主机侧的编程非常容易,就像读写文件一样使用fpga_open打开文件,使用fpga_send和fpga_recv进行数据的发送和接收。下面是最简单的C语言例子。
  1. #include



  2. #include



  3. #include





  4. #define BUF_SIZE (1*1024*1024)



  5. unsigned int buf[BUF_SIZE];





  6. int main(int argc, char* argv[]) {



  7.   fpga_t * fpga;



  8.   int fid = 0; // FPGA id



  9.   int channel = 0; // FPGA

  10. channel





  11.   fpga = fpga_open(fid);



  12.   fpga_send(fpga, channel,

  13. (void *)buf, BUF_SIZE, 0, 1, 0);



  14.   fpga_recv(fpga, channel,

  15. (void *)buf, BUF_SIZE, 0);



  16.   fpga_close(fpga);



  17.   return 0;



  18. }



RIFFA 2.0在FPGA侧的接口也进行了简化,下面是接收和发送的时序。
2.png
3.png

RIFFA官方提供了近60页的文档,详细介绍了相关配置的问题。


三、测试结果
由于手上没有合适的JTAG线,无法烧写FPGA程序。有关测试结果等过几天拿到线再贴上来。

回帖(1)

zealsoft

2023-2-2 11:48:47
今天终于把JTAG线搞定了。板上有20pin的JTAG接口和6pin的简易JTAG接口。由于20pin的接口针间距和我们使用的不同,所以用杜邦线连接了6pin的端口。刚开始连接jtag接口后发现无法识别板子,后来对照了原理图,才发现厂商的定义和我们的习惯不太一样。下面是原理图中的定义。
微信图片_20230202114957.png
烧写了厂商demo中自带的MIA702_Gen1x4If64.bin之后,回环测试结果是这样的:
testutil 2 0 0 1024000
words sent: 1024000
words recv: 1024000
recvBuffer[0]: 1023999
recvBuffer[1]: 1024000
recvBuffer[2]: 3
recvBuffer[3]: 4
recvBuffer[4]: 5
recvBuffer[5]: 6
recvBuffer[6]: 7
recvBuffer[7]: 8
recvBuffer[8]: 9
recvBuffer[9]: 10
recvBuffer[10]: 11
recvBuffer[11]: 12
recvBuffer[12]: 13
recvBuffer[13]: 14
recvBuffer[14]: 15
recvBuffer[15]: 16
recvBuffer[16]: 17
recvBuffer[17]: 18
recvBuffer[18]: 19
recvBuffer[19]: 20
send bw: 364.248964 MB/s 10.724121ms
recv bw: 219.810414 MB/s 17.770996ms

最后的数值表示读写FPGA的速度和时间。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分