异步FIFO设计

同步器

  • 异步FIFO的作用:
    • 用于在不同时钟域之间安全地传输数据
  • 同步器
    • 对于跨时钟阈之间的信号传输,需要进行同步处理
    • 一般来讲,我们可以采用同步器(2-3级FF组成)对单bit的信号进行同步操作

image-20251012195950967

由于异步FIFO也涉及了跨时钟域,因此在具体的设计中需要用到同步器的相关内容

异步FIFO结构图

image-20251014125731167

具体设计中存在的重要点和注意事项:

  • 在读写指针中,不同时钟域之间要注意同步问题,bin和gray码之间的转换
  • 对于FIFO的标志信号,full对应的是写时钟域的,empty对应是读时钟域的

二进制/格雷码

  • 二进制转格雷码

使用格雷码的最高位作为二进制的最高位,二进制次高位产生过程是使用二进制的高位和次高位格雷码相异或得到,其他位的值与次高位产生过程类似

1
2
3
4
5
6
7
8
9
10
module bin2gray#(
parameter DATA_WIDTH = 8
)(
input [DATA_WIDTH-1: 0] bin_data ,
output [DATA_WIDTH-1: 0] gray_data
);

assign gray_data = (bin_data >> 1) ^ bin_data;

endmodule

image-20251012201539832

  • 格雷码转二进制
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
module gray2bin#(
parameter DATA_WIDTH = 8
)(
input [DATA_WIDTH-1: 0] gray_data ,
output reg [DATA_WIDTH-1: 0] bin_data
);

integer i;
always @(gray_data)begin
bin_data[DATA_WIDTH-1] = gray_data[DATA_WIDTH-1];
for(i = DATA_WIDTH-2; i >= 0; i = i - 1)begin
bin_data[i] = gray_data[i] ^ bin_data[i+1];
end
end

endmodule

image-20251012201758356

异步FIFO代码示例