SATA主机协议的FPGA实现之准备工作
SATA主机协议的FPGA实现之准备工作
从2月中旬准备开始,经过3个月的奋战,我的又一个项目--基于FPGA的固态硬盘读写控制电路,已经基本实现。由于实用资料的匮乏,以及项目本身颇具挑战性,这个过程充满艰辛,这里也是希望写下一些经验,供后来的有心人参考,少走一些弯路。因为这个项目比较大,不是三言两语能说清楚的,可能接下来我会用5至6篇文章来讲这个东西,陆续的码文章也会耗时较久,希望先看到的看官耐心,同时由于完整的SATA协议实在是有点庞大,我的理解也不能尽善尽美,中间有不恰当之处也希望走过路过的指出。
言归正传,这里先普及一下硬盘的两个基本知识,一个是关于硬盘的存储介质,另一个则是关于硬盘的接口技术。首先说说这个存储介质,目前市场上主流的硬盘存储介质有两种,一种是我们最常用的移动硬盘采用的光碟,另一种则是现在兴起的固态硬盘采用的flash存储介质。这两种介质的具体细节这里不追究,只简单说明一下固态硬盘的优势在于速度快,轻,声音小,不足在于价格贵,读写次数有限。然后说说这个接口技术,目前市场上主流的硬盘接口技术有SATA、SAS以及较久的IDE等,我们日常最常接触到的就是SATA。SATA是由IDE发展而来的,它突破了IDE很多极限,比如速度上、抗干扰上等。对于做硬盘主机控制器来说,我们跟关心的是接口协议,而对存储介质这些可以放到次要位置。
这个项目开发的前期工作是一定要多研读相关的资料,包括SATA协议文档、ATA协议文档等。这里给出一个下载链接,里面是自己整理的相关资料,包括SATA3.0协议原版文档和一些有用的论文、中文文档等,需要的可以去下载。http://download.csdn.net/detail/dianshe12345/7571557。除此之外,因为要用到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校验方式,并对数据进行加解扰;物理层负责设备识别和初始化,实现高速串行数据链路,在传输线上发送和接收已编码的串行数据流,对数据进行串并/并串转换,并从数据流中分离出时钟信息。接下来的几篇文章将分别从这几个协议层的实现出发讲解整个项目的实现过程。
SATA主机协议的FPGA实现之准备工作的更多相关文章
- SATA主机协议的FPGA实现之物理层设计
SATA主机协议的FPGA实现之物理层设计 接上一篇文章,这里讲解SATA主机协议的物理层的实现过程. 下图是标准SATA协议文档中给出的物理层结构.可以看到它包含控制模块.时钟数据提取单元.同步 ...
- 千兆以太网TCP协议的FPGA实现
转自https://blog.csdn.net/zhipao6108/article/details/82386355 千兆以太网TCP协议的FPGA实现 Lzx 2017/4/20 写在前面,这应该 ...
- 详解串行通信协议及其FPGA实现
前言 好久没更新博客了,这篇文章写写停停,用了近一周的时间,终于写完了.本篇文章介绍,串口协议数据帧格式.串行通信的工作方式.电平标准.编码方式及Verilog实现串口发送一个字节数据和接收一个字节数 ...
- 转:SATA协议简介
SATA协议简介 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/FA99999/article/details/70738724 1.概述 本文档主 ...
- IDE、SATA、SCSI、SAS、FC、SSD硬盘类型介绍[zz]
目前所能见到的硬盘接口类型主要有IDE.SATA.SCSI.SAS.FC等等. IDE是俗称的并口,SATA是俗称的串口,这两种硬盘是个人电脑和低端服务器常见的硬盘.SCSI是"小型计算机系 ...
- 基于FPGA的1553B通信模块的设计(转)
reference:http://www.21ic.com/app/eda/201808/798483.htm https://www.milstd1553.com/ [导读] 摘 要: 提出一种将F ...
- Aurora 8B/10B、PCIe 2.0、SRIO 2.0三种协议比较
在高性能雷达信号处理机研制中,高速串行总线正逐步取代并行总线.业界广泛使用的Xilinx公司Virtex-6系列FPGA支持多种高速串行通信协议,本文针对其中较为常用的Aurora 8B/10B和PC ...
- OV7725学习之SCCB协议(一)
OV7725摄像头只能作为从机,通过SCCB协议配置内置的172个寄存器.因此首先要了解的就是SCCB总线 1.SCCB协议简述 SCCB协议有两线也有三线,两线为SIO_C与SIO_D,三线为SIO ...
- SAS,SATA普及文档
目前所能见到的硬盘接口类型主要有IDE.SATA.SCSI.SAS.FC等等. IDE是俗称的并口,SATA是俗称的串口,这两种硬盘是个人电脑和低端服务器常见的硬盘.SCSI是"小型计算机系 ...
随机推荐
- RFC2616-HTTP1.1-Methods(方法规定部分—译文)
part of Hypertext Transfer Protocol -- HTTP/1.1RFC 2616 Fielding, et al. 9 方法定义 下面列出了有关HTTP/1.1协议的一些 ...
- python实现链表(二)
class SingleNode(object): """单链表的结点""" def __init__(self,item): # _ite ...
- 在Java中,关于.Class()与.getCalss与.getClass().getName()的区别
** * Java反射 *所谓反射,可以理解为在运行时期获取对象类型信息的操作. *传统的编程方法要求程序员在编译阶段决定使用的类型,但是在反射的帮助下, *编程人员可以动态获取这些信息,从而编写更加 ...
- type__元组、字典、集合
- 在cikuapi.com上抓取相关词
最近用到文本相关性计算,要在开放域语料上操作,找了好久没找到好的方法,后来看到了清华的梁斌老师建的cikuapi,上面能查询一些相关词,自己写代码爬的时候出现中文解码问题,遂到Github上找了下相关 ...
- c# 获取键盘的输入
c# 获取键盘的输入 Console 类公开了三个方法获取键盘的输入,分别是Read .Readkey.ReadLine Read方法: 每次只能读入一个字符,如果没有字符可以读,返回-1,Rea ...
- IDEA2018.2.2 版本配置注释模板
Ctrl+Alt+S进入设置界面(我没改过按键映射,你也可以从File-OtherSetting进入设置),找到Editor->File and Code Templates,先在Include ...
- 基于socket构造c/s 架构软件
1.socket作用 socket层介于应用层和传输层之间,它起着连接应用层和传输层的功能,同时它能连接应用层和网络层. socket把复杂的tcp/ip协议隐藏在socket接口后面,对用户来说,一 ...
- vim技巧4 删除/保留文本中匹配行
vim技巧:如何删除/保留文本中特定的行呢? <ol><a href="/ss/ss/www"> show invisibles</a> < ...
- C++学习笔记45:多态性
运算符重载 运算符是针对新类型数据的实际需要,对原有运算符进行适当的改造 1.比如使复数类的对象可以使用+运算符实现加法: 2.比如使时钟类的对象可以用++运算符实现时间增加1秒: 注意:可以重载为类 ...