目录
3 使用IP核进行设计
3.1 通用设计指南
3.1.1 了解困难程度
困难程度受以下因素影响:
- 最大系统频率
- 目标器件的架构
- 特定的用户应用
3.1.2 理解信号流水线以及同步
要理解FIFO设计的本质,重要的是要理解如何使用流水线来最大化性能和实现跨时钟域的同步逻辑。写入写接口的数据在能被读接口访问之前可能需要多个时钟周期。
同步考虑
具有独立写和读时钟的FIFO,相关的接口信号只能在对应的时钟域使用。

上图显示了各时钟域的相关信号,分别与对应时钟域的时钟同步。除了rst信号,是一个异步复位。
FIFO的性能可以通过单独约束wr_clk和rd_clk输入信号的时钟周期来衡量。
信号与wr_clk和rd_clk的上升沿对齐,如果需要与下降沿对齐,可以在时钟输入fifo前加一个反相器。
3.2 初始化FIFO产生器
built-in FIFO 或 common clock shift register FIFO,需要在操作前进行复位。异步复位信号rst清除内部计数器以及输出寄存器。UltraScale架构的rst是同步到各自时钟的。
block RAM 或 distributed RAM FIFO,不需要复位,复位引脚也是可选的。对于common clock的配置,还可以选择异步或者同步复位。对于 independent clock 的配置,可以设置异步复位(rst)或者同步复位(wr_rst/rd_rst)。
如果选择了使能Reset Synchronization的异步复位(rst),复位信号会在内部同步到对应的时钟域。确保FIFO初始化到确知的状态。这种同步逻辑使得恰当的IP核逻辑复位时序,避免毛刺和亚稳态行为。复位脉冲和同步延迟要求依赖于FIFO的实现类型。
如果选择了未使能Reset Synchronization的同步复位(wr_rst/rd_rst),wr_rst/rd_rst被认为是与各自的时钟域同步的。只要断言了wr_rst,写时钟域就会保持复位状态;只要断言了rd_rst,读时钟域就会保持复位状态。
3.3 FIFO用法和控制
3.3.1 写操作
写使能断言,并且FIFO非满,数据从din写入并且断言写应答 (wr_ack) ,当FIFO满时忽略写请求并断言溢出标志。溢出不会破坏FIFO结构,等非空状态就可以正常写。
almost_full 、full 标志位:
- 与wr_clk同步,高电平有效。
- almost_full指示只能再写一个数据就断言full。
- full指示FIFO已满,不可再写入数据。
- built-in FIFO不支持almost_full。
典型的写操作:

断言wr_en后,wr_clk下一周期上升沿发生写操作。因为FIFO非满,所以写成功应答一个wr_ack。
写了两个数(D1,D2)后,almost_full断言,再写一个数(D3)导致full断言。
full后,D4没写进去,所以没有应答。
3.3.2 读操作
读使能断言,并且FIFO非空,数据从dout输出,并且断言数据有效信号valid。
almost_empty 和 empty 标志位:
- 与rd_clk同步,高电平有效。
- almost_empty指示只能再读一个数据就断言empty。
- empty指示FIFO已满,不可再读取数据。
- built-in FIFO不支持almost_empty。
读写同时钟情况:当写操作和读操作同时发生而empty为断言状态时,写操作被接受,读操作被忽略。在下一个时钟周期中,empty被取消断言并断言underflow。
读操作的模式:
两种模式:
- 标准读模式:在读请求使能后的下一个时钟提供数据。

- first-word fall-through (FWFT) 读模式:在读使能的同一个时钟提供数据。

first-word fall-through (FWFT)功能在读使能到来前,预读一个可读的数据。
注意:
- 可读的数据:非空。
- 预读了数据时,valid会自动断言。
标准读模式,empty在剩最后一个数据时断言,之后valid还维持一个时钟的断言状态。
而FWFT模式,empty在最后一个数据读完之后才断言,并且同时取消断言valid。
FWFT功能将FIFO的有效读取深度增加两个读word。
FWFT功能在给一个空FIFO写数据时,给empty的取消断言加了两个时钟周期的延时。
注意:每种模式读空FIFO需要的读操作数量是一样的。
下面对block RAM实现的同时钟的,gui深度都设置为16,读模式分别为standrad以及FWFT的两个FIFO进行仿真:

可以看到,对于标准模式,数据在写使能到empty取消断言为一个时钟周期的延时,而FWFT模式给empty的取消断言增加了两个时钟周期的延时。
标准模式下,实际深度为16,而FWFT模式下实际深度增加两个。
- 同时钟下的边写边读

3.3.3 握手标志信号
支持握手标志(VALID、underflow、wr_ack和overflow),以提供关于写和读操作状态的附加信息。握手标志是可选的,可以通过Vivado IDE配置为active-High或active-Low。
- Write Acknowledge
wr_ack在每次成功完成的读操作后断言。
- Valid
VALID的操作取决于读模式。
- Standard FIFO Read Operation:当成功读取数据时在rd_clk上升沿断言,表示dout上的数据有效。
- FWFT FIFO Read Operation:表示dout在当前周期是有效的,valid断言不一定需要读请求,因为FWFT会将下一个可读的数据预读出来放在dout并断言valid。如果FIFO中有一个或多个word,则断言VALID。当FIFO中没有word时,VALID被取消。这里需要注意,如果是数据位宽需要转换的额FIFO,如32位写,

本文详细解析了如何在FPGA设计中使用IP核进行FIFO的设计,涉及信号流水线、同步、初始化、控制逻辑、握手标志、数据计数、时钟管理、复位策略以及特殊设计注意事项。重点讲解了非对称位宽、嵌入寄存器、错误检查与注入等关键部分。
最低0.47元/天 解锁文章
2061





