原创 PATA硬盘接口的设备端UDMA协议实现要点分析

2009-9-5 13:38 6188 8 23 分类: 通信

    一年前费了好大的力气才用FPGA实现了PATA硬盘接口UDMA协议的设备端功能,现在需要把这一接口电路移植到新的项目中。借此机会把以前混乱的思路整理一下。 riple


    整理了当初设计时考虑到和后期调试中发现的几个设计难点,罗列如下。随着我对这些难点的逐一分析和解决,还会不断地充实。 riple


1. PATA接口的MDMAUDMA传输协议复用信号。 riple


    同一组握手和触发信号,在MDMAPIO方式下是一套信号名称,在UDMA方式下换成了另外一套名称,相应地,信号的时序特性也发生了改变。在UDMA方式下,同一个信号,在主机数据输出data_out和主机数据输入data_in两种不同的数据传输方向下,其定义也发生了变化。 riple


 


2. UDMA协议握手信号数量增加,握手信号关系复杂。 riple


    在MDMA传输方式下,握手信号仅有2个,读写触发信号2个;在UDMA传输方式下,握手信号增加到4个,读写触发信号1个。在data_out方向下,主机控制2个握手信号,1个触发信号,设备控制2个握手信号;在data_in方向下,主机控制3个握手信号,设备控制1个握手信号,1个触发信号。 riple


 


3. 本地时钟频率的确定问题。 riple


    对于同步时序电路,需要考虑异步信号跨时钟域传输的同步问题及其引入的延迟问题。从设计设备端接口的角度看来,主机信号的同步需要两个本地时钟周期。对于握手信号来说,协议要求的时序很宽泛,以50MHz时钟20ns一个周期,延迟两拍计算,设备端驱动的信号的响应时间在协议允许范围内;对于触发信号来说,协议要求的时序就很紧张。在data_in方向下,设备驱动触发信号,协议只有对触发信号的下限要求,没有上限约束,容易实现;在data_out方向下,主机驱动触发信号,很有可能达到协议要求的下限,设备必须在下限时间内实现触发信号的同步和数据的采集及写入,对延时很敏感。 riple


 


4. UDMA支持模式的问题。 riple


    UDMA模式越高,触发信号的周期越短,由于在触发信号的双边沿传输数据,所以周期减半。在data_in方向下,设备端驱动触发信号的数据,可以运行在较低的触发信号频率下;设备端的FIFO能够以多高的速度存入数据,决定了设备端在data_out方向下,能够支持的最高UDMA模式,该模式即设备能够支持的UDMA模式。采用数据宽度增倍的方式可以减半数据的写入频率,要求同步处理引入的延时不超过一个UDMA整周期,需要一个32位的buffer(注:在奇数个数据传输后,如果主机中止data_out传输,该方法会引发数据高低地址问题,处理较复杂);采用流水方式可以避免奇数次中止问题,但是FIFO写入频率与半周期频率相等,并且要求同步处理引入的延时不超过一个UDMA整周期,需要两个16位的buffer。另外,16CRC校验电路的运行频率也影响支持模式的确定。 riple


 


5.主从设备共用总线的问题。 riple


    设备端驱动的信号需要在有效状态和高阻状态之间适时地切换。 riple


 


6. CRC相关问题: riple


 


6.1. 双边沿触发数据CRC实现和时序问题。 riple


    可以与FIFO处理相同。采用加倍数据宽度方式可以提高性能,但是会带来资源的增加(其实没有提高性能);采用连续流水方式可以节省资源,但是会有性能下降问题。 riple


 


6.2. data_indata_out共用CRC实现问题。 riple


    把FIFO同步触发脉冲加入到该模块,用data_dir实现切换。 riple


 


6.3 CRC检查结果返回问题。 riple


    在每一次中止协议结束后,在DMACK-上升沿采样主机CRC结果,进行CRC校验,并返回结果。(中断方式,及时返回;查询方式,及时返回) riple


 


7. data_in协议相关问题: riple


 


7.1 data_in源同步传输方式,数据与触发信号同步产生,数据和触发信号的相位问题。 riple


    采用计数器分频信号产生触发信号,该信号需要符合奇数次中止问题。用寄存器延时实现内部和外部数据的相位调整。 riple


 


7.2 data_in设备启动协议。 riple


    用DMACK-的下降沿采样STOP信号(采样后的信号在每次中止协议发生后复位),与STOP信号同步之后的信号进行逻辑处理,该信号作为进入正常传输的跳转条件。 riple


 


7.3 data_in主机暂停协议。 riple


    用HDMARDY-信号控制触发信号发生电路,实现暂停 ,但是要实现电平保持功能。不需要在状态机中实现该状态。 riple


 


7.4 data_in设备暂停协议。 riple


    用rfifo_al_emptyrfifo_empty信号实现暂停,但是要保持暂停前的电平。不需要在状态机中实现该状态。 riple


 


7.5 data_in主机中止协议。 riple


    由STOP信号同步后的信号引发状态机跳转,设备需要拉低DMARQ信号。在中止状态,需要判断CRC结果,并根据结果决定跳转方向。如果正确,可以根据数据传输量进入相应的状态;如果错误,要返回错误。 riple


 


7.6 data_in设备中止协议。 riple


    正常情况下,不在数据传输结束前由设备发出中止协议。在后端超时和传输结束时由设备发出中止协议。此时DSTROBE信号已经由暂停协议确定电平,设备只需要拉低DMARQ信号即可。在非正常状态中止时,设备需要返回错误信息。 riple


 


7.7 data_in主机中止、设备重新启动的实现。 riple


    在数据没有传输完毕时,主机启动了中止协议,设备进入中止协议处理状态后,需要等到DMACK-无效后,并进行CRC结果判断。如果结果正确,才能进入下一次启动协议;如果结果错误,要返回错误信息(中断或主机查询方式)。 riple


 


7.8 data_in主机奇数次传输中止,设备偶数次启动时,DSTROBE信号的有效、无效边沿区别问题。 riple


    在奇数次传输中止时,DSTROBE信号保持低电平;在偶数次启动时,DSTROBE是高电平。需要在中止协议里实现对DSTROBE信号高电平复位的操作。 riple


 


8. data_out协议相关问题: riple


 


8.1 data_out源同步传输方式,如何实现双边沿数据捕获,同步写入问题。 riple


    用每一个边沿采样数据。在每一个边沿产生同步脉冲,采用流水线方式同步写入FIFO。由于奇数次中止问题,不考虑加倍数据宽度方式。 riple


 


8.2 data_out设备启动协议。 riple


    用DMACK-的下降沿采样STOP信号(采样后的信号在每次中止协议发生后复位),与STOP信号同步之后的信号进行逻辑处理,该信号作为进入正常传输的跳转条件。用DMACK-STOP信号的组合逻辑(异步或同步后)实现DDMARDY信号的高电平向低电平跳转。 riple


 


8.3 data_out主机暂停协议。 riple


    设备端不需要考虑。 riple


 


8.4 data_out设备暂停协议。 riple


    用wfifo_al_full控制DDMARDY信号的低电平向高电平跳转。 riple


 


8.5 data_out主机中止协议。 riple


    由STOP信号同步后的信号引发状态机跳转,设备需要拉低DMARQ信号,DDMARDY信号由STOP信号的高电平跳转引发高电平跳转。在中止状态,需要判断CRC结果,并根据结果决定跳转方向。如果正确,可以根据数据传输量进入相应的状态;如果错误,要返回错误。 riple


 


8.6 data_out设备中止协议。 riple


    用传输数据量控制DDMARDY信号向高电平跳转,延时后控制DMARDY信号向低电平跳转。状态机进入中止协议处理状态。在中止状态,需要判断CRC结果,并根据结果决定跳转方向。如果错误,要返回错误。 riple


 


8.7 data_out主机中止、设备重新启动的实现。 riple


    在数据没有传输完毕时,主机启动了中止协议,设备进入中止协议处理状态后,需要等到DMACK-无效后,并进行CRC结果判断。如果结果正确,才能进入下一次启动协议;如果结果错误,要返回错误信息(中断或主机查询方式)。 riple


 


8.8 data_out主机奇数次传输中止,设备偶数次启动时,HSTROBE信号的有效、无效边沿区别问题。 riple


    在采用双倍数据宽度处理方式中,在中止后重新启动时需要根据上一次传输中止时记录的HSTROBE信号的高低电平(低电平为奇数次)决定数据写入的高低地址。在采用流水方式进行的数据采样过程中,只需要根据STOP原始信号的低电平判断是否进行同步脉冲生成即可,不需要考虑奇数次中止问题。 riple



9. mdma、pio信号与udma信号的切换逻辑。 riple


    由于实现udma的设备至少要支持pio模式,所以必须在udma方式和pio方式之间切换相关的电路。切换信号的选择和该信号的跳变时刻很重要。可以选择nDMACK信号作为切换信号。 riple


10.DMARQ上升沿到nDMACK下降沿之间,主机可能有查询寄存器的操作。 riple


    针对该问题,可以采用如上的方法,防止出现寄存器操作干扰udma操作的问题。 riple


 



相关链接:ATA-100标准跟我看,内容老了些(01),但是反映了当初技术的前沿


在PatentStorm上搜索“ata + disk”的专利 riple


Method for detecting a cable type by utilizing the peripheral device to measure and send a state of the PDIAG-signal to the host riple


Synchronous DMA burst transfer protocol having the peripheral device toggle the strobe signal such that data is latched using both edges of the strobe signal riple


System for increasing data transfer rate using sychronous DMA transfer protocol by reducing a timing delay at both sending and receiving devices riple


Quantum的老文档pdf riple


SCSI vs. IDE Bus Mastering for DAWs riple


[精华] 【知识】Windows系统会自行关闭硬盘DMA模式(附设置DMA工作模式的方法) riple


为什麽UltraDMA/33「不」能让硬碟跑得更快 riple

文章评论15条评论)

登录后参与讨论

用户345776 2011-4-19 22:53

博主,,你好。 我跟你发过站内PM了,不知道你收到没有? 如果收到劳烦您回复一下好吗? 我最近在研发的一个项目有些问题无法解决,希望您能给予一些帮助。 具体事项可以有直接点的方式来与您交流吗?比如QQ MSN这些,我的QQ是: 9 372401

用户210588 2009-6-6 11:32

你好,最近也在学习这个,能不能把你做代码让我看看呢?wzgboy@126.com

ash_riple_768180695 2009-5-21 21:15

下一次的地址不能自动生成,还是要通过标准的命令传输给设备。udma、mdma、pio命令的差异主要在数据传输阶段采用的方式,主机发送命令的方式都是一样的。

用户1611579 2009-5-18 22:22

你好,ripple,请问采用Burst传输方式,下一次传送的地址是自动形成的吗?在寄存器直接读就可以了是吗?

ash_riple_768180695 2008-10-20 22:49

主机和硬盘之间通过identify和set_feature等命令进行传输模式的查询和设定。就像一个握手过程,主机查询设备的能力,然后设定和设备之间的传输方式。

用户168557 2008-10-20 14:54

你好,IDE硬盘信息里面有一些字用来表明设备选择的是何种模式,这些位是可变的。 我想问一下,这些位是受谁控制的呢?主机是根据这些位的值来设定传输模式,还是设定传输模式后来改变硬盘里的这些信息呢?

用户565744 2008-9-11 11:34

你好,最近我在做FPGA实现udma4,路子已经通了,只是启动时间我有点迷惑,我的IDE上只挂了一个主设备,按ATA协议,应该上电后收到Reset#不需要自检30S吧? 为什么我这有时需要自检30S后然后设了特征 才能工作,有时又很快一上电就可以对其操作.您遇到过这问题吗? 我最近一个项目要求启动后2S就要进入工作状态.所以不可能等30S的.. 谢谢 我的邮箱:10787127@qq.com

ash_riple_768180695 2008-7-5 20:17

我在ATA小组里回答了你的问题,去小组里看看吧: http://group.ednchina.com/640

用户1171506 2008-7-4 18:52

好贴,我现在用FPGA控制硬盘遇到一个问题,希望能指教。在udam方式下datain时,运行不稳定,启动UDMA读后DSTROBE的边沿经常不能到256。手册上也没看得明白,我是用的主机中止模式,是不是主机的HSTROBE无效后还会一个还是两个DSTROBE的有效边沿?谢谢

ash_riple_768180695 2008-4-8 17:04

在嵌入式平台上,我觉得还是电子硬盘抗震些。
相关推荐阅读
ash_riple_768180695 2015-12-18 11:06
学习示例程序:FPGA快速系统原型设计--敏捷实践
        学习与开发板配套的示例程序,是敏捷实践的起点。示例程序是厂商针对开发板上提供的硬件资源和接口量身定做的工程,可以展示其FPGA芯片的功能和性能特点。从示例程序入手最大的好处就是:示...
ash_riple_768180695 2015-11-03 16:46
开发板选取:FPGA快速系统原型设计--敏捷实践
    既然是“实践”,就不能只谈编码和仿真,必须要上板运行、调试。这个虚拟项目的目标是实现一块兼容Intel82574L以太网控制器的千兆网卡,需要运行在一块具备PCIe接口和10/100/10...
ash_riple_768180695 2015-10-22 12:41
开篇:FPGA快速系统原型设计--敏捷实践
    虽然借用了 “系统原型开发”的标题,本系列文章将围绕FPGA IP级别的开发这个主题展开,如果可能的话,将扩展至FPGA System级别的开发。     先上一篇PPT:RSPwFP...
ash_riple_768180695 2013-08-26 10:21
学习SystemVerilog(二)——学习它的理由
    学习SystemVerilog的理由也很多,我在阅读SystemVerilog for Design 和 SystemVerilog for Verification两本书前言的过程中,总...
ash_riple_768180695 2013-08-26 10:19
学习SystemVerilog(一)——不学习它的理由
    想要学习SystemVerilog已经很久了。曾经尝试通过Accellera网站上给出的LRM学习,怎奈内容众多,找不出入手点和重点,只能望而却步。虽然手头有三本SystemVerilog...
ash_riple_768180695 2011-06-26 23:20
Hardware-Assisted IEEE1588 Implementation Analysis
06/18/11 11:00:05 PM         最近一段时间在研究IEEE1588-2008精确时间同步协议(PTP)。该协议可以在软件中实现,如果需要提高时间同步...
我要评论
15
8
关闭 站长推荐上一条 /2 下一条