zoukankan      html  css  js  c++  java
  • FPGA Asynchronous FIFO设计思路(2)

    FPGA Asynchronous FIFO设计思路(2

    首先讨论格雷码的编码方式:

     

        先看4bit的格雷码,当MSB0时,正向计数,当MSB1时,即指针已经走过一遍了,最高位翻转,此时的格雷码是反向计数,这其中整套数据以最大值(深度)为对称中心,每一个数均符合格雷码的要求,即下一个状态比上一个状态只有1bit的变化。

    3bit的格雷码,在最高位反向后,即指针达到了FIFO最后一个地址,低位开始重新计数,此时存在一个问题是,在最高位跳转的地方,有两bite的数据发生变化,违背了格雷码的规律。

     

        以上为一种利用格雷码来产生数据指针的模型,使用格雷码来传递FIFO指针数据,那么FIFO的深度一定是pow2,以上模型中,指针ptr先通过gray to binary comb logic 模块,将格雷码转化成二进制数据,然后进行加一操作,得到bnext,然后通过binary to gray comb logic bnext转化为gnext, 然后gnext通过寄存器输出得到新的数据指针ptr.再通过gnext的最高位和次高位,计算出addrmsb.

     

        以上是第二种数据指针生成模型,首先是,数据地址即指针去掉最高位后,参与加一运算,得到新的数据地址,采用二进制的形式。

      然后加一得到的新数据地址进行格雷码转换,得到gnext的值,然后通过寄存器输出,即此模型同时输出数据指针(采用的格雷码)和数据地址值(采用二进制)。

     

     以上为FIFO的一种整体设计模型。

     

     实际操作中,空满标志位信号生成的问题

     

     具体逻辑不用多说

     

        关于空信号的生成,最高位,以及数据地址完全相等,即可以判断为空。

        关于满信号的生成即复杂一些:

     

         如果采用以前的判断依据,指针的最高位不同,剩下的数据地址完全相同,如果采用的是格雷码编码方式,就会出现问题。

     

          满信号的判断依据中指出读指针和写指针的最高两位同时不同,剩下的相同,即可以判断FIFO满。

     

  • 相关阅读:
    如何保证access_token长期有效
    微信自定义菜单的创建
    是否同一棵二叉搜索树
    Tree Traversals Again(根据前序,中序,确定后序顺序)
    List Leaves 树的层序遍历
    leetcode-优美的排列
    leetcode-下一个排列
    leetcode-二进制手表
    leetcode-组合总数III(回溯)
    leetcode-累加数(C++)
  • 原文地址:https://www.cnblogs.com/chensimin1990/p/9854625.html
Copyright © 2011-2022 走看看