微波EDA网,见证研发工程师的成长!
首页 > 通信和网络 > 通信网络技术文库 > 采用FPGA和DSP直接控制硬盘实现存储控制的方法

采用FPGA和DSP直接控制硬盘实现存储控制的方法

时间:02-07 来源:EDN 点击:
1 引言

数据存储是数据采集过程中的一个重要环节,目前大部分数据存储系统都是用内置工控机的方法完成数据保存任务,这种方法系统功耗大,硬件成本高,不适用于具有内记功能要求的系统。本系统采用FPGA和DSP直接控制硬盘进行数据存储,并采用一片FIFO 作为数据缓存,设计思路比较新颖,硬件结构简单,成本低,直接控制硬盘的方法可将系统功耗降至最低,具有自动内记功能,能及时存储采集到的数据。本系统已经应用于某信号采集设备中,实践证明可满足使用要求,能够满足80Khz数据采样率系统的存盘要求。

2 系统实现方案

本设计采用FPGA和DSP直接控制硬盘[1][2],并采用一片FIFO作为数据缓存,系统采用DSP完成文件管理工作,利用FPGA实现DSP与硬盘的接口。具体框图如图1所示。

图1 方案实现框图


首先由采集控制板FPGA将FIFO复位,需要储存数据时数据流直接将数据写入FIFO,当存储控制板FPGA查询到FIFO的状态为非空时就输出BIO信号通知DSP启动存盘程序。DSP先访问硬盘确定所需参数,如下一个文件应使用的文件名,保存文件的逻辑扇区号等。然后DSP向硬盘发出存盘命令,当硬盘响应控制命令后,DSP通知FPGA可以向硬盘传输数据。存盘时FPGA从FIFO中读出数据并将数据打包,由8bit变为16bit,并写入硬盘数据寄存器。当存满40M时,DSP通知采集控制系统已写满一个文件,采集控制系统将FIFO复位完成一次存盘操作。

3 存储控制程序流程

程序启动后,首先将硬盘Device register中的SRST置1使硬盘复位,在硬盘复位后读取MBR0和BPB0,在FAT中找到Special Sector并检查是否有标志位0x55FF,如果没有则说明硬盘是第1次被使用,如果有则从中读取参数准备传输数据。

(1) 为了在每次启动程序后能迅速查找到应使用的文件名、下一个空簇的位置、正在使用的磁盘等参数,将硬盘第3簇中第1扇区标志为Special Sector,用于储存这些参数。

(2)每个磁盘被划分出200M空间为保留区,当发现磁盘空间不足200M时即显示磁盘已满,不在用当前磁盘存储数据而是使用下一个磁盘。

(3)每个磁盘第2簇为目录区,因使用短文件名无子目录,所以当每簇为16扇区时目录区共可储存256个文件名。

(4)数据文件大小固定为40M。

如果硬盘是第一次被使用,则主机顺次读取MBR0、BPB0、MBR1、BPB1直到查询到最后一个硬盘分区,并将相关参数如每个分区的大小、分区的逻辑地址、每个分区数据空间起始段的逻辑地址、FAT表逻辑地址等信息写入Special Sector,并做一个文件的目录(32字节)将第一个文件命名为"000.dat"。

当FAT中第三簇被标志为坏簇时,表明已经在硬盘上划分Special Sector并已存入硬盘参数。主机从Special Sector中读取下一个可用空簇,并计算这一簇在FAT中的位置并将FAT读入C54的RAM中,读取Special Sector中的文件名及相关参数并将其写入目录区。然后查询BIO,当BIO为低电平时开始传输数据(参见储存板接口),传输数据时FPGA启动元件 trans_data,由主机发出XF作为启动信号。FPGA从FIFO中每读出2Bytes向硬盘写一次,连续写256次,即向硬盘传输512字节数据。主机每发出一个XF下降沿FPGA就从FIFO中读取512字节数据并存入硬盘。

传输40M数据结束后,主机将根据传输的扇区数填写FAT表,判断硬盘空间是否小于200M、已储存的文件数是否大于256,如果为真则再次存储数据时将使用下一个磁盘分区。

4 硬盘操作控制流程

我们一般习惯称硬盘接口为IDE接口[3],对硬盘的操作如读写扇区,发送命令等都是通过读写寄存器来完成的,每向硬盘发送一组命令后都要读取状态寄存器中的信息,通过状态寄存器的值来判断硬盘是否已经执行完所发送的命令。

4.1 硬盘启动操作

硬盘加电后应先将硬盘复位,硬盘复位方式有三种,本设计采用的是将SRST置1,当SRST被置1后硬盘立即复位,这时应至少等待2ms才读取Status register。如果Status register的值为80h,则表明硬盘已完成复位。硬盘启动流程见图2。

图2 硬盘启动程序流程图


4.2 扇区读写操作

首先应向硬盘发送命令参数,将要读写的扇区数目写入Sector count register,将扇区的逻辑地址写入LBA High register、LBA Mid register和LBA Low register,将要接收命令的设备号写入Device register。流程见图3。

图3 扇区读写操作程序流程图


LBA=(柱面编号×磁头数+磁头编号)×扇区数+扇区编号-1

将命令READ SECTOR或WRITE SECTOR写入Command register后,在400ns内Status register的值并不可靠,所以需等待400ns才能读取Status register,这段等待时间可以通过读取Alternate Status register和Error register度过,读取的数值应被丢弃。当状态寄存器的值为58h时,表示硬盘已经可以从Data register接收或传输数据。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top