基于Linux的ARM与FPGA数据通信设计与实现
张福洪;徐春晖;胡舜峰
【摘 要】At present,ARM and FPGA are two mainstream chips that used in embedded development .ARM is widely used in the field of control , while FPGA is more used in the field of data processing .In order to realize synergetic work and data communication between them , this paper introduces the design and implementation of a kind of communication interface between ARM and FPGA .The interface driver was developed in the case of embedded Linux system running on ARM and FPGA as a character device ,including data bus driver and general purpose input output ( GPIO) driver.The user application program can realize the data communication between them by calling the operation function defined in the driver .At last,after testing the interface with custom communication scheme , it can realize the control of ARM to FPGA equipment and stable parallel data transmission .%ARM与FPGA是目前应用于嵌入式开发的两款主要芯片,ARM偏向于控制领域,而FPGA偏向数据处理。为实现两者的协同工作以及数据通信,介绍了一
种通信接口方案的设计与实现。在ARM上运行嵌入式Linux系统的情况下,将FPGA作为字符设备,对两者之间的接口进行驱动程序开发,包括数据总线驱动和GPIO控制驱动。用户应用程序通过调用驱动中定义好的操作函数,便可实现两者的数据通信。最后利用自定义的通信方案对接口进行测试,实现了ARM对FPGA设备的命令控制以及正确稳定的并行数据传输。
【期刊名称】《杭州电子科技大学学报》
【年(卷),期】2015(000)004
【总页数】5页(P26-30)
【关键词】数据总线;通用输入输出端口;嵌入式系统;设备驱动
【作 者】张福洪;徐春晖;胡舜峰
【作者单位】杭州电子科技大学通信工程学院,浙江杭州310018;杭州电子科技大学通信工程学院,浙江杭州310018;杭州电子科技大学通信工程学院,浙江杭州310018
【正文语种】中 文
【中图分类】TP332
以应用为中心的嵌入式系统的构建,需要在相应的微处理器及硬件设备上完成,硬件设备之间的数据通信在系统中也十分必要。高级精简指令集处理器( Advanced RISC Machines,ARM)是一款高性能、低功耗的嵌入式处理器,ARM9系列在无线设备、数字多媒体设备、通信和信息系统等控制领域中仍是主流的ARM处理器[1]。现场可编程门阵列( Field-Programmable Gate Array,FPGA)可以快速测试实现用硬件描述语言完成的电路设计,是现代IC设计验证技术的主流。在数据处理方面,FPGA采用并行多通道方式,并且运行速度快,从而实现高速数据处理。由于FPGA没有指令系统,它的控制能力较弱,因此结合ARM的控制功能和FPGA的数据处理功能进行综合设计已成为一种开发趋势。目前,ARM + FPGA的开发方案已被越来越多的运用到实际项目中,但在ARM上开发的裸机程序可移植性差,也不便于后续应用程序的开发。为了改进不足,本文借助嵌入式Linux操作系统,通过系统上的设备驱动程序开发,简化了接口数据通信的实现方式。嵌入式Linux是将Linux内核进行裁剪修改后移植到微处理器运行的一种操作系统,具有实时、
开源、网络支持等特性[2]。结合Linux系统,能让ARM更好的控制设备和资源,并使在ARM上开发应用程序变得简单。本文设计的接口,包括通用输入输出端口( General Purpose Input Output,GPIO),它提供了ARM对FPGA的控制功能,并且采用并行总线接口,弥补了串行传输速率低的缺陷。
1.1 硬件平台简介
在本设计方案中,ARM平台选用飞凌嵌入式公司生产的FL2440开发板,采用核心板+底板的结构。核心板上包括ARM微控制器、64 MB的SDRAM内存、256 MB的NAND Flash以及4 MB的NOR Flash。其中,微控制器是三星公司生产的ARM9处理器S3C2440A,具有高性能、低价格、低功耗等特点,并带有全性能的MMU(内存管理单元),使其支持Linux等嵌入式操作系统[3]。开发板上已成功移植Linux系统,并能通过串口在PC端用超级终端实现控制。
FPGA选用ALTERA公司的CycloneⅢ系列EP3C16Q240C8N芯片。该系列EP3C16芯片具有15 408个LE( Logic Element,逻辑单元),0.5 Mbits存储空间,56个乘法器,4个锁相环,20个全局时钟,以及346个可供用户使用的I/O引脚。它是一款典型的低成本FPGA,
并将低功耗、高性能结合在一起,具有灵活的解决方案,便于使用者做出快速复杂的设计。其广泛应用于视频图像处理、无线通信等领域。
1.2 通信接口设计
ARM核心板与底板相连的接口中,包括了地址总线、数据总线、SPI、IIC、通用IO口,以及复位、电源引脚等。这里选取DATA0 DATA15总共16位数据总线作为与FPGA进行并行数据传输的接口,另外包括读使能( R_EN)、写使能( W_EN)、片选( NGCS5) 3路控制信号,数据总线直接与ARM芯片相连。相比于SPI、IIC等串行总线接口,采用并行总线方式可以实现大数据量的高速传输[4]。
针对具体的通信方案,往往需要ARM对总线上所传输数据的含义进行解释。在本设计中为了实现ARM对FPGA的控制及指示数据含义,选取4路GPIO口作为控制命令信号,总共可以配置16种状态。具体为开发板上的GPF0、GPG1、GPF2、GPF1等4路IO。
ARM与FPGA通信接口的所有连线如图1所示。
ARM上运行了Linux系统,因此需要设计接口驱动,并编写用于具体通信测试的应用程序。
由于和ARM不在同一个时钟域中,FPGA端则通过异步FIFO实现对总线上数据的读写缓存,从而准确传输数据。
由于嵌入式Linux的可裁剪特性,通过各类接口连接到系统的外部设备可以自由的加载( insmod)和卸载( rmmod)[5],在系统中则通过相应的驱动来支持该设备。设备驱动程序是一个中间软件层,位于实际硬件和用户应用程序之间,它为应用程序设计屏蔽了硬件的实现细节。对于Linux来说,任何硬件设备都以文件形式存在,因此通过驱动程序中的系统函数调用,应用程序可以对设备进行打开、关闭、控制、读写等操作,方式就和操作普通文件一样。
linux内核设计与实现 pdfLinux系统将设备分为字符设备、网络设备和块设备3种基本类型[5],每一类都有对应的设备驱动程序。FPGA通常属于字符设备[6],它可以按字节来读写的,本文设计的接口驱动程序主要包括加载及卸载设备驱动、实现设备操作两大模块。
2.1 设备的加载及卸载
为了使设备驱动程序能被应用程序访问,首先要将编译好的驱动模块完整的加载到内核当中。加载模块时运行如下的初始化函数[5]:
初始化代码依次完成申请、映射I/O内存资源,初始化GPIO寄存器,动态分配设备号,初始化设备文件结构,注册字符设备,创建设备节点等工作。由于要对具体的硬件进行读写操作,因此需要将FPGA的I/O内存资源进行映射,以便在驱动程序中通过虚地址来访问FPGA的物理地址,这里用到系统调用函数ioremap( )来映射内存,代码如下:
初始化GPIO寄存器即将对应的4路IO口配置成输出模式,以实现ARM对FPGA的控制。动态分配设备号使用系统函数alloc_chrdev_region( ),然后调用cdev_init( ),cdev_add( )完成设备初始化及注册,最后调用device_create( )自动创建设备节点。
同样,卸载模块时运行模块清除函数[5],代码如下:
清除代码依次完成与初始化相对应的工作,即注销设备、释放设备号、取消内存映射,分别调用函数cdev_del( ),unregister_chrdev_region( ),iounmap( )实现。
2.2 设备操作的实现
所有的设备操作都定义在一个file_operations结构体中,它是由一系列函数指针组成的集合,其中定义的打开、关闭、控制、读写等操作,均能在设备上进行。驱动中的函数与结
构成员一一对应,对设备的特定操作均由这些函数分别实现。
如下定义了本文设计的设备文件操作接口,包括了对设备的基本操作:
其中,fpga_open、fpga_release分别执行FPGA设备的打开和关闭,s3c2440_ioctl发送4路IO口控制命令,fpga_read、fpga_write分别完成数据总线上16位并行数据的读写操作。
2.2.1 GPIO控制驱动
ARM通过4路GPIO口对FPGA进行控制操作,对应文件操作接口中的s3c2440_ioctl,使用设备驱动程序设计中的ioctl方法实现,它是用于设备控制的公共接口。
首先定义命令,具体包括命令的类别(幻数)、序号、信号传递方向等,代码如下:
然后实现s3c2440_ioctl函数,其主体部分代码如下所示,利用switch-case语句可以根据不同命令配置出IO口的高低电平,F GA根据IO口上的电平然后执行相应的复位、读写数据操作,这样即实现了ARM向FPGA发送控制信号。
2.2.2 数据总线驱动
数据总线主要实现16位并行数据的读和写功能,对应设备文件操作接口中的fpga_read、fpga_ write。读和写功能完成类似的工作,从设备读取数据到用户空间,将数据从用户空间写到设备上,因此它们的函数也极为相似。
其中读函数为: static ssize_t fpga_read( struct file*fp,short user*rbuf,const size_t size,loff_t*ppos) ;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。