A small-to-medium depth FIFO base FIFO_RBU

 1 -------------------------------------------------------------------------------
 2 -- Filename: fifo.vhd
 3 --
 4 -- Description:     
 5 -- A small-to-medium depth FIFO. 
 6 -- For data storage, the SRL elements native to the target FGPA family are used. 
 7 -- If the FIFO depth exceeds the available depth of the SRL elements,
 8 -- then SRLs are cascaded and MUXFN elements are used 
 9 -- to select the output of the appropriate SRL stage.
10 --
11 -- Features:
12 --
13 -- Width and depth are arbitrary, but each doubling of depth, 
14 -- starting from the native SRL depth, adds a level of MUXFN. 
15 -- Generally, in performance-oriented applications, 
16 -- the fifo depth may need to be limited to not exceed the SRL cascade depth 
17 -- supported by local fast interconnect or the number of MUXFN levels.
18 --
19 -- However, deeper fifos will correctly build.
20 --
21 -- Commands: read, write.
22 -- Flags: empty and full.
23 --
24 --
25 -- The Addr output is always one less than the current occupancy 
26 -- when the FIFO is non-empty, and is all ones when FIFO is empty. 
27 -- Therefore, the value <FIFO_Empty, Addr> as a signed value, 
28 -- is one less than the current occupancy. 
29 --
30 -- <'1', "1111" > => -1 + 1 =>  0 : FIFO is empty. 
31 --
32 -- <'0', "0000" > =>  0 + 1 =>  1 : FIFO has 1 data
33 -- <'0', "1111" > => 15 + 1 => 16 : FIFO has 16 data
34 --
35 -- <'0', "0000" > =>  0 + 1 =>  1 : FIFO has 1 data 
36 -- <'1', "1111" > => -1 + 1 =>  0 : FIFO is empty. 
37 --
38 -- This information can be used to generate additional flags, if needed.
39 --
40 ----------------------------------------------------------------------------------
41 library IEEE;
42 use IEEE.STD_LOGIC_1164.all;
43 
44 -- Uncomment the following library declaration if using
45 -- arithmetic functions with Signed or Unsigned values
46 use IEEE.NUMERIC_STD.all;
47 
48 -- Uncomment the following library declaration if instantiating
49 -- any Xilinx primitives in this code.
50 --library UNISIM;
51 --use UNISIM.VComponents.all;
52 use work.my_func_pack.all;
53 use work.my_comp_pack.all;
54 
55 entity fifo is
56   generic (
57     C_DWIDTH : natural := 8;
58     C_DEPTH  : positive := 16 );
59   port (
60     Clk        : in std_logic;
61     Reset      : in std_logic;
62     FIFO_Write : in std_logic;
63     Data_In    : in std_logic_vector(0 to C_DWIDTH-1);
64     FIFO_Read  : in std_logic;
65     Data_Out   : out std_logic_vector(0 to C_DWIDTH-1);
66     FIFO_Full  : out std_logic;
67     FIFO_Empty : out std_logic;
68     Addr       : out std_logic_vector(0 to clog2(C_DEPTH)-1)
69   );
70 end fifo;
71 
72 architecture Behavioral of fifo is
73 
74   constant ADDR_BITS : integer := clog2(C_DEPTH);
75   constant ZEROES    : std_logic_vector(0 to clog2(C_DEPTH)-1) := (others => '0');
76 
77 begin
78 
79   fifo_i : fifo_rbu
80   generic map (
81     C_DWIDTH => C_DWIDTH,
82     C_DEPTH  => C_DEPTH)
83   port map (
84     Clk           => Clk,
85     Reset         => Reset,
86     FIFO_Write    => FIFO_Write,
87     Data_In       => Data_In,
88     FIFO_Read     => FIFO_Read,
89     Data_Out      => Data_Out,
90     FIFO_Full     => FIFO_Full,
91     FIFO_Empty    => FIFO_Empty,
92     Addr          => Addr,
93     Num_To_Reread => ZEROES,
94     Underflow     => open,
95     Overflow      => open
96   );
97 
98 end Behavioral;
posted @ 2012-05-10 13:57  IAmAProgrammer  阅读(279)  评论(0编辑  收藏  举报