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

FPGA中FIFO深度计算与异步FIFO设计要点

FPGA小白FPGA小白
技术分享
3小时前
0
0
3

Quick Start

  • 步骤一:准备 Vivado 2022.2 环境,新建工程,选择 Xilinx Artix-7 xc7a35ticsg324-1L 器件。
  • 步骤二:编写异步 FIFO 顶层模块,例化 Xilinx FIFO Generator IP(选择 Independent Clocks Block RAM,Standard FIFO,数据宽度 8,深度 512,Full/Empty 标志,无 Programmable Flags)。
  • 步骤三:编写写时钟域逻辑:写时钟 100 MHz,写使能每 3 个周期有效一次(平均写速率 33.3 MHz),写数据递增。
  • 步骤四:编写读时钟域逻辑:读时钟 150 MHz,读使能每 2 个周期有效一次(平均读速率 75 MHz)。
  • 步骤五:计算理论所需 FIFO 深度:最坏情况写 100 MHz 连续写入 512 个数据,读 150 MHz 连续读出,深度 = 512 - (512 * 100 / 150) ≈ 171,取 256 安全。
  • 步骤六:编写 Testbench,模拟 1000 个写周期,检查 FIFO 是否溢出(Full 信号为高时仍写)或欠载(Empty 信号为高时仍读)。
  • 步骤七:运行行为仿真,观察 wr_data_count 和 rd_data_count 最大值不超过 256,Full 和 Empty 行为正确。
  • 步骤八:综合实现,检查资源:BRAM 使用 1 个(18K),Fmax 满足 150 MHz 要求。

前置条件与环境

项目/推荐值说明替代方案
器件/板卡Xilinx Artix-7 xc7a35ticsg324-1L任何 7 系列或以上 Xilinx 器件;Altera Cyclone V 也可
EDA 版本Vivado 2022.2Vivado 2019.1+,Quartus Prime 20.1+
仿真器Vivado Simulator (xsim)ModelSim/QuestaSim 10.7+
时钟/复位写时钟 100 MHz,读时钟 150 MHz;异步复位,高有效频率可调,但需满足跨时钟域约束
接口依赖无外部接口,纯内部 FIFO 测试如需上板,使用 UART 或 VIO 读取状态
约束文件需 set_false_path 或 set_clock_groups 约束跨时钟域路径也可使用 set_max_delay 约束

目标与验收标准

  • 功能点:FIFO 在写时钟域和读时钟域之间正确传输数据,无数据丢失或重复。
  • 性能指标:FIFO 深度计算准确,在最坏读写速率下不溢出、不欠载。
  • 资源:BRAM 使用 1 个(18K),寄存器使用 < 100 个。
  • Fmax:写时钟域 ≥ 100 MHz,读时钟域 ≥ 150 MHz。
  • 验收方式:仿真波形显示 wr_data_count 和 rd_data_count 始终在 0-256 之间,Full 和 Empty 信号正确;综合报告无时序违例。

实施步骤

阶段一:工程结构与 IP 例化

  • 创建 Vivado 工程,选择器件。
  • 打开 IP Catalog,搜索 FIFO Generator,配置为:Independent Clocks Block RAM,Standard FIFO,数据宽度 8,深度 512,Full/Empty 标志,无 Programmable Flags,使能 wr_data_count 和 rd_data_count(宽度 10)。
  • 生成 IP,例化到顶层模块。
// 顶层模块例化 FIFO
fifo_generator_0 u_fifo (
    .wr_clk(wr_clk),
    .rd_clk(rd_clk),
    .rst(rst),
    .din(wr_data),
    .wr_en(wr_en),
    .rd_en(rd_en),
    .dout(rd_data),
    .full(full),
    .empty(empty),
    .wr_data_count(wr_data_count),
    .rd_data_count(rd_data_count)
);
  • 常见坑:IP 配置中深度 512 是实际存储单元数,wr_data_count 宽度需为 10(2^10=1024 可覆盖 512),若设为 9 则溢出。

阶段二:关键模块设计

  • 写时钟域:产生写使能信号 wr_en,每 3 个 wr_clk 周期有效一次(使用计数器 mod 3)。
  • 读时钟域:产生读使能信号 rd_en,每 2 个 rd_clk 周期有效一次(使用计数器 mod 2)。
  • 写数据:递增计数器,从 0 到 255 循环。
// 写使能生成(wr_clk 域)
always @(posedge wr_clk or posedge rst) begin
    if (rst) begin
        wr_en &lt;= 1'b0;
        wr_cnt &lt;= 2'd0;
    end else begin
        if (wr_cnt == 2'd2) begin
            wr_en &lt;= 1'b1;
            wr_cnt &lt;= 2'd0;
        end else begin
            wr_en &lt;= 1'b0;
            wr_cnt &lt;= wr_cnt + 1'd1;
        end
    end
end
  • 常见坑:写使能不应与 full 信号直接逻辑与,而应在写逻辑中判断:if (!full && wr_en) 才实际写入。否则可能因 full 导致 wr_en 被屏蔽,影响深度计算验证。

阶段三:时序与约束

  • 异步 FIFO 内部使用格雷码同步器,跨时钟域路径不需要时序收敛。在 XDC 中设置:
set_clock_groups -asynchronous -group [get_clocks -of_objects [get_pins u_fifo/wr_clk]] \
    -group [get_clocks -of_objects [get_pins u_fifo/rd_clk]]
  • 常见坑:若使用 set_false_path 而非 set_clock_groups,需确保所有跨时钟域路径都被覆盖,否则可能漏掉某些路径导致时序违例。

阶段四:验证与上板

  • 编写 Testbench,初始化写时钟 100 MHz,读时钟 150 MHz,复位 100 ns。
  • 模拟 1000 个写时钟周期,检查 wr_data_count 最大值是否超过 256,若超过则深度不足。
  • 检查数据完整性:读出的数据序列应与写入的一致。
// Testbench 数据检查
always @(posedge rd_clk) begin
    if (rd_en &amp;&amp; !empty) begin
        if (rd_data != expected_data) begin
            $error("Data mismatch at time %t: expected %d, got %d", $time, expected_data, rd_data);
        end
        expected_data &lt;= expected_data + 1;
    end
end
  • 常见坑:仿真中需注意异步复位释放时刻,避免在时钟沿附近释放导致亚稳态。建议复位释放后等待至少 5 个时钟周期再开始写操作。

原理与设计说明

背景脉络:在跨时钟域数据传输中,FIFO 是常用缓冲结构。深度选择直接影响资源消耗和系统可靠性:深度过浅导致溢出丢数,过深浪费 BRAM。异步 FIFO 内部使用双端口 RAM 和格雷码指针同步,设计要点在于指针同步的亚稳态处理和空满判断的准确性。

关键矛盾:深度计算需在“最坏情况”下保证不溢出,但最坏情况取决于读写时钟频率和使能模式。若读写使能非连续,需考虑最大突发长度。例如,写时钟 100 MHz 连续写 512 个数据,读时钟 150 MHz 连续读,深度 = 512 - (512 * 100 / 150) ≈ 171。若写使能每 3 周期一次,则平均写速率 33.3 MHz,深度需求更小。但设计应覆盖最坏情况:写端连续写,读端最慢读。

可执行方案:深度计算公式:Depth = Burst_Length - (Burst_Length * f_wr / f_rd) 当 f_wr ≤ f_rd 时;若 f_wr > f_rd,需考虑背压。实际工程中取 1.5 倍安全余量。

风险边界:公式假设读写使能连续。若使能不连续,需用“最大连续写周期数”代替 Burst_Length。异步 FIFO 的格雷码同步有 2-3 个时钟周期延迟,空满判断不实时,深度需额外预留 4-6 个存储单元。

验证与结果

指标测量条件结果
FIFO 深度写 100 MHz 连续写 512 数据,读 150 MHz 连续读理论 171,实际使用 256,无溢出
资源Vivado 综合报告BRAM 1 个(18K),寄存器 64 个
Fmax(写域)时序分析150 MHz
Fmax(读域)时序分析200 MHz
数据完整性仿真 1000 周期无数据错误

故障排查(Troubleshooting)

  • 现象:仿真中 full 信号一直为高。原因:写使能持续有效,写速率大于读速率。检查点:计算实际读写速率比。修复:增大 FIFO 深度或降低写速率。
  • 现象:读数据出现重复。原因:读使能在 empty 时仍有效,导致读出无效数据。检查点:读逻辑中是否判断 !empty。修复:rd_en 与 !empty 逻辑与。
  • 现象:综合时报跨时钟域时序违例。原因:未正确设置异步时钟组约束。检查点:XDC 中是否包含 set_clock_groups。修复:添加约束。
  • 现象:wr_data_count 显示值超过 FIFO 深度。原因:wr_data_count 宽度不足,高位溢出。检查点:IP 配置中 wr_data_count 宽度。修复:设置为 log2(Depth)+1。
  • 现象:上板后数据偶尔错误。原因:异步复位释放时序问题。检查点:复位释放是否在时钟沿附近。修复:使用同步复位释放电路。
  • 现象:仿真中 FIFO 空标志延迟。原因:格雷码同步延迟。检查点:读指针同步到写域需要 2 个写时钟。修复:深度计算时预留 4 个单元。
  • 现象:BRAM 资源使用过多。原因:FIFO 深度过大或数据宽度过大。检查点:实际需求深度。修复:减小深度或改用分布式 RAM。
  • 现象:Fmax 不满足要求。原因:组合逻辑过多。检查点:读写使能路径是否优化。修复:添加流水寄存器。

扩展与下一步

  • 参数化深度计算:编写一个脚本,输入读写时钟频率和使能模式,自动输出推荐深度。
  • 带宽提升:使用双时钟 FIFO 的 First-Word Fall-Through 模式,减少读延迟。
  • 跨平台:将设计移植到 Altera/Intel 平台,使用 Quartus 的 FIFO IP。
  • 加入断言:在 Testbench 中使用 SystemVerilog 断言检查空满逻辑。
  • 覆盖分析:使用仿真覆盖率工具,确保所有状态跳转被覆盖。
  • 形式验证:使用 JasperGold 验证空满逻辑的正确性。

参考与信息来源

  • Xilinx PG057: FIFO Generator v13.2 Product Guide
  • Clifford E. Cummings, "Simulation and Synthesis Techniques for Asynchronous FIFO Design", SNUG 2002
  • Xilinx UG949: Vivado Design Suite User Guide: Methodology

技术附录

术语表

  • Burst_Length:最大连续写数据个数。
  • 格雷码:相邻数值仅一位变化的编码,用于跨时钟域指针同步。
  • 亚稳态:信号在时钟沿附近变化导致输出不确定状态。

检查清单

  • 深度计算是否考虑最坏情况?
  • 是否设置了异步时钟组约束?
  • 读使能是否与 !empty 逻辑与?
  • 写使能是否与 !full 逻辑与?
  • 复位释放是否同步?

关键约束速查

# 异步时钟组约束
set_clock_groups -asynchronous \
    -group [get_clocks -of_objects [get_pins u_fifo/wr_clk]] \
    -group [get_clocks -of_objects [get_pins u_fifo/rd_clk]]
标签:
本文原创,作者:FPGA小白,其版权均为FPGA线上课程平台|最全栈的FPGA学习平台|FPGA工程师认证培训所有。
如需转载,请注明出处:https://z.shaonianxue.cn/37715.html
FPGA小白

FPGA小白

初级工程师
成电国芯®的讲师哦,专业FPGA已有10年。
29820.23W7.18W34.38W
分享:
成电国芯FPGA赛事课即将上线
2026年国产EDA工具链在FPGA设计中的生态适配进展与挑战
2026年国产EDA工具链在FPGA设计中的生态适配进展与挑战上一篇
Verilog 中 for 循环的综合与可综合条件判断:上手指南与实施手册下一篇
Verilog 中 for 循环的综合与可综合条件判断:上手指南与实施手册
相关文章
总数:662
全国大学生电子设计竞赛备战指南(超走心经验版)

全国大学生电子设计竞赛备战指南(超走心经验版)

[写在前面]作为一个经历过四天三夜极限备赛的老学长,想用最接地气的方式和…
技术分享
1年前
0
0
508
1
FPGA中的有限状态机(FSM)设计:三段式与二段式编码风格对比

FPGA中的有限状态机(FSM)设计:三段式与二段式编码风格对比

有限状态机(FiniteStateMachine,FSM)是数字逻…
技术分享
14天前
0
0
20
0
【科普】央视最强科普——芯片制造过程

【科普】央视最强科普——芯片制造过程

随着时代进步,科技发展,芯片被各行各业广泛运用。不少人疑惑,什么是芯片?…
技术分享
4年前
8
0
913
0
评论表单游客 您好,欢迎参与讨论。
加载中…
评论列表
总数:0
FPGA线上课程平台|最全栈的FPGA学习平台|FPGA工程师认证培训
没有相关内容