一年前费了好大的力气才用FPGA实现了PATA硬盘接口UDMA协议的设备端功能,现在需要把这一接口电路移植到新的项目中。借此机会把以前混乱的思路整理一下。 riple
整理了当初设计时考虑到和后期调试中发现的几个设计难点,罗列如下。随着我对这些难点的逐一分析和解决,还会不断地充实。 riple
1. PATA接口的MDMA和UDMA传输协议复用信号。 riple
同一组握手和触发信号,在MDMA和PIO方式下是一套信号名称,在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。另外,16位CRC校验电路的运行频率也影响支持模式的确定。 riple
5.主从设备共用总线的问题。 riple
设备端驱动的信号需要在有效状态和高阻状态之间适时地切换。 riple
6. CRC相关问题: riple
6.1. 双边沿触发数据CRC实现和时序问题。 riple
可以与FIFO处理相同。采用加倍数据宽度方式可以提高性能,但是会带来资源的增加(其实没有提高性能);采用连续流水方式可以节省资源,但是会有性能下降问题。 riple
6.2. data_in和data_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_empty和rfifo_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的老文档 riple
SCSI vs. IDE Bus Mastering for DAWs riple
[精华] 【知识】Windows系统会自行关闭硬盘DMA模式(附设置DMA工作模式的方法) riple
用户345776 2011-4-19 22:53
用户210588 2009-6-6 11:32
ash_riple_768180695 2009-5-21 21:15
用户1611579 2009-5-18 22:22
ash_riple_768180695 2008-10-20 22:49
用户168557 2008-10-20 14:54
用户565744 2008-9-11 11:34
ash_riple_768180695 2008-7-5 20:17
用户1171506 2008-7-4 18:52
ash_riple_768180695 2008-4-8 17:04