本帖最后由 zealsoft 于 2023-1-30 14:23 编辑
感谢“
电子发烧友网”和米尔电子公司提供了本次MYD-JX8MMA7
开发板的评测机会。上次介绍了该开发板的基本情况和
ARM开发环境的构建,今天来看看其
FPGA部分。MYC-JX8MMA7核心板及开发板采用NXP i.MX8M Mini及Xilinx Ar
tix-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 支持 Windows 和Linux、Altera 和 Xilinx,具有 C/C++、Python、
matlab和 Java 的绑定。适配Xilinx和Intel的FPGA,支持PCIe2.0设计中对底层硬件进行了抽象,用户使用的过程中无需关注底层的硬件,同时上层软件将PCIe的操作抽象为读和写操作,用户直接调用函数即可。
RIFFA 2.0的架构如下图所示。
在FPGA侧,每个用户提供RX和TX两个FIFO接口,用户只需要根据时序对两个FIFO进行操作即可,完全不用考虑PCIE复杂的接口。RIFFA最多支持12个用户通道,虚拟出来的用户通道可以同时读写。
在主机侧,RIFFA的作者提供了驱动程序和库文件的源代码,米尔科技针对该开发板进行了驱动和库的适配,直接调用即可。主机侧的编程非常容易,就像读写文件一样使用fpga_open打开文件,使用fpga_send和fpga_recv进行数据的发送和接收。下面是最简单的C语言例子。
#include
#include
#include
#define BUF_SIZE (1*1024*1024)
unsigned int buf[BUF_SIZE];
int main(int argc, char* argv[]) {
fpga_t * fpga;
int fid = 0; // FPGA id
int channel = 0; // FPGA
- channel
fpga = fpga_open(fid);
fpga_send(fpga, channel,
- (void *)buf, BUF_SIZE, 0, 1, 0);
fpga_recv(fpga, channel,
- (void *)buf, BUF_SIZE, 0);
fpga_close(fpga);
return 0;
}
RIFFA 2.0在FPGA侧的接口也进行了简化,下面是接收和发送的时序。
RIFFA官方提供了近60页的文档,详细介绍了相关配置的问题。
三、测试结果
由于手上没有合适的JTAG线,无法烧写FPGA程序。有关测试结果等过几天拿到线再贴上来。