新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 基于FPGA的高速访问USB设备设计

基于FPGA的高速访问USB设备设计

作者:时间:2014-09-24来源:网络收藏

  摘要:针对访问设备存在传输速率低、资源消耗大、开发复杂的缺点,提出了一种将ARM处理器与相结合实现高速访问设备的方案。该方案利用ARM处理器的 Host读取USB设备数据井缓存于高速内存,采用乒乓机制通过SRAM接口将数据传给。经测试,数据传输速率可以达到48 Mbps。该方案具有开发难度小,资源占用率低和传输速率高的特点,适合于FPGA高速读取大量外部数据。

本文引用地址:http://www.eepw.com.cn/article/263272.htm

  引言

  目前FPGA通过USB接口获取USB设备中数据的方案大致分为两大类,一类为在FPGA内部实现USB设备控制,另一类为在FPGA外部实现USB设备控制。在FPGA内部实现的方案需要在FPGA内部实现USB控制器,在内部实现或者外接USB收发器。该方案的实现具有较大难度,同时由于USB协议和文件系统都相当复杂,需要使用相当多的FPGA资源,因此完全不能满足快速开发和低FPGA资源占用率的要求。在FPGA外部实现的方案通常使用单芯片的USB解决方案,典型的方案有两种:一种是集成了USB控制器和USB收发器,但需自行实现文件系统,如美国Cypress公司的CY7C67300;另一种是实现了包括文件系统在内的所有USB读取U盘所需的软硬件,只需要FPGA发送命令进行控制即可实现读取U盘,如南京沁恒电子的。在这两类方案中,CY7C67300集成度高,但其只支持USB 1.1,传输速率较低;同时需要FPGA对其进行配置和控制及实现文件系统,FPGA端的开发量较大。支持USB2.0接口,是一个真正的单芯片解决方案;但只支持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及其后的地址,完成数据的传输。

linux操作系统文章专题:linux操作系统详解(linux不再难懂)

fpga相关文章:fpga是什么


linux相关文章:linux教程



上一页 1 2 下一页

关键词: FPGA USB CH376

评论


相关推荐

技术专区

关闭