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