在异步FIFO中,数据读取和写入操作使用不同的时钟频率。由于写入和读取时钟不同步,因此称为异步FIFO。通常,这些用于数据需要从一个时钟域传递到另一个时钟域的系统中,这通常称为“时钟域交叉”。因此,异步FIFO有助于在两个工作于不同时钟的系统之间同步数据流。
异步FIFO框图
信号:
wr_en:写使能
wr_data:写入数据
full:FIFO 已满
empty:FIFO 为空
rd_en:读取启用
rd_data:读取数据
b_wptr:二进制写入指针
g_wptr:格雷码写入指针
b_wptr_next:二进制写入指针 下一页
g_wptr_next: 下一个格雷码写指针
b_rptr:二进制读取指针
g_rptr:格雷码读取指针
b_rptr_next: 下一个二进制读取指针
g_rptr_next:下一个格雷码读取指针
b_rptr_sync:二进制读取指针同步
b_wptr_sync:二进制写入指针同步
异步FIFO操作
在同步FIFO的情况下,写入和读取指针在同一时钟上生成。但是,在异步FIFO的情况下,写入指针与写入时钟域对齐,而读取指针与读取时钟域对齐。因此,它需要域交叉来计算FIFO的满条件和空条件。这会导致实际设计中的亚稳态。为了解决这种亚稳态问题,可以使用2个触发器或3个触发器同步器来传递写入和读取指针。为了解释,我们将使用 2 个触发器同步器。请注意,单个“两拍同步器”只能解析一位的亚稳态。因此,根据写入和读取指针的不同,需要多个 两拍 同步器。文章来源:https://www.toymoban.com/news/detail-827490.html
文章来源地址https://www.toymoban.com/news/detail-827490.html
module synchronizer
#(parameter WIDTH=3)
(input clk,
rst_n,
[WIDTH:0] d_in,
output reg [WIDTH:0] d_out
);
reg [WIDTH:0] q1;
always@(posedge clk) begin
if(!rst_n) begin
q1 <= 0;
d_out <= 0;
end
else begin
q1 <= d_in;
d_out <= q1;
end
end
endmodule
在异步FIFO中使用二进制到格雷码转换器ÿ
到了这里,关于IC设计入门——异步FIFO的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!