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

表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写入任何数据。

  • 56
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 26
    评论
评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值