只发FPGA相关1  随时更新~~

一、 瑞芯微RK3568J与FPGA的PCIe通信

ARM + FPGA架构有何种优势

近年来,随着中国新基建、中国制造2025的持续推进,单ARM处理器越来越难满足工业现场的功能要求,特别是能源电力、工业控制、智慧医疗等行业通常需要ARM + FPGA架构的处理器平台来实现特定的功能,例如多路/高速AD采集、多路网口、多路串口、多路/高速并行DI/DO、高速数据并行处理等。

到底ARM + FPGA架构有什么优势?

ARM:接口资源丰富、功耗低,擅长多媒体显示、逻辑控制等。

FPGA:擅长多通道或高速AD采集、接口拓展、高速信号传输、高速数据并行处理等。

因此,ARM + FPGA架构能带来性能、功耗等综合比较优势,ARM与FPGA既可各司其职,各自发挥原本架构的独特优势,亦可相互协作处理更复杂的问题。

为何需要ARM + FPGA高速通信

在工业应用场景,一般FPGA作为数据采集前端,常常有大量的数据需要传输给ARM进行处理。如能源电力,会用FPGA作为高速AD或多通道AD采集,然后将产生的大量数据传输给ARM做AD数据存储和处理;又如智慧医疗,FPGA需将采集和处理的高清视频数据传输至ARM,让ARM对高速视频数据进行视频显示、编码或存储。因此,“ARM + FPGA高速通信”是“ARM + FPGA架构”项目成功的关键因素。

创龙科技为满足能源电力、智慧医疗、轨道交通等行业日益增长的国产化需求,率先推出国产化率100%的RK3568J工业核心板,并提供基于RK3568J与FPGA的高速通信案例

RK3568J + FPGA高速通信案例

下面将为大家介绍基于瑞芯微RK3568J(硬件平台:创龙科技TL3568-EVM评估板)与Xilinx Artix-7(硬件平台:创龙科技TLA7-EVM评估板)的PCIe高速通信案例

ARM端基于PCIe总线对FPGA BRAM进行读写测试。应用程序通过ioctl函数发送命令开启DMA传输数据后,等待驱动上报input事件;当应用层接收到input事件,说明DMA传输数据完成。

硬件搭建方面,使用M.2 Key M转PCI-E 4X延长线将TL3568-EVM评估板的M.2 PCIe NVMe接口与创龙科技TLA7-EVM评估板的PCIe接口连接,并将TLA7-EVM评估板通过TL-DLC10下载器连接至PC机,硬件连接如下图所示。

嵌入式~FPGA专辑1_嵌入式硬件

图1 硬件搭建示意图按照创龙科技提供的案例用户手册进行操作,我们得出ARM与FPGA基于PCIe通信的实测数据,如下图所示。实测写操作的DMA传输速率为780.77MB/s,读操作的DMA传输速率为563.06MB/s。

嵌入式~FPGA专辑1_硬件平台_02

图2 数据实测 

嵌入式~FPGA专辑1_数据_03

图3 数据解读 

二、 Zynq的一个简单工程

Zynq PS部分的开发涉及到交叉编译ARM Cortex-A9 CPU运行的程序,也就是Zynq上面运行的程序。这部分工作不是由Vivado负责的,需要用另外一套软件工具:Xilinx SDK.

SDK开发软件又需要Zynq的配置信息,也就是在Vivado工程中设置的PS时钟、DDR、外设那些。根据教程的介绍,在Vivado工程完成之后,使用Export功能,将硬件信息导出给SDK用。

嵌入式~FPGA专辑1_硬件平台_04

在导出的时候可选择包含bit文件,也就是FPGA部分的配置码流。原因是Zynq启动是由PS部分主导的,需要PS负责PL (FPGA)的初始化,不像单纯FPGA只要将bit烧写到外部flash中就可以自动加载了。导出的文件后缀是 .hdf

SDK的IDE是Eclipse风格的,操作起来和常见的MCU近似了。

在SDK中新建工程的时候,要选择目标硬件平台,而我必须用自己的板子而非所列的硬件,于是点旁边的New按钮。

嵌入式~FPGA专辑1_数据_05

然后就要用到从Vivado中导出的硬件信息了,点Browse选择之前生成的.hdf文件,软件会自动取一个名称(可能会长,自己可以修改)。 

嵌入式~FPGA专辑1_嵌入式硬件_06

再回到上一个对话框,就看到目标硬件平台已经变成新建的了。先给新的软件工程取个名(比如我用的demo0),SDK还会同时创建一个BSP: demo0_bsp

嵌入式~FPGA专辑1_数据_07

再点Next可以看到一些工程的模板供选择。作为新手有必要看一下工程怎么写的,可以选最简单的Hello World,这里选Memory Tests,顺带测试一下DDR的配置是否能工作。确认以后,SDK就自动创建工程并编译了,可以在Project Explorer中看到源文件等内容

嵌入式~FPGA专辑1_数据_08

这看起来和开发MCU用的arm-none-eabi工具链有几分相似呢,编译结果也是得到elf文件。选中erf文件,点鼠标右键弹出菜单,就可以选择Debug或者Run来运行了。当然也类似于MCU开发环境,前提是调试器要连好了,这里需要Xilinx 下载器连到了Zynq的JTAG上面。 

嵌入式~FPGA专辑1_多路_09

我已经连好了矿板,确认FPGA可以下载bit文件的情况下,SDK中选择Debug或Run还是遇到了问题: 

嵌入式~FPGA专辑1_数据_10

这像是一个调试器的故障,矿板的PS部分本来已经运行起Linux了,可能不能被JTAG复位。关于Zynq的启动,我所知是有几种模式的。那么不让矿板的Linux启动,也许是可以解开这个问题。从电路图上分析,矿板是用的NAND flash启动方式,那么改一下 PS MIO[4]脚的上拉为下拉,就可以切换到JTAG boot模式避免板子自己启动了。

嵌入式~FPGA专辑1_数据_11

矿板上的boot模式没有接死,上拉和下拉电阻都有,不用飞线直接改焊电阻就可以了。 

嵌入式~FPGA专辑1_数据_12

嵌入式~FPGA专辑1_嵌入式硬件_13

把照片上红框中R2578电阻焊下来,改焊到旁边R2585的位置上,矿板就不会从NAND启动了。

改启动模式之后,在SDK中选择Run,顺利看到了串口打印出来的信息:

嵌入式~FPGA专辑1_数据_14

作为模板提供的Memtest程序是在Zynq7010的片上SRAM中运行的。这一点可以由lscript.ld脚本佐证: 

嵌入式~FPGA专辑1_多路_15

为了分析程序怎么运行的,可以试着去反汇编一下demo0.elf 文件。使用SDK目录下面的arm-xilinx-eabi-objdump –d 来反汇编,可以看到所有代码部分。比如,在地址0地方是中断向量表:

嵌入式~FPGA专辑1_嵌入式硬件_16

也可以查找main函数在哪里: 

嵌入式~FPGA专辑1_多路_17

整个程序的初始化部分比STM32 MCU还是显得代码量多,不过,想想能当成一个667MHz主频,有256MB DDR RAM可以用,还可以自己用verilog写外设的MCU板子来玩,可以发挥的地方就多了。