1 -- 'Bucket Brigade' FIFO
2 -- 16 deep
3 -- 8-bit data
4 --
5 -- Version : 1.10
6 -- Version Date : 3rd December 2003
7 -- Reason : '--translate' directives changed to '--synthesis translate' directives
8 --
9 -- Version : 1.00
10 -- Version Date : 14th October 2002
11 --
12 -- Start of design entry : 14th October 2002
13 --
14 -- Ken Chapman
15 -- Xilinx Ltd
16 -- Benchmark House
17 -- 203 Brooklands Road
18 -- Weybridge
19 -- Surrey KT13 ORH
20 -- United Kingdom
21 --
22 -- chapman@xilinx.com
23 --
24 ------------------------------------------------------------------------------------
25 --
26 -- NOTICE:
27 --
28 -- Copyright Xilinx, Inc. 2002. This code may be contain portions patented by other
29 -- third parties. By providing this core as one possible implementation of a standard,
30 -- Xilinx is making no representation that the provided implementation of this standard
31 -- is free from any claims of infringement by any third party. Xilinx expressly
32 -- disclaims any warranty with respect to the adequacy of the implementation, including
33 -- but not limited to any warranty or representation that the implementation is free
34 -- from claims of any third party. Futhermore, Xilinx is providing this core as a
35 -- courtesy to you and suggests that you contact all third parties to obtain the
36 -- necessary rights to use this implementation.
37 --
38 ------------------------------------------------------------------------------------
39 --
40 -- Library declarations
41 --
42 -- The Unisim Library is used to define Xilinx primitives. It is also used during
43 -- simulation. The source can be viewed at %XILINX%\vhdl\src\unisims\unisim_VCOMP.vhd
44 --
45 ------------------------------------------------------------------------------------
46
47 library IEEE;
48 use IEEE.STD_LOGIC_1164.all;
49 use IEEE.STD_LOGIC_ARITH.all;
50 use IEEE.STD_LOGIC_UNSIGNED.all;
51 library unisim;
52 use unisim.vcomponents.all;
53
54 entity bbfifo_comp is
55 generic ( C_DWIDTH : positive := 8);
56 port (
57 i_reset : in std_logic;
58 i_clock : in std_logic;
59 i_fifo_wr : in std_logic;
60 i_fifo_rd : in std_logic;
61 o_fifo_full : out std_logic;
62 o_fifo_half_full : out std_logic;
63 o_fifo_data_present : out std_logic;
64 i_fifo_wdata : in std_logic_vector(C_DWIDTH-1 downto 0);
65 o_fifo_rdata : out std_logic_vector(C_DWIDTH-1 downto 0));
66 end bbfifo_comp;
67
68 architecture low_level_definition of bbfifo_comp is
69
70 signal pointer : std_logic_vector(3 downto 0);
71 signal next_count : std_logic_vector(3 downto 0);
72 signal half_count : std_logic_vector(3 downto 0);
73 signal count_carry : std_logic_vector(2 downto 0);
74 signal pointer_zero : std_logic;
75 signal pointer_full : std_logic;
76 signal decode_data_present : std_logic;
77 signal data_present_int : std_logic;
78 signal valid_write : std_logic;
79
80 ------------------------------------------------------------------------------------
81 -- Attributes to define LUT contents during implementation
82 -- The information is repeated in the generic map for functional simulation--
83 ------------------------------------------------------------------------------------
84 attribute INIT : string;
85 attribute INIT of zero_lut : label is "0001";
86 attribute INIT of full_lut : label is "8000";
87 attribute INIT of dp_lut : label is "BFA0";
88 attribute INIT of valid_lut : label is "C4";
89
90 begin
91
92 data_width_loop : for i in 0 to C_DWIDTH-1 generate
93 attribute INIT : string;
94 attribute INIT of data_srl : label is "0000";
95 begin
96 data_srl : SRL16E
97 --synthesis translate_off
98 generic map (INIT => X"0000")
99 --synthesis translate_on
100 port map(
101 D => i_fifo_wdata(i),
102 CE => valid_write,
103 CLK => i_clock,
104 A0 => pointer(0),
105 A1 => pointer(1),
106 A2 => pointer(2),
107 A3 => pointer(3),
108 Q => o_fifo_rdata(i) );
109 end generate data_width_loop;
110
111 -- 4-bit counter to act as data pointer
112 -- Counter is clock enabled by 'o_fifo_data_present'
113 -- Counter will be i_reset when 'i_reset' is active
114 -- Counter will increment when 'valid_write' is active
115 count_width_loop : for i in 0 to 3 generate
116 attribute INIT : string;
117 attribute INIT of count_lut : label is "6606";
118 begin
119 register_bit : FDRE
120 port map (
121 D => next_count(i),
122 Q => pointer(i),
123 CE => data_present_int,
124 R => i_reset,
125 C => i_clock);
126
127 count_lut : LUT4
128 --synthesis translate_off
129 generic map (INIT => X"6606")
130 --synthesis translate_on
131 port map(
132 I0 => pointer(i),
133 I1 => i_fifo_rd,
134 I2 => pointer_zero,
135 I3 => i_fifo_wr,
136 O => half_count(i));
137
138 lsb_count : if i = 0 generate
139 begin
140
141 count_muxcy : MUXCY
142 port map(
143 DI => pointer(i),
144 CI => valid_write,
145 S => half_count(i),
146 O => count_carry(i));
147
148 count_xor : XORCY
149 port map(
150 LI => half_count(i),
151 CI => valid_write,
152 O => next_count(i));
153
154 end generate lsb_count;
155
156 mid_count : if i > 0 and i < 3 generate
157 begin
158
159 count_muxcy : MUXCY
160 port map(
161 DI => pointer(i),
162 CI => count_carry(i-1),
163 S => half_count(i),
164 O => count_carry(i));
165
166 count_xor : XORCY
167 port map(
168 LI => half_count(i),
169 CI => count_carry(i-1),
170 O => next_count(i));
171
172 end generate mid_count;
173
174 upper_count : if i = 3 generate
175 begin
176
177 count_xor : XORCY
178 port map(
179 LI => half_count(i),
180 CI => count_carry(i-1),
181 O => next_count(i));
182
183 end generate upper_count;
184
185 end generate count_width_loop;
186
187
188 -- Detect when pointer is zero and maximum
189 zero_lut : LUT4
190 --synthesis translate_off
191 generic map (INIT => X"0001")
192 --synthesis translate_on
193 port map(
194 I0 => pointer(0),
195 I1 => pointer(1),
196 I2 => pointer(2),
197 I3 => pointer(3),
198 O => pointer_zero );
199
200
201 full_lut : LUT4
202 --synthesis translate_off
203 generic map (INIT => X"8000")
204 --synthesis translate_on
205 port map(
206 I0 => pointer(0),
207 I1 => pointer(1),
208 I2 => pointer(2),
209 I3 => pointer(3),
210 O => pointer_full );
211
212
213 -- Data Present status
214 dp_lut : LUT4
215 --synthesis translate_off
216 generic map (INIT => X"BFA0")
217 --synthesis translate_on
218 port map(
219 I0 => i_fifo_wr,
220 I1 => i_fifo_rd,
221 I2 => pointer_zero,
222 I3 => data_present_int,
223 O => decode_data_present );
224
225 dp_flop : FDR
226 port map (
227 D => decode_data_present,
228 Q => data_present_int,
229 R => i_reset,
230 C => i_clock);
231
232 -- Valid i_fifo_wr signal
233
234 valid_lut : LUT3
235 --synthesis translate_off
236 generic map (INIT => X"C4")
237 --synthesis translate_on
238 port map(
239 I0 => pointer_full,
240 I1 => i_fifo_wr,
241 I2 => i_fifo_rd,
242 O => valid_write );
243
244 -- assign internal signals to outputs
245 o_fifo_full <= pointer_full;
246 o_fifo_half_full <= pointer( 3 );
247 o_fifo_data_present <= data_present_int;
248
249 end low_level_definition;
250
251 library IEEE;
252 use IEEE.STD_LOGIC_1164.all;
253
254 -- Uncomment the following library declaration if using
255 -- arithmetic functions with Signed or Unsigned values
256 use IEEE.NUMERIC_STD.all;
257
258 -- Uncomment the following library declaration if instantiating
259 -- any Xilinx primitives in this code.
260 --library UNISIM;
261 --use UNISIM.VComponents.all;
262
263 entity bbfifo is
264 generic (
265 C_DWIDTH : positive := 8;
266 C_STAGE : positive := 6);
267 port (
268 i_reset : in std_logic;
269 i_clock : in std_logic;
270 i_fifo_wr : in std_logic;
271 i_fifo_rd : in std_logic;
272 i_fifo_wdata : in std_logic_vector(C_DWIDTH-1 downto 0);
273 o_fifo_rdata : out std_logic_vector(C_DWIDTH-1 downto 0);
274 o_fifo_full : out std_logic;
275 o_fifo_half_full : out std_logic;
276 o_fifo_data_present : out std_logic);
277 end bbfifo;
278
279 architecture Behavioral of bbfifo is
280
281 type fifo_data_type is array (C_STAGE downto 1) of std_logic_vector (C_DWIDTH-1 downto 0);
282 signal fifo_wdata : fifo_data_type;
283 signal fifo_rdata : fifo_data_type;
284 signal fifo_full : std_logic_vector(C_STAGE downto 1);
285 signal fifo_half_full : std_logic_vector(C_STAGE downto 1);
286 signal fifo_data_present : std_logic_vector(C_STAGE downto 1);
287 signal fifo_write : std_logic_vector(C_STAGE downto 1);
288 signal fifo_read : std_logic_vector(C_STAGE downto 1);
289
290 component bbfifo_comp
291 generic ( C_DWIDTH : positive := 8);
292 port (
293 i_reset : in std_logic;
294 i_clock : in std_logic;
295 i_fifo_wr : in std_logic;
296 i_fifo_rd : in std_logic;
297 o_fifo_full : out std_logic;
298 o_fifo_half_full : out std_logic;
299 o_fifo_data_present : out std_logic;
300 i_fifo_wdata : in std_logic_vector(C_DWIDTH-1 downto 0);
301 o_fifo_rdata : out std_logic_vector(C_DWIDTH-1 downto 0));
302 end component;
303
304 begin
305
306 o_fifo_full <= fifo_full(1);
307 o_fifo_rdata <= fifo_rdata(C_STAGE);
308 o_fifo_data_present <= fifo_data_present(C_STAGE);
309 o_fifo_half_full <= fifo_half_full((C_STAGE+1)/2) when C_STAGE rem 2 = 1 else
310 fifo_full( (C_STAGE+2) / 2 ); -- C_STAGE rem 2 = 0
311
312 G : for i in 1 to C_STAGE generate
313
314 bbfifo_comp_x : bbfifo_comp
315 generic map (
316 C_DWIDTH => C_DWIDTH )
317 port map (
318 i_reset => i_reset,
319 i_clock => i_clock,
320 i_fifo_wr => fifo_write(i),
321 i_fifo_rd => fifo_read(i),
322 o_fifo_full => fifo_full(i),
323 o_fifo_half_full => fifo_half_full(i),
324 o_fifo_data_present => fifo_data_present(i),
325 i_fifo_wdata => fifo_wdata(i),
326 o_fifo_rdata => fifo_rdata(i)
327 );
328
329 fifo_write_G1 : if i = 1 generate
330 fifo_write(1) <= i_fifo_wr;
331 fifo_wdata(1) <= i_fifo_wdata;
332 end generate fifo_write_G1;
333
334 -- Stage n is written when there is data in stage n-1 and stage n is not full.
335 -- This transfer of data also results in the corresponding read from stage n-1.
336 -- The transfer control signal is a single cycle pulse
337 -- to give time for the data present output of stage n-1
338 -- to respond to read event and go Low if possible.
339 fifo_write_Gx : if i > 1 generate
340 fifo_wdata(i) <= fifo_rdata(i-1);
341 process ( i_clock )
342 begin
343 if rising_edge( i_clock ) then
344 fifo_write(i) <= fifo_data_present(i-1) and not fifo_full(i) and not fifo_write(i);
345 end if;
346 end process;
347 end generate fifo_write_Gx;
348
349 fifo_read_Gn : if i = C_STAGE generate
350 fifo_read(C_STAGE) <= i_fifo_rd;
351 end generate fifo_read_Gn;
352
353 fifo_read_Gx : if i < C_STAGE generate
354 fifo_read(i) <= fifo_write(i+1);
355 end generate fifo_read_Gx;
356
357 end generate G;
358
359 end Behavioral;