在使用FIFO Generate IP核时,如果在Basic选项页选择了Naitve接口,就需要配置Native Ports页,该页提供了针对FIFO核心的性能选项(读取模式)、数据端口参数、ECC(错误检查和纠正)以及初始化选项。
1 Read Mode
Read Mode通常指的是FIFO(First In First Out,先进先出)在读取数据时的操作方式。当选择使用Block RAM或Distributed RAM作为FIFO时,会有不同的读取模式可供选择。
1.1 Standard FIFO
FIFO实现的是具有标准延迟且不使用输出寄存器的FIFO。数据按照先进先出的顺序从FIFO中读取,但不会在输出端口提前显示即将输出的数据。
当用户请求读取数据时,数据会在下一个时钟周期被提供给用户。换句话说,请求和数据的交付之间存在一个时钟周期的延迟。
对于Standard FIFO读取操作,当读取使能(rd_en)被置位,并且FIFO不为空时,FIFO中存储的下一个数据会被驱动到输出总线(dout)上,并且有效标志(VALID)也会被置位。
工作流程
(1) 写入数据:当至少有一个数据字被写入FIFO时,空标志(empty)会被撤销,表示FIFO中有数据可供读取。
(2) 读取使能:当读取使能信号rd_en被置位时,一个读取操作会在下一个rd_clk(读取时钟)的上升沿发生。
(3) 读取数据:在读取操作的时钟周期,FIFO将下一个可用的数据字输出到dout,并且置位VALID标志,表示一个成功的读取操作已经完成。
(4) FIFO为空:当FIFO中的最后一个数据字被读取后,FIFO会置位empty标志,表示FIFO为空。
(5) 读取请求无效:如果当empty被置位时继续置位rd_en,读取请求将被忽略,VALID会被撤销,并且可能会置位下溢标志(underflow),表示FIFO已经尝试读取一个不存在的数据字。
(6) 恢复读取:当执行写入操作后,FIFO会撤销empty标志,允许恢复有效的读取操作,这通常通过置位VALID和撤销underflow来表示。
图3-3展示了标准读取访问的流程图或时序图。在这个图中,可以看到读数据信号被置位后如何在下一个时钟周期将数据从dout读取出来,并且置位VALID标志。
Standard FIFO读取操作提供了一种简单而可靠的方式来从FIFO中读取数据。通过监控empty、VALID和underflow等标志,可以确保读取操作在FIFO非空时进行,并且在FIFO为空时避免无效的读取请求。
1.2 First-Word Fall-Through FIFO
First-Word Fall-Through FIFO 是使用了带有寄存器输出的读取操作,允许在不执行读取操作的情况下“预览”FIFO中的下一个数据字。当FIFO中有数据可用时,第一个数据字会自动出现在输出总线(dout)上。一旦第一个数据字出现在dout上,空标志(empty)就会被撤销,表示FIFO中有一个或多个可读的数据字,并且有效标志(VALID)会被置位,表示dout上存在一个有效的数据字。这种模式增加了FIFO的有效读取深度,并允许数据在读取使能有效之前就已经准备好。
当用户请求读取数据时,数据会在同一时钟周期内被提供给用户,请求和数据的交付之间没有延迟,从而提高了数据处理的效率。
工作流程
(1) 初始状态:当FIFO不为空时,下一个可用的数据字会自动出现在输出总线dout上,并且VALID被置位。
(2) 读取使能:当读取使能信号rd_en被置位时,在下一个rd_clk的上升沿,下一个数据字会被放到dout上。
(3) 读取最后一个数据字:当最后一个数据字被放到dout上后,如果再次发起读取请求,dout上的数据会变得无效,这由VALID的撤销和empty的置位来表示。此时,如果继续尝试从FIFO中读取数据,将会导致下溢(underflow)条件。
空标志的处理
与standard读取模式不同,First-Word Fall-Through模式下的empty标志是在读取完最后一个数据字后被置位的。当empty被置位时,VALID会被撤销。在标准读取模式下,当empty被置位时,VALID会在一个时钟周期内被置位。
有效读取深度
与standard模式相比,该模式增加了FIFO的有效读取深度,使得FIFO能够多存储两个数据字以供读取。
写入与读取的关系
对于每一个写入操作,都需要相应数量的读取操作来清空FIFO。这对两种读取操作模式都适用。
图3-4展示了First-Word Fall-Through读取操作的时序图。在这个图中,可以看到数据如何自动出现在dout上,以及当rd_en被置位时,如何在下一个时钟周期将数据从dout读取出来。同时,还可以看到empty和VALID标志如何随着数据的读取而变化。
选择哪种读取模式取决于具体的应用需求。如果应用程序可以容忍一个时钟周期的延迟,并且不需要立即访问最新进入FIFO的数据,那么standard 读取操作可能是一个合适的选择。然而,如果应用程序需要立即访问最新进入FIFO的数据,并且对性能有严格要求,那么First-Word Fall-Through读取操作可能更合适。
需要注意的是,虽然First-Word Fall-Through读取操作可以提高数据访问的速度,但它也可能增加FIFO设计的复杂性,并可能需要更多的硬件资源来实现。
2 Data Port Parameters
(1) Asymmetric Port Width(非对称端口宽度):仅对于使用UltraScale设备的Block RAM或Built-in FIFO可用。写入和读取端口的位宽可能不同,这在某些应用中可能是有用的,比如需要同时处理不同位宽的数据时。
(2) Write Width(写入宽度):定义了可以写入FIFO的数据的位宽。有效范围是1到1024位。可以在单个写入操作中将1到1024位的数据发送到FIFO。
(3) Write Depth(写入深度):定义了FIFO可以存储的数据的最大数量。有效范围是16到131072,但只允许深度为2的幂。这确保了FIFO在逻辑上是一个“干净”的结构,因为二进制计数很容易用于管理和跟踪其中的数据。
(4) Read Width(读取宽度):如果选择了block RAM或Built-in FIFO配置,则此参数可用。其有效范围必须遵守非对称端口规则,这意味着读取宽度可能与写入宽度不同,但具体取决于FIFO的配置和应用需求。
(5) Read Depth(读取深度):这是基于写入宽度、写入深度和读取宽度自动计算的。在大多数FIFO设计中,读取深度与写入深度相同,但由于非对称端口的存在,这可能会有所不同。
(6) Low Latency(低延迟):仅当UltraScale设备的Built-in FIFO配置中的深度元素数量超过一个时可用。低延迟模式旨在减少数据从FIFO读取到使用之间的时间延迟,这在需要快速响应的应用中可能是非常重要的。
(7) Low Latency Output Register(低延迟输出寄存器):当选择低延迟选项时,此选项可用。输出寄存器用于在数据从FIFO发送到外部世界之前临时存储数据。在低延迟模式下,这个寄存器可以确保数据尽快到达其目的地,同时仍然保持数据的完整性和准确性。
3 ECC, Output Register and Power Gating Options
ECC(Error Correction Code,错误纠正码)和相关选项在数据存储和处理中扮演着关键角色,特别是在需要高度可靠性和准确性的应用中。
(1) ECC:当启用硬ECC的错误纠正检查功能时,block RAM或Built-in FIFO将设置为全ECC模式,此时编码器和解码器都会被启用。ECC技术通过在数据中添加额外的校验位来检测和纠正错误,从而确保数据的完整性和准确性。
(2) 单比特错误注入(Single Bit Error Injection):在具有ECC功能的Common 和Independent clock block RAM或Built-in FIFO中可用。当使用基于block RAM的FIFO构建时,还可以使用带有ECC逻辑的软ECC选项(Soft ECC)。该功能提供一个输入端口来在写入时注入单个比特错误,并输出一个指示单个比特错误发生的端口。这有助于测试和验证ECC功能的正确性。
(3) 双比特错误注入(Double-Bit Error Injection):同样在具有ECC功能的Common 和Independent clock block RAM或Built-in FIFO中可用。与单比特错误注入类似,它提供输入端口来在写入时注入双比特错误,并输出一个指示双比特错误发生的端口。这进一步增强了ECC功能的测试能力。
(4) ECC流水线寄存器(ECC Pipeline Reg):Built-in FIFO宏在ECC解码器和编码器路径上有一个可选的流水线寄存器。当选择ECC流水线寄存器时,它可以改善FIFO宏的时序并在DOUT上增加一个时钟周期的额外延迟。此外,当对FIFO应用重置时,ECC流水线寄存器会保持先前读取的数据在流水线中。这有助于确保在重置期间数据的连续性和准确性。
(5) 动态功耗门控(Dynamic Power Gating):动态功耗门控是一种节能功能,通过控制睡眠引脚(sleep pin)来使内置FIFO宏保持在睡眠模式,同时保持数据内容不变。在唤醒时间要求之前对FIFO的任何访问都不能得到保证,并且可能会导致内存内容损坏。当睡眠模式激活(即睡眠引脚为高电平)时,写使能(wr_en)和读使能(rd_en)引脚必须保持低电平。在此模式下,内存的数据内容会得到保留。
(6) 输出寄存器(Output Registers):block RAM宏具有Built-in 嵌入式或互联寄存器,可用于流水线数据处理并改善宏的时序。此选项允许用户在FIFO的输出端添加一个流水线阶段,并利用可用的嵌入式寄存器。对于Built-in FIFO,此功能仅支持具有1个FIFO宏深度的同步FIFO配置。
FIFO生成器还提供了选择嵌入式寄存器和互联寄存器的选项,以便在满足时序要求时获得平滑的延迟。这种灵活性允许用户根据具体的应用需求优化FIFO的性能和功耗。
3 Initialization
初始化中关于FIFO的部分,包含了多种选项和配置。
(1)Reset Pin(复位引脚):
对于使用Block RAM或Distributed RAM实现的FIFO,复位引脚不是必需的,输入引脚也是可选的。在某些情况下,可以通过软件或其他方式实现复位,而无需专门的复位引脚。
(2) Enable Reset Synchronization(启用复位同步):
可选选项,仅适用于Independent clock block RAM或Distributed RAM FIFO。当未选中时,wr_rst/rd_rst是可用的。这有助于确保在多个时钟域之间正确同步复位信号。
(3) Enable Safety Circuit(启用安全电路):
可选选项,仅适用于基于BRAM的FIFO,并且默认启用异步复位。对于AXI接口,安全电路在核心内部自动启用,因为AXI接口中的复位始终是异步的。当选择启用安全电路时,会启用额外的逻辑以确保同步触发器驱动FIFO生成器的输出和BRAM原语的控制信号。
(4} Reset Type(复位类型):
异步复位(Asynchronous Reset):对于使用Distributed 或block RAM实现的Common Clock FIFO,可选选项。异步复位意味着复位信号可以在任何时间断言,而不受时钟信号的限制。
同步复位(Synchronous Reset):可选选项,适用于使用Distributed 或block RAM实现的Common Clock FIFO。同步复位要求复位信号在时钟信号的上升沿或下降沿处断言。
(5) Full Flags Reset Value(满标志复位值):
对于block RAM、Distributed RAM和移位寄存器配置,可以选择在复位期间满标志(prog_full、almost_full和full)的复位值。这有助于在复位后正确地初始化FIFO的状态。
(6) Dout Reset Value(Dout复位值):
这指示当复位被置位时,FIFO输出上断定的十六进制值。它适用于所有使用block RAM、Distributed RAM、移位寄存器或7系列设备的Common Clock built-in FIFO实现,其中启用了嵌入式寄存器选项。如果选择了此选项,当复位被置位时,FIFO的dout输出将复位到定义的dout复位值。如果未选择此选项,FIFO的dout输出将不会受到复位置位的影响,并将保持其先前的值(对于使用内置FIFO的UltraScale架构设备,有一些限制)。