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

Subversion Repositories srl_fifo

[/] [srl_fifo/] [branches/] [avendor/] [rtl/] [srl_fifo_32.vhd] - Blame information for rev 2

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

Line No. Rev Author Line
1 2 amulcock
----------------------------------------------------------------------------
2
----                                                                                                                ----
3
----                                                                                                                ----
4
---- This file is part of the srl_fifo project                                              ----
5
---- http://www.opencores.org/cores/srl_fifo                                            ----
6
----                                                                                                                ----
7
---- Description                                                                                                ----
8
---- Implementation of srl_fifo IP core according to                    ----
9
---- srl_fifo IP core specification document.                                   ----
10
----                                                                                                                ----
11
---- To Do:                                                                                                         ----
12
----    NA                                                                                                          ----
13
----                                                                                                                ----
14
---- Author(s):                                                                                             ----
15
----   Andrew Mulcock, amulcock@opencores.org                                   ----
16
----                                                                                                                ----
17
----------------------------------------------------------------------------
18
----                                                                                                                ----
19
---- Copyright (C) 2008 Authors and OPENCORES.ORG                                       ----
20
----                                                                                                                ----
21
---- This source file may be used and distributed without                               ----
22
---- restriction provided that this copyright statement is not                  ----
23
---- removed from the file and that any derivative work contains                ----
24
---- the original copyright notice and the associated disclaimer.               ----
25
----                                                                                                                ----
26
---- This source file is free software; you can redistribute it                 ----
27
---- and/or modify it under the terms of the GNU Lesser General             ----
28
---- Public License as published by the Free Software Foundation;               ----
29
---- either version 2.1 of the License, or (at your option) any                 ----
30
---- later version.                                                                                             ----
31
----                                                                                                                ----
32
---- This source is distributed in the hope that it will be                             ----
33
---- useful, but WITHOUT ANY WARRANTY; without even the implied         ----
34
---- warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR            ----
35
---- PURPOSE. See the GNU Lesser General Public License for more                ----
36
---- details.                                                                                                   ----
37
----                                                                                                                ----
38
---- You should have received a copy of the GNU Lesser General              ----
39
---- Public License along with this source; if not, download it                 ----
40
---- from http://www.opencores.org/lgpl.shtml                                           ----
41
----                                                                                                                ----
42
----------------------------------------------------------------------------
43
--                                                                                                                      ----
44
-- CVS Revision History                                                                                 ----
45
--                                                                                                                      ----
46
-- $Log: not supported by cvs2svn $                                                                                                         ----
47
--                                                                                                                      ----
48
--
49
-- quick description
50
--
51
--  Based upon the using a shift register as a fifo which has been 
52
--   around for years ( decades ), but really came of use to VHDL 
53
--   when the Xilinx FPGA's started having SRL's. 
54
--
55
--  In my view, the definitive article on shift register logic fifo's 
56
--   comes from Mr Chapman at Xilinx, in the form of his BBFIFO
57
--    tecXeclusive article, which as at early 2008, Xilinx have
58
--     removed.
59
--
60
-- This version is for 'later' devices that have an inherent shift
61
-- register of 32 bits.
62
--
63
 
64
library IEEE;
65
use IEEE.STD_LOGIC_1164.ALL;
66
use ieee.NUMERIC_STD.all;
67
 
68
entity srl_fifo_32 is
69
    generic ( width : integer := 8 ); -- set to how wide fifo is to be
70
    port(
71
        data_in      : in     std_logic_vector (width -1 downto 0);
72
        data_out     : out    std_logic_vector (width -1 downto 0);
73
        reset        : in     std_logic;
74
        write        : in     std_logic;
75
        read         : in     std_logic;
76
        full         : out    std_logic;
77
        half_full    : out    std_logic;
78
        data_present : out    std_logic;
79
        clk          : in     std_logic
80
    );
81
 
82
-- Declarations
83
 
84
end srl_fifo_32 ;
85
--
86
------------------------------------------------------------------------------------
87
--
88
architecture rtl of srl_fifo_32 is
89
--
90
------------------------------------------------------------------------------------
91
--
92
 
93
 
94
 
95
------------------------------------------------------------------------------------
96
--
97
------------------------------------------------------------------------------------
98
--
99
 
100
constant srl_length  : integer := 32;    -- set to srl 'type' 16 or 32 bit length
101
constant pointer_vec : integer := 5;    -- set to number of bits needed to store pointer = log2(srl_length)
102
 
103
type    srl_array       is array ( srl_length - 1  downto 0 ) of STD_LOGIC_VECTOR ( WIDTH - 1 downto 0 );
104
signal  fifo_store              : srl_array;
105
 
106
signal  pointer            : integer range 0 to srl_length - 1;
107
 
108
signal pointer_zero        : std_logic;
109
signal pointer_full        : std_logic;
110
signal valid_write         : std_logic;
111
signal half_full_int       : std_logic_vector( pointer_vec - 1 downto 0);
112
 
113
signal empty               : std_logic := '1';
114
signal valid_count         : std_logic ;
115
 
116
------------------------------------------------------------------------------------
117
--
118
------------------------------------------------------------------------------------
119
--      
120
begin
121
 
122
 
123
-- Valid write, high when valid to write data to the store.
124
valid_write <= '1' when ( read = '1' and write = '1' )
125
                    or  ( write = '1' and pointer_full = '0' ) else '0';
126
 
127
-- data store SRL's
128
data_srl :process( clk )
129
begin
130
    if rising_edge( clk ) then
131
        if valid_write = '1' then
132
            fifo_store <= fifo_store( fifo_store'left - 1 downto 0) & data_in;
133
        end if;
134
    end if;
135
end process;
136
 
137
data_out <= fifo_store( pointer );
138
 
139
 
140
process( clk)
141
begin
142
    if rising_edge( clk ) then
143
        if reset = '1' then
144
            empty <= '1';
145
        elsif empty = '1' and write = '1' then
146
            empty <= '0';
147
        elsif pointer_zero = '1' and read = '1' and write = '0' then
148
            empty <= '1';
149
        end if;
150
    end if;
151
end process;
152
 
153
 
154
 
155
--      W       R       Action
156
--      0        0        pointer <= pointer
157
--      0        1       pointer <= pointer - 1  Read, but no write, so less data in counter
158
--      1       0        pointer <= pointer + 1  Write, but no read, so more data in fifo
159
--      1       1       pointer <= pointer              Read and write, so same number of words in fifo
160
--
161
 
162
valid_count <= '1' when (
163
                             (write = '1' and read = '0' and pointer_full = '0' and empty = '0' )
164
                        or
165
                             (write = '0' and read = '1' and pointer_zero = '0' )
166
                         ) else '0';
167
process( clk )
168
begin
169
    if rising_edge( clk ) then
170
        if valid_count = '1' then
171
            if write = '1' then
172
                pointer <= pointer + 1;
173
            else
174
                pointer <= pointer - 1;
175
            end if;
176
        end if;
177
    end if;
178
end process;
179
 
180
 
181
  -- Detect when pointer is zero and maximum
182
pointer_zero <= '1' when pointer = 0 else '0';
183
pointer_full <= '1' when pointer = srl_length - 1 else '0';
184
 
185
 
186
 
187
 
188
  -- assign internal signals to outputs
189
  full <= pointer_full;
190
   half_full_int <= std_logic_vector(to_unsigned(pointer, pointer_vec));
191
   half_full <= half_full_int(half_full_int'left);
192
  data_present <= not( empty );
193
 
194
end rtl;
195
 
196
------------------------------------------------------------------------------------
197
--
198
------------------------------------------------------------------------------------
199
 
200
 

powered by: WebSVN 2.1.0

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