从2月中旬准备开始,经过3个月的奋战,我的又一个项目--基于FPGA的固态硬盘读写控制电路,已经基本实现。由于实用资料的匮乏,以及项目本身颇具挑战性,这个过程充满艰辛,这里也是希望写下一些经验,供后来的有心人参考,少走一些弯路。因为这个项目比较大,不是三言两语能说清楚的,可能接下来我会用5至6篇文章来讲这个东西,陆续的码文章也会耗时较久,希望先看到的看官耐心,同时由于完整的SATA协议实在是有点庞大,我的理解也不能尽善尽美,中间有不恰当之处也希望走过路过的指出。
言归正传,这里先普及一下硬盘的两个基本知识,一个是关于硬盘的存储介质,另一个则是关于硬盘的接口技术。首先说说这个存储介质,目前市场上主流的硬盘存储介质有两种,一种是我们最常用的移动硬盘采用的光碟,另一种则是现在兴起的固态硬盘采用的flash存储介质。这两种介质的具体细节这里不追究,只简单说明一下固态硬盘的优势在于速度快,轻,声音小,不足在于价格贵,读写次数有限。然后说说这个接口技术,目前市场上主流的硬盘接口技术有SATA、SAS以及较久的IDE等,我们日常最常接触到的就是SATA。SATA是由IDE发展而来的,它突破了IDE很多极限,比如速度上、抗干扰上等。对于做硬盘主机控制器来说,我们跟关心的是接口协议,而对存储介质这些可以放到次要位置。
这个项目开发的前期工作是一定要多研读相关的资料,包括SATA协议文档、ATA协议文档等。这里给出一个下载链接,里面是自己整理的相关资料,包括SATA3.0协议原版文档和一些有用的论文、中文文档等,需要的可以去下载。。除此之外,因为要用到StratixIV器件,还需要看看StratixIV的器件手册,器件手册可以到ALTERA官网上去下载,有英文版也有中文版的。当然如果你用到的是其他的器件,那就去找相关的器件手册,貌似ALTERA的EP4 GX序列也有高速收发器,不过好像只能实现SATA1.0的传输速率。如果用ALTERA的器件做SATA协议,有两篇文档是推荐大家看看的,一篇是“理解SATA-SAS 40nm FPGA解决方案”,还有一篇是“实现Altera器件中的SATA与SAS协议”。这两篇文档告诉了我们怎么用ALTERA公司的器件去实现SATA协议,特别是第二篇,还是很有价值的,大家可以网上搜一下。
下面大致说一下自己理解的SATA协议。SATA协议目前有三个版本--SATA1.0、SATA2.0以及SATA3.0,三个版本之间最大的区别就是传输速率,分别为1.5Gbps、3.0Gbps和6.0Gbps。SATA物理接口由7针信号线和15针电源线组成,其中7针信号线中由3根地线,2根差分输入线和2根差分输出线组成。SATA数据传输采用的是模拟的串行差分信号,这使它从根本上改变了IDE硬盘中的码间串扰问题。也是因为这个原因,我们采用FPGA在做SATA协议时,必须选用那些有专用物理器件支持的芯片--SATA协议传输速率高,而且最终需要将数字信号转化为模拟差分信号传输,一般的低端FPGA芯片并不能胜任,现在一些中高端FPGA芯片是采用内部集成高速收发器硬件的方式解决这个问题的,比如ALTERA公司的ALTGX收发器、XILINX公司的RocketIO MGT等,这也是为什么前文提到需要采用StratixIV这种FPGA芯片的原因,我采用的是DE4开发板。
SATA协议分为4个协议层,分别是物理层、链路层、传输层和应用层。其中应用层提供寄存器接口,并对所有ATA命令进行解析,完成寄存器的更新;传输层位于链路层和应用层之间,负责处理控制信息,并将主机和设备之间需要交换的数据封装成数据帧,即帧信息结构FIS(Frame Information Structure);链路层负责控制传输控制原语和数据,从数据帧中提取数据进行8B/10B编解码。同时,为保证数据可靠传输,链路层还引入CRC-32校验方式,并对数据进行加解扰;物理层负责设备识别和初始化,实现高速串行数据链路,在传输线上发送和接收已编码的串行数据流,对数据进行串并/并串转换,并从数据流中分离出时钟信息。接下来的几篇文章将分别从这几个协议层的实现出发讲解整个项目的实现过程。