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

Subversion Repositories pcie_ds_dma

[/] [pcie_ds_dma/] [trunk/] [core/] [adm/] [rtl/] [cl_fifo1024x65_v5.vhd] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 dsmv
---------------------------------------------------------------------------------------------------
2
--
3
-- Title       : cl_fifo1024x65_v5
4
-- Author      : Dmitry Smekhov
5
-- Company     : Instrumental System
6
--
7
-- Version         : 1.1           
8
--
9
---------------------------------------------------------------------------------------------------
10
--
11
-- Description : Модуль FIFO 1024x65
12
--                               Модификация 5
13
--                               Выход FIFO - с регистра
14
--                               Уровни срабатывания флагов PAE, PAF - 32 слова
15
--                               Нет выходов от счётчиков слов
16
--
17
---------------------------------------------------------------------------------------------------
18
--
19
--      Version 1.1  17.05.2007
20
--                               Добавлен выход flag_empty
21
--
22
---------------------------------------------------------------------------------------------------
23
--
24
--      Version 1.0  26.12.2006
25
--                               Базовая версия
26
--
27
---------------------------------------------------------------------------------------------------
28
 
29
 
30
library ieee;
31
use ieee.std_logic_1164.all;
32
use work.adm2_pkg.all;
33
 
34
package cl_fifo1024x65_v5_pkg is
35
 
36
component cl_fifo1024x65_v5 is
37
         port(
38
                -- сброс
39
                 reset          : in std_logic;                                                 -- 0 - сброс
40
 
41
                -- запись
42
                 clk_wr         : in std_logic;                                                 -- тактовая частота записи
43
                 data_in        : in std_logic_vector( 63 downto 0 );    -- вход данных
44
                 data_inx       : in std_logic:='0';                                     -- дополнительный разряд данных
45
                 data_en        : in std_logic;                                                 -- 1 - запись в fifo
46
                 flag_wr        : out bl_fifo_flag;                                             -- флаги fifo, синхронно с clk_wr
47
 
48
                 -- чтение
49
                 clk_rd         : in std_logic;                                                 -- тактовая частота чтения
50
                 data_out       : out std_logic_vector( 63 downto 0 );   -- выход данных
51
                 data_outx      : out std_logic;                                                -- дополнительный разряд данных
52
                 data_cs        : in std_logic;                                                 -- 0 - чтение из fifo
53
                 flag_rd        : out bl_fifo_flag;                                             -- флаги fifo, синхронно с clk_rd 
54
                 flag_empty     : out std_logic                                                 -- 1 - внутреннее FIFO пустое
55
            );
56
end component;
57
 
58
end package;
59
 
60
 
61
 
62
 
63
library ieee;
64
use ieee.std_logic_1164.all;
65
use work.adm2_pkg.all;
66
 
67
entity cl_fifo1024x65_v5 is
68
         port(
69
                -- сброс
70
                 reset          : in std_logic;                                                 -- 0 - сброс
71
 
72
                -- запись
73
                 clk_wr         : in std_logic;                                                 -- тактовая частота записи
74
                 data_in        : in std_logic_vector( 63 downto 0 );    -- вход данных
75
                 data_inx       : in std_logic:='0';                                     -- дополнительный разряд данных
76
                 data_en        : in std_logic;                                                 -- 1 - запись в fifo
77
                 flag_wr        : out bl_fifo_flag;                                             -- флаги fifo, синхронно с clk_wr
78
 
79
                 -- чтение
80
                 clk_rd         : in std_logic;                                                 -- тактовая частота чтения
81
                 data_out       : out std_logic_vector( 63 downto 0 );   -- выход данных
82
                 data_outx      : out std_logic;                                                -- дополнительный разряд данных
83
                 data_cs        : in std_logic;                                                 -- 0 - чтение из fifo
84
                 flag_rd        : out bl_fifo_flag;                                             -- флаги fifo, синхронно с clk_rd 
85
                 flag_empty     : out std_logic                                           -- 1 - внутреннее FIFO пустое
86
            );
87
end cl_fifo1024x65_v5;
88
 
89
 
90
architecture cl_fifo1024x65_v5 of cl_fifo1024x65_v5 is
91
 
92
 
93
component ctrl_fifo1024x65_v5 is
94
        port (
95
        din: in std_logic_vector(64 downto 0);
96
        rd_clk: in std_logic;
97
        rd_en: in std_logic;
98
        rst: in std_logic;
99
        wr_clk: in std_logic;
100
        wr_en: in std_logic;
101
        dout: out std_logic_vector(64 downto 0);
102
        empty: out std_logic;
103
        full: out std_logic;
104
        prog_empty: out std_logic;
105
        prog_full: out std_logic;
106
        rd_data_count: out std_logic_vector(0 downto 0);
107
        wr_data_count: out std_logic_vector(0 downto 0));
108
end component;
109
 
110
 
111
component cl_fifo_control_v2 is
112
        port(
113
                reset           : in std_logic;         -- 0 - сброс
114
                clk                     : in std_logic;         -- тактовая частота
115
                ef                      : out std_logic;        -- 0 - FIFO пустое
116
                rd                      : out std_logic;        -- 1 - чтение из FIFO
117
                we                      : out std_logic;        -- 1 - запись во входной буфер
118
                empty           : in std_logic;         -- 1 - FIFO пустое
119
                read            : in std_logic          -- 0 - запрос на чтение
120
                );
121
end component;
122
 
123
 
124
 
125
signal reset_p          : std_logic;
126
signal r_en                     : std_logic;
127
signal full                     : std_logic;
128
signal empty            : std_logic;
129
signal ef                       : std_logic;
130
signal s_pae,s_paf,s_hf : std_logic;
131
signal s_ovr,s_und:std_logic;
132
signal w_cnt,r_cnt      : std_logic_vector( 0 downto 0 );
133
signal fifo_in          : std_logic_vector( 64 downto 0 );
134
signal fifo_out         : std_logic_vector( 64 downto 0 );
135
signal data_out_we      : std_logic;
136
signal prog_full        : std_logic;
137
signal prog_empty       : std_logic;
138
 
139
--attribute rlock_range: string;
140
--attribute rlock_range of crl: label is "R0C0:R3C0";
141
begin
142
 
143
 
144
fifo_in( 63 downto 0 ) <= data_in;
145
fifo_in( 64 ) <= data_inx;
146
 
147
ctrl_fifo : ctrl_fifo1024x65_v5
148
        port map (
149
                din             => fifo_in,
150
                wr_en           => data_en,
151
                wr_clk          => clk_wr,
152
                rd_en           => r_en,
153
                rd_clk          => clk_rd,
154
                rst             => reset_p,
155
                dout            => fifo_out,
156
                full            => full,
157
                empty           => empty,
158
                prog_empty  => prog_empty,
159
                prog_full   => prog_full,
160
                wr_data_count   => w_cnt,
161
                rd_data_count   => r_cnt
162
        );
163
 
164
crl : cl_fifo_control_v2
165
        port map (
166
 
167
                reset           => reset,               -- 0 - сброс
168
                clk                     => clk_rd,              -- тактовая частота
169
                ef                      => ef,                  -- 0 - FIFO пустое
170
                rd                      => r_en,                -- 1 - чтение из FIFO
171
                we                      => data_out_we, -- 1 - запись в выходной буфер
172
                empty           => empty,               -- 1 - FIFO пустое
173
                read            => data_cs              -- 0 - запрос на чтение
174
         );
175
 
176
reset_p<=not reset;
177
flag_empty <= empty;
178
 
179
 
180
pr_fifo_out: process( clk_rd ) begin
181
        if( rising_edge( clk_rd ) ) then
182
          if( data_out_we='1' ) then
183
                data_out<=fifo_out( 63 downto 0 ) after 1 ns;
184
          end if;
185
        end if;
186
end process;
187
 
188
pr_fifo_outx: process( reset, clk_rd ) begin
189
        if( reset='0' ) then
190
                data_outx <= '0' after 1 ns;
191
        elsif( rising_edge( clk_rd ) ) then
192
          if( data_out_we='1' ) then
193
                data_outx <= fifo_out( 64 ) after 1 ns;
194
          end if;
195
        end if;
196
end process;
197
 
198
 
199
pr_errorU: process( reset, clk_rd )
200
begin
201
        if (reset='0') then
202
                s_und<='0' after 1 ns;
203
        elsif( rising_edge( clk_rd ) ) then
204
                if( ef='0'  ) then
205
                        if(data_cs='0') then
206
                                s_und<='1' after 1 ns;
207
                        end if;
208
                end if;
209
        end if;
210
end process;
211
 
212
pr_errorA: process( reset, clk_wr )
213
begin
214
 
215
        if (reset='0') then
216
                s_ovr<='0' after 1 ns;
217
        elsif( rising_edge( clk_wr ) ) then
218
                if(full='1' ) then
219
                        if(data_en='1') then
220
                                s_ovr<='1' after 1 ns;
221
                        end if;
222
                end if;
223
        end if;
224
end process;
225
 
226
 
227
 
228
flag_rd.ef<=ef;
229
 
230
pr_flag_rd: process( reset, clk_rd )
231
 variable vef, vff: std_logic;
232
begin
233
  if(reset='0') then
234
          flag_rd.pae<='0' after 1 ns;
235
          flag_rd.hf<='1'  after 1 ns;
236
          flag_rd.paf<='1' after 1 ns;
237
          flag_rd.ff<='1'  after 1 ns;
238
  elsif( rising_edge( clk_rd ) ) then
239
                flag_rd.pae <= not prog_empty after 1 ns;
240
                flag_rd.paf <= not prog_full  or not r_cnt(0) after 1 ns;
241
                flag_rd.hf  <= not r_cnt(0)   after 1 ns;
242
                flag_rd.ff  <= not full or not r_cnt(0) after 1 ns;
243
  end if;
244
end process;
245
 
246
flag_rd.ovr<=s_ovr;
247
flag_rd.und<=s_und;
248
 
249
 
250
flag_wr.ff<=( not full ) or not w_cnt(0) after 1 ns;
251
 
252
pr_flag_wr: process( reset, clk_wr )
253
 
254
begin
255
        if(reset='0') then
256
          flag_wr.ef<='0'   after 1 ns;
257
          flag_wr.pae<='0'  after 1 ns;
258
          flag_wr.hf<='1'   after 1 ns;
259
          flag_wr.paf<='1'  after 1 ns;
260
 
261
        elsif( rising_edge( clk_wr ) ) then
262
                flag_wr.pae<=  not prog_empty after 1 ns;
263
                flag_wr.paf<=  not prog_full or not w_cnt(0) after 1 ns;
264
                flag_wr.hf<=   not w_cnt(0)   after 1 ns;
265
                flag_wr.ef<=   ef             after 1 ns;
266
        end if;
267
 
268
end process;
269
 
270
flag_wr.ovr<=s_ovr;
271
flag_wr.und<=s_und;
272
 
273
 
274
 
275
 
276
end cl_fifo1024x65_v5;
277
 

powered by: WebSVN 2.1.0

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