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.storage/] [fifos/] [synch_fifos/] [1.0/] [vhd/] [double_fifo_muxed_read.vhd] - Blame information for rev 145

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 145 lanttu
-------------------------------------------------------------------------------
2
-- File        : double_fifo_muxed_read.vhdl
3
-- Description : Double_Fifo_Muxed_Read buffer for hibi v.2 interface
4
--               Includes two fifos and a special multiplexer
5
--               so that the reader sees only one fifo. Multiplexer
6
--               selects addr+data first from fifo 0 (i.e. it has a higher priority)
7
-- Author      : Erno Salminen
8
-- Date        : 07.02.2003
9
-- Modified    : 
10
--
11
-------------------------------------------------------------------------------
12
library ieee;
13
use ieee.std_logic_1164.all;
14
use ieee.std_logic_arith.all;
15
use ieee.std_logic_unsigned.all;
16
 
17
 
18
 
19
entity double_fifo_muxed_read is
20
 
21
  generic (
22
    Data_Width :    integer := 0;
23
    Depth_0    :    integer := 0;
24
    Depth_1    :    integer := 0;
25
    Comm_Width :    integer := 0
26
    );
27
  port (
28
    Clk        : in std_logic;
29
    Rst_n      : in std_logic;
30
 
31
    Data_In_0            : in  std_logic_vector ( Data_Width-1 downto 0);
32
    Comm_In_0            : in  std_logic_vector ( Comm_Width-1 downto 0);
33
    Addr_Valid_In_0      : in  std_logic;
34
    Write_Enable_In_0    : in  std_logic;
35
    One_Place_Left_Out_0 : out std_logic;
36
    Full_Out_0           : out std_logic;
37
 
38
    Data_In_1            : in  std_logic_vector ( Data_Width-1 downto 0);
39
    Comm_In_1            : in  std_logic_vector ( Comm_Width-1 downto 0);
40
    Addr_Valid_In_1      : in  std_logic;
41
    Write_Enable_In_1    : in  std_logic;
42
    One_Place_Left_Out_1 : out std_logic;
43
    Full_Out_1           : out std_logic;
44
 
45
    Read_Enable_In    : in  std_logic;
46
    Data_Out          : out std_logic_vector ( Data_Width-1 downto 0);
47
    Comm_Out          : out std_logic_vector ( Comm_Width-1 downto 0);
48
    Addr_Valid_Out    : out std_logic;
49
    Empty_Out         : out std_logic;
50
    One_Data_Left_Out : out std_logic
51
    );
52
end double_fifo_muxed_read;
53
 
54
 
55
 
56
architecture structural of double_fifo_muxed_read is
57
 
58
 
59
 
60
 
61
  component fifo
62
    generic (
63
      width : integer := 0;
64
      depth : integer := 0);
65
 
66
    port (
67
      Clk            : in  std_logic;
68
      Rst_n          : in  std_logic;
69
      Data_In        : in  std_logic_vector (width-1 downto 0);
70
      Write_Enable   : in  std_logic;
71
      One_Place_Left : out std_logic;
72
      Full           : out std_logic;
73
 
74
      Read_Enable    : in  std_logic;
75
      Data_Out       : out std_logic_vector (width-1 downto 0);
76
      Empty          : out std_logic;
77
      One_Data_Left  : out std_logic
78
      );
79
  end component; --fifo;
80
 
81
 
82
  component fifo_mux_read
83
    generic (
84
      Data_Width         :     integer := 0;
85
      Comm_Width         :     integer := 0
86
      );
87
    port (
88
      Clk                : in  std_logic;
89
      Rst_n              : in  std_logic;
90
 
91
      Data_0_In          : in  std_logic_vector (Data_Width-1 downto 0);
92
      Comm_0_In          : in  std_logic_vector (Comm_Width-1 downto 0);
93
      Addr_Valid_0_In    : in  std_logic;
94
      One_Data_Left_0_In : in  std_logic;
95
      Empty_0_In         : in  std_logic;
96
      RE_0_Out           : out std_logic;
97
 
98
      Data_1_In          : in  std_logic_vector (Data_Width-1 downto 0);
99
      Comm_1_In          : in  std_logic_vector (Comm_Width-1 downto 0);
100
      Addr_Valid_1_In    : in  std_logic;
101
      One_Data_Left_1_In : in  std_logic;
102
      Empty_1_In         : in  std_logic;
103
      RE_1_Out           : out std_logic;
104
 
105
      Read_Enable_In    : in  std_logic;
106
      Data_Out          : out std_logic_vector (Data_Width-1 downto 0);
107
      Comm_Out          : out std_logic_vector (Comm_Width-1 downto 0);
108
      Addr_Valid_Out    : out std_logic;
109
      One_Data_Left_Out : out std_logic;
110
      Empty_Out         : out std_logic
111
      );
112
  end component; --fifo_mux_read;
113
 
114
 
115
  signal Data_AV_Comm_In_0 : std_logic_vector ( 1 + Comm_Width + Data_Width-1 downto 0);
116
  signal Data_AV_Comm_In_1 : std_logic_vector ( 1 + Comm_Width + Data_Width-1 downto 0);
117
 
118
  signal Data_AV_Comm_0_Mux : std_logic_vector ( 1 + Comm_Width + Data_Width-1 downto 0);
119
  signal Data_0_Mux         : std_logic_vector ( Data_Width-1 downto 0);
120
  signal Comm_0_Mux         : std_logic_vector ( Comm_Width-1 downto 0);
121
  signal AV_0_Mux           : std_logic;
122
 
123
  signal Data_AV_Comm_1_Mux : std_logic_vector ( 1 + Comm_Width + Data_Width-1 downto 0);
124
  signal Data_1_Mux         : std_logic_vector ( Data_Width-1 downto 0);
125
  signal Comm_1_Mux         : std_logic_vector ( Comm_Width-1 downto 0);
126
  signal AV_1_Mux           : std_logic;
127
 
128
  signal Read_Enable_Mux_0   : std_logic;
129
  signal Empty_0_Mux         : std_logic;
130
  signal One_Data_Left_0_Mux : std_logic;
131
 
132
  signal Read_Enable_Mux_1   : std_logic;
133
  signal Empty_1_Mux         : std_logic;
134
  signal One_Data_Left_1_Mux : std_logic;
135
 
136
 
137
  signal Tie_High : std_logic;
138
  signal Tie_Low  : std_logic;
139
 
140
 
141
begin  -- structural
142
  -- Check generics
143
  assert (Depth_0 + Depth_1 > 0) report "Both fifo depths zero!" severity warning;
144
 
145
  -- Concurrent assignments
146
  Tie_High <= '1';
147
  Tie_Low  <= '0';
148
  -- Combine fifo inputs
149
  Data_AV_Comm_In_0 <= Addr_Valid_In_0 & Comm_In_0 & Data_In_0;
150
  Data_AV_Comm_In_1 <= Addr_Valid_In_1 & Comm_In_1 & Data_In_1;
151
 
152
 
153
  -- Split fifooutput
154
  AV_0_Mux   <= Data_AV_Comm_0_Mux ( 1+Comm_Width + Data_Width-1);
155
  Comm_0_Mux <= Data_AV_Comm_0_Mux (   Comm_Width + Data_Width-1 downto Data_Width);
156
  Data_0_Mux <= Data_AV_Comm_0_Mux (                Data_Width-1 downto 0);
157
  AV_1_Mux   <= Data_AV_Comm_1_Mux ( 1+Comm_Width + Data_Width-1);
158
  Comm_1_Mux <= Data_AV_Comm_1_Mux (   Comm_Width + Data_Width-1 downto Data_Width);
159
  Data_1_Mux <= Data_AV_Comm_1_Mux (                Data_Width-1 downto 0);
160
 
161
 
162
  Map_Fifo_0 : if Depth_0 > 0 generate
163
    Fifo_0 : fifo
164
      generic map(
165
        width          => 1 + Comm_Width + Data_Width,
166
        depth          => Depth_0
167
        )
168
      port map(
169
        Clk            => Clk,
170
        Rst_n          => Rst_n,
171
 
172
        Data_In        => Data_AV_Comm_In_0,
173
        Write_Enable   => Write_Enable_In_0,
174
        One_Place_Left => One_Place_Left_Out_0,
175
        Full           => Full_Out_0,
176
 
177
        Read_Enable   => Read_Enable_Mux_0,
178
        Data_Out      => Data_AV_Comm_0_Mux,
179
        Empty         => Empty_0_Mux,
180
        One_Data_Left => One_Data_Left_0_Mux
181
        );
182
  end generate Map_Fifo_0;
183
 
184
 
185
  Not_Map_Fifo_0 : if Depth_0 = 0 generate
186
    -- Fifo #0 does not exist!
187
    Data_AV_Comm_0_Mux   <= (others => '0');
188
    Empty_0_Mux          <= Tie_High;
189
    One_Data_Left_0_Mux  <= Tie_Low;
190
    Full_Out_0           <= Tie_High;
191
    One_Place_Left_Out_0 <= Tie_Low;
192
 
193
    -- Connect the other fifo (#1)straight to the outputs ( =>  FSM)
194
    Data_Out          <= Data_1_Mux;
195
    Comm_Out          <= Comm_1_Mux;
196
    Addr_Valid_Out    <= AV_1_Mux;
197
    One_Data_Left_Out <= One_Data_Left_1_Mux;
198
    Empty_Out         <= Empty_1_Mux;
199
 
200
    Read_Enable_Mux_1 <= Read_Enable_In;  --15.05
201
 
202
  end generate Not_Map_Fifo_0;
203
 
204
 
205
 
206
 
207
  Map_Fifo_1 : if Depth_1 > 0 generate
208
    Fifo_1 : fifo
209
      generic map(
210
        width          => 1 + Comm_Width + Data_Width,
211
        depth          => Depth_1
212
        )
213
      port map(
214
        Clk            => Clk,
215
        Rst_n          => Rst_n,
216
 
217
        Data_In        => Data_AV_Comm_In_1,
218
        Write_Enable   => Write_Enable_In_1,
219
        One_Place_Left => One_Place_Left_Out_1,
220
        Full           => Full_Out_1,
221
 
222
        Read_Enable   => Read_Enable_Mux_1,
223
        Data_Out      => Data_AV_Comm_1_Mux,
224
        Empty         => Empty_1_Mux,
225
        One_Data_Left => One_Data_Left_1_Mux
226
        );
227
  end generate Map_Fifo_1;
228
 
229
 
230
  Not_Map_Fifo_1 : if Depth_1 = 0 generate
231
    -- Fifo #1 does not exist!
232
 
233
    -- Signals fifo#1=> IP
234
    --     Full_Out_1           <= Tie_High;
235
    --     One_Place_Left_Out_1 <= Tie_Low;
236
 
237
    -- Signals fifo#1=> FSM
238
    Data_AV_Comm_1_Mux   <= (others => '0');
239
    Empty_1_Mux          <= Tie_High;
240
    One_Data_Left_1_Mux  <= Tie_Low;
241
 
242
    -- Connect the other fifo (#0)straight to the outputs ( =>  FSM)
243
    Data_Out          <= Data_0_Mux;
244
    Comm_Out          <= Comm_0_Mux;
245
    Addr_Valid_Out    <= AV_0_Mux;
246
    One_Data_Left_Out <= One_Data_Left_0_Mux;
247
    Empty_Out         <= Empty_0_Mux;
248
 
249
    Read_Enable_Mux_0 <= Read_Enable_In;  --15.05
250
 
251
  end generate Not_Map_Fifo_1;
252
 
253
 
254
  Map_Mux : if Depth_0 > 0 and Depth_1 > 0 generate
255
    -- Only one fifo used
256
    -- Multiplexer is needed only if two fifos are used
257
    MUX_01: fifo_mux_read
258
      generic map(
259
        Data_Width         => Data_Width,
260
        Comm_Width         => Comm_Width
261
        )
262
      port map(
263
        Clk                => Clk,
264
        Rst_n              => Rst_n,
265
 
266
        Data_0_In          => Data_0_Mux,
267
        Comm_0_In          => Comm_0_Mux,
268
        Addr_Valid_0_In    => AV_0_Mux,
269
        One_Data_Left_0_In => One_Data_Left_0_Mux,
270
        Empty_0_In         => Empty_0_Mux,
271
        RE_0_Out           => Read_Enable_Mux_0,
272
 
273
        Data_1_In          => Data_1_Mux,
274
        Comm_1_In          => Comm_1_Mux,
275
        Addr_Valid_1_In    => AV_1_Mux,
276
        One_Data_Left_1_In => One_Data_Left_1_Mux,
277
        Empty_1_In         => Empty_1_Mux,
278
        RE_1_Out           => Read_Enable_Mux_1,
279
 
280
        Read_Enable_In    => Read_Enable_In,
281
        Data_Out          => Data_Out,
282
        Comm_Out          => Comm_Out,
283
        Addr_Valid_Out    => Addr_Valid_Out,
284
        One_Data_Left_Out => One_Data_Left_Out,
285
        Empty_Out         => Empty_Out
286
        );
287
  end generate Map_Mux;
288
 
289
 
290
 
291
 
292
 
293
 
294
 
295
 
296
 
297
 
298
end structural;
299
 
300
 
301
 

powered by: WebSVN 2.1.0

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