AMBPEX5_v20_SX50T_CORE
|
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