关于FPGA向FX3写数据的一些问题

公告

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

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

cross mob
Lee_sin
Level 1
Level 1
5 sign-ins First reply posted First question asked

你好我在做FPGA向FX3写数据的过程中遇到了一些问题想要明确一下:

(缓冲区的大小设置为16kB,数据总线位宽为32位,水印值为6)

1、如果以16kB为单位写,这时候pktend_n信号是否可以一直处于高电平状态,并且我在control center中看到正确的数据。

2、以1024B为单位写,按照已解决:FX3 标记极性和使用部分标记 - 英飞凌开发人员社区 (infineon.com)

所述1024B应该需要再发一个零数据包(ZLP)来包装缓冲区,为此我做了以下几种测试

  1. 第一种是在slwr_n拉高前的最后一个周期,将pktend_n信号拉低一个周期,按照对如果理解没错的话这是以 短数据包 的形式写入数据,并且观察到在pktend_n信号置位三个周期后flaga信号会拉低一段时间,按照我的理解flaga指示的是缓冲区的状态,我可以肯定这里缓冲区并没有满,想请问flaga是否还具有其他的作用?1024B是否也可以按照短数据包的形式发送?
  2. 第二种是在slwr_n拉高以后,再将pktend_n信号拉低一个周期,按照对AN65974的理解,这里应该为发送1024B之后再发送一个零数据包(ZLP)来包装缓冲区,这里如果我没有延迟紧跟着将pktend_n信号拉低一个周期,则在control center中就会出现Error Code:997,但是我将pktend_n信号延迟一个周期再拉低,则可以看到正确数据,请问这是为什么?

几种情况,如图所示

短数据包短数据包零长度数据包零长度数据包

error:997error:997

 

0 点赞
1 解答
YiZ_31
Moderator
Moderator
Moderator
1000 replies posted 750 replies posted 500 replies posted
  1. 第一种是在slwr_n拉高前的最后一个周期,将pktend_n信号拉低一个周期,按照对如果理解没错的话这是以 短数据包 的形式写入数据,并且观察到在pktend_n信号置位三个周期后flaga信号会拉低一段时间,按照我的理解flaga指示的是缓冲区的状态,我可以肯定这里缓冲区并没有满,想请问flaga是否还具有其他的作用?1024B是否也可以按照短数据包的形式发送?

=>Flaga的功能在GPIF designer中是可配的,可以配置成相应的第1234个thread的DMA_Ready或者DMA_WaterMark, 或者当前thread的DMA_Ready DMA_WaterMark,要看你配的是哪种。

  1. 第二种是在slwr_n拉高以后,再将pktend_n信号拉低一个周期,按照对AN65974的理解,这里应该为发送1024B之后再发送一个零数据包(ZLP)来包装缓冲区,这里如果我没有延迟紧跟着将pktend_n信号拉低一个周期,则在control center中就会出现Error Code:997,但是我将pktend_n信号延迟一个周期再拉低,则可以看到正确数据,请问这是为什么?

=>你可以打开我们的GPIF designer, 假设你用的是sync slave fifo这个状态机:

YiZ_31_0-1638855890438.png

从图中可以看出,write状态是无法直接转到ZLP状态进行commit的,必须要先通过(PKEND&SLWR)|SLCS的状态转回到idle状态,才可以通过SLWR&!SLCS&!PKEND&SLRD的状态转到ZLP状态进行commit。

在原帖中查看解决方案

0 点赞
3 回复数
YiZ_31
Moderator
Moderator
Moderator
1000 replies posted 750 replies posted 500 replies posted
  1. 第一种是在slwr_n拉高前的最后一个周期,将pktend_n信号拉低一个周期,按照对如果理解没错的话这是以 短数据包 的形式写入数据,并且观察到在pktend_n信号置位三个周期后flaga信号会拉低一段时间,按照我的理解flaga指示的是缓冲区的状态,我可以肯定这里缓冲区并没有满,想请问flaga是否还具有其他的作用?1024B是否也可以按照短数据包的形式发送?

=>Flaga的功能在GPIF designer中是可配的,可以配置成相应的第1234个thread的DMA_Ready或者DMA_WaterMark, 或者当前thread的DMA_Ready DMA_WaterMark,要看你配的是哪种。

  1. 第二种是在slwr_n拉高以后,再将pktend_n信号拉低一个周期,按照对AN65974的理解,这里应该为发送1024B之后再发送一个零数据包(ZLP)来包装缓冲区,这里如果我没有延迟紧跟着将pktend_n信号拉低一个周期,则在control center中就会出现Error Code:997,但是我将pktend_n信号延迟一个周期再拉低,则可以看到正确数据,请问这是为什么?

=>你可以打开我们的GPIF designer, 假设你用的是sync slave fifo这个状态机:

YiZ_31_0-1638855890438.png

从图中可以看出,write状态是无法直接转到ZLP状态进行commit的,必须要先通过(PKEND&SLWR)|SLCS的状态转回到idle状态,才可以通过SLWR&!SLCS&!PKEND&SLRD的状态转到ZLP状态进行commit。

0 点赞
Lee_sin
Level 1
Level 1
5 sign-ins First reply posted First question asked

十分感谢您的解答

1、关于FLAGA,我设置为Thread_0_DMA_Ready,为上行指示线程的专用标志,按照理解它表示缓冲区的状态,若FLAGA为1则表明缓冲区未满,为0则表示缓冲区已满。想请问一下为什么我们在通过短数据包或者零长度数据包发送数据的时候FLAGA会拉低一段时间,可以肯定这时候缓冲区并没有满,这是否是正常的现象?

2、同样的,当数据的大小为1024B时,通过我观察到的现象,同样可以通过短数据包的形式发送。请问这是正常现象吗?

0 点赞
YiZ_31
Moderator
Moderator
Moderator
1000 replies posted 750 replies posted 500 replies posted

那你这个DMA都去commit当然不会出于Ready的状态,thread是需要时间切换DMA buffer的。

只要满足状态机的条件跳转到ZLP状态,都会commit

 

0 点赞