引言
目前FPGA通过USB接口获取USB设备中数据的方案大致分为两大类,一类为在FPGA内部实现USB设备控制,另一类为在FPGA外部实现USB设备控制。在FPGA内部实现的方案需要在FPGA内部实现USB控制器,在内部实现或者外接USB收发器。该方案的实现具有较大难度,同时由于USB协议和文件系统都相当复杂,需要使用相当多的FPGA资源,因此完全不能满足快速开发和低FPGA资源占用率的要求。在FPGA外部实现的方案通常使用单芯片的USB解决方案,典型的方案有两种:一种是集成了USB控制器和USB收发器,但需自行实现文件系统,如美国Cypress公司的CY7C67300;另一种是实现了包括文件系统在内的所有USB读取U盘所需的软硬件,只需要FPGA发送命令进行控制即可实现读取U盘,如南京沁恒电子的CH376。在这两类方案中,CY7C67300集成度高,但其只支持USB 1.1,传输速率较低;同时需要FPGA对其进行配置和控制及实现文件系统,FPGA端的开发量较大。CH376支持USB2.0接口,是一个真正的单芯片解决方案;但CH376只支持FAT16/32文件系统,不支持NTFS文件系统,无法读取大于4 GB的大文件。另外,CH376需要FPGA进行配置和控制,因此需要实现CH376的控制逻辑并占用一定的FPGA资源。
由于现有方案均存在数据传输速率低、FPGA开发量大的缺点,本文提出了一种使用ARM+FPGA的方案,通过ARM处理器读取USB设备数据并传输给FPGA,从而实现FPGA从USB设备获取数据。该方案既能达到较高的数据传输速率,又能降低FPGA开发量,同时还具有很高的灵活性。
1 系统设计
本方案的系统设计如图1所示。该系统由ARM处理器、FPGA和USB设备构成,FPGA通过内部开辟的异步RAM空间接收数据,ARM处理器负责将USB设备中数据通过并行总线转发给FPGA,USB设备支持常见的U盘、照相机、移动硬盘等支持USB接口的从设备。本设计还将ARM处理器的两个引脚与FPGA的通信。指令线用于ARM向FPGA发送准备进行数据传输的指令;响应线用于FPGA在接收到ARM的通知并准备好后响应ARM。与FPGA相连的DDR存储器用于高速缓存大量图像数据,支持常见的DDR、DDR2和DDR3等类型。
1.1 ARM处理器选择
本方案选用的ARM处理器为韩国三星公司的S5PV210。S5PV210是一款基于ARM Cortex—A8内核的RSIC处理器,该芯片拥有强大的计算能力、丰富的内部资源和外部接口,主频高达1 GHz,同时它还拥有优化的外部存储器接口。外部存储器接口为异步接口,时钟频率为133MHz,位宽为16位,具有完善且可调的时序控制功能,可用于连接ROM、SRAM、oneNAND、NAND Flash等多种存储器,能满足在高端通信服务中的数据带宽要求。本方案使用这个接口完成数据从ARM处理器到FPGA的高速传输。
1.2 ARM与FPGA接口设计
本方案将FPGA异步RAM连接在ARM处理器的XM0内存总线上,作为一个位宽为16位的SRAM使用,其对应的硬件地址为0x10000000到0x1000 1002,共4 098字节。由于异步RAM的位宽为16位,故只需使用地址线ADDR 1~ADDR 13。指令线连接ARM处理器的GPIO引脚,方向为输出,高电平有效。响应线连接ARM处理器的中断引脚,方向为输入,上升沿有效。
1.3 软件设计
在本方案中,ARM处理器以帧为单位向FPGA传输数据。每帧长度为4 098字节,其中,帧头长度为2字节,数据长度为4 096字节。帧格式如图2所示。
帧类型的取值为:此帧不是最后帧为00,此帧是最后帧则为11。帧长度为帧数据的长度,以字节为单位。
本方案所设计的软件分为两个部分一一驱动程序和应用程序,软件总体框图如图3所示。驱动程序在Linux系统中注册硬件并提供控制硬件的功能函数,以供应用程序调用。应用程序使用驱动程序提供的功能函数控制硬件,完成整个传输过程。软件总体流程图如图4所示。
1.3.1 驱动程序设计
本方案涉及3种驱动程序:USB驱动程序、文件系统驱动程序和FPGA驱动程序。
Linux系统有丰富完善的USB设备和文件系统支持。本方案使用Linux系统中自带的USB Mass Storage驱动程序和文件系统驱动程序,自行编写FPGA驱动程序。FPGA驱动程序基于Linux系统字符设备驱动程序模型进行编写。FPGA驱动程序的主要函数有初始化函数init()、写入中断服务函数write_int()、写入函数write()。
初始化函数init()首先将FPGA异步RAM对应的硬件地址0x10000000~0x10001002映射为Linux系统中的内存虚拟地址A到A+4098(设映射的内存虚拟地址起始为A),实现在Linux系统中直接向异步RAM写入数据。然后,设置指令线、响应线所对应的寄存器。将指令线的方向设置为输出,并输出低电平;响应线的方向设置为中断输入。最后,函数将响应线中断服务函数设置为write_int()。
写入函数write()与写入中断服务函数write_int()配合,完成一次数据传输:
①当应用程序调用写入函数后,函数首先设置指令线为高电平指示FPGA准备传输数据,然后将驱动程序置于休眠状态,等待唤醒。
②FPGA收到指令后判断现在能否传输数据,如果能,则在中断线上发送一个上升沿。ARM处理器捕捉到该上升沿后,调用write_int(),唤醒驱动程序。
③驱动程序被唤醒后,继续执行write()。write()函数首先根据应用程序提供的参数生成帧头,并将帧头写入地址ADDR和ADDR+1,完成帧头的传输。随后将数据写入地址ADDR+2及其后的地址,完成数据的传输。
1.3.2 应用程序设计
本方案通过Linux系统的热插拔机制自动启动应用程序。在U盘插入USB接口后,Linux系统自动加载USB驱动和FPGA驱动并启动应用程序。应用程序流程如图5所示。
运行应用程序时,通过设置参数能使应用程序读取U盘、移动硬盘甚至网络上的文件,使方案具有很高的灵活性。应用程序使用了多线程技术来充分利用系统资源,使用两个线程分别实现从U盘读取数据存入缓冲区的过程和将缓冲区内的数据传输至FPGA的过程。在读取线程或写入线程中,可以加入数据处理代码实现数据的预处理,减少FPGA工作量。应用程序分配了多个缓冲区提高性能,并使用了互斥锁实现读取线程与传输线程间的线程同步,确保数据正确传输。
1.4 ARM向FPGA传输数据设计
本方案在FPGA中实现一个异步RAM,其使用乒乓机制接收来自ARM处理器的数据,同时需要将异步RAM中的数据写入DDR 2存储器。异步RAM内部有两个数据缓冲模块。在乒乓机制中,两个模块分别执行不同的任务,当模块1接收数据来自ARM处理器的数据时,模块2将数据写入DDR 2存储器。当两个模块的任务都完成后,交换模块1和模块2的任务。与现有方案相比,本方案FPGA无需配置外部芯片,所需开发量较小。
2 测试与分析
2.1 传输速率测试
此测试传输3个不同大小的文件,记录数据传输时间,从而获得数据传输速率。
测试结果如表1所列。
由表1可知,在传输速率测试中,测得的最高数据传输速率为47.6 Mbps,比现有方案如CY7C67300、CH376的数据传输速率高。在传输速率测试中,传输100 KB文件的传输速率与传输1 MB和1 GB文件的传输速率相比偏低,而传输1 MB和1 GB文件的传输速率则相差不大。原因为:
①测试为先进行计时后开始传输,存在一段时间未传输数据。
②应用程序在传输开始前需要一段时间进行初始化,存在一段时间未传输数据。
在后两种测试中,以上两种未传输数据的时间占总时间的比重较低,因此数据传输速率较高。
2.2 传输准确率测试
此测试在FPGA内实现一个比较器,比较异步RAM接收到的数据与比较器内置数据是否一致,从而测试传输是否正确并确定正确率。经测试,此方案在传输过程中无差错发生,传输正确率为100%。
结语
FPGA与ARM处理器相配合实现FPGA高速获取U盘数据的方案,可以满足FPGA高速读取U盘数据的需求。在传输过程中无差错,且具有良好的灵活性。本方案具有很高的实用价值。
评论
查看更多