OpenCores
URL https://opencores.org/ocsvn/wb_uart/wb_uart/trunk

Subversion Repositories wb_uart

[/] [wb_uart/] [trunk/] [src/] [slib_fifo.vhd] - Blame information for rev 16

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 14 federico.a
--
2
-- FIFO
3
--
4
-- Author:   Sebastian Witt
5
-- Date:     29.01.2008
6
-- Version:  1.3
7
--
8
-- This code is free software; you can redistribute it and/or
9
-- modify it under the terms of the GNU Lesser General Public
10
-- License as published by the Free Software Foundation; either
11
-- version 2.1 of the License, or (at your option) any later version.
12
--
13
-- This code is distributed in the hope that it will be useful,
14
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
15
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16
-- Lesser General Public License for more details.
17
--
18
-- You should have received a copy of the GNU Lesser General Public
19
-- License along with this library; if not, write to the
20
-- Free Software  Foundation, Inc., 59 Temple Place, Suite 330,
21
-- Boston, MA  02111-1307  USA
22
--
23
 
24
LIBRARY IEEE;
25
USE IEEE.std_logic_1164.all;
26
USE IEEE.numeric_std.all;
27
 
28
 
29
entity slib_fifo is
30
    generic (
31
        WIDTH       : integer := 8;                             -- FIFO width
32
        SIZE_E      : integer := 6                              -- FIFO size (2^SIZE_E)
33
    );
34
    port (
35
        CLK         : in std_logic;                             -- Clock
36
        RST         : in std_logic;                             -- Reset
37
        CLEAR       : in std_logic;                             -- Clear FIFO
38
        WRITE       : in std_logic;                             -- Write to FIFO
39
        READ        : in std_logic;                             -- Read from FIFO
40
        D           : in std_logic_vector(WIDTH-1 downto 0);    -- FIFO input
41
        Q           : out std_logic_vector(WIDTH-1 downto 0);   -- FIFO output
42
        EMPTY       : out std_logic;                            -- FIFO is empty
43
        FULL        : out std_logic;                            -- FIFO is full
44
        USAGE       : out std_logic_vector(SIZE_E-1 downto 0)   -- FIFO usage
45
    );
46
end slib_fifo;
47
 
48
architecture rtl of slib_fifo is
49
    -- Signals
50
    signal iEMPTY   : std_logic;                                -- Internal EMPTY
51
    signal iFULL    : std_logic;                                -- Internal FULL
52
    signal iWRAddr  : unsigned(SIZE_E downto 0);                -- FIFO write address
53
    signal iRDAddr  : unsigned(SIZE_E downto 0);                -- FIFO read address
54
    signal iUSAGE   : unsigned(SIZE_E-1 downto 0);              -- FIFO usage
55
    -- FIFO memory
56
    type FIFO_Mem_Type is array (2**SIZE_E-1 downto 0) of std_logic_vector(WIDTH-1 downto 0);
57
    signal iFIFOMem : FIFO_Mem_Type := (others => (others => '0'));
58
 
59
begin
60
    -- Full signal (biggest difference of read and write address)
61
    iFULL <= '1' when (iRDAddr(SIZE_E-1 downto 0) = iWRAddr(SIZE_E-1 downto 0)) and
62
                      (iRDAddr(SIZE_E)           /= iWRAddr(SIZE_E)) else '0';
63
 
64
    -- Write/read address counter and empty signal
65
    FF_ADDR: process (RST, CLK)
66
    begin
67
        if (RST = '1') then
68
            iWRAddr <= (others => '0');
69
            iRDAddr <= (others => '0');
70
            iEMPTY  <= '1';
71
        elsif (CLK'event and CLK='1') then
72
            if (WRITE = '1' and iFULL = '0') then       -- Write to FIFO
73
                iWRAddr <= iWRAddr + 1;
74
            end if;
75
 
76
            if (READ = '1' and iEMPTY = '0') then       -- Read from FIFO
77
                iRDAddr <= iRDAddr + 1;
78
            end if;
79
 
80
            if (CLEAR = '1') then                       -- Reset FIFO
81
                iWRAddr <= (others => '0');
82
                iRDAddr <= (others => '0');
83
            end if;
84
 
85
            if (iRDAddr = iWRAddr) then                 -- Empty signal (read address same as write address)
86
                iEMPTY <= '1';
87
            else
88
                iEMPTY <= '0';
89
            end if;
90
        end if;
91
    end process;
92
 
93
    -- FIFO memory process
94
    FF_MEM: process (RST, CLK)
95
    begin
96
        if (RST = '1') then
97
            --iFIFOMem(2**SIZE_E-1 downto 0) <= (others => (others => '0'));
98
        elsif (CLK'event and CLK = '1') then
99
            if (WRITE = '1' and iFULL = '0') then
100
                iFIFOMem(to_integer(iWRAddr(SIZE_E-1 downto 0))) <= D;
101
            end if;
102
            Q <= iFIFOMem(to_integer(iRDAddr(SIZE_E-1 downto 0)));
103
        end if;
104
    end process;
105
 
106
    -- Usage counter
107
    FF_USAGE: process (RST, CLK)
108
    begin
109
        if (RST = '1') then
110
            iUSAGE <= (others => '0');
111
        elsif (CLK'event and CLK = '1') then
112
            if (CLEAR = '1') then
113
                iUSAGE <= (others => '0');
114
            else
115
                if (READ = '0' and WRITE = '1' and iFULL = '0') then
116
                    iUSAGE <= iUSAGE + 1;
117
                end if;
118
                if (WRITE = '0' and READ = '1' and iEMPTY = '0') then
119
                    iUSAGE <= iUSAGE - 1;
120
                end if;
121
            end if;
122
        end if;
123
    end process;
124
 
125
    -- Output signals
126
    EMPTY <= iEMPTY;
127
    FULL  <= iFULL;
128
    USAGE <= std_logic_vector(iUSAGE);
129
 
130
end rtl;
131
 
132
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.