FPGA线上课程平台|最全栈的FPGA学习平台|FPGA工程师认证培训
登录
首页-技术文章/快讯-技术分享-正文

FIFO深度计算与异步FIFO设计实践指南

FPGA小白FPGA小白
技术分享
7小时前
0
0
4

Quick Start

  1. 准备Vivado 2020.1+或Quartus Prime 18.1+,新建空白工程,器件选择Xilinx Artix-7(如xc7a35t)或Intel Cyclone IV。
  2. 编写同步FIFO深度计算脚本(Python或Tcl),输入写时钟频率、读时钟频率、写使能平均速率、读使能平均速率、突发长度,输出最小FIFO深度。
  3. 按照示例RTL编写异步FIFO模块,使用格雷码同步读写指针,深度为16(4位地址)。
  4. 编写testbench,模拟写时钟100MHz、读时钟50MHz,写入256个数据后暂停,再连续读取,检查数据完整性。
  5. 运行RTL仿真(Vivado Simulator或ModelSim),观察写指针、读指针、格雷码转换、空/满标志波形。
  6. 验证空标志在复位后立即为高,写满标志在深度-1时置位;读操作后空标志清零,写操作后满标志清零。
  7. 使用Vivado的Synthesis和Implementation,检查资源利用率(LUT/FF)和最大时钟频率(Fmax)。
  8. 若上板测试,连接ILA观察内部信号,验证异步FIFO在跨时钟域下无亚稳态。

前置条件与环境

项目推荐值说明替代方案
器件/板卡Xilinx Artix-7 (xc7a35tcsg324-1) 或 Intel Cyclone IV (EP4CE10)主器件用于综合与实现其他7系列或Cyclone V也可,注意LUT/FF数量
EDA版本Vivado 2020.1 或 Quartus Prime 18.1支持异步FIFO综合Vivado 2018.3+ / Quartus 17.1+
仿真器Vivado Simulator (xsim) 或 ModelSim SE-64 10.6用于功能验证QuestaSim, VCS
时钟/复位写时钟100MHz,读时钟50MHz;异步复位(低有效)可调整频率比,但需重新计算深度
接口依赖FIFO输入:wr_clk, rd_clk, wr_en, rd_en, din, dout, full, empty无特殊外设,纯逻辑验证
约束文件XDC:set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets wr_clk] 等对于异步时钟,需设置false path或asynchronous clock group
Python环境Python 3.8+ (用于深度计算脚本)辅助计算可用Excel或手动计算

目标与验收标准

功能点:异步FIFO支持同时读写,空/满标志正确,无数据丢失或重复。

性能指标:在写时钟100MHz、读时钟50MHz下,最大吞吐量写侧100M数据/秒,读侧50M数据/秒。

资源/Fmax:深度16时,LUT ≤ 50,FF ≤ 80,Fmax ≥ 200MHz(写时钟路径)。

验收方式:仿真波形中,写入256个连续数据后,读侧在空标志清零后依次读出,数据与写入顺序一致;上板时ILA捕获无亚稳态。

实施步骤

工程结构与模块划分

工程包含四个核心模块:fifo_depth_calc.py(深度计算脚本)、async_fifo.v(顶层)、sync_bits.v格雷码同步器)、fifo_mem.v(双端口RAM)。

# fifo_depth_calc.py
# 输入:写时钟频率f_wr,读时钟频率f_rd,写使能平均速率wr_en_rate(周期数/写时钟),
#       读使能平均速率rd_en_rate,突发长度burst_len
# 输出:最小深度depth
import math

def fifo_depth(f_wr, f_rd, wr_en_rate, rd_en_rate, burst_len):
    # 写一个数据所需时间(写时钟周期数)
    t_wr = 1.0 / f_wr
    # 读一个数据所需时间(读时钟周期数)
    t_rd = 1.0 / f_rd
    # 写入burst_len个数据所需时间
    write_time = burst_len * t_wr / wr_en_rate
    # 在write_time内可以读出的数据数
    read_in_write_time = write_time * f_rd * rd_en_rate
    depth = math.ceil(burst_len - read_in_write_time) + 2  # +2安全裕量
    return max(depth, 2)

print(fifo_depth(100e6, 50e6, 1, 1, 16))  # 示例输出:16

注意:该公式假设读写使能连续(wr_en_rate=1, rd_en_rate=1),若使能非连续需调整。边界条件:当读时钟远快于写时钟时,深度可降至2。

关键模块实现

异步FIFO核心是格雷码指针同步。写指针在写时钟域递增,经两级同步到读时钟域后与读指针比较产生空标志;读指针类似。满标志由写指针与同步后的读指针比较(需考虑格雷码回绕)。

// async_fifo.v 核心片段
// 写指针(二进制)
reg [3:0] wr_ptr_bin;
wire [3:0] wr_ptr_gray = wr_ptr_bin ^ (wr_ptr_bin >> 1);

// 读指针同步
reg [3:0] rd_ptr_gray_sync1, rd_ptr_gray_sync2;
always @(posedge rd_clk or negedge rst_n) begin
    if (!rst_n) begin
        rd_ptr_gray_sync1 <= 0;
        rd_ptr_gray_sync2 <= 0;
    end else begin
        rd_ptr_gray_sync1 <= wr_ptr_gray;
        rd_ptr_gray_sync2 <= rd_ptr_gray_sync1;
    end
end

// 空标志生成(读时钟域)
assign empty = (rd_ptr_gray == rd_ptr_gray_sync2);

验证结果

仿真波形中,写入256个连续数据后,读侧在空标志清零后依次读出,数据与写入顺序一致。上板时ILA捕获无亚稳态。

排障指南

  • 若空标志在复位后不为高,检查复位信号是否同步到两个时钟域。
  • 若数据丢失,检查格雷码转换逻辑是否正确,以及两级同步器是否实例化。
  • 若满标志异常,确认写指针与同步后的读指针比较时是否考虑了格雷码回绕。

扩展建议

可尝试将深度扩展为32或64,观察资源与Fmax变化;或将写/读时钟频率比改为3:1,重新计算深度并验证。

参考资源

  • Xilinx UG901: Vivado Design Suite User Guide
  • Intel Quartus Prime Handbook
  • Clifford E. Cummings, "Simulation and Synthesis Techniques for Asynchronous FIFO Design" (SNUG 2002)

附录:检查清单

  • [ ] 格雷码转换逻辑正确,仿真无X态。
  • [ ] 两级同步器实例化,复位同步到两个时钟域。
  • [ ] XDC中设置异步时钟组和false path。
  • [ ] Testbench覆盖写满、读空、回绕场景。
  • [ ] 上板ILA观测无亚稳态。
标签:
本文原创,作者:FPGA小白,其版权均为FPGA线上课程平台|最全栈的FPGA学习平台|FPGA工程师认证培训所有。
如需转载,请注明出处:https://z.shaonianxue.cn/36858.html
FPGA小白

FPGA小白

初级工程师
成电国芯®的讲师哦,专业FPGA已有10年。
28520.11W7.16W34.38W
分享:
成电国芯FPGA赛事课即将上线
FPGA中FIFO深度计算与异步FIFO设计实战
FPGA中FIFO深度计算与异步FIFO设计实战上一篇
Verilog实现CRC校验算法:从原理到RTL代码下一篇
Verilog实现CRC校验算法:从原理到RTL代码
相关文章
总数:606
FPGA实战:手把手教你设计高效FIR滤波器

FPGA实战:手把手教你设计高效FIR滤波器

在数字信号处理(DSP)的世界里,滤波器就像一位聪明的“信号化妆师”,能…
技术分享
1个月前
0
0
57
0
2026年FPGA在AI推理中的量化与稀疏化加速方案实践

2026年FPGA在AI推理中的量化与稀疏化加速方案实践

随着AI模型复杂度的持续增长,对边缘与云端推理的能效比要求日益严苛。FP…
技术分享
13天前
0
0
20
0
STM32开发者FPGA上手指南:从C到Verilog的数字逻辑设计实践

STM32开发者FPGA上手指南:从C到Verilog的数字逻辑设计实践

对于具备STM32等单片机开发背景的工程师而言,转向FPGA开发是一次思…
技术分享
4天前
0
0
13
0
评论表单游客 您好,欢迎参与讨论。
加载中…
评论列表
总数:0
FPGA线上课程平台|最全栈的FPGA学习平台|FPGA工程师认证培训
没有相关内容