b.对于流模式,需要创建两个DMA通道:一个P2U通道,其中PIB_SOCKET_0作为生产者,UIB_SOCKET_1作为消费者。DMA缓冲区大小是16*1024(对USB3.0设备)或者16*512(对于USB2.0设备)取决于连接的是2.0还是3.0设备。DMA缓存数为8.选择这样的缓存大小和数量提供了高生产量性能。一个U2P通道,其中PIB_SOCKET_3作为生产者,UIB_SOCKET_1作为消费者。DMA缓冲区大小是16*1024(对USB3.0设备)或者16*512(对于USB2.0设备)取决于连接的是2.0还是3.0设备。DMA缓存数为4.注意,缓存数量能被进一步提高以强化性能,但P2U的缓存数量应该减少。这是因为FX3不能提供足够的缓存,以至于能用8个缓存,每个缓存大小为16*1024.
图17 流IN传输设置——缓存数量和大小优化性能
图18 流OUT传输设置——缓存数量和大小优化性能
如果下面的定义在该应用比较通过的FX3固件工程的cyfxslfifosync.h文件中使能,则上面描述的DMA通道被设置。 #define STREAM_IN_OUT
分配给P2U和U2PDMA通道的缓存数量可以由下面的宏定义来控制。该宏定义也在cyfxslfifosync.h文件中。
#define CY_FX_SLFIFO_DMA_BUF_COUNT_P_2_U (4) #define CY_FX_SLFIFO_DMA_BUF_COUNT_U_2_P (8) FPGA实现细节
图19 使用SP601 Evaluation Kit实现赛灵思 Spartan6 FPGA
为了演示FX3的GPIF接口运行在100MHz时的最大性能。SP601的板子上有一个27MHz的晶振。FPGA使用锁相环从27MHz中产生100MHz的时钟。
下面是使用不同传输类型的使用状态。 流IN实例:
对于流IN模式,实现Verilog RTL级的状态机在下面展示。
图20 流IN模式下的状态机
状态A:
初始化状态机中的所有寄存器和信号。从器件FIFO控制线的状态如下: PKTEND#=1;SLOE#=1;SLRD#=1;SLCS#=0;SLWR#=1;A[1:0]=0 状态E:
只要FLAGA=1,状态机就进入该状态。状态机将宣布写控制信号状态: PKTEND#=1;SLOE#=1;SLRD#=1;SLCS#=0;SLWR#=0;A[1:0]=0 状态F:
在FLAGB有效后的一个周期进入该状态。这个状态取消所有的写控制信号。对于“使用局部标志的通用公式”部分的每一个公式,在局部FLAG变为0的2个周期后,FX3应该采样SLWR#有效。考虑到通过FPGA到接口有一个时钟周期的传播延时,在采样到FLAGB为0后,FPGA使能SLWR#信号一个周期。在FLAGB有效后的6个周期,水印值是6,我们期待FLAGA回到0.这个状态保持4个周期的执行来确保FLAGA上有效状态的有效性。 短包实例:
这个实例利用PKTEND#证明了短包提交程序。
下面的状态机实现了在verilog RTL级模式下的短包实例。
图21 短包传输的状态机
状态A:
该状态初始化状态机中的寄存器和信号。从器件FIFO的控制状态如下: PKTEND#=1;SLOE#=1;SLRD#=1;SLCS#=0;SLWR#=1;A[1:0]=0
状态E:
FLAGA=1时,状态机将进入该状态。如果strob==1.则提交一个16字的短包,否则提交全包。 状态F:
在FLAGB有效后的一个周期进入该状态。该状态取消了所以写控制信号,正如前面公式中提到的,对于每个公式,在局部FLAG变为0后,FX3应该采样SLWR#信号2个周期。考虑到从FPGA到接口有一个周期的延时,FPGA在采样到局部FLAG为0后的一个周期宣布SLWR#信号有效。水印值为6,我们期待FLAGA变为0,在局部标志后的6个之中周期。.这个状态保持4个周期的执行来确保FLAGA上有效状态的有效性。 ZLP例子:
这个实例利用PKTEND#证明了ZLP提交程序。
下面的状态机实现了在verilog RTL级模式下的ZLP实例。
图22 ZLP传输状态机
状态A:
该状态初始化状态机中的寄存器和信号。从器件FIFO的控制状态如下: PKTEND#=1;SLOE#=1;SLRD#=1;SLCS#=0;SLWR#=1;A[1:0]=0 状态E:
FLAGA=1时,状态机将进入该状态。如果strob==1.则提交一个ZLP,否则提交全包。
状态F:
在FLAGB有效后的一个周期进入该状态。该状态取消了所以写控制信号,正如前面公式中提到的,对于每个公式,在局部FLAG变为0后,FX3应该采样SLWR#信号2个周期。考虑到从FPGA到接口有一个周期的延时,FPGA在采样到局部FLAG为0后的一个周期宣布SLWR#信号有效。水印值为6,我们期待FLAGA变为0,在局部标志后的6个之中周期。.这个状态保持4个周期的执行来确保FLAGA上有效状态的有效性。 流OUT例子:
下面的状态机实现了在verilog RTL级模式下的流OUT实例。
图23 流OUT装换状态机
状态G:
状态机初始化所有的寄存器和信号,从器件FIFO的控制状态如下: PKTEND#=1;SLOE#=1;SLRD#=1;SLCS#=0;SLWR#=1;A[1:0]=3 状态A:
不论何时FLAGC=1,状态机将进入该状态 状态B:
状态机将宣布读控制有效:
PKTEND#=1;SLOE#=0;SLRD#=0;SLCS#=0;SLWR#=1;A[1:0]=3 状态F: