同步FIFO和异步FIFO总结 您所在的位置:网站首页 同步器出现问题的原因 同步FIFO和异步FIFO总结

同步FIFO和异步FIFO总结

#同步FIFO和异步FIFO总结| 来源: 网络整理| 查看: 265

文章目录 1. FIFO简介2. 使用场景3. 分类4. FIFO的常见参数5. FIFO设计5.1 空满标志生成5.2 异步FIFO的设计还要注意跨时钟域问题5.3 gray码如何判断空满 `6. 同步FIFO实现`7. 异步FIFO实现8. 对FIFO进行约束9. 关于异步FIFO最小深度的计算9.1 写时钟快于读时钟,写和读的过程中没有空闲周期9.2 写时钟频率大于读时钟频率,但在读写的过程中存在空闲周期9.3 写时钟慢于读时钟,且读写过程中没有空闲周期9.4 写时钟频率小于读时钟频率,但读写过程中存在空闲周期9.5 读写时钟速率相同,且无空闲时钟9.6 读写时钟频率一致,但在读写过程中存在空闲周期9.7 特定条件下,最坏情况分析FIFO最小深度9.8 条件拐弯抹角的给出,需要自己提取关键信息9.9 其它情况 9. Vivado FIFO IP核使用10. FIFO IP使用注意事项

1. FIFO简介

FIFO是一种先进先出数据缓存器,它与普通存储器的区别是没有外部读写地址线,使用起来非常简单,缺点是只能顺序读写,而不能随机读写。

2. 使用场景 数据缓冲:也就是数据写入过快,并且间隔时间长,也就是突发写入。那么通过设置一定深度的FIFO,可以起到数据暂存的功能,且使得后续处理流程平滑。时钟域的隔离:主要用异步FIFO。对于不同时钟域的数据传输,可以通过FIFO进行隔离,避免跨时钟域的数据传输带来的设计和约束上的复杂度。比如FIFO的一端是AD,另一端是PCI;AD的采集速率是16位100KSPS,每秒的数据量是1.6Mbps。而PCI总线的速度是33MHz,总线宽度是32位用于不同宽度的数据接口。例如单片机是8位,DSP是16。 3. 分类

同步FIFO:指读时钟和写时钟是同一个时钟 异步FIFO:指读写时钟是不同的时钟。

4. FIFO的常见参数 FIFO的宽度:即FIFO一次读写操作的数据位;FIFO的深度:指的是FIFO可以存储多少个N位的数据(如果宽度为N)。满标志:FIFO已满或将要满时由FIFO的状态电路送出的一个信号,以阻止FIFO的写操作继续向FIFO中写数据而造成溢出(overflow)。空标志:FIFO已空或将要空时由FIFO的状态电路送出的一个信号,以阻止FIFO的读操作继续从FIFO中读出数据而造成无效数据的读出(underflow)。读时钟:读操作所遵循的时钟,在每个时钟沿来临时读数据。写时钟:写操作所遵循的时钟,在每个时钟沿来临时写数据。 5. FIFO设计 5.1 空满标志生成 FIFO设计的关键是产生可靠的FIFO读写指针和生成FIFO空/满状态标志。 当读写指针相等时,表明FIFO为空,这种情况发生在复位操作时;或者当读指针读出FIFO中最后一个字后,追赶上了写指针时,这时FIFO处于满的状态。 为了区分到底是满状态还是空状态,可以采用以下方法: 方法1:在指针中添加一个额外的位(extra bit),当写指针增加并越过最后一个FIFO地址时,就将写指针这个未用的MSB加1,其它位回零。对读指针也进行同样的操作。此时,对于深度为2^n的FIFO,需要的读/写指针位宽为(n+1)位,如对于深度为8的FIFO,需要采用4bit的计数器,0000~1000、1001~1111,MSB作为折回标志位,而低3位作为地址指针。 如果两个指针的MSB不同,说明写指针比读指针多折回了一次;如r_addr=0000,而w_addr = 1000,为满。如果两个指针的MSB相同,则说明两个指针折回的次数相等。其余位相等,说明FIFO为空; 5.2 异步FIFO的设计还要注意跨时钟域问题

将一个二进制的计数值从一个时钟域同步到另一个时钟域的时候很容易出现问题,因为采用二进制计数器时所有位都可能同时变化,在同一个时钟沿同步多个信号的变化会产生亚稳态问题。而使用格雷码只有一位变化,因此在两个时钟域间同步多个位不会产生问题。所以需要一个二进制到gray码的转换电路,将地址值转换为相应的gray码,然后将该gray码同步到另一个时钟域进行对比,作为空满状态的检测

5.3 gray码如何判断空满

对于“空”的判断:依然依据二者完全相等(包括MSB); 对于“满”的判断:如下图,由于gray码除了MSB外,具有镜像对称的特点,当读指针指向7,写指针指向8时,除了MSB,其余位皆相同,不能说它为满。因此不能单纯的只检测最高位了,在gray码上判断为满必须同时满足以下3条:

wptr和同步过来的rptr的MSB不相等,因为wptr必须比rptr多折回一次。wptr与rptr的次高位不相等,如上图位置7和位置15,转化为二进制对应的是0111和1111,MSB不同说明多折回一次,111相同代表同一位置。剩下的其余位完全相等 6. 同步FIFO实现

image.png 参考链接:https://blog.csdn.net/HengZo/article/details/49683707

代码的核心部分主要是data_count,并且full 信号是当data_count == DATA_DEPTH时拉高,除了data_count之外,还可以同过判断r_ptr和w_ptr两个指针是否相等来判断空,满信号 ssign empty = (w_ptr == r_ptr) ? 1 : 0; assign full = (w_ptr[2:0] == r_ptr[2:0] && (w_ptr[3] == ~r_ptr[3])) ? 1 : 0;

这里还有一个注意的点,也就是w_ptr++会越界,同步FIFO就算用data_cnt来判断空满条件,在存数据和写数据时还是应该用w_ptr来表示,如果直接用data_cnt来表示,那么设计的就是一个栈而不是FIFO了。 module syn_fifo( clk, rst_n, data_in, w_en, full, data_out, r_en, empty); parameter DATA_WIDTH = 8; parameter DATA_DEPTH = 16; parameter ADDR_WIDTH = 4; input wire clk, rst_n; input wire [DATA_WIDTH-1:0] data_in; input wire w_en, r_en; output wire empty, full; output reg [DATA_WIDTH-1:0] data_out; reg [ADDR_WIDTH : 0] data_count; reg [ADDR_WIDTH-1 : 0] w_ptr, r_ptr; reg [DATA_WIDTH-1 : 0] mem[0 : DATA_DEPTH-1]; assign empty = (data_count == 'd0) ? 1 : 0; assign full = (data_count == DATA_DEPTH) ? 1 : 0; //data_count == DATA_DEPTH always @ (posedge clk or negedge rst_n) begin if (!rst_n) data_count


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有