基于FPGA和IP核的数码相框的设计和实现
对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; i《512; i++)data[i]=IORD(SD_CARD_BASE, i);
/*读回数据*/
…
2.3 JPEG DECODER IP核设计
JPEG(Joint Photographic Expert Group)是第一个适用于连续色调、多灰度、彩色或黑白静止图像的国际标准。为提高JPEG图像的解码效率,实现良好的解码效果,本设计采用流水线结构设计JPEG解码IP核。解码模块结构如图5所示。

输入缓冲模块从传输码流中接收图像数据,冗余处理后将数据输出给头文件解析模块;头文件解析完毕后,将数据输出给熵解码模块;熵解码模块完成整个图像数据的熵解码处理,包括哈夫曼解码、行程解码和差分解码,最终得到量化参数;反量化和反Z扫描模块对熵解码后的图像数据进行反量化和排序;IDCT模块采用经典的行列分解方法将频域表示的数据流转换成时域表示的数据流,将数据恢复到传输前的形式。色彩空间转换模块完成数据的内插和色彩空间转换。
使用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; i《gbpb.sec_per_chus; i++) /*从SD卡中
读取一簇数据*/
{ret = sd_read(rsv, secnum+(UINT32)i);
…
for(j=0; j《512; 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]。任务调度示意
- 一种消防应急灯具专用控制芯片的设计(11-02)
- 基于FPGA的8段数码管动态显示IP核设计(02-03)
- 基于FPGA和IP Core的定制缓冲管理的实现(08-14)
- 基于Altera ASI IP核的ASI发送卡实现(02-25)
- FPGA的高速多通道数据采集控制器IP核设计(04-22)
- 基于EDA或FPGA的IP保护的实现(09-16)
