AMBPEX5_v20_SX50T_CORE
|
00001 --------------------------------------------------------------------------------------------------- 00002 -- 00003 -- Title : cl_fifo_control_v2 00004 -- Author : Dmitry Smekhov 00005 -- Company : Instrumental System 00006 -- E-mail : dsmv@insys.ru 00007 -- 00008 -- Version : 2.0 00009 -- 00010 --------------------------------------------------------------------------------------------------- 00011 -- 00012 -- Description : Управление FIFO 00013 -- Модификация 2 00014 -- Используется для управления FIFO с выходом на регистр 00015 -- 00016 --------------------------------------------------------------------------------------------------- 00017 -- 00018 -- Version 2.0 24.02.2004 00019 -- Изменён алгоритм работы. Исправлены ошибки чтения данных. 00020 -- 00021 -- Version 1.2 13.01.2004 00022 -- Исправлено чтение второго слова из FIFO при empty=0 00023 -- 00024 -- Version 1.1 24.12.2003 00025 -- Исправлен алгоритм работы 00026 -- 00027 --------------------------------------------------------------------------------------------------- 00028 00029 library ieee; 00030 use ieee.std_logic_1164.all; 00031 00032 entity cl_fifo_control_v2 is 00033 port( 00034 reset : in std_logic; -- 0 - сброс 00035 clk : in std_logic; -- тактовая частота 00036 ef : out std_logic; -- 0 - FIFO пустое 00037 rd : out std_logic; -- 1 - чтение из FIFO 00038 we : out std_logic; -- 1 - запись во входной буфер 00039 empty : in std_logic; -- 1 - FIFO пустое 00040 read : in std_logic -- 0 - запрос на чтение 00041 ); 00042 end cl_fifo_control_v2; 00043 00044 00045 architecture cl_fifo_control_v2 of cl_fifo_control_v2 is 00046 00047 type st_type is ( s0, s1, s2, s4, s5, s6, s7 ); 00048 signal st, stn : st_type; 00049 signal empty1 : std_logic; 00050 00051 begin 00052 00053 pr_state: process( reset, clk ) begin 00054 if( reset='0' ) then 00055 st<=s0; 00056 elsif( rising_edge( clk ) ) then 00057 st<=stn after 1 ns; 00058 end if; 00059 end process; 00060 00061 pr_empty1: process( clk ) begin 00062 if( rising_edge( clk ) ) then 00063 empty1<=empty after 1 ns; 00064 end if; 00065 end process; 00066 00067 pr_st: process( clk, st, empty, read ) 00068 00069 variable vr : std_logic; -- rd; 00070 variable vw : std_logic; -- we; 00071 variable vef: std_logic; -- ef; 00072 00073 begin 00074 00075 vr:='0'; 00076 vw:='0'; 00077 vef:='0'; 00078 00079 case st is 00080 when s0 => if( empty='0' ) then 00081 stn <= s1; 00082 else 00083 stn <=s0; 00084 end if; 00085 when s1 => vr:='1'; stn <=s2; 00086 when s2 => vw:='1'; stn <=s4; 00087 when s4 => if( empty1='0' ) then stn<=s7; vr:='1'; 00088 else stn<=s5; 00089 end if; 00090 when s5 => vef:='1'; 00091 if( read='0' ) then 00092 stn<=s0; 00093 elsif( empty1='0' ) then 00094 vr:='1'; 00095 stn<=s7; 00096 else 00097 stn<=s5; 00098 end if; 00099 00100 when s6 => -- vef:='1'; 00101 vr:='1'; 00102 stn<=s7; 00103 -- if( read='0' )then 00104 -- stn<=s0; 00105 -- else 00106 -- vr:='1'; 00107 -- stn<=s7; 00108 -- end if; 00109 00110 when s7 => vef:='1'; 00111 if( read='0' ) then 00112 if( empty='0' ) then 00113 vr:='1'; 00114 vw:='1'; 00115 stn<=s7; 00116 else 00117 vw:='1'; 00118 stn<=s5; 00119 end if; 00120 else 00121 stn<=s7; 00122 end if; 00123 end case; 00124 00125 rd <= vr; 00126 we <= vw; 00127 ef <= vef; 00128 00129 end process; 00130 00131 end cl_fifo_control_v2;