• 异步fifo设计(1)


    异步fifo的设计主要涉及读写指针的产生,空满状态的判断

    一:简单讲解

    重要参数:fifo深度(简单来说就是需要存多少个数据)

                     fifo位宽(每个数据的位宽)
    FIFO有同步异步两种,同步即读写时钟相同,异步即读写时钟不相同
    同步FIFO用的少,可以作为数据缓存
    异步FIFO可以解决跨时钟域的问题,在应用时需根据实际情况考虑好fifo深度即可
    本次要设计一个异步FIFO,深度为8,位宽也是8
    二:读写指针的产生(格雷码)
      深度为8,如果用二进制表示,3位即可,但这里要考虑空满状态。什么是空满状态呢?
      写满,读空,用一个写指针控制数据写入FIFO,读指针控制读取数据。当写指针将FIFO深度写满,这时称为写满;当读指针把数据都读了出来,这里称为读空。
      如果fifo是空的话,意味着该fifo的wr_ptr和rd_ptr的值是相等的。空状态一般有两种情况,一种是复位的时候由于wr_ptr和rd_ptr被清0,所以其值相等;另一种情况时rd_ptr的值增加之后追上了wr_ptr 的值,与其相等。如果fifo是满的话,也意味着wr_ptr和rd_ptr的值是相等的,但是需要注意的是此时wr_ptr实际上是将rd_ptr套圈之后再一次追上rd_ptr的值与其相等。这样的话空和满状态都意味着wr_ptr和rd_ptr的值是一样的,那么到底该如何区分是空状态和满状态呢?这就涉及到了异步fifo设计的第一个问题:如何产生fifo的读写指针。

             这里有两种解决办法,一种是增加一个额外的bit来区分;另外一种办法是利用grey码。

      第一种方法:我们在设计时将指针的位宽设计成 4 位,最高位的作用就是区分是读空还是写满。第一种方法易产生亚稳态等问题,所以不是我们要讲述的重点。具体理论 1 如下

      当最高位相同,其余位相同认为是读空
      当最高位不同,其余位相同认为是写满
      注意:理论1试用的是二进制数之间的空满比较判断。
      第二种方法:grey码
    1:grey码(贴不了照片,不知道怎么回事)
      格雷码判断是否为读空或写满时应使用理论 2,看最高位和次高位是否相等,具体如下:
           当最高位和次高位相同,其余位相同认为是读空
           当最高位和次高位不同,其余位相同认为是写满
                                               
     
      可以看出,除了最高位,上图的格雷码关于红线对称。
         格雷码如何产生呢?
      格雷码可由二进制码(十进制值同)^ 二进制码右移一位得到

       下面将介绍用到一组flip-flop的设计:这种设计输出端的寄存器存的是真正的grey码值(wr_ptr,rd_ptr),grey码输出通过Grey-to-binary转换器得到bin,bin经过一个条件增量器之后产生bnext信号,该值又传给Binary-to-grey转换器产生gnext信号。结构图如下所示:

        用到两组filp-flop的设计:这种设计没有Grey-to-binary转换器,并且可以直接映射到fifo内存的地址,也就省去了将fifo内存的地址转化为grey码的操作。该设计如下图所示:

       


      
  • 相关阅读:
    Linux 服务器连接远程数据库(Mysql、Pgsql)
    oracle主键自增
    全排列算法实现
    python动态导入包
    python发红包实现
    CentOS 6.8安装Oracle 11 g 解决xhost: unable to open display
    xargs的一个小坑
    利用ssh-copy-id复制公钥到多台服务器
    redhat 5 更换yum源
    【原创】Hadoop的IO模型(数据序列化,文件压缩)
  • 原文地址:https://www.cnblogs.com/xh13dream/p/9265042.html
Copyright © 2020-2023  润新知