TypechoJoeTheme

至尊技术网

登录
用户名
密码

关于异步FIFO的知识点–详细代码解释(很干)[通俗易懂],异步fifo实现原理

2025-12-21
/
0 评论
/
6 阅读
/
正在检测是否收录...
12/21

标题:异步FIFO设计原理与Verilog代码深度解析
关键词:异步FIFO、跨时钟域、Verilog、格雷码、空满判断
描述:本文详细讲解异步FIFO的核心设计思想,包括双端口RAM、格雷码计数器、空满判断逻辑,并附Verilog代码逐行解析,解决跨时钟域数据传输难题。

正文:

在数字IC设计中,异步FIFO是解决跨时钟域数据传输的"瑞士军刀"。其核心挑战在于如何安全地在两个不同时钟域间传递读写指针,避免亚稳态导致数据丢失。本文将拆解异步FIFO的三大核心模块,并用可综合的Verilog代码演示实现细节。

1. 异步FIFO架构剖析

典型的异步FIFO由以下组件构成:
- 双端口RAM:物理存储单元(写端口用写时钟,读端口用读时钟)
- 格雷码计数器:将二进制指针转换为格雷码避免亚稳态
- 同步器链:两级DFF同步跨时钟域信号
- 空满判断逻辑:比较读写指针的"镜像值"

module async_fifo #(
    parameter DATA_WIDTH = 8,
    parameter ADDR_WIDTH = 4  // 深度=2^ADDR_WIDTH
)(
    input  wr_clk, wr_rst,
    input  rd_clk, rd_rst,
    input  wr_en, rd_en,
    input  [DATA_WIDTH-1:0] din,
    output [DATA_WIDTH-1:0] dout,
    output full, empty
);

2. 格雷码的魔法

为什么用格雷码?当指针从3(011)变为4(100)时,二进制编码有3位同时跳变,而格雷码仅变化1位(010→110),极大降低亚稳态风险。

// 二进制转格雷码
function [ADDR_WIDTH:0] bin2gray;
    input [ADDR_WIDTH:0] bin;
    begin
        bin2gray = (bin >> 1) ^ bin; // 右移1位后异或
    end
endfunction

3. 指针同步关键代码

写指针需要同步到读时钟域判断空状态,读指针需要同步到写时钟域判断满状态:

// 写指针同步到读时钟域
always @(posedge rd_clk or posedge rd_rst) begin
    if (rd_rst) begin
        wr_ptr_sync <= 0;
        wr_ptr_sync_d1 <= 0;
    end else begin
        wr_ptr_sync_d1 <= wr_ptr_gray;
        wr_ptr_sync <= wr_ptr_sync_d1;
    end
end

4. 空满判断的边界条件

空条件:同步后的写指针 == 读指针(格雷码比较)
满条件:写指针[MSB] != 读指针[MSB],且其他位相同(利用指针多1位的特性)

// 空满标志生成
assign empty = (rd_ptr_gray == wr_ptr_sync);
assign full = (wr_ptr_gray[ADDR_WIDTH] != rd_ptr_sync[ADDR_WIDTH]) && 
              (wr_ptr_gray[ADDR_WIDTH-1:0] == rd_ptr_sync[ADDR_WIDTH-1:0]);

5. 深度计算技巧

实际可用深度为2^n-1而非2^n。例如4位地址时:
- 理论深度=16,实际深度=15
- 这是通过将指针扩展1位(ADDR_WIDTH+1)实现的,多出的最高位用于区分满状态

6. 实测中的注意事项

  1. 复位时需同时清除所有指针和同步寄存器
  2. 读写使能不能同时拉高(除非设计允许)
  3. 格雷码比较前必须确保同步完成(通常需要2-3周期)

通过这种设计,异步FIFO可以达到100MHz以上的稳定传输速率。实际工程中还需加入几乎空/几乎满等扩展信号,以适应不同应用场景需求。

朗读
赞(0)
版权属于:

至尊技术网

本文链接:

https://www.zzwws.cn/archives/42114/(转载时请注明本文出处及文章链接)

评论 (0)