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

Subversion Repositories funbase_ip_library

[/] [funbase_ip_library/] [trunk/] [TUT/] [ip.hwp.accelerator/] [dctqidct/] [1.0/] [hdl/] [dctQidct/] [Fifo.vhd] - Blame information for rev 145

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 145 lanttu
-------------------------------------------------------------------------------
2
-- File        : fifo.vhdl
3
-- Description : Fifo buffer for hibi interface
4
-- Author      : Erno Salminen
5
-- Date        : 29.04.2002
6
-- Modified    : 30.04.2002 Vesa Lahtinen Optimized for synthesis
7
--
8
-------------------------------------------------------------------------------
9
library ieee;
10
use ieee.std_logic_1164.all;
11
use ieee.std_logic_arith.all;
12
use ieee.std_logic_unsigned.all;
13
 
14
ENTITY Fifo_dct IS
15
   GENERIC(
16
      width : integer := 0;
17
      depth : integer := 0
18
   );
19
   PORT(
20
      Clk            : IN     std_logic;
21
      Rst_n          : IN     std_logic;
22
      Data_In        : IN     std_logic_vector (width-1 DOWNTO 0);
23
      Write_Enable   : IN     std_logic;
24
      One_Place_Left : OUT    std_logic;
25
      Full           : OUT    std_logic;
26
      Data_Out       : OUT    std_logic_vector (width-1 DOWNTO 0);
27
      Read_Enable    : IN     std_logic;
28
      Empty          : OUT    std_logic;
29
      One_Data_Left  : OUT    std_logic
30
   );
31
 
32
-- Declarations
33
 
34
END Fifo_dct ;
35
 
36
architecture behavioral of Fifo_dct is
37
 
38
  type data_array is array (depth-1 downto 0) of std_logic_vector (width-1 downto 0);
39
  signal Fifo_Buffer : data_array;
40
 
41
  signal in_ptr  : integer range 0 to depth-1;
42
  signal out_ptr : integer range 0 to depth-1;
43
 
44
  -- Registers
45
  signal Full_reg           : std_logic;
46
  signal Empty_reg          : std_logic;
47
  signal One_Data_Left_reg  : std_logic;
48
  signal One_Place_Left_reg : std_logic;
49
  signal Data_Amount        : std_logic_vector (depth-1 downto 0);
50
 
51
 
52
begin  -- behavioral
53
 
54
  -- Continuous assignments
55
  -- Assigns register values to outputs
56
  Full           <= Full_reg;
57
  Empty          <= Empty_reg;
58
  One_Data_Left  <= One_Data_Left_reg;
59
  One_Place_Left <= One_Place_Left_reg;
60
  Data_Out       <= Fifo_Buffer (out_ptr);
61
  -- Note! There is some old value in data output when fifo is empty.
62
 
63
 
64
Main : process (Clk, Rst_n)
65
begin  -- process Main
66
  if Rst_n = '0' then                   -- asynchronous reset (active low)
67
 
68
    -- Reset all registers
69
    -- Fifo is empty at first
70
    Full_reg           <= '0';
71
    Empty_reg          <= '1';
72
    One_Data_Left_reg  <= '0';
73
    in_ptr             <= 0;
74
    out_ptr            <= 0;
75
    Data_Amount        <= (others => '0');
76
 
77
    if depth =1 then                    -- 30.07
78
      One_Place_Left_reg <= '1';
79
    else
80
      One_Place_Left_reg <= '0';
81
    end if;
82
 
83
    for i in 0 to depth-1 loop
84
      Fifo_Buffer (i)  <= (others => '0');
85
    end loop;  -- i
86
 
87
  elsif Clk'event and Clk = '1' then    -- rising clock edge
88
 
89
 
90
    -- 1) Write data to fifo
91
    if Write_Enable = '1' and Read_Enable = '0' then
92
 
93
      if Full_reg = '0' then
94
        Empty_reg            <= '0';
95
        if (in_ptr = (depth-1)) then
96
          in_ptr <= 0;
97
        else
98
          in_ptr <= in_ptr + 1;
99
        end if;
100
        out_ptr              <= out_ptr;
101
        Data_Amount          <= Data_Amount +1;
102
        Fifo_Buffer (in_ptr) <= Data_In;
103
 
104
        -- Check if the fifo is getting full
105
        if Data_Amount + 2 = depth then
106
          Full_reg           <= '0';
107
          One_Place_Left_reg <= '1';
108
        elsif Data_Amount +1 = depth then
109
          Full_reg           <= '1';
110
          One_Place_Left_reg <= '0';
111
        else
112
          Full_reg           <= '0';
113
          One_Place_Left_reg <= '0';
114
        end if;
115
 
116
        -- If fifo was empty, it has now one data 
117
        if Empty_reg = '1' then
118
          One_Data_Left_reg <= '1';
119
        else
120
          One_Data_Left_reg <= '0';
121
        end if;
122
 
123
      else
124
        in_ptr             <= in_ptr;
125
        out_ptr            <= out_ptr;
126
        Full_reg           <= Full_reg;
127
        Empty_reg          <= Empty_reg;
128
        Fifo_Buffer        <= Fifo_Buffer;
129
        Data_Amount        <= Data_Amount;
130
        One_Data_Left_reg  <= One_Data_Left_reg;
131
        One_Place_Left_reg <= One_Place_Left_reg;
132
      end if;
133
 
134
 
135
    -- 2) Read data from fifo  
136
    elsif Write_Enable = '0' and Read_Enable = '1' then
137
 
138
      if Empty_reg = '0' then
139
        in_ptr      <= in_ptr;
140
        if (out_ptr = (depth-1)) then
141
          out_ptr <= 0;
142
        else
143
          out_ptr <= out_ptr + 1;
144
        end if;
145
        Full_reg    <= '0';
146
        Data_Amount <= Data_Amount -1;
147
 
148
        -- Debug
149
        -- Fifo_Buffer (out_ptr) <= (others => '1');
150
 
151
        -- Check if the fifo is getting empty
152
        if Data_Amount = 2 then
153
          Empty_reg         <= '0';
154
          One_data_Left_reg <= '1';
155
        elsif Data_Amount = 1 then
156
          Empty_reg         <= '1';
157
          One_Data_Left_reg <= '0';
158
        else
159
          Empty_reg         <= '0';
160
          One_Data_Left_reg <= '0';
161
        end if;
162
 
163
        -- If fifo was full, it is no more 
164
        if Full_reg = '1' then
165
          One_Place_Left_reg <= '1';
166
        else
167
          One_Place_Left_reg <= '0';
168
        end if;
169
 
170
      else
171
        in_ptr             <= in_ptr;
172
        out_ptr            <= out_ptr;
173
        Full_reg           <= Full_reg;
174
        Empty_reg          <= Empty_reg;
175
        Fifo_Buffer        <= Fifo_Buffer;
176
        Data_Amount        <= Data_Amount;
177
        One_Data_Left_reg  <= One_Data_Left_reg;
178
        One_Place_Left_reg <= One_Place_Left_reg;
179
      end if;
180
 
181
 
182
    -- 3) Write and read at the same time  
183
    elsif Write_Enable = '1' and Read_Enable = '1' then
184
 
185
 
186
      if Full_reg = '0' and Empty_reg = '0' then
187
        if (in_ptr = (depth-1)) then
188
          in_ptr <= 0;
189
        else
190
          in_ptr <= in_ptr + 1;
191
        end if;
192
        if (out_ptr = (depth-1)) then
193
          out_ptr <= 0;
194
        else
195
          out_ptr <= out_ptr + 1;
196
        end if;
197
        Full_reg           <= '0';
198
        Empty_reg          <= '0';
199
        Data_Amount        <= Data_Amount;
200
        One_Data_Left_reg  <= One_Data_Left_reg;
201
        One_Place_Left_reg <= One_Place_Left_reg;
202
 
203
        Fifo_Buffer (in_ptr)  <= Data_In;
204
        -- Fifo_Buffer (out_ptr) <= (others => '1');  --debug
205
 
206
 
207
      elsif Full_reg = '1' and Empty_reg = '0' then
208
        -- Fifo is full, only reading is possible
209
        in_ptr                <= in_ptr;
210
        if (out_ptr = (depth-1)) then
211
          out_ptr <= 0;
212
        else
213
          out_ptr <= out_ptr + 1;
214
        end if;
215
        Full_reg              <= '0';
216
        One_Place_Left_reg    <= '1';
217
        --Fifo_Buffer (out_ptr) <= (others => '1');  -- Debug
218
        Data_Amount           <= Data_Amount -1;
219
 
220
        -- Check if the fifo is getting empty
221
        if Data_Amount = 2 then
222
          Empty_reg         <= '0';
223
          One_data_Left_reg <= '1';
224
        elsif Data_Amount = 1 then
225
          Empty_reg         <= '1';
226
          One_Data_Left_reg <= '0';
227
        else
228
          Empty_reg         <= '0';
229
          One_Data_Left_reg <= '0';
230
        end if;
231
 
232
 
233
      elsif Full_reg = '0' and Empty_reg = '1' then
234
        -- Fifo is empty, only writing is possible
235
        if (in_ptr = (depth-1)) then
236
          in_ptr <= 0;
237
        else
238
          in_ptr <= in_ptr + 1;
239
        end if;
240
        out_ptr              <= out_ptr;
241
        Empty_reg            <= '0';
242
        One_Data_Left_reg    <= '1';
243
        Fifo_Buffer (in_ptr) <= Data_In;
244
        Data_Amount          <= Data_Amount +1;
245
 
246
        -- Check if the fifo is getting full
247
        if Data_Amount + 2 = depth then
248
          Full_reg           <= '0';
249
          One_Place_Left_reg <= '1';
250
        elsif Data_Amount +1 = depth then
251
          Full_reg           <= '1';
252
          One_Place_Left_reg <= '0';
253
        else
254
          Full_reg           <= '0';
255
          One_Place_Left_reg <= '0';
256
        end if;
257
 
258
 
259
      -- 4) Do nothing, fifo remains idle 
260
      else
261
 
262
        in_ptr             <= in_ptr;
263
        out_ptr            <= out_ptr;
264
        Full_reg           <= Full_reg;
265
        Empty_reg          <= Empty_reg;
266
        Fifo_Buffer        <= Fifo_Buffer;
267
        Data_Amount        <= Data_Amount;
268
        One_Data_Left_reg  <= One_Data_Left_reg;
269
        One_Place_Left_reg <= One_Place_Left_reg;
270
      end if;
271
 
272
    else
273
      -- Fifo is idle
274
      in_ptr             <= in_ptr;
275
      out_ptr            <= out_ptr;
276
      Full_reg           <= Full_reg;
277
      Empty_reg          <= Empty_reg;
278
      Fifo_Buffer        <= Fifo_Buffer;
279
      Data_Amount        <= Data_Amount;
280
      One_Data_Left_reg  <= One_Data_Left_reg;
281
      One_Place_Left_reg <= One_Place_Left_reg;
282
    end if;
283
 
284
  end if;
285
end process Main;
286
 
287
end behavioral;

powered by: WebSVN 2.1.0

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