基于FPGA的高速访问USB设备设计
时间:11-12
来源:互联网
点击:
摘要:针对FPGA访问USB设备存在传输速率低、资源消耗大、开发复杂的缺点,提出了一种将ARM处理器与FPGA相结合实现高速访问USB设备的方案。该方案利用ARM处理器的USB Host读取USB设备数据井缓存于高速内存,采用乒乓机制通过SRAM接口将数据传给FPGA。经测试,数据传输速率可以达到48 Mbps。该方案具有开发难度小,资源占用率低和传输速率高的特点,适合于FPGA高速读取大量外部数据。
引言
目前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及其后的地址,完成数据的传输。
引言
目前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及其后的地址,完成数据的传输。
FPGA USB ARM 收发器 Cypress 电子 总线 Cortex Linux 比较器 相关文章:
- 一种基于电力线的家庭以太网络实现方法(10-10)
- 基于DSP和FPGA的机器人声控系统设计与实现 (04-16)
- 面向大众市场的千兆位级收发器(05-04)
- 利用以太网硬件在环路实现高带宽DSP仿真(05-04)
- 采用软处理器IP规避器件过时的挑战(05-04)
- WCDMA系统基带处理的DSP FPGA实现方案(01-02)