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/] [fifo_shift_slotted.vhd] - Blame information for rev 145

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 145 lanttu
-------------------------------------------------------------------------------
2
-- File        : fifo_shift.vhdl
3
-- Description : Fifo buffer for hibi interface
4
--
5
-- Author      : Erno Salminen
6
-- Date        : 29.05.2003
7
-- Modified    : 
8
--
9
-------------------------------------------------------------------------------
10
library ieee;
11
use ieee.std_logic_1164.all;
12
use ieee.std_logic_arith.all;
13
use ieee.std_logic_unsigned.all;
14
 
15
entity fifo is
16
 
17
  generic (
18
    width : integer := 0;
19
    depth : integer := 0);
20
 
21
  port (
22
    Clk            : in  std_logic;
23
    Rst_n          : in  std_logic;
24
    Data_In        : in  std_logic_vector (width-1 downto 0);
25
    Write_Enable   : in  std_logic;
26
    One_Place_Left : out std_logic;
27
    Full           : out std_logic;
28
    Data_Out       : out std_logic_vector (width-1 downto 0);
29
    Read_Enable    : in  std_logic;
30
    Empty          : out std_logic;
31
    One_Data_Left  : out std_logic
32
    );
33
 
34
end fifo;
35
 
36
 
37
 
38
architecture slotted_shift_reg of fifo is
39
 
40
  component shift_slot
41
    generic (
42
      width : integer := 0);
43
    port (
44
      Clk          : in  std_logic;
45
      Rst_n        : in  std_logic;
46
      Valid_In     : in  std_logic;
47
      Data_In      : in  std_logic_vector ( width-1 downto 0);
48
      Shift_Enable : in  std_logic;
49
      Valid_Out    : out std_logic;
50
      Data_Out     : out std_logic_vector ( width-1 downto 0)
51
      );
52
 
53
  end component; -- shift_slot;
54
 
55
 
56
 
57
  type Fifo_slot_type is record
58
                           Valid : std_logic;
59
                           Data  : std_logic_vector ( width-1 downto 0);
60
                         end record;
61
  type slot_signal_array is array (depth downto 0) of Fifo_slot_type;
62
  signal intermediate_signal     : slot_signal_array;
63
  signal Top_Slot_Write_Enable : std_logic;
64
 
65
begin  -- slotted_shift_reg
66
 
67
 
68
 
69
  -- Continuous assignments
70
  -- Assigns register values to outputs
71
  assert depth > 1 report "Fifo depth must be more than one!" severity WARNING;
72
  Full           <= intermediate_signal (depth-1).Valid;  -- ylin paikka varattu
73
  Empty          <= not (intermediate_signal (0).Valid );  -- alin paikka tyhja
74
 
75
  -- Yksi data=alin taynna, toiseksi alin tyhja
76
  One_Data_Left  <= not (intermediate_signal (1).Valid) and intermediate_signal (0).Valid;
77
 
78
  -- Yksi paikka=ylin tyhja, toiseksi ylin taynna
79
  One_Place_Left <= not (intermediate_signal (depth-1).Valid) and intermediate_signal (depth-2).Valid;
80
 
81
  Data_Out       <= intermediate_signal (0).Data;  --alin data ulostuloon
82
  -- Note! There is some old value in data output when fifo is empty.
83
 
84
 
85
 
86
  top_slot : shift_slot
87
    generic map (
88
      width        => width)
89
    port map (
90
      Clk          => Clk,
91
      Rst_n        => Rst_n,
92
      Valid_In     => intermediate_signal (depth).Valid,
93
      Data_In      => intermediate_signal (depth).Data,
94
      Shift_Enable => Top_Slot_Write_Enable,
95
      Valid_Out    => intermediate_signal(depth-1).Valid,
96
      Data_Out     => intermediate_signal(depth-1).Data
97
      );
98
 
99
  map_slots    : for i in 0 to depth-2 generate
100
    gen_slot_i : shift_slot
101
      generic map (
102
        width        => width)
103
      port map (
104
        Clk          => Clk,
105
        Rst_n        => Rst_n,
106
        Valid_In     => intermediate_signal (i+1).Valid,
107
        Data_In      => intermediate_signal (i+1).Data,
108
        Shift_Enable => Read_Enable,
109
        Valid_Out    => intermediate_signal (i).Valid,
110
        Data_Out     => intermediate_signal (i).Data
111
        );
112
  end generate map_slots;
113
 
114
 
115
  async_first_slot: process (intermediate_signal, Data_In, Write_Enable, Read_Enable)
116
  begin  -- process async_first_slot
117
    -- Ohjataan ensimmaisen (=kirjoitus-) paikan sisaanmenoja
118
 
119
    if Write_Enable = '1' and Read_Enable = '0' then
120
      -- Kirjoitus
121
 
122
      if intermediate_signal (depth-1).Valid = '1' then
123
        -- Ylin paikka taynna
124
        Top_Slot_Write_Enable             <= '0';
125
        intermediate_signal (depth).Data  <= (others => '0');  --'Z');
126
        intermediate_signal (depth).Valid <= '0';
127
 
128
      else
129
        -- Kirjoitetaan uusi data ylimpaan
130
        Top_Slot_Write_Enable             <= '1';
131
        intermediate_signal (depth).Data  <= Data_In;
132
        intermediate_signal (depth).Valid <= '1';
133
      end if;
134
 
135
 
136
    elsif Write_Enable = '0' and Read_Enable = '1' then
137
      -- Luku
138
      --Nollataan ylin paikka
139
      Top_Slot_Write_Enable             <= '1';
140
      intermediate_signal (depth).Data  <= (others => '0');  -- 'Z');
141
      intermediate_signal (depth).Valid <= '0';
142
 
143
 
144
    elsif Write_Enable = '1' and Read_Enable = '1' then
145
      --Luku ja kirjoitus yhta aikaa
146
      if intermediate_signal (depth-1).Valid = '1' then
147
        -- Ylin paikka taynna
148
        Top_Slot_Write_Enable             <= '0';
149
        intermediate_signal (depth).Data  <= (others => '0');  --'Z');
150
        intermediate_signal (depth).Valid <= '0';
151
 
152
      else
153
        -- Kirjoitetaan uusi data ylimpaan
154
        Top_Slot_Write_Enable             <= '1';
155
        intermediate_signal (depth).Data  <= Data_In;
156
        intermediate_signal (depth).Valid <= '1';
157
      end if;
158
 
159
 
160
 
161
    else
162
      -- Ei tehda mitaan
163
      -- Ylin paikka taynna
164
      Top_Slot_Write_Enable             <= '0';
165
      intermediate_signal (depth).Data  <= (others => '0');  --'Z');
166
      intermediate_signal (depth).Valid <= '0';
167
 
168
 
169
    end if;
170
 
171
 
172
  end process async_first_slot;
173
 
174
end slotted_shift_reg;                  --architecture

powered by: WebSVN 2.1.0

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