基于Nios II 的多功能数码相框的设计与实现
数码相框作为一种数码消费品和装饰品的结合物,在市场上受到越来越多的关注。目前的数码相框方案多采用MCU为核心的架构,相框功能固定,不便于产品升级。针对以上问题,本文设计了基于Nios II的多功能数码相框,该相册主要包含以下功能:支持包括BMP、JPEG在内的多种常见文件格式的图像显示;图像旋转、缩放、浏览切换等特效;支持图片浏览时背景音乐播放;可通过带FAT文件系统的SD卡进行图像数据更新,同时还具有时间显示等扩展功能。系统中将需要耗费大量时间的复杂操作(如图像解码、图像的各种特效功能以及SD卡控制)用挂载在Avalon总线上的自定义模块实现。缩短了处理时间,提高了系统响应速度。系统采用基于Nios II处理器的SoPC技术,使得该数码相框具有灵活性高、可重配置、便于升级等优点[1]。
1 总体设计
本系统采用经济型的Cyclone II FPGA芯片作为核心,基于Nios II软核处理器,采用软硬件结合的方式设计实现。系统的硬件总体框图如图1所示。
SD卡作为文件存储介质,用于存放音频与图像文件,编写SD卡控制器对SD卡进行读写控制;采用LCM显示屏作为数码相框的显示界面,SRAM作为LCM的显示缓存,存储图像数据供LCM刷新,并由LCM_SRAM IP核控制图像的显示;SDRAM为Nios II软核程序运行空间;EPCS对FPGA进行配置;Flash用来存储软件代码和数据。
2 功能模块设计
根据数码相框所要实现的功能,设计了如下模块:
2.1 LCM_SRAM IP核设计
该模块主要功能是图像数据存储、LCM参数配置以及图像的缩放、旋转、切换效果控制等。以硬件方式实现图像切换效果,提高实时性的同时降低对CPU的依赖。
2.1.1 切换特效实现
设计中通过控制LCM读取SRAM的地址实现不同的图像切换效果,如上方切入、下方切入、百叶窗、菱形等八种方式循环出现。切换时,LCM上同时存在新旧两幅图像的数据,因此,缓存中需要存储这两幅图像的数据。以百叶窗效果为例,每行以16个像素作为间隔,将LCM的每一行分割成20个条形区域。如图2所示,第i行被分割后,第一个区域的像素点为n1~n16,最后一个区域为m1~m16。每个条形区域中,新图像的数据逐渐向右覆盖旧图像数据,从而形成百叶窗效果。具体实现过程为:在第一次刷新时,每行的各个条形区域的第一个像素点(n1,…,m1)读取新图像的数据,各区域其他像素点(n2~n16,…,m2~m16)仍然读取旧图像的数据;第二次刷新时,每行各个条形区域的前两个像素点(n1、n2,…,m1、m2)读取新图像数据,其他像素点(n3~n16,…,m3~m16)仍读取旧图像的数据。屏幕刷新16次则可实现百叶窗切换效果。图2中每个圆点代表显示屏的一个像素点。
2.1.2 缩放算法实现
为实现图像缩放功能,该模块实现了如图3所示的双线性插值缩放算法。该算法利用了需要处理的原始图像像素点周围的4个像素点的相关性,通过双线性算法计算实现图像缩放[2]。设计中使用SRAM作为显示缓存,无严格的实时性要求,因此忽略了行场同步信号,简化了模块设计。
缓存1模块是待缩放图像数据的缓存,存放来自SRAM中解码后的RGB565数据。插值系数生成模块的使能信号来自旋转模块或者按键输入,由选择器进行判断,按键按下时,按照设定的行列缩放因子计算行列插值系数;若使能信号来自旋转模块,则根据原始图像的分辨率计算出旋转过后的分辨率,并按照屏幕尺寸确定完整显示该图像能达到的最大分辨率,以此计算行列缩放因子。获取相邻像素模块用来控制缓存1模块的读地址,从SRAM中读取相邻4个像素值。插值运算单元根据相邻4个像素的值及插值系数进行双线性插值运算,并将数据输出至缓存2,缓存2在SRAM空闲时将数据写入SRAM中。
2.2 SD Card Controller IP核设计
SD卡是一种基于半导体快闪记忆器的存储设备,其数据传送和物理规范由MMC发展而来。系统中将SD卡控制器设计成一个SPI模式的IP核,通过软件驱动实现SD卡的基本读写操作,即不需要复杂的硬件电路又能得到比软件模拟SPI的控制方式更快的读写速度。SD卡控制器结构图如图4所示。
2.2.1 功能模块划分
主控模块的端口与Avalon总线连接,用于缓存SD卡命令,并存储扇区地址、待发送的数据到双口RAM以及从中读取数据等。初始化模块完成对SD卡的初始化操作。命令生成模块完成SD卡命令、参数、命令校验值的发送和命令回执的读取以及数据的收发。串并、并串转换模块的主要作用是实现串并或者并串转换[3]。
使用Quartus II自带的逻辑分析仪(SignalTap II工具)对SD卡控制管脚的信号量进行实时捕获,验证了设计的正确性[4]。
2.2.2 驱动设计
SD卡控制器的驱动共设计了4个接口函数,分别完成初始化、读扇区、写扇区和执行SD命令的功能。驱动程序在初始化SD卡时得到卡类型标志,之后驱动程序根据卡类型对地址参数进行处理(若是SD1.1协议则地址左移9位,否则不变),以兼容SD1.1和SD2.0协议。读数据函数核心代码如下:
if(sd_type == 1) addr=addr 9; /*判断地址偏移*/
IOWR(SD_CARD_BASE, 517, CMD17); /*写命令*/
IOWR(SD_CARD_BASE, 518, addr); /*写地址*/
IOWR(SD_CARD_BASE, 519, 0); /*开始运行*/
ret=IORD(SD_CARD_BASE, 519); /*读命令回执*/
…
for(i=0; i512; i++)data[i]=IORD(SD_CARD_BASE, i);
/*读回数据*/
…
2.3 JPEG DECODER IP核设计
JPEG(Joint Photographic Expert Group)是第一个适用于连续色调、多灰度、彩色或黑白静止图像的国际标准。为提高JPEG图像的解码效率,实现良好的解码效果,本设计采用流水线结构设计JPEG解码IP核。解码模块结构如图5所示。
输入缓冲模块从传输码流中接收图像数据,冗余处理后将数据输出给头文件解析模块;头文件解析完毕后,将数据输出给熵解码模块;熵解码模块完成整个图像数据的熵解码处理,包括哈夫曼解码、行程解码和差分解码,最终得到量化参数;反量化和反Z扫描模块对熵解码后的图像数据进行反量化和排序;IDCT模块采用经典的行列分解方法将频域表示的数据流转换成时域表示的数据流,将数据恢复到传输前的形式。色彩空间转换模块完成数据的内插和色彩空间转换[5]。
使用Modelsim对该IP核进行了仿真验证,输入一幅320×240的JPEG图像原始数据。将解码出的数据与软件解码出的数据进行比较,证明了JPEG解码器解码正确。
3 软件设计
利用SD卡控制器驱动的接口函数,在其读写的基础上应用FAT16文件系统,实现SD卡文件操作(如获取目录/文件信息、读文件、删除文件、创建文件、追加文件等)以便于与PC机及其他多媒体设备进行数据交换。设计中使用实时多任务嵌入式操作系统?滋C/OS-II,以降低系统软件设计的复杂度和提高系统的稳定性[6],并设计多个任务,实现SD卡初始化、文件读取、数据流控制。
3.1 FAT16文件系统实现
3.1.1 读文件
文件系统中文件数据的存放是以簇为单位的,而SD卡的基本读写单位是扇区,所以需要根据簇号计算相应的扇区号,由文件系统结构可得一般的计算公式为:
起始扇区号=隐藏扇区数+保留扇区数+2×FAT表占用扇区数+FDT表占用扇区数+(起始簇号-2)×每簇扇区数
从SD卡的数据扇区中读取指定文件的核心代码为:
clunum = ffdt.fst_clu; /*获取下一个簇号*/
do{
secnum = get_sta_sec(clunum); /*由起始簇号获得
起始扇区*/
clunum = fat[clunum]; /*获取下一个簇号*/
for(i=0; igbpb.sec_per_chus; i++) /*从SD卡中
读取一簇数据*/
{ret = sd_read(rsv, secnum+(UINT32)i);
…
for(j=0; j512; j++)fdata[count++] = rsv[j];}
}while(clunum != 0xFFFF);
3.1.2 长文件名支持
具有长文件名的一个文件或目录实际对应着多个目录登记项(FDT),由几个长文件名和一个别名组成。作为别名的短文件名以传统的8.3文件名格式存储在一个FDT中,其余的几个长文件名则存储在属性标志为0x0FH的FDT中。每个这种登记项中可以存储13个字符,当读取文件或目录时,操作系统会将它们重组成可以包含小写字母的长文件名[7]。实现思路为:获取文件及目录信息时,记录属性为0x0F的登记项中的内容直到出现属性为0x01或0x02的登记项,然后从之前记录的登记项内容中得出真正的文件或目录名。支持长文件名的FDT结构定义如下:
struct _longname_fdt_{
UINT8 name[2048]; /*文件名*/
UINT16 nlen; /*文件名的实际长度*/
UINT8 attr; /*属性*/
UINT8 rsvd_data[10]; /*保留数据*/
UINT16 wrt_time; /*最后更新时间*/
UINT16 wrt_date; /*最后更新日期*/
UINT16 fst_clu; /*第一簇*/
UINT32 file_size; /*文件大小*/};
typedef struct _fdt_ FDT;
3.2 μC/OS-II任务划分
在Nios II IDE集成开发环境中整合了?滋C/OS-II操作系统,集成该操作系统后,根据系统的功能和软硬件功能模块设计多个任务,各个任务间通过信号量、全局变量等方式进行通信[8]。任务调度示意图如图6所示。
TaskStart任务:优先级为0,初始化硬件设计和全局变量;创建其他任务,创建完成之后自我删除,不参与任务调度。
TaskRdMusic:优先级为2,从SD卡的音频文件夹中读取音频数据,完成一次操作后,跳转到TaskPlayMusic。
TaskPlayMusic:优先级为3,将读取的音频数据送至音频解码芯片的缓冲区内,以播放音乐。与TaskRdMusic之间通过信号量1切换。
TaskRdPhoto:优先级为1,从SD卡的图像文件夹中读取一个图像文件数据。
TaskFileHead:优先级为2,图像数据读取完成后,分析文件头,以确定图像文件格式,根据其格式将图像数据送至对应解码器。
TaskDisplay:优先级为2,向LCM_SRAM IP核发出显示命令,使SRAM中解码后的图像数据显示到LCM上。
系统上电后,首先对各个硬件模块及软件中的数据结构进行初始化。如果初始化失败(如SD卡没插入、不带有FAT16文件系统等),系统将再次进行初始化尝试;如果初始化成功,则系统按照图7进行任务调度。
系统的软硬件设计好以后,将硬件配置文件下载到FPGA,再运行软件程序可查看实际显示效果。
图7中,上方是分辨率为800×400的JPEG源图像;图7(a)为LCM上显示的效果图,该图经过缩小以适应屏幕的分辨率,此时的分辨率为320×160,居中显示,背景为黑色;图7(b)为按照屏幕尺寸缩放效果,此时分辨率为320×240;图7(c)为顺时针90°旋转后的显示效果,此时图像分辨率为120×240。
该多功能数码相框系统以Nios II软核处理器为核心,其优点是有很高的灵活性、硬件可裁剪、产品开发周期短、便于升级。在SD卡上使用FAT16文件系统,便于对音频、图像文件进行分类管理,并使多功能数码相框与PC机、数码相机等设备进行数据交换时更加方便。利用Nios II软核特性移植?滋C/OS-II操作系统,完成了各个功能模块的任务调度,提高了系统稳定性,简化了系统软件的设计。该数码相框不仅可以用于产品原型开发、直接销售,而且还可以进行定制,满足定制个性化礼品的市场需求,为多功能数码相框开辟更加广阔的市场。
评论