当前位置: 首页 > news >正文

同步FIFO的三种写法各有特点。计数器法直接用读写计数器差值判断空满,适合小深度场景。举个例子,当depth=1时可以直接用寄存器存储数据

FIFO verilogIP 包括深度为1的fifo 包括普通同步FIFO和异步FIFO,均为first word fall through模式,同步fifo三种写法,异步fifo三种写法,可参数化配置,接口为fifo的基础接口 提供基础的testbench,两种fifo均在fpga上进行了验证

module sync_fifo_counter #( parameter DATA_WIDTH = 8, parameter DEPTH = 1 )( input clk, rst, input wr_en, rd_en, input [DATA_WIDTH-1:0] din, output [DATA_WIDTH-1:0] dout, output full, empty ); reg [DATA_WIDTH-1:0] mem; reg wr_ptr, rd_ptr; reg count; // FWFT模式直接输出存储数据 assign dout = mem; assign empty = (count == 0); assign full = (count == DEPTH); always @(posedge clk) begin if(rst) begin count <= 0; mem <= 0; end else begin case({wr_en, rd_en}) 2'b10: if(!full) begin mem <= din; count <= count + 1; end 2'b01: if(!empty) begin count <= count - 1; end 2'b11: begin mem <= din; end endcase end end endmodule

这种实现方式在depth=1时特别简单,但扩展到更大深度时需要调整计数器位宽。注意FWFT模式下数据直接存储在输出端口,读操作更像是数据更新。

FIFO verilogIP 包括深度为1的fifo 包括普通同步FIFO和异步FIFO,均为first word fall through模式,同步fifo三种写法,异步fifo三种写法,可参数化配置,接口为fifo的基础接口 提供基础的testbench,两种fifo均在fpga上进行了验证

状态机法用有限状态代替计数器,适合资源受限场景。用两个状态位表示空/满状态,当读写指针相遇时切换状态。这种方法省去了计数器需要的加法器,但需要处理边界条件:

// 状态定义 localparam EMPTY = 2'b01; localparam FULL = 2'b10; always @(posedge clk) begin if(wr_en && !full) begin // 写入逻辑 if(state == EMPTY) state <= NORMAL; end if(rd_en && !empty) begin // 读取逻辑 if(count == 1) state <= EMPTY; end end

指针法则采用读写指针循环递增的方式,通过指针差值判断空满。这是最接近ASIC实现的方法,但需要处理指针回绕:

reg [ADDR_WIDTH:0] wr_ptr, rd_ptr; // 多1bit用于回绕判断 assign full = (wr_ptr[ADDR_WIDTH] != rd_ptr[ADDR_WIDTH]) && (wr_ptr[ADDR_WIDTH-1:0] == rd_ptr[ADDR_WIDTH-1:0]);

异步FIFO的实现难点在跨时钟域处理。格雷码转换是常见方案,但要注意转换时机。这里给出一个基于双端口RAM的实现框架:

module async_fifo_graymap ( input wr_clk, rd_clk, input wr_rst, rd_rst ); // 写指针格雷码转换 always @(posedge wr_clk) begin binary_wr_ptr <= binary_wr_ptr + wr_en; gray_wr_ptr <= (binary_wr_ptr >> 1) ^ binary_wr_ptr; end // 读指针同步链 always @(posedge wr_clk) begin gray_rd_sync1 <= gray_rd_ptr; gray_rd_sync2 <= gray_rd_sync1; end

实测在Xilinx Artix-7上,深度16的异步FIFO需要约80个LUT。时序约束要设置setclockgroups异步,否则工具会误报时序问题。

Testbench编写时注意构造写快读慢和读快写慢两种场景。分享一个实用的波形生成方法:

// 写突发后停止 initial begin repeat(5) begin @(negedge clk); wr_en = 1; din = $random; end wr_en = 0; #1000; end

深度为1的FIFO有个特殊用例:当作为时钟域交叉的单脉冲信号传递时,配合握手信号能避免亚稳态。实际项目中用它传递中断信号效果不错,但要注意发送端需保持信号直到确认接收。

http://www.jsqmd.com/news/275331/

相关文章:

  • 大数据领域 Elasticsearch 集群搭建全流程
  • 自动聊天工具尝试一(寻找方向)
  • 一个python笔试题及扩展
  • 支持付费内容与广告的社区论坛小程序商业化运营源码系统
  • 2025年最受物流企业青睐的自动化立体库解决方案TOP 5,贯通式货架/中型货架/平台货架/轻型货架/重型货架自动化立体库公司有哪些
  • 永久关闭windows系统的自动更新的6种方法 详细介绍
  • 详细介绍:PHP 8.0到PHP 8.5各版本主要新特性的整理
  • 盘点2026年EOR名义雇主服务优势,教你如何选择EOR名义雇主高效产品推荐
  • 猎奇榜
  • Product Hunt 每日热榜 | 2026-01-20
  • 经营范围填写指南
  • 通达信【万马奔腾V8】主图与选股指标源码分享
  • 和vvv
  • Python 中subprocess.getstatusoutput(cmd) 函数注入命令风险分析
  • ARM嵌入式开发代码实践——LED灯闪烁(C语言版)
  • 突破想象!AI应用架构师用科研AI智能体重塑金融学分析格局
  • Qt的技巧笔记(二):ComboBox 下拉组合框组件
  • stm32TIM输入捕获基本结构
  • 计算机大数据毕设实战-基于springboot+大数据技术旅游商品智能推荐管理系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 【深度解析x-algorithm】XAI-org开源的通用算法引擎核心技术与实践
  • 本地Python脚本是否存在命令注入风险
  • 收藏!2026年AI浪潮下,Java程序员的出路与三大黄金风口
  • 什么是沙箱技术
  • 关于comfyui的comfyui-prompt-reader-node插件(import failed)和图片信息问题(metadata) - 实践
  • 【Eino 】架构与核心特性解析
  • 什么是上网行为管理
  • α-Conotoxin SI ;Ile-Cys-Cys-Asn-Pro-Ala-Cys-Gly-Pro-Lys-Tyr-Ser-Cys-NH2
  • VirtualLab Fusion应用:导入材料数据
  • 最近搞了个硬核的工业自动化项目,主角是西门子S7-1500 PLC带着一群小弟玩协同作战。这个焊装系统里藏着不少值得说道的门道,咱们边拆边聊
  • 什么是射频组合功率