基于SoC FPGA 的FPGA to HPS数据通信系统设计*

2021-08-25 07:01刘春雅
甘肃科技 2021年13期
关键词:外设应用程序逻辑

刘春雅

(陕西国防工业职业技术学院,陕西 西安 710300)

1 概述

数字信号处理领域内较为典型的应用为ADC高速数据采集及处理,由中端或高端FPGA 完成若干通道的ADC 接口逻辑,数据接收后进入FPGA 逻辑,之后再进行诸如FIR 滤波、FFT 运算等数字信号处理。处理后的一些相关信息及运算结果需要通过支持TCP/IP 协议的以太网GE 口、USB、CAN 等接口发送至上位机、存储单元或其他设备,而支持TCP/IP 协议的以太网GE 口、USB、CAN 等接口都带有协议解析部分的处理,这在传统的纯FPGA 逻辑内很难实现对这部分协议的解析和处理。在很多对小型化、低功耗等一些设计指标约束条件较高的场合,传统的单FPGA 架构的方案就会显得难以适从。

2 SoC FPGA 的特点

CycloneV SoC FPGA 是Intel PSG 推出的一款在单芯片上集成了ARM 双核Cortex-A9 处理器和FPGA 逻辑的真正意义上的SoC 芯片。它的出现正好能够解决上述问题,单芯片ARM+FPGA 的架构不仅能够完成以前FPGA 所擅长的ADC 接口及数字信号处理等功能,还可以通过片上内部的ARM来实现以太网GE 口、USB、CAN 等不太好使用FPGA 去实现的一些接口,不仅如此还能够利用ARM 运行嵌入式操作系统完成复杂的单板事务流程控制及管理、人机交互界面等。单芯片的SoC 方案对设备小型化、低功耗化的设备发展方向提供了有力的帮助。

SoC FPGA 内部的ARM 侧和FPGA 侧的数据通信是由3 个桥实现的,分别是H2F_AXI_Master桥,用于完成HPS(即Hard Processor System,HSP 为包含了ARM 双核Cortex-A9 处理器、FLASH 及SDRAM 控制器及诸多外设接口等在内的一整套完整的硬核CPU 系统)向FPGA 发起数据读写操作;F2H_AXI_Slave 桥,用于完成FPGA 向HPS 发起数据读写操作;H2F_LW_AXI_Master 桥,用于HPS 向FPGA 发起一些控制指令或较小带宽数据读写。

对于之前提到的典型应用为高速ADC 数据采集及处理来讲,需要确保FPGA 侧处理完的数据等信息能够最终送往HPS 侧才能让SoC FPGA 发挥出应有的作用。

3 设计实现

3.1 Avalon MM Master Templates 简介

Avalon MM Master Templates 实现了Avalon MM Master 功能。通过这个Avalon Master 接口,用户能够向对应的Avalon Slave 设备写入数据,也能够从对应的Avalon Slave 设备读出数据。

该Templates 在使用时需要区分读或写两个模式,也就是说在使用时需要指定其工作模式是读或写中的一种,一个Instance 无法同时支持读写双向,如果需要读写双向,可以在系统搭建的时候例化两个Avalon MM Master Templates 并分别指定为读和写模式。

Avalon MM Master Templates 读和写模式顶层结构,(如图1 和图2 所示):

图1 Master 读模式

图2 Master 写模式

对于Master Templates 的读或写模式来说,都是由四个基本模块构成的,分别是时钟复位、读/写Master 逻辑、控制逻辑及FIFO 逻辑。

时钟复位考虑到同步设计一般在Platform Designer 系统中保持与整个HPS 系统一致。

读/写Master 逻辑部分的接口是与对应的Slave设备对接的,使用时在Platform Designer 中需要进行连接。

3.2 Platform Designer 系统搭建

添加Master Templates 到系统并修改其配置参数,需要将Master Direction 设置为“Write”,即FPGA 主动发起写操作到HPS 侧。Data Width 选为32bit,其有8、16、32、64、128、256、512 和1024 共计8 个选项。Address Width 选为32bit,与ARM 位宽匹配。打开burst 使能,并设置最大的burst 长度为128,可以根据实际的数据吞吐量进行设置。按照这个设置,一次burst 最大可以传输32×128bit=4096bit的数据。配置FIFO 深度为256,使用memory based方式,即使用FPGA 内部的Block RAM 搭建FIFO,按照这个设置,32×256 会占用FPGA 内部的一个M10K 做FIFO。最后将master_template 的控制端口和FIFO 端口Export 出来,以便用户进行控制和数据写入。

为了方便后面的测试,还需要编写一个Avalon MM Slave的模块,将该模块挂在HPS 的h2f_lw_axi_master 这个轻量级总线桥上,在测试过程中可以通过ARM 运行的应用程序来控制master_template 的写入。该模块可以设计含有3 个寄存器,分别用于控制master_template 的control_go,control_write_base 及control_write_length。编写完成的代码需要在Platform Designer 工具中添加为一个元件进来并挂在h2f_lw_axi_master 这个轻量级总线桥上了。

之后在 Platform Designer 工具中将这个write_ctrl 作为一个模块添加到HPS 系统中,连接好时钟及复位信号,将HPS 的h2f_lw_axi_master 连接到该元件的as(即Avalon MM Slave)端口。最终连接好的整个HPS 系统如图3 所示:

图3 添加并连接write_ctrl 模块到HPS 系统

对搭建好的HPS 系统分配基地址,Generate HDL 后得到HPS 部分的HDL 代码。至此,HPS 侧的硬件系统搭建完成。

硬件部分完成后,需要在SoC EDS 工具中生成Linux 软件和驱动所需包含的hps_0.h 头文件,该头文件包含了HPS 侧全部的外设及接口IP 寄存器定义等。

其命令为:sopc-create-header-files“./soc_system.sopcinfo”--single hps_0.h--module hps_0

生成设备树dts 并转换为Linux 系统启动所需的dtb。

其命令为:make dtb

由于dtb 文件中包含的信息是与一个具体的Quartus 工程对应的,在启动时,Linux 操作系统会根据dtb 文件中的硬件描述去初始化FPGA 侧添加的各种IP。

3.3 Avalon MM Master Templates 驱动程序设计

开始Linux 应用程序设计之前,需要先为Avalon MM Master Templates 编写相应的驱动程序,否则Linux 内核无法识别该外设。驱动程序中:

(1)amm_wr_init(viod)为驱动模块入口,Linux在加载设备驱动时会首先执行该函数并获取到该设备的主设备号。其中:

①ret=alloc_chrdev_region(&devno,minor,1,"amm_wr");获取设备号,设备节点命名为"amm_wr"。

②my_kernel_buffer=dma_alloc_coherent(NULL,dma_size,(void *)&(my_kernel_buffer_phy),GFP_K ERNEL);为DMA 内存申请,申请内存大小为dma_size。my_kernel_buffer_phy 为申请到的内存物理首地址,FPGA 使用的就是该实际的物理地址。my_kernel_buffer 为DMA 内存空间虚拟地址指针。

(2)amm_wr_read 函数实现从内核空间读取数据到用户空间,copy_to_user (buf,my_kernel_buffer,count)为从my_kernel_buffer 中拷贝count 个数据到用户空间buf 中。

(3)amm_wr_ioctl 函数是设备驱动程序中对设备的I/O 通道进行管理的函数。所谓对I/O 通道进行管理,就是对设备的一些特性进行控制。put_user(data,(unsigned int *)arg)可将my_kernel_buffer_phy物理地址拷贝到用户空间。应用程序在调用ioctl 函数时,就能够得到该物理地址,并通过写write_ctrl这个Slave 模块其中的base 寄存器操作,将FPGA发起写传输所需的物理地址告知FPGA。

(4)fops 定义部分:

其余部分主要为amm_wr_open 打开函数,amm_wr_release 关闭函数,amm_wr_exit 驱动出口函数及一些声明等。

将此驱动的源码上传至Ubuntu 系统下,使用root 账户登录Ubuntu,设置好处理器架构,设置好交叉编译工具,并在Makefile 中指定好linux-soc fpga源码路径,之后就可以编译得到后缀为.ko 的驱动模块文件。应用程序开始执行之前,需要先使用insmod 命令安装这个驱动模块。

3.4 Linux 应用程序设计

应用程序的功能主要是为了测试整个HPS 底层的硬件系统,检验是否能够完成FPGA 逻辑侧的数据写入HPS 侧的DDR 中,并可将最终写入DDR的数据读取到Linux 的用户空间并打印显示出来。

该应用程序通过写模式的Avalon MM Master Templates,将FPGA 逻辑代码生成的16384 个数据从逻辑侧写入到了HPS 侧的DDR 中储存,再通过read 函数读取到用户空间的read_buffer 中,最后为了显示方便,仅打印出了前1024 个数据。

应用程序中:

(1)periph_vir_base=mmap(NULL,HW_REGS_SPAN,(PROT_READ|PROT_WRITE),MAP_SHARED,fd,HW_REGS_BASE);为通过mmap 函数将以地址(HW_REGS_BASE)为起始的一段空间(HW_REGS_SPAN)进行虚拟地址映射,得到了HPS 全部外设的虚拟地址,其中也包括了HPS 侧的h2f_lw_axi_master 总线桥的虚拟地址。

(2)write_ctrl_vir_base=periph_vir_base+((unsigned long)(ALT_LWFPGASLVS_OFST+MASTER_CTRL BASE)&(unsigned long)(HW_REGS_MASK));可得到write_ctrl 自定义元件的基地址,其基地址由外设虚拟基地址+h2f_lw 总线桥的偏移地址+write_ctrl 元件相对于h2f_lw 总线桥的偏移地址得到。

(3)int trans_init(void)函数为通过ioctl 系统调用得到申请到的DMA 的一段地址空间,并将这段空间的基地址写入FPGA 侧write_ctrl 元件的寄存器,同样的方式,也写入了数据长度参数。FPGA 得到这两个参数就能够向这个地址写入此数据长度的一段数据了。

(4)main 函数内,先对整个系统做了复位,以清除Avalon MM Master Templates 内FIFO 的多余数据,确保FIFO 不会有残存数据影响本次测试。之后软件通过写寄存器的方式向write_ctrl 元件写入控制指令,控制go 发一次脉冲来启动传输过程。之后调用read 函数将16384 个数据读取到用户空间的read_buffer 储存,最后通过for 循环,将储存 的16384 个数据打印出来,为了方便显示,只打印出了前1024 个数据。

(5)程序退出时需要取消虚拟地址映射并关闭打开的文件描述符。

3.5 应用程序测试

在SoC EDS 中输入“eclipse &”打开DS-5 并新建软件工程,添加源代码和必要的文件包含路径后编译工程,得到二进制程序文件,再为该文件添加可执行权限。运行应用程序得到的结果(如图4 所示)。

图4 应用程序运行结果

4 结束语

从该FPGA to HPS 数据通信系统设计最终的测试结果来看,完全达到了芯片内部FPGA 侧到ARM 侧的数据通信的目标。如FPGA 逻辑侧接的是ADC 数据或是用户经过数字信号处理运算后的数据,通过此方案就可以达到将数据送往ARM 侧的目的。之后再通过相应的嵌入式软件开发,就可以完成将数据最终通过TCP/IP 协议的GE 口,USB,CAN 等接口送出的任务。故该方案可以成为通用的SoC FPGA 数据交互通信方案,具备较强的参考价值。

猜你喜欢
外设应用程序逻辑
刑事印证证明准确达成的逻辑反思
逻辑
创新的逻辑
删除Win10中自带的应用程序
谷歌禁止加密货币应用程序
女人买买买的神逻辑
Microchip推出具备双ADC外设的全新器件,扩展其低成本8位PIC®单片机产品线
外设天地行情
三星电子将开设应用程序下载商店
外设天地行情