news 2026/6/10 17:56:36

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
同步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有个特殊用例:当作为时钟域交叉的单脉冲信号传递时,配合握手信号能避免亚稳态。实际项目中用它传递中断信号效果不错,但要注意发送端需保持信号直到确认接收。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 16:02:50

蜘蛛表格团队:七年坚守免费多维表,我们用技术为每一份梦想铺路

2017年盛夏的西安&#xff0c;古城墙的阴影隔绝了部分酷暑&#xff0c;咖啡馆内的美式醇香与年轻人的热议碰撞交织。当指尖在Excel表格上反复拖拽却屡屡陷入协作困境时&#xff0c;一个直击行业痛点的疑问在讨论中愈发清晰&#xff1a;为何高效的协作工具&#xff0c;总要被付费…

作者头像 李华
网站建设 2026/6/10 15:35:48

VirtualLab Fusion应用:X射线掠入射聚焦反射镜

摘要掠入射反射光学元件在X射线光路中广泛使用&#xff0c;特别是Kirkpatrick-Baez&#xff08;KB&#xff09;椭圆反射镜系统。&#xff08;A. Verhoeven, et al., Journal of Synchrotron Radiation 27.5 (2020): 1307-1319&#xff09;聚焦是通过使用两个物理分离的椭圆反射…

作者头像 李华
网站建设 2026/6/10 17:05:11

肿瘤坏死因子超家族受体TWEAKR

肿瘤坏死因子受体超家族成员12A&#xff08;TNFRSF12A&#xff09;&#xff0c;又称为成纤维细胞生长因子诱导的早期反应蛋白14&#xff08;FN14&#xff09;&#xff0c;TWEAKR或CD266&#xff0c;是TNFSF12/TWEAK受体。是某些细胞类型的弱凋亡诱导剂。促进血管生成和内皮细胞…

作者头像 李华
网站建设 2026/6/9 11:24:18

什么是SZTP

文章目录SZTP是如何工作的SZTP如何确保开局的安全性安全零配置部署&#xff08;Secure Zero Touch Provisioning&#xff0c;SZTP&#xff09;&#xff0c;是指在DHCP方式的ZTP开局场景下&#xff0c;增加部署BootStrap服务器&#xff0c;使用双向认证和数据加密保证ZTP数据可信…

作者头像 李华
网站建设 2026/6/10 6:44:18

【毕业设计】基于Python网易云音乐排行榜数据分析系统设计与实现(源码+文档+远程调试,全bao定制等)

java毕业设计-基于springboot的(源码LW部署文档全bao远程调试代码讲解等) 博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、…

作者头像 李华