摘要:利用Cyclone II系列FPGA构建了一种用于SD卡读写的SPI控制器,并在其上实现了一个基于Nios II软核处理器的嵌入式文件系统。此文件系统是通过在Nios II EDS开发平台上移植znFAT32文件系统实现的。
引言
在嵌入式系统或移动设备上使用SD卡,接口的构建和文件系统实现是必须解决的问题。本文探讨在CycloneII平台为基础的嵌入式系统上,实现SD卡接口和文件系统的实现方法。
基于FPGA IP软核处理器的嵌入式系统,因其集成度高、可灵活配置和性价比方面的优势,已经逐渐逼近甚至赶超采用专用集成电路(ASIC)的设计方案。
利用Nios II可定制周边设备的特点,在FPGA中,通过DHL编程构造出SD卡需要的SPI接口和其他控制信号的方式。在此基础上,在Nios II处理器上实现了一个灵活的文件系统。
基于FPGA和Nios II软核构建SOPC嵌入式文件系统,本文所做的工作包括:Nios II处理器IP软核的最小SOPC系统的构建,SD卡的底层扇区读写驱动程序的编写方式,znFAT32文件系统的移植,以及对SD卡文件操作的实现等。
1 基于Nios II软核的SOPC系统构建
1.1 SOPC系统的结构
如图1所示,基于NiosII的SOPC系统包括如下部分:
①系统核心模块:Nios II处理器。
②处理器外围支持电路:时钟单元以及存储器单元SDRAM控制器(包括存储代码的ROM与存储变量的RAM)部分。
③程序下载调试模块:JTAG接口控制器和异步通信接口(UART用于打印调试信息)。
④片上系统的内部外设模块:诸如定时器、UART、SPI、GPIO等,这部分总的功能电路可根据需要配置,在本例的实验验证中,主要用到SD卡的接口是SPI。
⑤EPCS控制器:由于FPGA是基于RAM的结构框架,掉电后代码会丢失。所以FPGA需要配置一个ROM在上电后将代码加载到RAM中运行。在SOPC系统中,EPCS控制器有两个作用,一是用来帮助EDS工具将软件程序下载到EPCS芯片中去,二是在FPGA配置完成后引导EPCS芯片中的程序加载到SDRAM中去运行。
1.2 Cyclone II构建SOPC系统的过程
Altera公司为在其生产的FPGA上构建SOPC,不仅提供了各种使用的IP核模块,还提供了极为友好的集成开发环境Quartus II。在Quartus II中,有一个工具SOPCBuilder,可以帮助用户通过添加和配置(给出参数)IP核的方式,自动构建Verilog HDL语言硬件代码。
在Quartus II中,构建SOPC系统的流程如图2所示。
将需要的IP核模块添加完成后,下一步是用Verilog HDL语言编写顶层文件,对定制的SOPC进行例化处理(模块之间的连接关系定义,I/O引脚的配置),编译顶层文件和模块IP核,才能生成在FPGA上运行的片上系统。
在添加IP核后,SOPCBuilder可生成资源列表,本文构建的系统列表如图3所示。
在实例中使用了Nios II模块、时钟模块、定时器、SDRAM模块、EPCS模块、UART模块和SPI共计7个模块。
SOPC系统构建完成后,模块之间信号传递的时序并未确定。接下来的时序设计是SOPC能否正常运行的关键。在片上系统生成后,首先要对系统进行时序分析,以便使系统的时序符合设计逻辑的要求,并保证系统的正常工作,必要时要对系统的时序进行适当的约束。这一工作
可利用Quartus II软件中内嵌的TimeQuest完成,也可以使用第三方提供的时序分析软件,如PrimeTime软件等来实现。
本文采用Altera公司提供的TimeQuest来进行时序约束。经过时序约束后,对工程再编译,可产生时序报告。通过分析时序约束报告,可对约束适当修改,这个过程可反复进行,直到满足时序要求为止。
2 SD卡接口协议分析与驱动程序设计
2.1 SD卡通信接口协议分析
SD卡一般定义了SD和SPI两种可选的总线操作方式,本文采用SPI方式与SD卡接口,可以直接利用Quartus II中提供的SPI控制器IP核。S PI协议是面向位传输的同步串行通信协议。在SPI模式下,SD卡可以支持单块与多块的读写操作。
SOPC上的SPI控制器与SD卡之间的读写操作过程应符合SD卡的通信协议,其读写交互过程如图4所示。
从图4中可以看出,任何操作都是由SPI控制器的SD写命令开始,SD卡在接收到一个合法命令后,将给予应答来响应,接下来便是数据块的读或写操作。
2.2 SD卡驱动层程序的编写
Nios II EDS是Altera公司为其Nios II处理器开发的一款C/C++语言编程软件,其软件架构是基于HAL(Hardware Abstraction Layer)之上的,Nios II EDS为Nios开发者提供了编程接口、底层设备驱动、HAL API,以及C标准库等资源。更重要的是,HAL系统库为Nios II软件设计人员提供了应用程序与底层硬件交互的设备驱动接口,从而大大简化了应用程序的开发。此外,HAL系统库还为应用程序与底层硬件驱动之间划分了一条清晰的界线,从而大大提高了应用程序的可复用性,使得应用程序不受底层硬件变化的影响。
片上系统的SPI控制器硬件逻辑,是由SOPC Builder工具将一个SPI主控器软核封装到系统中的,此SPI控制器与Nios II软核以Avalon总线相连接。SD卡的设备驱动层分为4层,包括硬件抽象层、命令层、CRC校验层与操作函接口层,其结构框图如图5所示。
硬件抽象层主要实现Nios II处理器对SPI控制器相应的功能寄存器的操作。
命令层定义了对SD卡各种操作的交互方法,包括命令码与应答码的定义。
CRC校验层主要完成校验工作,对于命令与数据采取不同的校验方式。命令用CRC7校验,数据用CRC16校验。
操作函数接口层的作用是向znFAT32文件系统提供SD卡的所有操作,这其中包括了SD卡的初始化、扇区读写等函数接口(这是文件系统对SD卡进行文件操作所必需的),以供znFAT32文件系统调用。这里利用Nios IIEDS集成开发环境编写的驱动实现SD对卡的块读写(以扇区为基本单位进行读写操作),为SD卡挂载文件系统提供API函数。
每个层的接口函数如下:
3 znFAT32文件系统的嵌入和SD卡的挂载
3.1 znFAT32文件系统概述
znFAT32是于振南为小型嵌入式设备完全独立编写,且开放源代码的FAT32文件系统解决方案。znFAT32能够支持众多的存储设备(SD卡、CF卡、Flash、U盘等),支持多个存储器共同工作,可以支持同时访问多个存储器对文件的操作。对硬件资源要求低,能够轻松地移植到51单片机、AVR、ARM、DSP、Nios II等处理器上,占用资源极少(仅占用800字节左右的RAM),非常适合嵌入式开发中文件系统的嵌入。其代码完全由C语言编写,能够轻松阅读,移植方便。其代码结构如图6所示。
由图6可知该文件系统包含两层。
文件系统代码层——主要提供对存储设备进行操作的各种函数。
存储设备接口层——主要是为了挂载不同的存储设备。
3.2 文件系统SD卡的挂载
znFAT32文件系统挂载需要SD卡驱动层提供的扇区读写函数。将编写的扇区读写函数SD_Read_Sector、SD_Write_Sector取代文件系统中的FAT32_ReadSector与FAT32_WriterSector两个函数即可。根据需要的处理器编写SD卡驱动程序十分重要,只有保证驱动程序的正确性,才能进行文件系统的正确挂接,才能在挂接完成后对SD卡进行文件操作。
znFAT32文件系统的挂接需要对znFAT32文件系统提供的用于标定存储设备的全局变量Dev_No设备号进行处理,znFAT32文件系统给我们提供的存储设备宏定义如下:
对不同设备进行文件操作,需要通过设备号来选择不同的设备驱动函数。对SD卡操作需将Dev_NO定义为SDCARD。
4 文件系统在Nios II中的应用实例
完成SOPC系统的创建后,在生成的Nios II系统上通过Nios II EDS编程,便可将SD卡与文件系统挂接。
4.1 znFAT32文件系统的使用
znFAT32文件系统为用户提供的对文件的基本操作函数让我们能够轻松地对文件进行操作。下面列举了几个基本函数:
通过上面的函数,可以完成对SD卡的文件读写、删除、数据添加、目录创建、文件拷贝、文件重命名等操作。
4.2 SOPC系统对SD卡文件读写操作的验证
为了验证上述系统能否正常实现SD卡读写,笔者选用了4 GB容量的金士顿SDHC卡,进行了文件读写实验。图7为Nios II EDS给出的Deb ug信息窗口。信息显示了在构建的系统上SD卡的初始化(实现文件系统的挂接),接着读取SD卡的存储容量、扇区大小、每簇扇区数,并在根目录下面打开名为TEST.TXT的文件,并对该文件的信息进行读取。在一级子目录下面,同样建立一个TEST.TXT的文件,并对文件信息进行读取。
由运行结果可知,初始化成功并识别此SD卡为SDHC卡,容量为964 256(总簇数)×8(每簇扇区数)×512(每扇区字节数)≈3 968 860 160。根目录下的TEXT.TXT文件被打开,打开文件成功后在DIR1子目录下面创建TEST.TXT。由主函数创建的文件日期在TimeCreat[6]={12,1,4,17,40,28)中存放,文件成功后读取创建的新文件的详细信息。
为了进一步验证本系统对SD卡的写入操作,笔者将此SD卡通过读卡器与PC机连接,在PC机的文件系统下,显示了相同的结果。
结语
本文通过在CycloneⅡ系列FPGA上构建SOPC系统,并在该系统上基于NiosⅡ处理器构建了SD卡文件系统。该系统以SPI接口方式与SD卡连接,文件系统是面向嵌入式系统的紧凑型开放源码的系统。经过对SD卡的操作验证,证明本文提供的方案具有设计灵活、集成度高、通用性强、移植性好等诸多优点。在线阵CCD数据采集实验系统以及数控贴片控制系统上得到了很好的应用。