您的位置:技术中心首页 > 硬件语言 >> VHDL >> 同步FIFO之VHDL描述

同步FIFO之VHDL描述 (1)

作者:skycanny   时间:2007-09-28 16:09:38  来自:skycanny的笔记  浏览次数:0  文字大小:【】【】【

同步FIFOVHDL描述

       同步FIFO的意思是说FIFO的读写时钟是同一个时钟,不同于异步FIFO,异步FIFO的读写时钟是完全异步的。同步FIFO的对外接口包括时钟,清零,读请求,写请求,数据输入总线,数据输出总线,空以及满信号。下面分别对同步FIFO的对外接口信号作一描述:

1.  时钟,输入,用于同步FIFO的读和写,上升沿有效;

2.  清零,输入,异步清零信号,低电平有效,该信号有效时,FIFO被清空;

3.  写请求,输入,低电平有效,该信号有效时,表明外部电路请求向FIFO写入数据;

4.  读请求,输入,低电平有效,该信号有效时,表明外部电路请求从FIFO中读取数据;

5.  数据输入总线,输入,当写信号有效时,数据输入总线上的数据被写入到FIFO中;

6.  数据输出总线,输出,当读信号有效时,数据从FIFO中被读出并放到数据输出总线上;

7.  空,输出,高电平有效,当该信号有效时,表明FIFO中没有任何数据,全部为空;

8.  满,输出,高电平有效,当该信号有效时,表明FIFO已经满了,没有空间可用来存贮数据。

使用VHDL描述的FIFO将以上面的接口为基础,并且可以参数化配置FIFO的宽度和深度。先把对外接口描述出来吧。

---------------------------------------------------------------------------------------------------------

-- Designer            :      skycanny

-- Date                  :      2007-1-29

-- Description :      Synchronous FIFO created by VHDL

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

use ieee.std_logic_arith.all;

 

entity sfifo is

       generic(width  :      positive

                     depth      :      positive

                     );

       port

       (

              clk          :      in     std_logic;

              rst          :      in     std_logic;

              wq          :      in     std_logic;

              rq           :      in     std_logic;

              data         :      in     std_logic_vector(width - 1 downto 0);

              q            :      in     std_logic_vector(width - 1 downto 0);

              empty     :      out   std_logic;

              full   :      out   std_logic

       );

end entity sfifo;

-----------------------------------------------------------------------------------------------------------

 

同步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代码的编写

         点击看大图

    

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

 

今天又重新安装了UltraEdit, Quartus II6.0Modelsim SE 6.0,这次安装以后系统没有发现什么异常。另外还安装了紫光的拼音输入法,用习惯了这个,微软呀,智能ABC这些都用不太习惯。最后把系统备份了一下,以免将来出了什么问题还可以还原一下,呵呵。

 

           还是接着昨天的《同步FIFOVHDL描述》。突然发现用于实现FIFORAM必须是真正意义上的双口RAM,也就是读写可以同时进行的,以前只是用VHDL描述过单端口的RAM,双口RAM还没有描述过,不过曾经看到过Xilinx FPGA/CPLD的开发工具ISECore Genertor好像提供双口RAM的软核,所以我想用HDL语言也就应该可以描述从而调用双口RAM,这个等到具体写双口RAMRTL代码的时候再研究。还有一个问题就是FIFO的读写请求控制信号必须要控制FIFO读写指针的产生电路,只有读写信号信号有效的时候,FIFO读写指针才能是有效的,负责是无效而且要保持不变,这个容易理解。

              今天,就先完成写指针产生和管理电路的RTL代码吧,其实很简单,就是一个二进制计数器。下面就是VHDL的代码,大家看看有没有什么问题。

-----------------------------------------------------------------------------------------------------------

-- Designer            :      skycanny

-- Date                  :      2007-2-2

-- Description :      write_pointer is created

-- Modification       :      add  FIFO status full judge  2007-2-3 skycanny

 

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

use ieee.std_logic_arith.all;

 

entity write_pointer is

       generic

       (

              depth      :      positive  

       );

       port

       (

              clk          :      in     std_logic;

              rst          :      in     std_logic;

              wq          :      in     std_logic;

              full          :      in     std_logic;

              wr_pt      :      out   std_logic_vector(depth - 1 downto 0)         

       );

end entity;

 

architecture RTL of write_pointer is

signal      wr_pt_t   :      std_logic_vector(depth - 1 downto 0);  -- writer pointer counter

 

begin

       process(rst, clk)

       begin

              if rst = '0' then

                     wr_pt_t <= (others => '0');

              elsif clk'event and clk = '1' then

                     if wq = '0' and full = '0' then

                            wr_pt_t <= wr_pt_t + 1;

                     end if;

       end process;

       wr_pt <= wr_pt_t;

end RTL;

------------------------------------------------------------------------------------------------------------

[1] [2]
责任编辑:5life

更多相关 VHDL FIFO 的文章

双口RAM的VHDL testbench [2007-09-28]
异步FIFO的VHDL设计 [2007-09-28]
PS/2键盘时钟的VHDL描述技巧 [2007-09-28]
VHDL编程设计技巧 [2007-09-28]
VHDL 的设计技巧 [2007-09-28]
HDL语言的历史 [2006-02-27]
Verilog学习笔记(More) [2006-02-27]
硬件描述语言HDL的现状与发展 [2006-01-06]
一个可以综合的Verilog 写的FIFO存储器 [2005-12-18]
硬件描述语言(HDL)的基础知识及其应用 [2005-12-18]
本文共有0条评论,现在显示最新的5条。

栏目导航

电路基础
硬件语言
逻辑验证
电路综合
后端设计
可测设计
基本逻辑
制造工艺
书籍精选
说文解字
工具学习
数字滤波
趣闻逸事
数字锁相
设计杂项
低耗设计

站点最新

更多相关链接

  同步FIFO之VHDL描述
  双口RAM的VHDL testbench
  异步FIFO的VHDL设计
  PS/2键盘时钟的VHDL描述技巧
  VHDL编程设计技巧
  VHDL 的设计技巧

栏目最新

更多相关链接

  同步FIFO之VHDL描述
  双口RAM的VHDL testbench
  异步FIFO的VHDL设计
  PS/2键盘时钟的VHDL描述技巧
  VHDL编程设计技巧
  VHDL 的设计技巧

热点文章

更多相关链接

  VHDL 的设计技巧
  PS/2键盘时钟的VHDL描述技巧
  VHDL编程设计技巧
  异步FIFO的VHDL设计
  双口RAM的VHDL testbench
  同步FIFO之VHDL描述