文献标识码:A
文章编号: 0258-7998(2012)12-0023-03
USB移动硬盘需要用户随身携带,易感染病毒且主机关机后无法使用。随着高性能网络技术的不断进步,网络存储方式逐渐兴起[1],个人/家庭网络硬盘是为适应当前对远程文件资源访问的迫切需求而设计开发的一种基于FPGA的嵌入式网络存储设备。它是一种将文件上传至服务器主机、用户可在任意地点的客户端上通过网络访问该文件的存储方式。
本文设计实现了一种基于FPGA的个人/家庭网络硬盘,其系统整体架构如图1所示,分为硬件层、内核层及用户层。用户层是系统的交互操作界面,硬件层实现系统对底层硬盘的各种操作,内核层负责在用户层与硬件层之间传递驱动的相关参数及数据。利用XUPV5 LX110T FPGA开发板设计并挂载ATA控制器的IP核;移植PetaLinux操作系统并添加独立的FAT32文件系统模块;用户端采用B/S模式。由于用户端是标准的浏览器,用户只需要一台能上网的PC机就可利用Web浏览器调用相应的通用网关接口CGI(Common Gateway Interface)程序完成对硬盘的远程操作。个人/家庭网络硬盘可全天候不间断工作,方便快捷,通过挂载多个硬盘可扩展用户存储容量。未来可以参考本文提出的通用方法结合不同的需求对系统进一步开发与完善。
1 系统设计
1.1 硬件平台简介
系统硬件平台结构如图2所示。系统采用Xilinx公司的XUPV5 LX110T FPGA开发板,内嵌MicroBlaze软核、以太网控制器、Flash、DDR等模块,通过PLB总线实现模块之间的交互通信。底层数据存储设备使用具有IDE接口的ATA硬盘,通过V5开发板的扩展接口与FPGA芯片相连,用户端通过访问网络实现对硬盘的远程访问。
图2模块中,除阴影所示模块需自行开发外,其他部分均由XUPV5 LX110T FPGA开发板提供。
1.2 ATA主机控制器的IP核设计
本文采用具有IDE接口的希捷ST340014A硬盘(40 GB)作为数据存储设备,依据ATA/ATAPI-6协议[2]完成了对ATA主机控制器的设计,并将其封装为IP核以方便集成到不同总线结构的ASIC或SoC系统中[3]。ATA主机控制器的结构如图3所示。
硬件层的ATA主机控制器包括复位、PIO控制、MDMA(Multiword DMA)控制、Ultra DMA控制、接收/发送缓存等6个主要模块,全部用VHDL语言编程实现,仿真调试通过。其中,复位模块在初始化或异常情况下对各个模块的重置复位;PIO模块控制PIO模式的读写硬盘操作;MDMA模块实现对硬盘的多字DMA模式读写操作;Ultra DMA控制模块用于实现对以Ultra DMA方式访问硬盘的整个流程的控制;接收/发送缓存模块用于控制数据的缓存。
实现ATA主机控制器的关键除了要按要求设计严格的时序逻辑及状态机外,还需要实现对协议指定寄存器的读写操作。因为命令及命令参数的传递、设备状态信息的传递都是通过对寄存器的读写来完成的。ATA协议中各寄存器的数据传输遵守PIO传输模式,通过设置CS1-、CS0-和DA[2:0]选通寄存器地址,DIOR-/DIOW-信号控制读写。同时,ATA主机控制器或硬盘把待传送的数据放到数据总线上,并根据数据传送的方向由控制器或硬盘读取总线上的数据。ATA/ATAPI-6协议中各寄存器[4]的定义如表1所示。
实现内核驱动与底层硬盘的对接过程为:首先将VHDL设计的ATA主控制器模块封装成用户定制的IP核,通过PLB总线与MicroBlaze处理器互连;其次对XGpio函数进行封装。硬盘驱动定义如表2所示。
1.3 FAT文件系统
文件系统作为操作系统与底层硬件之间的桥梁,在嵌入式系统等各个领域得到了广泛的应用。当前U盘、MP3、MP4等设备几乎都采用了微软公司FAT32[5]文件系统,但由于并未公布FAT32文件系统的源码,本文采用开源项目FatFS[6]。FatFS独立于底层的DISK I/O层,不依赖于硬件架构并与Windows的FAT文件系统有着良好的兼容性。
FAT文件系统可划分为需求、逻辑和物理三个层次。需求层支持用户的基本文件操作;逻辑层实现FAT文件系统到物理层的映射;物理层实现与物理存储介质的接口(包括基本的读写扇区、硬盘复位等操作)。物理层主要实现5个接口:disk_initialize(初始化磁盘驱动器)、disk_status(获取磁盘状态)、disk_read(读扇区)、disk_write(写扇区)、disk_ioctl(控制设备关联特性)。利用这5个接口可以实现FAT文件系统的需求和逻辑。
文件系统物理层的5个接口函数调用PetaLinux内核驱动实现底层硬盘与文件系统的对接,进而实现FAT文件系统的各个流程,例如读扇区disk_read操作将调用表2中定义的xgpio_ata_ioctl、xgpio_ata_read等驱动函数,这些函数实现了ATA IP核中对相应的寄存器读写功能。首先,将参数及数据传递到内核中;其次,将xgpio_ata_ioctl、xgpio_ata_read等驱动函数封装到应用层中的disk_read中,满足文件系统逻辑层的需求,进而实现文件系统需求层各个接口。所有的FAT文件系统操作流程都封装为库,被用户直接调用。文件系统的接口函数全部被定义到应用层,供CGI调用。
经测试,编写的FatFS文件系统物理层接口函数工作正常,可以满足逻辑层、需求层的所有需求。
1.4 用户接口
PetaLinux操作系统是专门用于FPGA的全功能嵌入式Linux操作系统[7],用户可使用其自带的工具方便快捷地搭建所需的开发环境。PetaLinux中集成了对部分常用IP核的支持,减少了用户移植、编写驱动的工作量。同时源码中包含大量的脚本语言,简化了操作。编译生成并拷贝FatFS库到PetaLinux /bin目录下,用户便可将其作为应用程序进行调用。
用户和整体系统的接口通过满足CGI规范的C语言编写实现。服务器采用完全支持CGI的高性能单任务型嵌入式Web服务器Boa。移植PetaLinux时需开启对Boa的支持。
GI工作流程:当输入目标板的IP地址后,用户的Web浏览器与Boa服务器建立TCP连接;当在Web页面上完成一定操作后,将会向PetaLinux中的Boa服务器发出CGI请求,Boa服务器接收到该请求后将会创建一个CGI进程,并将具体的环境变量、参数与标准的输入方式传递给CGI程序;CGI程序完成相应的处理后再将结果传给Boa服务器,服务器将输出内容添加一定的标识信息后以HTML页面的形式返回并呈现给用户[8],具体流程如图4所示。例如,用户点击“Read”按钮时,将触发HTML页面中的表单并向服务器发出HTTP请求(CGI请求),发往