SATA硬盘控制器的FPGA实现
贾效玲,张刚,张博
【摘 要】摘要:设计一款高性能的SATA硬盘控制器IP核。基于Xilinx公司的Virtex-5系列FPGA,参考SATA2.5协议,运用VHDL硬件描述语言,采用模块化的设计理念,完成IP核的设计。搭建了验证平台,对IP核的性能进行了测试,经测试该控制器IP核能正确地完成读、写、设备复位、设备识别等操作,且稳定性良好。同时编写了PetaLinux操作系统下的驱动程序,便于嵌入式系统的应用。
【期刊名称】火力与指挥控制 【年(卷),期】2016(041)009 【总页数】4
【关键词】SATA2.5,控制器,FPGA,VHDL
0 引言
随着嵌入式技术的发展,嵌入式系统对存储器容量的要求越来越高,特别是图像采集、视屏监控等系统。硬盘容量大、价格便宜非常适合需要大容量存储的嵌入式系统,而目前很少有成熟的硬盘嵌入式接入方案。本文详细分析了SATA协议结构,设计了相应的SATA控制器,并在FPGA上进行了验证,基于PetaLinux设计实现了文件系统接口,为硬盘的嵌入式系统应用提供了良好解决方案。
1 SATA简介
2001年Intel等厂商组成的Serial ATA委员会提出速度为150MB/s的SATA总线接口,高于并行ATA的最高理论速度133 MB/s,SATA2.0和SATA3.0更
是分别达到了300MB/s和600MB/s[1]。
SATA接口由电源和上行、下行两个数据通道组成,数据通道由3根地线将两对差分信号线隔开,形成SATA独占通道带宽的点对点连接方式[2]。按功能SATA协议分为物理层、链路层、传输层和命令层,协议的层次结构如图1所示。主机和设备之间,除了物理层,其他各层均通过消息虚拟连接。物理层是协议的最底层主要负责码流的收发及串并并串转换;链路层主要负责消息的无差错传输,包括8B/10B编解码、加解扰、CRC校验等;传输层主要负责生成与解析帧信息结构(Frame Information Structures,FIS);命令层主要负责生成和解析访问SATA硬盘的操作命令[3]。
2 SATA控制器
2.1 总体设计
设计按照SATA协议分为4层,各层内部通过控制模块和数据通路实现相应功能,各层之间相对独立,发生错误时只需修改该层的模块,而不会对其他层造成影响。
控制模块通过有限状态机实现协议的时序控制功能,相邻层的状态机相互配合实现数据的传输控制。状态机用VHDL硬件语言描述,控制各层有条不紊地处理数据。数据通路分为发送和接收两个通道,采用FIFO方式存储。
发送数据时,命令层将传来的数据和命令按照SATA协议要求传给传输层,传输层接收数据并封装成FIS,存放于FIFO中;数据链路层对接收到的FIS进行CRC校验和加扰,并且加上帧头帧尾送到物理层;物理层由RocketIOGTP来实现,由于GTP具有8B/10B编解码功能,所以链路层的8B/10B编解码功能可以省略[4]。物理层的OOB信号用于完成初始化,速度协调模块自动识别
硬盘速率。GTP能够对接收到的消息帧进行8B/10B编码,然后经过并串转换按照差分的方式发送出去。接收过程正好相反。物理层差分信号RX和TX分别与硬盘的差分收发信号线相接。系统结构框图如图2所示。 2.2 物理层
主机与设备之间的通信基础是物理层,通过SATA接口连接。其主要功能包括:①接收高速串行差分信号并转换成并行数据;②将并行数据转换成高速串行差分信号发送;③实现主机与设备的初始化连接。
Xilinx Virtex5芯片内嵌RocketIO GTP高速串行收发器可直接来实现SATA物理层[5]。接收数据时它将3Gb/s的串行码流转换成并行数据流,发送时把并行数据串行化发送[6],同时还能产生用于初始化的带外信号(OutOfBand,OOB)。物理层协议定义了COMRESET、
COMINIT、COMWAKE 3种带外信号,均表现为在连续的Align原语簇间插入时间长度不同的空闲[7]。
初始化连接的目的是建立链路层数据传输的通路,其过程为:首先主机发送信号COMRESET,设备检测到COMRESET信号后发送信号COMINIT响应,主机确认收到信号COMINIT后发送信号COMWAKE确认,然后设备以信号COMWAKE响应,接着主机与设备进行速率匹配,匹配成功后主机发送SYNC原语,当主机端接收3个连续的非ALIGN原语时表示连接建立成功。物理层的测试结果如图3所示,rxstatus0表示的是接收到OOB信号的类型,‘4’表示COMINIT信号,‘2’表示COMWAKE信号。 2.3 链路层
链路层接收传输层的FIS,插入原语封装成帧后交给物理层发送,并从物理层
SATA硬盘控制器的FPGA实现
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)