AMBPEX5_v20_SX50T_CORE
adm/rtl/cl_fifo_control_v2.vhd
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;