你好,
GPIF II接口是一个半双工接口,因此同一个时刻只能进行读操作或者写操作。在我的项目设计中,上位机发送一个命令帧,下位机在收到之后立马回复一个响应帧。即,下位机进行完读操作,立即进行写操作。这时会出现错误,错误现象如下:命令帧和响应帧都是32B长度,可以通过抓取信号确定下位机已经正确接收命令帧数据,并且已按照短包时序正确发送32B响应帧,此时用上位机接收数据,前4B数据丢失,最后4B数据并不期望的数据,而是0x00000000。这和读写操作之间的间隔有关系吗?当我设置不同间隔的时候,有时正确,有时出错。我该怎么排查这个问题,谢谢,请您尽快回复。
Jack chen
已解决! 转到解答。
在slavefifo的设计中,读写之间的转换只要满足相应的时序要求。通常数据丢失或者数据包不完整都是时序有问题。您可能需要再确认下写操作的时序,尤其是地址位和Flag,等待FX3给出正确的信号再进行写操作。
谢谢您的回复。
在我的程序里,flaga、flagc分别是写、读的专用线程标志;flagb、flagd分别是写、读的水印值标志。上下行通道水印值均为6。写操作写的是短包数据,而且每写一次短包,都是上位机读完之后才去写下一个短包。这种情况下写操作时还需要检测flaga、b的值吗?我试过等flaga==1,flagb==1之后再去进行写操作,发现bug依然存在。代码中,关于地址位的赋值,是:
Jack chen
您可以测试下单独作写操作会有错误吗?如果不会出错,那么单独写入与先读后写之间是否有信号差异?
程序模块之间耦合关系复杂,我想请您帮我明确一下读写时序,帮我判断正确与否。
读时序:
配置,flaga--读操作专用标志;flagb--读水印值标志;下行读通道水印值:6;时钟:100MHz
flagc--写操作专用标志;flagd--写水印值标志;下行写通道水印值:6;总线位宽32
flaga==1的时候,等flagb==1,此时拉低sloe和slrd读取数据。将flag信号全部打一拍(采样),采样后的ffflagb==0时,拉低sloe5个clk表示当前缓冲区还有5个可读数据;拉低slrd3个clk,这是因为slrd有2个周期延迟,因此刚好读完缓冲区数据。
短包写操作:我的应用中是写32B短包数据。因此先判断flaga==1,然后flagb==1时,拉低slwr8个时钟周期,在slwr的第8个周期,拉低pktend信号。
下面是片选信号和数据总线以及地址线的赋值
Jack chen
总体而言你的设计没有问题,可以检查下图中这些时间参数是否有满足。