目录
1. 参考资料
首先,先推荐几个好的参考资料
https://www.doc88.com/p-592167157036.html
这是一个中文论文,可以先看中文的,再看下面英文的,英文的比中文 的写的详细
https://download.csdn.net/download/weiweiliulu/12465007
其实就是 Design of an Open-Source Sata Core for Virtex-4 FPGAs这篇英文论文
2. SATA结构
SATA 的每一层都分工明确,层次分明。
2.1 应用层
当主机端SATA接口的命令寄存器被修改时,说明接口得到了一个新的读写操作指令,应用层会分析得到的磁盘操作命令并根据协议进行相应的解析,解析成对应的传输请求,最后根据数据传输请求要求传输层进行数据的传输操作。
说明:具体SATA我也没调试过,只是看文章。我的理解是,应用层收到新的寄存器值,会根据下面的寄存器表,使用case语句,解析出不同传输操作。把不同的操作使能信号送入传输层,传输层再进一步做格式封装。
既然是寄存器,不得不说一下寄存器映射表,对应表可以看到每一个值对应的含义。把对应的寄存器值转换成对应的操作。
说明 :FIS(frame information structure)
2.2 传输层
传输层接收到应用层的数据传输请求后,将SATA接口中相关寄存器的内容按照协议规定的格式封装层一个帧信息数据包FIS (frame information structure)。按照协议规定的各种数据传输控制流量,将命令帧信息包及数据信息依次传递给链路层。
具体的FIS 协议包内容较长,放到下一个博文描述。
传输层位于中间,有打包同样也有解包。 传输层发送命令和数据。
命令主要作用是读取或者设置SATA接口设备的状态或者属性信息,如sleep,idle,flush,cache等。设备端收到命令后,执行命令并以发送响应FIS帧作为响应。
数据有PIO数据读写和DMA数据读写。PIO 主要用来读取少量数据,中间有一些控制和应答指令在里面,但是DMA适合大容量的数据传输。
2.3 链路层
负责控制帧的传输过程。链路层为每一个帧定义了数据帧起始原语(SOF)和数据结束帧原语(EOF)。接收方通过辨认他们来判断一个帧的边界。链路层给帧信息封装上SOF和EOF原语,数据,以及CRC校验后,再将待发送的数据进行扰码,扰码完毕后再进行8B/10B编码,最后由物理层发送出去。原语8b/10b转换后,就是K码和D 码。本质上还是十六进制的数,fpga也处理不了所谓的码字。表中也描述了码字与十六进制数据之间的对应关系和原语的意义。
原语对应表
8b/10b在很多高速接口中都有,有什么作用呢?
8b/10b编码机制主要是保证数据传输的有效性和抗干扰性。使发送 0 1 频率基本保持一致,并且连续的1或者0不超过5位。即每5个连续的1或0之后必须插入一位0或者1,从而保证信号DC平衡。具体编码实现过程,可以在中文论文对应章节找到。
2.4 物理层
物理层收到链路层处理过的数据后,将这些数据利用差分信号线发送出去,并通过特有的带外信号(OOB)来检查总线上是否挂载设备,完成上电初始化和复位。物理层的OOB信号是一个重点。
OOB信号主要包含两种:comreset/comminit信号和comwake信号。comreset信号有效周期是106.7ns的ALING信号序列,其后跟随320ns空闲信号以示分开。comreset/comminit信号格式一样,差别就是comreset信号只由主机端发送,而comminit由设备端发送。comwake信号的有效周期是106.7ns的ALING,其后是106.7ns的空闲信号。也就是comreset/comminit的空闲时间不一样。comwake信号主机端和设备端均可发送。ALING是什么呢?具体看原语对应表中介绍。
我的理解是,最开始发送的是32比比特数据,后来变成1比特的高低电平发出去。根据发送数据源和空闲时间来区分谁是谁。模式时钟是150M ,可以算出来需要几个时钟。
中间状态机也是比较复杂,具体看英文论文中P22和中文论文中P14描述。
一个方法验证链路是否建立,可以最终肯定有一个输出的LINKUP 信号,也就是使能信号。
//////////测试////
sata 在测试的时候需要额外关注这几个地方。
1)SATA复位 上电初始化完成,连接成功的使能信号 (OOB)
2)MGT接收器信号锁定。MGT接收模块OK
3) MGT发送器信号锁定。MGT发送模块OK
以上三步表示物理层已经实现了SATA硬盘初始化,等待接收或者发送数据。