图12 32位数据总线宽度下的突发读
例3:
16位数据总线下的同步从器件FIFO:
在GPIFII Designer中,FLAGA被配置成Current_thread_DMA_RDY,FLAGB被配置成Current_thread_DMA_watermark。
CyU3PGpifSocketConfigure (0, PIB_SOCKET_3, 3, CyFalse, 1) 同步从器件FIFO模式下,执行外部FPGA到EZ-USB FX3的突发写。
图13是一个逻辑分析截图,展示了在转换结束时,FLAGs变成0.可以看出,在最后一个字前的3个周期FLAGB变低。在FLAGB变低前2个字可以被写进。
对于该例子,使用前面的公式可得: 水印值为3,总线宽度为16
因此,在局部FLAG被采样为2之后,写入16位的数据。
图13 16位数据总线宽度下的突发写转换
例4:
16位数据总线下的同步从器件FIFO:
在GPIFII Designer中,FLAGA被配置成Current_thread_DMA_RDY,FLAGB被配置
成Current_thread_DMA_watermark。
CyU3PGpifSocketConfigure (3, PIB_SOCKET_3,2, CyFalse, 1) 同步从器件FIFO模式下,执行外部FPGA到EZ-USB FX3的突发读。 从器件FIFO模式下,执行外部FPGA到EZ-USB FX3的突发写。
图13是一个逻辑分析截图,展示了在转换结束时,FLAGs变成0.可以看出,在最后一个字前的4个周期FLAGB变低。在FLAGB变低前3个字可以被读出。
图14 16位数据总线宽度的突发读转换
使用局部FLAG时,其他的重要注意事项:
① 局部标志只能被用来决定何时结束转换。空/满标志必须在转换的开始被监控以确保套接字的有效性。这意味着局部FLAG不能独自使用,必须和空/满标志连接使用。
② 如果外部主机能够实现计数原理,可以不使用局部标志,可以写进等于EZ-USB FX3 DMA缓冲区大小的数据。在创建DMA通道时,外部主机应该计算写进或读出的数据量,以确保数量不能超过缓冲区的大小。在这种情况,监控一个满或空的标志决定何时开始转换。 ③ 如果一个计数模式不能像上面那样实现,使用下面之一的局部标志需要被完成:
a. 如果外部主机总是爆发固定数量的数据,当选择一个水印值时,这种突发大小必须被考虑。例如,如果外部主机突发写8个字,然后,设置水印值,以至于局部标志变低,当有EZ-USB FX3的DMA缓存区空间时。然后,当看到局部标志为低时,外部主机能写一个完整的8位突发数据。为了实现这种对于16位的写方
向,水印值应该被设置为6.
b. 一个可选择方法是一旦局部标志变成0时,不是执行突发访问,外部处理器转换成单一循环访问模式。接着,在每一次循环时,在写之前,外部主机能检测空满标志以确定缓存仍然有空间。
在软件开发套件中的从器件FIFO固件例子
到目前为止,该应用笔记详细描述了同步从器件FIFO接口和能够被配置的标志。GPIFII Designer工具中已经完成了必要的配置,更新配置需要与固件相结合。在建立GPIFII Designer工程时,产生头文件cyfxgpifconfig.h。该头文件需要被包含到固件工程中。集成在从器件FIFO接口中的EZ-USB FX3 SDK包括一个固件例子。
在安装了EZ-USB FX3软件开发包后,在下面的目录([FX3 SDK Install Path] \\EZ-USB FX3 SDK\\1.2\\firmware\\slavefifo_examples\\slfifosync)中能够找到集成同步从器件FIFO接口的固件例子。这个固件例子支持16和32位的数据总线宽度。在头文件
cyfxslfifosync.h
中定义了常量
CY_FX_SLFIFO_GPIF_16_32BIT_CONF_SELECT。选择32位数据总线时,设置常量为1;选择16位总线宽度时,设置常量为0。请注意,对100MHz的32位数据时,为了器件FIFO的功能,必须要配置锁相环频率为400MHz。这个步骤通过该设置setSysClk400参数,作为输入到CyU3PDeviceInit()的函数。详情,请参考API引导手册。
设计实例:连接FPGA到FX3同步从器件FIFO接口
截止目前,该应用比较详细描述了同步从器件FIFO接口,包括配置和使用不同的FLAGs。该部分提供了一个完整的设计实例,在该实例中赛灵思Spartan6系列的FPGA被连接到FX3通过同步从器件FIFO接口。
下面是该应用设计中使用的硬件、固件和软件部分。 ① 拥有FMC接口的FX3 DVK 板。 ② 赛灵思Spartan 6 SP601评估套件 ③ FX3同步从器件FIFO工程 ④ 控制中心和流实例 下面是该例子的组成部分:
1. 回送转移:在这个设计部分,FPGA首先从FX3中读取一个完整的缓存,然后
写回FX3中。USB主机应该发出OUT/IN令牌包去传送,然后接受这个数据。为了该目的,利用控制中心提供EZ-USB FX3 SDK。
2. 短包:在这个设计组件中,FPGA传送一个被短包跟随着的全包到FX3。USB主机发出IN令牌包来接受这个数据。
3. 零长度包传送:在该部分设计中,FPGA穿上一个被零长度包跟随的全包到FPGA中。USB主机应该发出IN令牌来接受这个数据。
4. 流(IN)数据传递:在这种设计模式下,FPGA完成一个方向的转换,也就是说,通过同步从器件FIFO接口连续向FX3写数据。USB主机应该发出IN令牌来接受这个数据。为了这个目的,能够利用EZ-USB FX3 SDK提供的控制中心实例来实现。
5. 流(OUT)数据传递:在这种设计模式下,FPGA完成一个方向的转换,也就是说,通过同步从器件FIFO接口连续从FX3读数据。USB主机应该发出OUT令牌来接受这个数据。为了这个目的,能够利用EZ-USB FX3 SDK提供的控制中心实例来实现。 FX3固件细节
FX3的固件是基于FX3 SDK工程中的事例来的。 下面是该固件的主要特征: ① 使能USB3.0和USB2.0.
② 利用赛普拉斯的VID/PID=0x04B4/0x00F1来枚举设备。这需要使能赛普
拉斯设备控制中心软件来初始化USB传输。 ③ 集成的同步从器件FIFO描述符:
a.支持4个套接字访问。 b.数据总线宽度为32位 c.输入时钟为100MHz d.按照下面来配置4个标志:
i. ii.
FLAGA:进程0的满标志
FLAGB:水印值为6的局部标志,表示进程0.
iii. FLAGC:进程3的空标志 iv.
FLAGD:水印值为6的局部标志,表示进程3.
请注意,GPIFII Designer工程提供该应用笔记展示了上面的设置如何完成。固件工程也展示了如何使用CyU3PGpifSocketConfigure()API来配置水印值。
④ 配置锁相环频率为400MHz,这一步通过设置setSysClk400参数来完成,
输入到CyU3PDeviceInit()函数中。请注意,对于100MHz,32位数据的从器件FIFO,不可缺少该函数。 ⑤ 按照下面步骤设置DMA通道:
a.对于回写,短包,ZLP传输,需要创建2个DMA通道。一个P2U通道,其中PIB_SOCKET_0作为生产者,UIB_SOCKET_1作为消费者。DMA缓冲区大小是512或者1024字节取决于连接的是2.0还是3.0设备。DMA缓存数为2. 一个U2P通道,其中PIB_SOCKET_3作为生产者,UIB_SOCKET_1作为消费者。DMA缓冲区大小是512或者1024字节取决于连接的是2.0还是3.0设备。DMA缓存数为2.(注:只有P2U通道时为短包和ZLP使用的)
图15 回写传输设置
图16 短包和ZLP传输设置
如果下面的定义在该应用比较通过的FX3固件工程的cyfxslfifosync.h文件中使能,则上面描述的DMA通道被设置。 #define LOOPBACK_SHRT_ZLP
百度搜索“70edu”或“70教育网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,70教育网,提供经典综合文库利用EZ-USB FX3 从器件FIFO接口进行设计(4)在线全文阅读。
相关推荐: