PATA硬盘接口的设备端UDMA协议实现要点分析
0赞一年前费了好大的力气才用FPGA实现了PATA硬盘接口UDMA协议的设备端功能,现在需要把这一接口电路移植到新的项目中。借此机会把以前混乱 的思路整理一下。
整理了当初设计时考虑到和后期调试中发现的几个设计难点,罗列如下。随着我对这些难点的逐一分析和解决,还会不断地充实。
1. PATA接口的MDMA和UDMA传输协议复用信号。
同一组握手和触发信号,在MDMA和PIO方式下是一套信号名称,在UDMA方 式下换成了另外一套名称,相应地,信号的时序特性也发生了改变。在UDMA方 式下,同一个信号,在主机数据输出data_out和主机数据输入data_in两种不同的数据传输方向下,其定义也发生了变化。
2. UDMA协议握手信号数量增加,握手信号关系复杂。
在MDMA传 输方式下,握手信号仅有2个,读写触发信号2个;在UDMA传输方式下,握手信号增加到4个,读 写触发信号1个。在data_out方向下,主机控 制2个握手信号,1个触发 信号,设备控制2个握手信号;在data_in方向下,主机控制3个握手信号,设备控制1个握手 信号,1个触发信号。
3. 本 地时钟频率的确定问题。
对于同步时序电路,需要考虑异步信号跨时钟域传输的同步问题及其引入的延迟问题。从设计设备端接口的角度看来,主机信号的同步需要两个本地时钟周期。对于 握手信号来说,协议要求的时序很宽泛,以50MHz时钟20ns一个周期,延迟两拍计算,设备端驱动的信号的响应时间在协议允许范围内;对于触发信号来说,协议要求 的时序就很紧张。在data_in方向下,设备驱动触发信号,协议只有对触发信号的下限要求,没有上限约束,容易实现;在data_out方向下,主机驱动触发信号,很有可能达到协议要求的下限,设备必须在下限时间内实现触发信号的同步和 数据的采集及写入,对延时很敏感。
4. UDMA支持模式的问题。
UDMA模式越高,触发信号的周 期越短,由于在触发信号的双边沿传输数据,所以周期减半。在data_in方向下,设备端驱动 触发信号的数据,可以运行在较低的触发信号频率下;设备端的FIFO能够以多高的速度存入数 据,决定了设备端在data_out方向下,能够支持的最高UDMA模 式,该模式即设备能够支持的UDMA模式。采用数据宽度增倍的方式可以减半数据的写入频率,要求同步处理引入的延时不超过一个UDMA整周期,需要一个32位的buffer(注:在奇数个数据传输后,如果主机中止data_out传输,该方法会引发数据高低地址问题,处理较复杂);采用流水方式可以避免奇数次中止问题,但是FIFO写入频率与半周期频率相等,并且要求同步处理引入的延时不超过一个UDMA整周期,需要两个16位的buffer。另外,16位CRC校验电路的运行频率也影响支持模式的确定。
5.主 从设备共用总线的问题。
设备端驱动的信号需要在有效状态和高阻状态之间适时地切换。
6. CRC相关问题:
6.1. 双边沿触发数据CRC实 现和时序问题。
可以与FIFO处 理相同。采用加倍数据宽度方式可以提高性能,但是会带来资源的增加(其实没有提高性能);采用连续流水方式可以节省资源,但是会有性能下降问题。
6.2. data_in和data_out共用CRC实现问题。
把FIFO同 步触发脉冲加入到该模块,用data_dir实现切换。
6.3 CRC检查结果返回问题。
在每一次中止协议结束后,在DMACK-上升沿采样主机CRC结果,进行CRC校 验,并返回结果。(中断方式,及时返回;查询方式,及时返回)
7. data_in协议相关问题:
7.1 data_in源同步传输方式,数据与触发信号同步产生,数据和触发信号的相位问题。
采用计数器分频信号产生触发信号,该信号需要符合奇数次中止问题。用寄存器延时实现内部和外部数据的相位调整。
7.2 data_in设备启动协议。
用DMACK-的下降沿采样STOP信号(采样后的信号在每次中止协议发生后复位),与STOP信号同步之后的信号进行逻辑处理,该信号作为进入正常传输的跳转条件。
7.3 data_in主机暂停协议。
用HDMARDY-信号控制触发信号发生电路,实现暂停,但是要实现电平保持功能。不需要在状态机中实现该状态。
7.4 data_in设备暂停协议。
用rfifo_al_empty和rfifo_empty信号实现暂 停,但是要保持暂停前的电平。不需要在状态机中实现该状态。
7.5 data_in主机中止协议。
由STOP信 号同步后的信号引发状态机跳转,设备需要拉低DMARQ信号。在中止状态,需要判断CRC结果,并根据结果决定跳转方向。如果正确,可以根据数据传输量进入相应的状态;如果错误,要返回错 误。
7.6 data_in设备中止协议。
正常情况下,不在数据传输结束前由设备发出中止协议。在后端超时和传输结束时由设备发出中止协议。此时DSTROBE信号已经由暂停协议确定电平,设备只需要拉低DMARQ信号即可。在非正常状态中止时,设备需要返回错误信息。riple
7.7 data_in主机中止、设备重新启动的实现。
在数据没有传输完毕时,主机启动了中止协议,设备进入中止协议处理状态后,需要等到DMACK-无效后,并进行CRC结 果判断。如果结果正确,才能进入下一次启动协议;如果结果错误,要返回错误信息(中断或主机查询方式)。
7.8 data_in主机奇数次传输中止,设备偶数次启动时,DSTROBE信号的有效、无效边沿区别问题。
在奇数次传输中止时,DSTROBE信号保持低电平;在偶数次启动时,DSTROBE是高电平。需要在中止协议里 实现对DSTROBE信号高电平复位的操作。
8. data_out协议相关问题:
8.1 data_out源同步传输方式,如何实现双边沿数据捕获,同步写入问题。
用每一个边沿采样数据。在每一个边沿产生同步脉冲,采用流水线方式同步写入FIFO。由于奇数次中止问题,不考虑加倍数据宽度方式。
8.2 data_out设备启动协议。
用DMACK-的下降沿采样STOP信号(采样后的信号在每次中止协议发生后复位),与STOP信号同步之后的信号进行逻辑处理,该信号作为进入正常传输的跳转条件。用DMACK-和STOP信号的组合逻辑(异步或同 步后)实现DDMARDY信号的高电平向低电平跳转。
8.3 data_out主机暂停协议。
设备端不需要考虑。
8.4 data_out设备暂停协议。
用wfifo_al_full控制DDMARDY信号的低电平向高电 平跳转。
8.5 data_out主机中止协议。
由STOP信 号同步后的信号引发状态机跳转,设备需要拉低DMARQ信号,DDMARDY信号由STOP信号的高电平跳转引发高电 平跳转。在中止状态,需要判断CRC结果,并根据结果决定跳转方向。如果正确,可以根据数据传输量进入相应的状态;如果错误,要返回错 误。
8.6 data_out设备中止协议。
用传输数据量控制DDMARDY信号向高电平跳转,延时后控制DMARDY信号向低电平跳转。状态机进入 中止协议处理状态。在中止状态,需要判断CRC结果,并根据结果决定跳转方向。如果 错误,要返回错误。
8.7 data_out主机中止、设备重新启动的实现。
在数据没有传输完毕时,主机启动了中止协议,设备进入中止协议处理状态后,需要等到DMACK-无效后,并进行CRC结 果判断。如果结果正确,才能进入下一次启动协议;如果结果错误,要返回错误信息(中断或主机查询方式)。
8.8 data_out主机奇数次传输中止,设备偶数次启动时,HSTROBE信号的有效、无效边沿区别问题。
在采用双倍数据宽度处理方式中,在中止后重新启动时需要根据上一次传输中止时记录的HSTROBE信号的高低电平(低电平为奇数次)决定数据写入的高低地址。在采用流水方式进行的数据采样过程中,只 需要根据STOP原始信号的低电平判断是否进行同步脉冲生成即可,不需要考虑奇数次中止问题。
9. mdma、pio信号与udma信号的切换逻辑。
由于实现udma的设备至少要支持pio模式,所以必须在udma方式和pio方式之间切换相关的电路。切换信号的选择和该信号的跳变时刻很重要。可以选 择nDMACK信号作为切换信号。
10.DMARQ上升沿到nDMACK下降沿之间,主机可能有查询寄存器的操作。
针对该问题,可以采用如上的方法,防止出现寄存器操作干扰udma操作的问题。
相关链接:ATA-100标准跟我看,内容老了些(01),但是反映了当初技术的前沿
在PatentStorm上搜索“ata + disk”的专利
SCSI vs. IDE Bus Mastering for DAWs