FIFO Generate IP核使用——Native接口时读写宽度不一致详解

server/2024/9/24 11:56:12/

表3-4显示了在选择了Native接口时哪些时钟类型支持非对称的宽高比,即读写宽度不一致。

非对称的宽高比允许FIFO的输入和输出度不同。FIFO支持以下写-读宽高比(Write-to-Read Aspect Ratios):1:8, 1:4, 1:2, 1:1, 2:1, 4:1, 8:1。

这个功能是通过在Vivado IP Catalog中自定义FIFO时选择独特的写和读宽度来实现的如上图所示。默认情况下,写和读宽度被设置为相同的值(提供1:1的宽高比),但支持1:8到8:1之间的任何比例,并且FIFO的输出深度会根据输入深度以及写和读宽度自动计算。

对于非对称宽高比,满(full)和空(empty)标志仅在能够写入或读取一个完整的字时才被激活。FIFO不允许访问部分字。例如,假设一个FIFO已满,如果写宽度是8位而读宽度是2位,你需要完成四个有效的读操作之后,满标志才会取消断言,并且才会接受一个写操作。写数据计数器会显示根据写端口比例计算的FIFO字数,而读数据计数器会显示根据读端口比例计算的FIFO字数。

注意:对于写宽度小于读宽度的非对称宽高比(1:8, 1:4, 1:2),最高有效位(MSB)将首先被读取。这意味着,在读取时,数据会按照最高有效位到最低有效位的顺序逐个读取,直到达到读宽度所指定的位数。这种设计使得FIFO能够在宽度不匹配的情况下仍然有效地传输数据。

图3-13展示了一个具有1:4宽高比(写宽度=2,读宽度=8)的FIFO的示例,在可以执行读操作之前,需要连续执行四个写操作。第一个写操作是01,接着是00,然后是11,最后是10。内存是从左到右(从最高有效位MSB到最低有效位LSB)填充的。当执行读操作时,接收到的数据是01_00_11_10。

图3-14展示了一个具有1:4宽高比的FIFO的din(数据输入)、dout(数据输出)以及握手信号。当四个字被写入FIFO后,空信号被取消断言(即变为无效状态,表示FIFO不再为空)。然后,在执行一个单独的读操作后,空信号再次被断言(即变为有效状态,表示FIFO再次为空)。

这是因为在这个例子中,FIFO的写宽度是数据宽度(或字宽度)的四分之一。因此,需要连续写入四个2位宽的“字”(在这里每个“字”实际上是两个位)来填充一个完整的8位宽的数据字,然后才能从FIFO中读取这个8位宽的数据字。当这四个2位宽的“字”被写入后,FIFO就包含了足够的数据来执行一个8位宽的读操作,因此空信号会被取消断言。一旦这个8位数据字被读取,FIFO再次变空,因此空信号会再次被断言。

图3-15展示了一个宽高比为4:1的FIFO(写宽度为8,读宽度为2)。在这个例子中,执行了一个写操作,之后跟随四个读操作。写操作的数据是11_00_01_11。当执行读操作时,数据是从左到右(从最高有效位MSB到最低有效位LSB)接收的。如上图所示,第一次读操作得到的数据是11,接着是00,然后是01,最后是11。

在这个例子中,FIFO的写宽度是读宽度的四倍。因此,一个完整的写操作会写入一个8位宽的数据字。然后,由于读宽度只有2位,所以需要连续进行四次读操作才能读取整个8位宽的数据字。每次读操作都会从FIFO中读取2位的数据,并按照它们被写入的顺序(从左到右,即从MSB到LSB)来接收这些位。

图3-16展示了一个宽高比为4:1的FIFO的din、dout以及握手信号。在执行一个写操作后,FIFO的空信号被取消断言(即变为无效状态,表示FIFO不再为空)。由于没有其他写操作发生,所以FIFO在连续进行四次读操作后再次断言空信号。

在这个例子中,写操作向FIFO中写入了一个8位宽的数据字。由于FIFO的宽高比为4:1,即写宽度为8位而读宽度为2位,因此一个完整的写操作对应四个读操作。在四次读操作之后,FIFO中的所有数据都被读取出来,因此空信号被再次断言(即变为有效状态),表示FIFO现在为空,可以再次进行写操作来填充数据。这个过程中,满信号可能从未被断言,除非有连续多个写操作尝试在FIFO满时继续写入数据。

First-Word Fall-Through(FWFT)FIFO

FWFT FIFO与标准FIFO相比,在读取端口上提供了两个额外的可读字。对于写/读宽高比大于或等于1(如1:1、2:1、4:1和8:1)的情况,FWFT实现还通过depth_ratio*2(其中depth_ratio = 写深度 / 读深度)增加了可以写入FIFO的字数。然而,对于写/读宽高比小于1(如1:2、1:4和1:8)的情况,增加的两个额外可读字只相当于不到一个完整的写字。这些部分字的创建导致FIFO的prog_empty(程序化空)和wr_data_count(写入数据计数)信号的行为与之前的描述有所不同。

具体来说,FWFT特性允许在不发出读操作的情况下从FIFO中查看下一个可用字。当FIFO中有数据时,第一个字会直接从FIFO中掉落并自动出现在输出总线(dout)上。一旦第一个字出现在dout上,empty信号会变为无效,表示FIFO中有一个或多个可读字,并且VALID信号变为有效,表示dout上存在有效字。

与标准读模式不同,在FWFT模式下,当从FIFO中读取最后一个数据时,空标志位被置位,而在标准读取模式下,当empty变为有效时,VALID会在1个时钟周期中持续有效。此外,FWFT特性还将FIFO的有效读取深度增加两个读取字,这意味着在FWFT模式下,FIFO可以连续读取更多的数据,直到达到其物理存储限制。

对于非对称宽高比的FIFO,写宽度和读宽度的不同会导致数据处理和存储方式的差异。在FWFT模式下,这些差异可能更加明显,因为FWFT特性允许在不进行完整读操作的情况下访问数据。这可能会导致在某些情况下,FIFO的某些信号(如prog_emptywr_data_count)的行为与标准模式有所不同。

Programmable Empty (prog_empty)

prog_empty 信号是一个可编程的阈值信号,当FIFO中可读字的数量小于或等于该阈值时,prog_empty 会被断言。然而,当写/读宽高比小于1(取决于读和写时钟的频率)时,可能会出现prog_empty 违反这个规则的情况,但这种情况仅在empty 被断言时发生。

为了避免这种情况,你可以将可编程空断言阈值设置为 3*depth_ratio*frequency_ratio(其中 depth_ratio = 写深度/读深度 且 frequency_ratio = 写时钟频率 / 读时钟频率)。如果可编程空断言阈值设置得低于这个值,那么当empty 被断言时,prog_empty 可能也会被断言。

Write Data Count (wr_data_count)

wr_data_count 信号通常悲观地报告写入FIFO的字数,并且保证永远不会少报FIFO中的字数,以确保不会溢出FIFO。然而,当写/读宽高比小于1时,如果读写操作导致FIFO中存在部分写字,那么可能会少报FIFO中的字数。

这种行为在FIFO接近满(即距离满只有1或2个字)时最为关键,因为在这个状态下,wr_data_count 少报字数,因此不能用来判断FIFO是否已满。在这种配置下,你应该使用full 标志来禁止向FIFO写入任何数据。


http://www.ppmy.cn/server/34689.html

相关文章

Ubuntu多版本(低版本)gcc/g++安装、切换与卸载图文教程

目录 1 问题背景2 多版本安装3 多版本切换4 多版本卸载5 其他问题 1 问题背景 环境: gcc 9.4.0g 9.4.0Ubuntu20.04 现象:通过apt install build-essential安装的gcc和g默认是当前版本系统支持的最高版本编译器,但是很多工程的编译需要安装低版…

用正确的工具做对的事情 软件, 推荐

keywords: 软件, 推荐 好的软件总是给人一种相见恨晚的感觉。 软件列表 功能WindowsMac OS X文本编辑gVimMacVim离线 API 文档ZealDashUMLVisioStarUML流程图VisioProcessOn.com文件查找EverythingAlfred文件内容查找FileLocatorAlfredAndroid 开发Android StudioAndroid St…

树莓派与ESP32无线通信

树莓派和esp8266在局域网下使用UDP通信,esp8266采集adc数据传递给树莓派,树莓派在web上显示结果...-CSDN博客

Spring Clound介绍

Spring Cloud 是一系列框架的集合,它利用 Spring Boot 的开发便利性简化了分布式系统(例如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话和集群状态)的开发。Spring Cloud 旨在为开发者…

Windows10 wsl --version不生效\无法使用systemd问题解决

问题解决的思路: 全凭这小哥不然无法解决!! https://superuser.com/questions/1731365/updating-wsl-2-without-microsoft-store 在windows版本22H2(不包含)以下的windows机器中,wsl作为windows的组件存在。但由wsl启动的Linux系统本身受限制…

【C】137 只出现一次的数字

给你一个整数数组 nums &#xff0c;除某个元素仅出现 一次 外&#xff0c;其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题。 解法一 #include <stdio.h>int singleNumber(i…

安全配置核查关注点

口令策略 - 检查口令重复使用次数限制 - 检查口令生存周期要求 文件权限 - 检查关键权限指派安全要求&#xff1a;取得文件或其他对象的所有权 - 查看每个共享文件夹的共享权限&#xff0c;只允许授权的账户拥有权限共享此文件夹 用户账户 - 检查是否禁用guest用户 - 删除匿名用…

history命令显示时间戳、IP地址、用户名

一、前置知识 history命令的功能是显示和管理用户所执行过的所有命令记录。这些记录默认被Linux系统保存。用户可以使用history命令查阅这些记录&#xff0c;也可以对其记录进行修改和删除操作。 history命令的常用参数如下&#xff1a; -a: 保存命令记录-c: 清空命令记录-d:…