AMBPEX5_v20_SX50T_CORE
adm/rtl/cl_fifo1024x65_v5.vhd
00001 ---------------------------------------------------------------------------------------------------
00002 --
00003 -- Title       : cl_fifo1024x65_v5
00004 -- Author      : Dmitry Smekhov
00005 -- Company     : Instrumental System
00006 --
00007 -- Version         : 1.1           
00008 --
00009 ---------------------------------------------------------------------------------------------------
00010 --
00011 -- Description : Модуль FIFO 1024x65
00012 --                               Модификация 5
00013 --                               Выход FIFO - с регистра
00014 --                               Уровни срабатывания флагов PAE, PAF - 32 слова
00015 --                               Нет выходов от счётчиков слов
00016 --
00017 ---------------------------------------------------------------------------------------------------
00018 --
00019 --      Version 1.1  17.05.2007
00020 --                               Добавлен выход flag_empty
00021 --
00022 ---------------------------------------------------------------------------------------------------
00023 --
00024 --      Version 1.0  26.12.2006
00025 --                               Базовая версия
00026 --
00027 ---------------------------------------------------------------------------------------------------
00028 
00029 
00030 library ieee;
00031 use ieee.std_logic_1164.all;
00032 use work.adm2_pkg.all;
00033 
00034 package cl_fifo1024x65_v5_pkg is
00035 
00036 component cl_fifo1024x65_v5 is   
00037          port(                          
00038                 -- сброс
00039                  reset          : in std_logic;                                                 -- 0 - сброс
00040                  
00041                 -- запись
00042                  clk_wr         : in std_logic;                                                 -- тактовая частота записи
00043                  data_in        : in std_logic_vector( 63 downto 0 );   -- вход данных
00044                  data_inx       : in std_logic:='0';                                    -- дополнительный разряд данных
00045                  data_en        : in std_logic;                                                 -- 1 - запись в fifo
00046                  flag_wr        : out bl_fifo_flag;                                             -- флаги fifo, синхронно с clk_wr
00047                  
00048                  -- чтение
00049                  clk_rd         : in std_logic;                                                 -- тактовая частота чтения
00050                  data_out       : out std_logic_vector( 63 downto 0 );  -- выход данных
00051                  data_outx      : out std_logic;                                                -- дополнительный разряд данных
00052                  data_cs        : in std_logic;                                                 -- 0 - чтение из fifo
00053                  flag_rd        : out bl_fifo_flag;                                             -- флаги fifo, синхронно с clk_rd 
00054                  flag_empty     : out std_logic                                                 -- 1 - внутреннее FIFO пустое
00055             );
00056 end component;
00057 
00058 end package;
00059 
00060 
00061 
00062 
00063 library ieee;
00064 use ieee.std_logic_1164.all;
00065 use work.adm2_pkg.all;
00066 
00067 entity cl_fifo1024x65_v5 is   
00068          port(                          
00069                 -- сброс
00070                  reset          : in std_logic;                                                 -- 0 - сброс
00071                  
00072                 -- запись
00073                  clk_wr         : in std_logic;                                                 -- тактовая частота записи
00074                  data_in        : in std_logic_vector( 63 downto 0 );   -- вход данных
00075                  data_inx       : in std_logic:='0';                                    -- дополнительный разряд данных
00076                  data_en        : in std_logic;                                                 -- 1 - запись в fifo
00077                  flag_wr        : out bl_fifo_flag;                                             -- флаги fifo, синхронно с clk_wr
00078                  
00079                  -- чтение
00080                  clk_rd         : in std_logic;                                                 -- тактовая частота чтения
00081                  data_out       : out std_logic_vector( 63 downto 0 );  -- выход данных
00082                  data_outx      : out std_logic;                                                -- дополнительный разряд данных
00083                  data_cs        : in std_logic;                                                 -- 0 - чтение из fifo
00084                  flag_rd        : out bl_fifo_flag;                                             -- флаги fifo, синхронно с clk_rd 
00085                  flag_empty     : out std_logic                                           -- 1 - внутреннее FIFO пустое
00086             );
00087 end cl_fifo1024x65_v5;
00088 
00089 
00090 architecture cl_fifo1024x65_v5 of cl_fifo1024x65_v5 is  
00091 
00092 
00093 component ctrl_fifo1024x65_v5 is
00094         port (
00095         din: in std_logic_vector(64 downto 0);
00096         rd_clk: in std_logic;
00097         rd_en: in std_logic;
00098         rst: in std_logic;
00099         wr_clk: in std_logic;
00100         wr_en: in std_logic;
00101         dout: out std_logic_vector(64 downto 0);
00102         empty: out std_logic;
00103         full: out std_logic;
00104         prog_empty: out std_logic;
00105         prog_full: out std_logic;
00106         rd_data_count: out std_logic_vector(0 downto 0);
00107         wr_data_count: out std_logic_vector(0 downto 0));
00108 end component;
00109 
00110 
00111 component cl_fifo_control_v2 is   
00112         port(  
00113                 reset           : in std_logic;         -- 0 - сброс
00114                 clk                     : in std_logic;         -- тактовая частота
00115                 ef                      : out std_logic;        -- 0 - FIFO пустое
00116                 rd                      : out std_logic;        -- 1 - чтение из FIFO
00117                 we                      : out std_logic;        -- 1 - запись во входной буфер
00118                 empty           : in std_logic;         -- 1 - FIFO пустое
00119                 read            : in std_logic          -- 0 - запрос на чтение
00120                 );
00121 end component;
00122 
00123 
00124         
00125 signal reset_p          : std_logic;
00126 signal r_en                     : std_logic;    
00127 signal full                     : std_logic;
00128 signal empty            : std_logic;
00129 signal ef                       : std_logic;  
00130 signal s_pae,s_paf,s_hf : std_logic;  
00131 signal s_ovr,s_und:std_logic;
00132 signal w_cnt,r_cnt      : std_logic_vector( 0 downto 0 ); 
00133 signal fifo_in          : std_logic_vector( 64 downto 0 );
00134 signal fifo_out         : std_logic_vector( 64 downto 0 );
00135 signal data_out_we      : std_logic; 
00136 signal prog_full        : std_logic;
00137 signal prog_empty       : std_logic;
00138 
00139 --attribute rlock_range: string;
00140 --attribute rlock_range of crl: label is "R0C0:R3C0";
00141 begin                                                      
00142         
00143         
00144 fifo_in( 63 downto 0 ) <= data_in;
00145 fifo_in( 64 ) <= data_inx;
00146         
00147 ctrl_fifo : ctrl_fifo1024x65_v5
00148         port map (
00149                 din             => fifo_in,
00150                 wr_en           => data_en,
00151                 wr_clk          => clk_wr,
00152                 rd_en           => r_en,
00153                 rd_clk           => clk_rd,
00154                 rst                     => reset_p,
00155                 dout            => fifo_out,
00156                 full                    => full,
00157                 empty            => empty,
00158                 prog_empty  => prog_empty ,
00159                 prog_full   => prog_full ,
00160                 wr_data_count   => w_cnt,
00161                 rd_data_count   => r_cnt
00162         );      
00163                         
00164 crl : cl_fifo_control_v2
00165         port map (
00166 
00167                 reset           => reset,               -- 0 - сброс
00168                 clk                     => clk_rd,              -- тактовая частота
00169                 ef                      => ef,                  -- 0 - FIFO пустое
00170                 rd                      => r_en,                -- 1 - чтение из FIFO
00171                 we                      => data_out_we, -- 1 - запись в выходной буфер
00172                 empty           => empty,               -- 1 - FIFO пустое
00173                 read            => data_cs -- 0 - запрос на чтение
00174          );             
00175 
00176 reset_p<=not reset;
00177 flag_empty <= empty;
00178                 
00179 
00180 pr_fifo_out: process( clk_rd ) begin
00181         if( rising_edge( clk_rd ) ) then
00182           if( data_out_we='1' ) then
00183                 data_out<=fifo_out( 63 downto 0 ) after 1 ns;
00184           end if;
00185         end if;
00186 end process;
00187 
00188 pr_fifo_outx: process( reset, clk_rd ) begin
00189         if( reset='0' ) then
00190                 data_outx <= '0' after 1 ns;
00191         elsif( rising_edge( clk_rd ) ) then
00192           if( data_out_we='1' ) then
00193                 data_outx <= fifo_out( 64 ) after 1 ns;
00194           end if;
00195         end if;
00196 end process;
00197 
00198         
00199 pr_errorU: process( reset, clk_rd )   
00200 begin                                                            
00201         if (reset='0') then
00202                 s_und<='0' after 1 ns;  
00203         elsif( rising_edge( clk_rd ) ) then     
00204                 if( ef='0'  ) then              
00205                         if(data_cs='0') then
00206                                 s_und<='1' after 1 ns;
00207                         end if;
00208                 end if; 
00209         end if;
00210 end process;   
00211 
00212 pr_errorA: process( reset, clk_wr )  
00213 begin                                                            
00214         
00215         if (reset='0') then
00216                 s_ovr<='0' after 1 ns;  
00217         elsif( rising_edge( clk_wr ) ) then             
00218                 if(full='1' ) then
00219                         if(data_en='1') then
00220                                 s_ovr<='1' after 1 ns;          
00221                         end if;
00222                 end if; 
00223         end if;
00224 end process; 
00225         
00226         
00227 
00228 flag_rd.ef<=ef;
00229         
00230 pr_flag_rd: process( reset, clk_rd ) 
00231  variable vef, vff: std_logic;
00232 begin  
00233   if(reset='0') then
00234           flag_rd.pae<='0' after 1 ns;
00235           flag_rd.hf<='1'  after 1 ns;
00236           flag_rd.paf<='1' after 1 ns;
00237           flag_rd.ff<='1'  after 1 ns;
00238   elsif( rising_edge( clk_rd ) ) then
00239                 flag_rd.pae <= not prog_empty after 1 ns;
00240                 flag_rd.paf <= not prog_full  or not r_cnt(0) after 1 ns;
00241                 flag_rd.hf  <= not r_cnt(0)   after 1 ns;
00242                 flag_rd.ff  <= not full or not r_cnt(0) after 1 ns;
00243   end if;                         
00244 end process;           
00245 
00246 flag_rd.ovr<=s_ovr;
00247 flag_rd.und<=s_und;
00248 
00249 
00250 flag_wr.ff<=( not full ) or not w_cnt(0) after 1 ns;
00251 
00252 pr_flag_wr: process( reset, clk_wr ) 
00253 
00254 begin  
00255         if(reset='0') then
00256           flag_wr.ef<='0'   after 1 ns;
00257           flag_wr.pae<='0'  after 1 ns;
00258           flag_wr.hf<='1'   after 1 ns;
00259           flag_wr.paf<='1'  after 1 ns;
00260 
00261         elsif( rising_edge( clk_wr ) ) then
00262                 flag_wr.pae<=  not prog_empty after 1 ns;
00263                 flag_wr.paf<=  not prog_full or not w_cnt(0) after 1 ns;
00264                 flag_wr.hf<=   not w_cnt(0)   after 1 ns;
00265                 flag_wr.ef<=   ef             after 1 ns;
00266         end if;                   
00267         
00268 end process;           
00269         
00270 flag_wr.ovr<=s_ovr;
00271 flag_wr.und<=s_und;
00272 
00273 
00274 
00275 
00276 end cl_fifo1024x65_v5;
00277