日志档案

发表于 2007-2-2 0:12:29

6

标签: FIFO  VHDL  

同步FIFO之VHDL描述2

同步FIFO内部通过控制电路和RAM实现,控制电路主要包括写指针管理电路,读指针管理电路,以及FIFO状态判断电路,对于同步FIFO来讲,读和写的指针管理电路实际上就是二进制计数器。

       现在的FPGA都具有Block RAM,通过VHDL描述可以对其进行调用,为了能够实现任意深度和宽度的FIFO,那么在用VHDL描述RAM的时候需要使用generic使得RAM的调用能够参书化。同样,对于读写指针计数器,也需要参数化的描述方法。

       下面主要对FIFO的状态判断如何判断进行一些说明。假设宽度任意而深度为8FIFO,当读指针read_pointer和写指针write_pointer的值一样的时候,很显然,这时FIFO的状态为空。比较麻烦的是对FIFO是否已经满的状态的判断,因为存在两种情况,第一种情况时写指针write_pointer比读指针read_pointer大,比如writer_pointer = 7read_pointer = 0,还有一种情况时写指针writer_pointer比读指针read_pointer小,比如writer_pointer = 2read_pointer = 3。由于读写电路在循环的读写RAM,所以在上面的两种情况下FIFO实际上都已经满了。那么如何对读写指针的判断比较容易的得出FIFO已经满了,同时这样的判断电路还要容易参数化?第一种情况下,write_pointer – read_pointer = 7,实际上就是FIFO深度减一,第二种情况下,(write_pointer + 8) – read_pointer = 7,也是FIFO深度减一。从上面的讨论就可以很容易进行判断FIFO状态了,假设FIFO的深度用depth表示,则FIFO状态判断用伪码表示如下:

1.  Empty状态判断:

If writer_pointer = read_pointer

        FIFO is empty;

Else

     FIFO is not empty;

End if;

       2. Full状态判断:

              If writer_pointer > read_pointer

                     If write_pointer – read_pointer = depth

                            FIFO is full;

                     Else

                            FIFO is not full;

                     End if;

Else

       If write_pointer – read_pointer = 1

              FIFO is full;

       Else

              FIFO is not full;

       End if;

End if;

               下面的框图主要描述同步FIFO的内部结构,画出框图有助于对电路结构的理解,同样也有助于RTL代码的编写

         点击看大图

    

        今天就先写到这里吧,大家有什么问题和意见可以提出来,以便我及早的发现问题,不要等到要写代码的的时候才发现就麻烦了。

        欢迎访问skycanny的笔记(副站) ,别忘了投票哟!

 

 

系统分类: CPLD/FPGA   |   用户分类: FPGA/CPLD   |   来源: 原创   |   【推荐给朋友】   |   【添加到收藏夹】

    阅读(1167)    回复(2)  

投一票您将和博主都有获奖机会!

最新评论

  • sjh

    2007-4-3 10:57:13

    怎么用verilog实现除法的算法

  • riple

    2007-2-5 13:58:16

    好文,继续看。