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

Subversion Repositories fifo_srl_uni

[/] [fifo_srl_uni/] [trunk/] [fifo_srl_uni.vhd] - Blame information for rev 6

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 3 aTomek1328
-------------------------------------------------------------------------------
2
-- Title      : Parametrilayze based on SRL16 shift register FIFO
3
-- Project    : 
4
-------------------------------------------------------------------------------
5
-- File       : fifo_srl_uni.vhd
6
-- Author     : Tomasz Turek  <tomasz.turek@gmail.com>
7
-- Company    : SzuWar INC
8
-- Created    : 13:27:31 14-03-2010
9 6 aTomek1328
-- Last update: 15:02:32 21-03-2010
10 3 aTomek1328
-- Platform   : Xilinx ISE 10.1.03
11
-- Standard   : VHDL'93
12
-------------------------------------------------------------------------------
13
-- Description: 
14
-------------------------------------------------------------------------------
15
-- Copyright (c) 2010 SzuWar INC
16
-------------------------------------------------------------------------------
17
-- Revisions  :
18
-- Date                  Version  Author  Description
19
-- 13:27:31 14-03-2010   1.0      szuwarek  Created
20
-------------------------------------------------------------------------------
21 6 aTomek1328
-- Version 1.1 unlimited size of Input and Output register.
22
-- Version 1.0
23 3 aTomek1328
 
24
library IEEE;
25
use IEEE.STD_LOGIC_1164.ALL;
26
use ieee.std_logic_arith.all;
27
use IEEE.STD_LOGIC_UNSIGNED.all;
28
 
29
Library UNISIM;
30
use UNISIM.vcomponents.all;
31
 
32
entity fifo_srl_uni is
33
 
34
   generic (
35
      iDataWidth        : integer range 1 to 32   := 17;
36
      ififoWidth        : integer range 1 to 1023 := 32;
37 6 aTomek1328
      iInputReg         : integer range 0 to 3    := 0;
38 3 aTomek1328
      iOutputReg        : integer range 0 to 3    := 2;
39
      iFullFlagOfSet    : integer range 0 to 1021 := 2;
40
      iEmptyFlagOfSet   : integer range 0 to 1021 := 5;
41
      iSizeDelayCounter : integer range 5 to 11   := 6
42
      );
43
 
44
   port (
45
      CLK_I          : in  std_logic;
46
      DATA_I         : in  std_logic_vector(iDataWidth - 1 downto 0);
47
      DATA_O         : out std_logic_vector(iDataWidth - 1 downto 0);
48
      WRITE_ENABLE_I : in  std_logic;
49
      READ_ENABLE_I  : in  std_logic;
50
      READ_VALID_O   : out std_logic;
51
      FIFO_COUNT_O   : out std_logic_vector(iSizeDelayCounter - 1 downto 0);
52
      FULL_FLAG_O    : out std_logic;
53
      EMPTY_FLAG_O   : out std_logic
54
      );
55
 
56
end entity fifo_srl_uni;
57
 
58
architecture fifo_srl_uni_rtl of fifo_srl_uni is
59
 
60
-------------------------------------------------------------------------------
61
-- functions --
62
-------------------------------------------------------------------------------
63
   function f_srl_count (constant c_fifo_size : integer) return integer is
64
 
65
      variable i_temp  : integer;
66
      variable i_count : integer;
67
 
68
   begin  -- function f_srl_count
69
 
70
      i_temp := c_fifo_size;
71
      i_count := 0;
72
 
73
      for i in 0 to 64 loop
74
 
75
         if i_temp < 1 then
76
 
77
            if i_count = 0 then
78
 
79
               i_count := i;
80
 
81
            else
82
 
83
               i_count := i_count;
84
 
85
            end if;
86
 
87
         else
88
 
89
            i_temp := i_temp - 16;
90
 
91
         end if;
92
 
93
      end loop;  -- i
94
 
95
      return i_count;
96
 
97
   end function f_srl_count;
98
 
99
-------------------------------------------------------------------------------
100
-- constants --
101
-------------------------------------------------------------------------------
102
   constant c_srl_count : integer range 0 to 64 := f_srl_count(ififoWidth);
103
 
104
-------------------------------------------------------------------------------
105
-- types --
106
-------------------------------------------------------------------------------
107
   type type_in_reg    is array (0 to iInputReg - 1)   of std_logic_vector(iDataWidth - 1 downto 0);
108
   type type_out_reg   is array (0 to iOutputReg)      of std_logic_vector(iDataWidth - 1 downto 0);
109
   type type_data_path is array (0 to c_srl_count - 1) of std_logic_vector(iDataWidth - 1 downto 0);
110
   type type_srl_path  is array (0 to c_srl_count)    of std_logic_vector(iDataWidth - 1 downto 0);
111
 
112
-------------------------------------------------------------------------------
113
-- signals --
114
-------------------------------------------------------------------------------
115
   signal v_delay_counter : std_logic_vector(iSizeDelayCounter - 1 downto 0) := (others => '0');
116
   signal v_size_counter  : std_logic_vector(iSizeDelayCounter - 1 downto 0) := (others => '0');
117
   signal v_zeros         : std_logic_vector(iSizeDelayCounter - 1 downto 0) := (others => '0');
118
   signal v_WRITE_ENABLE  : std_logic_vector(iInputReg downto 0);
119
   signal v_READ_ENABLE   : std_logic_vector(iOutputReg downto 0);
120 6 aTomek1328
   signal v_valid_delay   : std_logic_vector(iOutputReg downto 0);
121 3 aTomek1328
   signal i_size_counter  : integer range 0 to 1023 := 0;
122
   signal i_srl_select    : integer range 0 to 64 := 0;
123
   signal i_temp          : integer range 0 to 64;
124
   signal t_mux_in        : type_data_path;
125
   signal t_srl_in        : type_srl_path;
126
   signal t_mux_out       : type_out_reg;
127
   signal t_reg_in        : type_in_reg;
128
   signal one_delay       : std_logic := '0';
129 5 aTomek1328
   signal ce_master       : std_logic;
130
   signal full_capacity   : std_logic;
131
   signal data_valid_off  : std_logic;
132 3 aTomek1328
 
133
begin  -- architecture fifo_srl_uni_r
134
 
135
   v_zeros <= (others => '0');
136 6 aTomek1328
 
137
   i_srl_select         <= conv_integer((v_delay_counter(iSizeDelayCounter - 1 downto 4)));
138
   i_size_counter       <= conv_integer(v_size_counter);
139
 
140
   ce_master            <= v_WRITE_ENABLE(0) and (not full_capacity);
141
 
142
   full_capacity        <= '0' when i_size_counter < ififoWidth else '1';
143
 
144
   t_mux_out(0)         <= t_mux_in(i_srl_select);
145
   READ_VALID_O         <= v_READ_ENABLE(0) and (not v_valid_delay(0));
146
   FIFO_COUNT_O         <= v_size_counter;
147
 
148 5 aTomek1328
-------------------------------------------------------------------------------
149
-- Input Register --
150
-------------------------------------------------------------------------------
151 3 aTomek1328
   GR0: if iInputReg = 0 generate
152
 
153
      t_srl_in(0) <= DATA_I;
154 6 aTomek1328
      v_WRITE_ENABLE(iInputReg) <= WRITE_ENABLE_I;
155 3 aTomek1328
 
156
   end generate GR0;
157
 
158
   GR1: if iInputReg = 1 generate
159
 
160
      t_srl_in(0) <= t_reg_in(0);
161 6 aTomek1328
      v_WRITE_ENABLE(iInputReg) <= WRITE_ENABLE_I;
162 3 aTomek1328
 
163
      P1: process (CLK_I) is
164
      begin  -- process P1
165
 
166
         if rising_edge(CLK_I) then
167
 
168
            t_reg_in(0) <= DATA_I;
169 6 aTomek1328
            v_WRITE_ENABLE(0) <= v_WRITE_ENABLE(iInputReg);
170 3 aTomek1328
 
171
         end if;
172
 
173
      end process P1;
174
 
175
   end generate GR1;
176
 
177 6 aTomek1328
   GR2: if iInputReg > 1 generate
178 3 aTomek1328
 
179
      t_srl_in(0) <= t_reg_in(0);
180 6 aTomek1328
      v_WRITE_ENABLE(iInputReg) <= WRITE_ENABLE_I;
181 3 aTomek1328
 
182
      P1: process (CLK_I) is
183
      begin  -- process P1
184
 
185
         if rising_edge(CLK_I) then
186
 
187 6 aTomek1328
            t_reg_in(iInputReg - 1) <= DATA_I;
188
            t_reg_in(0 to iInputReg - 2) <= t_reg_in(1 to iInputReg -1);
189
            v_WRITE_ENABLE(iInputReg - 1 downto 0) <= v_WRITE_ENABLE(iInputReg downto 1);
190 3 aTomek1328
 
191
         end if;
192
 
193
      end process P1;
194
 
195
   end generate GR2;
196 5 aTomek1328
-------------------------------------------------------------------------------
197
-- Input Register --
198
-------------------------------------------------------------------------------
199
 
200
-------------------------------------------------------------------------------
201
-- FIFO Core, SRL16E based --
202
-------------------------------------------------------------------------------
203 3 aTomek1328
   G1: for i in 0 to c_srl_count - 1 generate
204
 
205
      G0: for j in 0 to iDataWidth - 1 generate
206
 
207
         SRLC16_inst : SRLC16E
208
            port map
209
            (
210
                  Q => t_mux_in(i)(j), -- SRL data output
211
                  Q15 => t_srl_in(i+1)(j), -- Carry output (connect to next SRL)
212
                  A0 => v_delay_counter(0), -- Select[0] input
213
                  A1 => v_delay_counter(1), -- Select[1] input
214
                  A2 => v_delay_counter(2), -- Select[2] input
215
                  A3 => v_delay_counter(3), -- Select[3] input
216 5 aTomek1328
                  CE => ce_master, -- Clock enable input
217 3 aTomek1328
                  CLK => CLK_I, -- Clock input
218
                  D => t_srl_in(i)(j) -- SRL data input
219
                  );
220
 
221
      end generate G0;
222
 
223
   end generate G1;
224 5 aTomek1328
-------------------------------------------------------------------------------
225
-- FIFO Core, SRL16E based --
226
-------------------------------------------------------------------------------
227
 
228 3 aTomek1328
   P0: process (CLK_I) is
229
   begin  -- process P0
230
 
231
      if rising_edge(CLK_I) then
232
 
233 5 aTomek1328
         if (v_WRITE_ENABLE(0) = '1') and (READ_ENABLE_I = '0') and (i_size_counter < ififoWidth) then
234 3 aTomek1328
 
235
            if one_delay = '1' then
236
 
237
               v_delay_counter <= v_delay_counter + 1;
238
               one_delay <= '1';
239
 
240
            else
241
 
242
               one_delay <= '1';
243
               v_delay_counter <= v_delay_counter;
244
 
245
            end if;
246
 
247
            v_size_counter <= v_size_counter + 1;
248
 
249 5 aTomek1328
         elsif (v_WRITE_ENABLE(0) = '0') and (READ_ENABLE_I = '1') and (i_size_counter > 0) then
250 3 aTomek1328
 
251
            if v_delay_counter = v_zeros then
252
 
253
               one_delay <= '0';
254
 
255
            else
256
 
257
               one_delay <= '1';
258
               v_delay_counter <= v_delay_counter - 1;
259
 
260
            end if;
261
 
262 5 aTomek1328
            v_size_counter <= v_size_counter - 1;
263 3 aTomek1328
 
264
         else
265
 
266
            v_delay_counter <= v_delay_counter;
267
            v_size_counter <= v_size_counter;
268
            one_delay <= one_delay;
269
 
270
         end if;
271
 
272
      end if;
273
 
274
   end process P0;
275
 
276 6 aTomek1328
   data_valid_off <= '1' when i_size_counter = 0 else '0';
277 5 aTomek1328
-------------------------------------------------------------------------------
278
-- Output Register --
279
-------------------------------------------------------------------------------
280 3 aTomek1328
 
281 6 aTomek1328
   -- size of output register: 0 --
282 3 aTomek1328
   GM0: if iOutputReg = 0 generate
283
 
284
      DATA_O <= t_mux_out(0);
285
      v_READ_ENABLE(0) <= READ_ENABLE_I;
286 6 aTomek1328
      v_valid_delay(0) <= data_valid_off;
287 3 aTomek1328
 
288
   end generate GM0;
289
 
290 6 aTomek1328
   -- size of output register: 1 --
291 3 aTomek1328
   GM1: if iOutputReg = 1 generate
292
 
293
      DATA_O <= t_mux_out(1);
294
      v_READ_ENABLE(1) <= READ_ENABLE_I;
295 6 aTomek1328
 
296
 
297 3 aTomek1328
      P2: process (CLK_I) is
298
      begin  -- process P2
299
 
300
         if rising_edge(CLK_I) then
301
 
302
            v_READ_ENABLE(0) <= v_READ_ENABLE(1);
303
            t_mux_out(1) <= t_mux_out(0);
304 6 aTomek1328
            v_valid_delay(0) <= data_valid_off;
305 3 aTomek1328
 
306
         end if;
307
 
308
      end process P2;
309
 
310
   end generate GM1;
311 6 aTomek1328
 
312
   -- size of output register: > 1 --
313 3 aTomek1328
   GM2: if iOutputReg > 1 generate
314
 
315
      DATA_O <= t_mux_out(iOutputReg);
316
      v_READ_ENABLE(iOutputReg) <= READ_ENABLE_I;
317
 
318
      P2: process (CLK_I) is
319
      begin  -- process P2
320
 
321
         if rising_edge(CLK_I) then
322
 
323
            v_READ_ENABLE(iOutputReg - 1 downto 0) <= v_READ_ENABLE(iOutputReg downto 1);
324
            t_mux_out(1 to iOutputReg) <= t_mux_out(0 to iOutputReg - 1);
325 6 aTomek1328
            v_valid_delay(iOutputReg - 1 downto 0) <= data_valid_off&v_valid_delay(iOutputReg - 1 downto 1);
326 3 aTomek1328
 
327
         end if;
328
 
329
      end process P2;
330
 
331
   end generate GM2;
332 5 aTomek1328
-------------------------------------------------------------------------------
333
-- Output Register --
334
-------------------------------------------------------------------------------
335 3 aTomek1328
 
336 5 aTomek1328
-------------------------------------------------------------------------------
337
-- Flag Generators --
338
-------------------------------------------------------------------------------
339
   EMPTY_FLAG_O <= '0' when (i_size_counter)> iEmptyFlagOfSet             else '1';
340
   FULL_FLAG_O  <= '1' when i_size_counter >= ififoWidth - iFullFlagOfSet else '0';
341
-------------------------------------------------------------------------------
342
-- Flag Generators --
343
-------------------------------------------------------------------------------
344 3 aTomek1328
 
345
end architecture fifo_srl_uni_rtl;
346
 

powered by: WebSVN 2.1.0

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