读操作和写操作之间间隔应该是多少?

公告

大中华汽车电子生态圈社区并入开发者社区- 更多资讯点击此

Tip / 登入 to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
yxx0803
Level 3
Level 3
50 sign-ins 25 replies posted 25 sign-ins

你好,

          GPIF II接口是一个半双工接口,因此同一个时刻只能进行读操作或者写操作。在我的项目设计中,上位机发送一个命令帧,下位机在收到之后立马回复一个响应帧。即,下位机进行完读操作,立即进行写操作。这时会出现错误,错误现象如下:命令帧和响应帧都是32B长度,可以通过抓取信号确定下位机已经正确接收命令帧数据,并且已按照短包时序正确发送32B响应帧,此时用上位机接收数据,前4B数据丢失,最后4B数据并不期望的数据,而是0x00000000。这和读写操作之间的间隔有关系吗?当我设置不同间隔的时候,有时正确,有时出错。我该怎么排查这个问题,谢谢,请您尽快回复。

Best Regards,
Jack chen
0 点赞
1 解答
YiZ_31
Moderator
Moderator
Moderator
1000 replies posted 750 replies posted 500 replies posted

在slavefifo的设计中,读写之间的转换只要满足相应的时序要求。通常数据丢失或者数据包不完整都是时序有问题。您可能需要再确认下写操作的时序,尤其是地址位和Flag,等待FX3给出正确的信号再进行写操作。

在原帖中查看解决方案

0 点赞
5 回复数
YiZ_31
Moderator
Moderator
Moderator
1000 replies posted 750 replies posted 500 replies posted

在slavefifo的设计中,读写之间的转换只要满足相应的时序要求。通常数据丢失或者数据包不完整都是时序有问题。您可能需要再确认下写操作的时序,尤其是地址位和Flag,等待FX3给出正确的信号再进行写操作。

0 点赞
yxx0803
Level 3
Level 3
50 sign-ins 25 replies posted 25 sign-ins

谢谢您的回复。

在我的程序里,flaga、flagc分别是写、读的专用线程标志;flagb、flagd分别是写、读的水印值标志。上下行通道水印值均为6。写操作写的是短包数据,而且每写一次短包,都是上位机读完之后才去写下一个短包。这种情况下写操作时还需要检测flaga、b的值吗?我试过等flaga==1,flagb==1之后再去进行写操作,发现bug依然存在。代码中,关于地址位的赋值,是:

assign fx3_a= (fx3_slwr_n) ? 2'b11 : 2'b00;
并且fx3_a和fx3_slwr_n两个信号都是直接连在管脚上的,没有延迟。
您提到应该等待FX3给出正确的信号进行写操作,正确的信号具体是指?
进行写操作时和读的标志flagc、d没有关系把?
Best Regards,
Jack chen
0 点赞
YiZ_31
Moderator
Moderator
Moderator
1000 replies posted 750 replies posted 500 replies posted

您可以测试下单独作写操作会有错误吗?如果不会出错,那么单独写入与先读后写之间是否有信号差异?

0 点赞
yxx0803
Level 3
Level 3
50 sign-ins 25 replies posted 25 sign-ins

程序模块之间耦合关系复杂,我想请您帮我明确一下读写时序,帮我判断正确与否。

读时序:

配置,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信号。

下面是片选信号和数据总线以及地址线的赋值

assign fx3_slcs_n=1'b0;
assign fx3_db=(fx3_slwr_n) ? 32'dz : data_ack;
assign fx3_a= (fx3_slwr_n) ? 2'b11 : 2'b00;
Best Regards,
Jack chen
0 点赞
YiZ_31
Moderator
Moderator
Moderator
1000 replies posted 750 replies posted 500 replies posted

YiZ_31_0-1629250599915.png

总体而言你的设计没有问题,可以检查下图中这些时间参数是否有满足。

 

0 点赞