传输结束的标志延迟GPIFII转换开始Slave FIFO的写传Slave FIFO的读传设计器标标志配置的地址到输(从最后一个输(从最后一个志设定选标志延时SLWR#有效到满标志SLRD#有效到空标志择有效)有效)特定进程3周期+tCFLG(外部2周期+tCFLG(外部Thread_n“n”的设备在第四个时钟设备在第三个时钟_DMA_Rea0周期专用空/边缘采样有效标边缘采样有效标dy满标志志)志)当前寻址Current_2周期+进程的满thread_D3周期+tCFLG2周期+tCFLGtCFLG/空标志MA_Ready特定进程Thread_n取决于水取决于水“n”的_DMA_Wat0周期印水平印水平局部空ermark/满标志当前寻址Current_进程的局thread_D2周期+取决于水印水平取决于水印水平部满/空MA_WatertCFLG标志mark表4 不同标志配置的延迟相关
需要的应用APIn/an/aCyU3SocketConfigure() API.设置水印水平CyU3SocketConfigure() API.设置水印水平
这个部分描述了不同类型的可用且相关的延迟标志配置。下面的部分将描述如何使用GPIFII设计工具和EZ-USB FX3 SDK来配置标志位。
GPIFII设计器
应用同步Slave FIFO接口
GPIFII设计工具能够从赛普拉斯的网站上安装,一旦启动了GPIFII设计器,在开始页中你将发现赛普拉斯提供的接口。
图7 GPIFII设计器的Slave FIFO工程-赛普拉斯应用接口
Sync_slave_fifo_2bit工程是2位地址的同步从器件FIFO接口的GPIFII应用。下一个部分解释使用GPIFII设计器配置局部FLAG。 配置局部标志
局部标志的配置遵循下面两步:
1. 在GPIFII设计工具中选择局部FLAG设置。
2. 在固件中使用CyU3PGpifSocketConfigure()API设置局部FLAG的水印水平。
上述两步将在下面详细介绍。
在GPIFII设计工具中,一旦打开了来自塞朴拉斯应用接口的Sync_slave_fifo_2bit工程,在“标志A连接”或“标志B连接”情况下,对于当前进程,选择“Current_Thread_DMA_Watermark”来配置FLAG作为局部标志。或者选择“Thread_n_DMA_Watermark”来配置FLAG作为特定进程n的局部标志。 下面展示了该部分的截图。
图8 GPIFII设计器的标志设定-塞朴拉斯应用接口sync_slave_fifo_2bit
如果你打算添加更多的FLAG或作出在除了在sync_slave_fifo_2bit.cyfx工程中已经允许改变时,你可以单击文件->保存工程作为可编辑模式。这将允许你用一个不同的名字保存工程,保存完后,可以修改该工程。
在这种情况下配置一个FLAG作为局部FLAG,在I/O矩阵配置图中右击,然后在DMA标志设置上单击。下面的截图展示了这一过程。
图9“保存工程为可编辑”来创建新工程后
这将允许如像下图,选择FLAG配置:
图10. 选择特定的FLAG设置
第二步去配置一个局部FLAG是为局部标志指定一个水印值。这个水印值必
须在固件工程中被指定。在cyfxslfifo.c文件中添加一个称作CyU3PGpifSocketConfigure() 的API来设定水印值。这个调用可以在调用CyU3PGPIFLoad()API后添加。可以参考EZ-USB FX3 SDK API引导手册寻找CyU3PGpifSocketConfigure()API的完整描述。这个API的一个输入参数是水印值。
水印值决定了何时局部FLAG有效。下面的部分描述了再局部FLAG有效后可以读写的数据字数的公式。 使用局部标志的通用公式
前面部分描述了对FLAGs可能的配置以及配置一个局部FLAG的步奏。该部分解释了对于一个局部FLAG,水印值是如何决定的?
使用下面的公式来计算当局部FLAG有效后读写的数据量。
注:在CyU3PGpifSocketConfigure()设置的水印值是就 32位数据字而言的。 1. 当从外部主控向Sync Slave FIFO写数据时:
在局部FLAG被采样为低的时钟边缘,能够被写入的数据字量等于水印值*(32/总线宽度)-4
2. 当外部主控从Sync Slave FIFO读数据时:
a. 在局部FLAG被采样有效时的时钟边缘,能够读取的数据字量是水印值*(32/总线宽度)-1
b. 注意,从SLRD#到数据有两个周期延时。因此,在局部FLAG被采样有效时的时钟边缘后,SLRD#保持有效,循环的数据量是水印值*(32/总线宽度)-3
下面部分描述怎样设置水印值的一些例子与相应的对标志位的影响。截图清晰的展示了对于不同的水印值,局部标志的不同行为。注意,这些例子的FLAG极性设置为低,因此,FLAGs变低表明空/满或局部空/满。
CyU3PGpifSocketConfigure()API使用实例
前面的部分规定局部FLAGs的行为依赖于水印值和水印值的精确计算公式。 在该部分提供一些通过使用CyU3PGpifSocketConfigure()API来影响水印值设定的例子。截图也显示了对于不同的水印值,局部模式的行为。
注意,在这些例子中,FLAG极性设置为低。因此FLAG变低表明满/空或局部满/空。
例1:
32位数据总线同步从器件FIFO:
在GPIFII Designer中,FLAGA被配置成Current_thread_DMA_RDY,FLAGB被配置成Current_thread_DMA_watermark.
CyU3PGpifSocketConfigure(0,PIB_SOCKET_0,4,CyFalse,1)
在同步从器件FIFO中,从FPGA向EZ-USB FX3突发写(最后一个数据被写为0x00800080)。
下面是一个在转换结束时,FLAGs变成0的逻辑分析截图。在同一次循环中,最后一个字被写入,能够看到,FLAGB变低。
图11 32位数据总线宽度下的突发写转换
例2:
32位数据总线的同步从器件FIFO:
在GPIFII Designer中,FLAGA被配置成Current_thread_DMA_RDY,FLAGB被配置成Current_thread_DMA_watermark。
CyU3PGpifSocketConfigure(0,PIB_SOCKET_0,4,CyFalse,1) 同步从器件中,外部FPGA读取来自EZ-USB FX3的数据。
下面的截图展示了在转换结束时FLAGs变为0的逻辑图。从图中可以看到,在最后的数据被读取的前4个周期,FLAGB变低,在FLAGB变低后3个字的数据能够被读取出来。
来自局部FLAGs模式下的通用公式2(a)能被用于该实例: 水印值 = 4,宽度 = 32
因此,在局部FLAG被采样为3之后的时钟边缘,可以读取32位的数据。
布