【68013】slave-fifo模式下读出时的数据扰动和丢失

少女dtysky

世界Skill

时刻2014.05.09

扰动

传输过程中遇到的一个问题。
68013的输出数据位数设置为16,从上位机发送数据后,68013的FLAG有效,FPGA取数据,当测试数据变化比较大的时候(比如0x00到0xFF)会发生比较严重的疑似扰动现象,于是博主进行了以下测试:

是否和变化位数有关

从8位开始,不断增加位数,在FPGA端用八倍于数据传输频率的示波器查看采样结果。
测试表明当变动位数大于约12的时候会出现扰动问题,初步认为是串扰的影响,但查询了许多资料之后,发现35M的传输频率在这样的环境之下是不应当有这样的问题的,最后选择了请教老师,老师表明可能是数据建立的问题。

是否是数据建立时间的问题

将工作频率降到一半,重复以上操作查看采样结果。
测试表明的确是这个问题,上一个测试中每一个数据的八次采样结果都不同,而这次数据则是在八次采样后保持了稳定,证明数据的建立的确是需要一定的时间的。
但问题的根本还没有解决——为什么变化位数少的时候不会发生这个问题?苦思之后,猜测是供电的问题。

是否是供电的问题

由于USB板子是独立的,使用PC外接的的USBUHB供电,所以可能导致供电不足而影响数据变化速度。
尝试给此板子外接并上一个3.3v的电源,提高其功率。
测试结果发现变化所需建立时间缩短,但仍然无法达到要求,可能是板子自身的供电用三极管有问题。
最后的解决方案是将输出改为8位,解决了问题。
此外,当外接电源之后,数据传输的成功率提升约3倍,更加证明了这个问题的存在性。


丢数

另一个问题,在FPGA读出一个包时有一定概率会丢失一两个数据,具体表现是:

某一两个字节直接消失,同时68013内部数据指针随着消失的数据多移了一位,导致空标志拉高时应有512bytes传输成功,但最后却只传输了511bytes的数据。

这个问题也困扰了蛮久,在论坛上多次询问无果,最后调试发现问题出现在以下的状况:

传输时有连续三个以上的0x00时,会丢掉一两个0x00。

具体原因直到现在也没有查明,暂定解决方案是给每一个包位加个校验字节,一个包传完后将校验字节ACK给PC,PC判断传输是否成功。
此方法不太科学,建议使用CRC等方式提高可靠性(虽然68013文档中说自身已经有三次CRC。。。)

如果不是自己的创作,少女是会标识出来的,所以要告诉别人是少女写的哦。