AMBPEX5_v20_SX50T_CORE
adm/main/cl_chn_v3.vhd
00001 ---------------------------------------------------------------------------------------------------
00002 --
00003 -- Title       : cl_chn_v3
00004 -- Author      : Ilya Ivanov
00005 -- Company     : Instrumental System
00006 --
00007 -- Version     : 3.0
00008 ---------------------------------------------------------------------------------------------------
00009 --
00010 -- Description : Реализация общих регистров управления,
00011 --                               формирование прерывания и запроса DMA
00012 --                               Для дешифрации адреса используются только разряды 3..0.
00013 --                               Добавлена дешифрация регистров MODE3 и SFLAG
00014 --
00015 ---------------------------------------------------------------------------------------------------
00016 --
00017 --   Version 3.1   05.04.2010
00018 --                                      Добавлены триггеры на сигналы rst, fifo_rst
00019 --
00020 ---------------------------------------------------------------------------------------------------
00021 
00022 library IEEE;
00023 use IEEE.STD_LOGIC_1164.all;
00024 
00025 use work.adm2_pkg.all; 
00026 
00027 package cl_chn_v3_pkg is        
00028         
00029 component cl_chn_v3 is    
00030         generic (                                        
00031           -- 2 - out - для тетрады вывода
00032           -- 1 - in  - для тетрады ввода
00033           chn_type : integer 
00034         );
00035 
00036         port(
00037                 reset: in std_logic;                            -- 0 - общий сброс
00038                 clk: in std_logic;                                      -- тактовая частота
00039                 
00040                 -- Флаги
00041                 cmd_rdy         : in std_logic;                 -- 1 - готовность тетрады
00042                 rdy                     : in std_logic;                 -- 1 - готовность FIFO
00043                 fifo_flag       : in bl_fifo_flag;              -- флаги FIFO
00044                 st9                     : in std_logic:='0';    -- Разряды регистры STATUS
00045                 st10            : in std_logic:='0';
00046                 st11            : in std_logic:='0';
00047                 st12            : in std_logic:='0';
00048                 st13            : in std_logic:='0';
00049                 st14            : in std_logic:='0';
00050                 st15            : in std_logic:='0';
00051                 
00052                 -- Тетрада       
00053                 data_in         : in std_logic_vector( 15 downto 0 );   -- шина данных
00054                 cmd                     : in bl_cmd;                                                    -- команда
00055                 bx_irq          : out std_logic;                                                -- 1 - прерывание от тетрады
00056                 bx_drq          : out bl_drq;                                                   -- запрос DMA
00057                 
00058                 status          : out std_logic_vector( 15 downto 0 );  -- регистр STATUS
00059                                 
00060                 -- Управление
00061                 mode0           : out std_logic_vector( 15 downto 0 );  -- регистры тетрады
00062                 mode1           : out std_logic_vector( 15 downto 0 );  
00063                 mode2           : out std_logic_vector( 15 downto 0 );  
00064                 mode3           : out std_logic_vector( 15 downto 0 );  
00065                 sflag           : out std_logic_vector( 15 downto 0 );
00066                 fdiv            : out std_logic_vector( 15 downto 0 );
00067                 fdiv_we         : out std_logic;                                                -- 1 - в регистре FDIV новое значение
00068                 fmode           : out std_logic_vector( 15 downto 0 );
00069                 stmode          : out std_logic_vector( 15 downto 0 );
00070                 cnt0            : out std_logic_vector( 15 downto 0 );
00071                 cnt1            : out std_logic_vector( 15 downto 0 );
00072                 cnt2            : out std_logic_vector( 15 downto 0 );
00073                 rst                     : out std_logic;                                                -- 0 - сброс тетрады
00074                 fifo_rst        : out std_logic                                                 -- 0 - сброс FIFO
00075         );
00076 end component;
00077 
00078 end cl_chn_v3_pkg;
00079 
00080 library IEEE;
00081 use IEEE.STD_LOGIC_1164.all;
00082 
00083 use work.adm2_pkg.all; 
00084 
00085 entity cl_chn_v3 is       
00086         generic (                                        
00087           -- 2 - out - для тетрады вывода
00088           -- 1 - in  - для тетрады ввода
00089           chn_type : integer 
00090         );
00091 
00092         port(
00093                 reset: in std_logic;                            -- 0 - общий сброс
00094                 clk: in std_logic;                                      -- тактовая частота
00095                 
00096                 -- Флаги
00097                 cmd_rdy         : in std_logic;                 -- 1 - готовность тетрады
00098                 rdy                     : in std_logic;                 -- 1 - готовность FIFO
00099                 fifo_flag       : in bl_fifo_flag;              -- флаги FIFO
00100                 st9                     : in std_logic:='0';    -- Разряды регистры STATUS
00101                 st10            : in std_logic:='0';
00102                 st11            : in std_logic:='0';
00103                 st12            : in std_logic:='0';
00104                 st13            : in std_logic:='0';
00105                 st14            : in std_logic:='0';
00106                 st15            : in std_logic:='0';
00107                 
00108                 -- Тетрада       
00109                 data_in         : in std_logic_vector( 15 downto 0 );   -- шина данных
00110                 cmd                     : in bl_cmd;                                                    -- команда
00111                 bx_irq          : out std_logic;                                                -- 1 - прерывание от тетрады
00112                 bx_drq          : out bl_drq;                                                   -- запрос DMA
00113                 
00114                 status          : out std_logic_vector( 15 downto 0 );  -- регистр STATUS
00115                                 
00116                 -- Управление
00117                 mode0           : out std_logic_vector( 15 downto 0 );  -- регистры тетрады
00118                 mode1           : out std_logic_vector( 15 downto 0 );  
00119                 mode2           : out std_logic_vector( 15 downto 0 );  
00120                 mode3           : out std_logic_vector( 15 downto 0 );  
00121                 sflag           : out std_logic_vector( 15 downto 0 );
00122                 fdiv            : out std_logic_vector( 15 downto 0 );
00123                 fdiv_we         : out std_logic;                                                -- 1 - в регистре FDIV новое значение
00124                 fmode           : out std_logic_vector( 15 downto 0 );
00125                 stmode          : out std_logic_vector( 15 downto 0 );
00126                 cnt0            : out std_logic_vector( 15 downto 0 );
00127                 cnt1            : out std_logic_vector( 15 downto 0 );
00128                 cnt2            : out std_logic_vector( 15 downto 0 );
00129                 rst                     : out std_logic;                                                -- 0 - сброс тетрады
00130                 fifo_rst        : out std_logic                                                 -- 0 - сброс FIFO
00131         );
00132 end cl_chn_v3;
00133 
00134 architecture cl_chn_v3 of cl_chn_v3 is
00135   
00136 signal  c_mode0, c_mode1, c_mode2, c_mode3              : std_logic_vector( 15 downto 0 );
00137 signal  c_mask, c_inv, c_sflag, c_flag, c_irq   : std_logic_vector( 15 downto 0 );
00138 signal  c_fmode, c_fdiv, c_stmode, c_cnt0, c_cnt1, c_cnt2: std_logic_vector( 15 downto 0 );
00139 signal  c_status: std_logic_vector( 15 downto 0 );
00140 signal  c_drq_en: std_logic;     
00141 signal  c_rst: std_logic;       -- 0 - сброс тетрады
00142 
00143 
00144 begin
00145 
00146         
00147         
00148 mode0<=c_mode0;
00149 mode1<=c_mode1;
00150 mode2<=c_mode2;
00151 mode3<=c_mode3; 
00152 sflag<=c_sflag;
00153 status<=c_status;
00154 fmode<=c_fmode;
00155 fdiv<=c_fdiv; 
00156 stmode<=c_stmode;
00157 cnt0<=c_cnt0;
00158 cnt1<=c_cnt1;
00159 cnt2<=c_cnt2;
00160 
00161 
00162 pr_mode0: process( reset, clk ) begin
00163         if( reset='0' ) then
00164                 c_mode0<=(others=>'0');
00165         elsif( rising_edge( clk ) ) then
00166                 if( cmd.cmd_data_we='1' ) then
00167                         if( cmd.adr(9)='0' and cmd.adr(8)='0' ) then
00168                           case cmd.adr( 3 downto 0 ) is
00169                                   when "0000" => c_mode0<=data_in;
00170                                   when others=>null;
00171                           end case;
00172                         end if;
00173                 end if;
00174         end if;
00175 end process;
00176 
00177 
00178 pr_reg: process( c_rst, clk ) 
00179  variable v: std_logic;
00180 begin
00181         if( c_rst='0' ) then
00182                 c_mode1<=(others=>'0');
00183                 c_mode2<=(others=>'0');
00184                 c_mode3<=(others=>'0');
00185                 c_sflag<=(others=>'0');
00186                 c_mask<=(others=>'0');
00187                 c_inv<=(others=>'0'); 
00188                 c_fmode<=(others=>'0');
00189                 c_fdiv <=(others=>'0'); 
00190                 c_stmode<=(others=>'0'); 
00191                 c_cnt0<=(others=>'0'); 
00192                 c_cnt1<=(others=>'0'); 
00193                 c_cnt2<=(others=>'0'); 
00194                 fdiv_we<='0';
00195         elsif( rising_edge( clk ) ) then
00196                 v:='0';
00197                 if( cmd.cmd_data_we='1' ) then
00198                         if( cmd.adr(9)='0' and cmd.adr(8)='0' ) then
00199                           case cmd.adr( 3 downto 0 ) is
00200                                   when x"1" => c_mask<=data_in;
00201                                   when x"2" => c_inv<=data_in;
00202                                   when x"3" => c_fmode<=data_in; 
00203                                   when x"4" => c_fdiv<=data_in; v:='1';
00204                                   when x"5" => c_stmode<=data_in;
00205                                   when x"6" => c_cnt0<=data_in;
00206                                   when x"7" => c_cnt1<=data_in;
00207                                   when x"8" => c_cnt2<=data_in;
00208                                   when x"9" => c_mode1<=data_in;
00209                                   when x"a" => c_mode2<=data_in;
00210                                   when x"b" => c_mode3<=data_in;
00211                                   when x"c" => c_sflag<=data_in;
00212                                   when others=>null;
00213                           end case;
00214                         end if;
00215                 end if;
00216                 fdiv_we<=v;
00217         end if;
00218 end process;
00219 
00220 pr_status: process( clk ) begin
00221         if( rising_edge( clk ) ) then
00222                 c_status(0)<=cmd_rdy;
00223                 c_status(1)<=rdy;
00224                 c_status(2)<=fifo_flag.ef;
00225                 c_status(3)<=fifo_flag.pae;
00226                 c_status(4)<=fifo_flag.hf;
00227                 c_status(5)<=fifo_flag.paf;
00228                 c_status(6)<=fifo_flag.ff;  
00229                 c_status(7)<=fifo_flag.ovr;
00230                 c_status(8)<=fifo_flag.und;
00231                 c_status(9)<=st9;
00232                 c_status(10)<=st10;
00233                 c_status(11)<=st11;
00234                 c_status(12)<=st12;
00235                 c_status(13)<=st13;
00236                 c_status(14)<=st14;
00237                 c_status(15)<=st15;
00238         end if;
00239 end process; 
00240 
00241 c_flag<=c_status xor c_inv;
00242 c_irq<= c_flag and c_mask;
00243 
00244 pr_irq: process( c_irq, clk ) 
00245  variable v: std_logic;
00246 begin   
00247         v:='0';
00248         for i in 0 to 15 loop
00249                 v:=v or c_irq( i );
00250         end loop;
00251         if( rising_edge( clk ) ) then
00252                 bx_irq<=v and c_mode0(2);
00253         end if;
00254 end process;
00255 
00256 
00257 c_rst<=reset and ( not c_mode0(0) );
00258 rst <= c_rst  after 1 ns when rising_edge( clk );
00259 
00260 fifo_rst<=reset and ( not c_mode0(0) ) and ( not c_mode0(1) )  after 1 ns when rising_edge( clk );
00261 
00262 c_drq_en<=c_mode0( 3 );
00263 
00264 bx_drq.en<=c_drq_en;
00265 
00266 gen_out: if chn_type=2 generate
00267 
00268 pr_bx_drq: process( c_mode0, fifo_flag, c_drq_en, rdy ) 
00269 
00270 begin
00271         case c_mode0( 13 downto 12 )  is
00272                 when "00" => bx_drq.req <= fifo_flag.paf and c_drq_en; -- PAF = 1 
00273                 when "01" => bx_drq.req <= rdy and c_drq_en;               -- RDY = 1
00274                 when "10" => bx_drq.req <= fifo_flag.hf and c_drq_en; -- HF  = 1
00275                 when others => bx_drq.req<='0';
00276         end case;
00277 end process;    
00278         
00279         bx_drq.ack <= cmd.data_we and c_drq_en;
00280         
00281 end generate;
00282 
00283 gen_in: if chn_type=1 generate
00284 
00285 pr_bx_drq: process( c_mode0, fifo_flag, c_drq_en, rdy )
00286 
00287 begin
00288         case c_mode0( 13 downto 12 ) is
00289                 when "00" => bx_drq.req <= fifo_flag.pae and c_drq_en; -- PAE = 1 
00290                 when "01" => bx_drq.req <= rdy and c_drq_en;               -- RDY = 1
00291                 when "10" => bx_drq.req <= ( not fifo_flag.hf ) and c_drq_en; -- HF  = 0
00292                 when others => bx_drq.req<='0';
00293         end case;
00294 end process;
00295 
00296         bx_drq.ack <= ( not cmd.data_cs )  and c_drq_en;
00297         
00298 end generate;   
00299                                                
00300 end cl_chn_v3;
00301