DS_DMA
pcie_src/pcie_core64_m1/pcie_fifo_ext/ctrl_main.vhd
00001 -------------------------------------------------------------------------------
00002 --
00003 -- Title       : ctrl_main
00004 -- Author      : Dmitry Smekhov
00005 -- Company     : Instrumental Systems
00006 -- E-mail      : dsmv@insys.ru
00007 --
00008 -- Version     : 1.2
00009 --
00010 -------------------------------------------------------------------------------
00011 --
00012 -- Description : Узел формирования команд для управления работой контроллера DMA
00013 --
00014 -------------------------------------------------------------------------------
00015 --
00016 --  Version 1.2   26.01.2011
00017 --                               Добавлена запись 40-битного начального адреса дескриптора
00018 --
00019 -------------------------------------------------------------------------------
00020 --
00021 --  Version 1.1   02.06.2009
00022 --                                Добавлено чередование приоритетов запуска каналов DMA
00023 --
00024 -------------------------------------------------------------------------------
00025 
00026 library ieee;
00027 use ieee.std_logic_1164.all;                      
00028 
00029 package ctrl_main_pkg is
00030 
00031 component ctrl_main is
00032         port(
00033                 ---- Global ----
00034                 reset                   : in std_logic; -- 0 - сброс
00035                 clk                             : in std_logic; -- тактовая частота
00036 
00037                 ---- Регистры управления ----
00038                 dma0_ctrl               : in std_logic_vector( 7 downto 0 );    -- Регистр DMA_CTRL, канал 0
00039                 dma1_ctrl               : in std_logic_vector( 7 downto 0 );    -- Регистр DMA_CTRL, канал 0
00040                 
00041                 ---- ctrl_ext_ram ----
00042                 dma0_transfer_rdy       : in std_logic; -- 1 - канал 0 готов к обмену
00043                 dma1_transfer_rdy       : in std_logic; -- 1 - канал 1 готов к обмену
00044                 
00045                 ---- Управление DMA ----
00046                 dma_chn                         : out std_logic;        -- номер канала DMA для текущего обмена
00047                 ram_do                          : out std_logic_vector( 7 downto 0 );   -- данные для записи в регистр STATUS
00048                 ram_adr                         : out std_logic_vector( 8 downto 0 );   -- адрес для записи в регистр STATUS
00049                 ram_we                          : out std_logic;        -- 1 - запись в память
00050                 dma0_eot_clr            : in  std_logic;        -- 1 - сброс флага DMA0_EOT
00051                 dma1_eot_clr            : in  std_logic;        -- 1 - сброс флага DMA1_EOT
00052                 
00053                 reg_dma0_status         : out std_logic_vector( 15 downto 0 );  -- регистр STATUS канала 0
00054                 reg_dma1_status         : out std_logic_vector( 15 downto 0 );  -- регистр STATUS канала 1
00055                 
00056                 ---- ctrl_ext_ram       ----
00057                 ram_change                      : out std_logic;        -- 1 - изменение блока памяти
00058                 loc_adr_we                      : out std_logic;        -- 1 - запись локального адреса
00059                 
00060                 ---- ctrl_ext_descriptor ----
00061                 pci_adr_we                      : out std_logic;        -- 1 - запись адреса
00062                 pci_adr_h_we            : out std_logic;        -- 1 - запись старших разрядов адреса
00063                 dsc_correct                     : in  std_logic;        -- 1 - загружен правильный дескриптор
00064                 dsc_cmd                         : in  std_logic_vector( 7 downto 0 );   -- командное слово дескриптора
00065                 dsc_change_adr          : out std_logic;        -- 1 - смена адреса дескриптора
00066                 dsc_change_mode         : out std_logic;        -- Режим изменения адреса:
00067                                                                                                 -- 0: - увеличение
00068                                                         -- 1: - переход к нулевомй дескриптору
00069                 dsc_load_en                     : out std_logic;        -- 1 - разрешение записи дескриптора
00070                 
00071                 ---- ctrl_dma_ext_cmd ----                                               
00072                 dma_reg0                        : out std_logic_vector( 2 downto 0 );   -- регистр упрравления
00073                 dma_change_adr          : out std_logic ;       -- 1 - изменение адреса и размера
00074                 dma_status                      : in  std_logic_vector( 2 downto 0 )    -- состояние DMA
00075                                                                                                                                         -- 0: 1 - завершение обмена
00076                                                                                                                                         -- 1: 1 - ошибка при обмене
00077                                                                                                                                         -- 2: 1 - размер блока равен 0
00078         );              
00079         
00080 end component;
00081 
00082 end package;
00083 
00084 
00085 
00086 library ieee;
00087 use ieee.std_logic_1164.all;                      
00088 use ieee.std_logic_arith.all;
00089 use ieee.std_logic_unsigned.all;                
00090 
00091 library unisim;                                                                                                          
00092 use unisim.vcomponents.all;
00093 
00094 
00095 entity ctrl_main is
00096         port(
00097                 ---- Global ----
00098                 reset                   : in std_logic; -- 0 - сброс
00099                 clk                             : in std_logic; -- тактовая частота
00100 
00101                 ---- Регистры управления ----
00102                 dma0_ctrl               : in std_logic_vector( 7 downto 0 );    -- Регистр DMA_CTRL, канал 0
00103                 dma1_ctrl               : in std_logic_vector( 7 downto 0 );    -- Регистр DMA_CTRL, канал 0
00104                 
00105                 ---- ctrl_ext_ram ----
00106                 dma0_transfer_rdy       : in std_logic; -- 1 - канал 0 готов к обмену
00107                 dma1_transfer_rdy       : in std_logic; -- 1 - канал 1 готов к обмену
00108                 
00109                 ---- Управление DMA ----
00110                 dma_chn                         : out std_logic;        -- номер канала DMA для текущего обмена
00111                 ram_do                          : out std_logic_vector( 7 downto 0 );   -- данные для записи в регистр STATUS
00112                 ram_adr                         : out std_logic_vector( 8 downto 0 );   -- адрес для записи в регистр STATUS
00113                 ram_we                          : out std_logic;        -- 1 - запись в память
00114                 dma0_eot_clr            : in  std_logic;        -- 1 - сброс флага DMA0_EOT
00115                 dma1_eot_clr            : in  std_logic;        -- 1 - сброс флага DMA1_EOT
00116                 
00117                 reg_dma0_status         : out std_logic_vector( 15 downto 0 );  -- регистр STATUS канала 0
00118                 reg_dma1_status         : out std_logic_vector( 15 downto 0 );  -- регистр STATUS канала 1
00119                 
00120                 ---- ctrl_ext_ram       ----
00121                 ram_change                      : out std_logic;        -- 1 - изменение блока памяти
00122                 loc_adr_we                      : out std_logic;        -- 1 - запись локального адреса
00123                 
00124                 ---- ctrl_ext_descriptor ----
00125                 pci_adr_we                      : out std_logic;        -- 1 - запись адреса
00126                 pci_adr_h_we            : out std_logic;        -- 1 - запись старших разрядов адреса
00127                 dsc_correct                     : in  std_logic;        -- 1 - загружен правильный дескриптор
00128                 dsc_cmd                         : in  std_logic_vector( 7 downto 0 );   -- командное слово дескриптора
00129                 dsc_change_adr          : out std_logic;        -- 1 - смена адреса дескриптора
00130                 dsc_change_mode         : out std_logic;        -- Режим изменения адреса:
00131                                                                                                 -- 0: - увеличение
00132                                                         -- 1: - переход к нулевомй дескриптору
00133                 dsc_load_en                     : out std_logic;        -- 1 - разрешение записи дескриптора
00134                 
00135                 ---- ctrl_dma_ext_cmd ----                                               
00136                 dma_reg0                        : out std_logic_vector( 2 downto 0 );   -- регистр упрравления
00137                 dma_change_adr          : out std_logic ;       -- 1 - изменение адреса и размера
00138                 dma_status                      : in  std_logic_vector( 2 downto 0 )    -- состояние DMA
00139                                                                                                                                         -- 0: 1 - завершение обмена
00140                                                                                                                                         -- 1: 1 - ошибка при обмене
00141                                                                                                                                         -- 2: 1 - размер блока равен 0
00142         );
00143 end ctrl_main;
00144 
00145 
00146 architecture ctrl_main of ctrl_main is
00147 
00148 signal          dma0_eot        : std_logic;    -- 1 - завершение передачи блока канала 0
00149 signal          dma1_eot        : std_logic;    -- 1 - завершение передачи блока канала 1
00150 signal          dma0_sg_eot     : std_logic;    -- 1 - завершение работы канала 0
00151 signal          dma1_sg_eot     : std_logic;    -- 1 - завершение работы канала 1
00152 
00153 signal  dma_eot_set             : std_logic;
00154 signal  dma_sg_eot_set  : std_logic;
00155 
00156 signal  ra                              : std_logic_vector( 7 downto 0 );       -- адрес памяти автомата
00157 signal  dma_chni                : std_logic:='0';       -- номер выбранного канала DMA
00158 
00159 signal  ram_a_adr               : std_logic_vector( 8 downto 0 );
00160 signal  ram_a_out               : std_logic_vector( 31 downto 0 );
00161 
00162 signal  rstp                    : std_logic;       
00163 signal  dma_chn_change_en       : std_logic;            
00164 
00165 signal  dma0_ctrl_z                     : std_logic;
00166 signal  dma1_ctrl_z                     : std_logic;
00167 
00168 signal  dma0_flag_start         : std_logic;
00169 signal  dma1_flag_start         : std_logic;
00170 signal  dma_flag_start          : std_logic;
00171 signal  dma_flag_start_clr      : std_logic;                    
00172 signal  dma_transfer_start      : std_logic;   
00173 signal  dma_chn_change          : std_logic;            
00174 
00175 signal  dma0_start                      : std_logic;
00176 signal  dma1_start                      : std_logic;              
00177 signal  ram_adr_l                       : std_logic_vector( 2 downto 0 );
00178 signal  dma_start                       : std_logic;
00179 
00180 signal  dma0_wait_eot           : std_logic;
00181 signal  dma1_wait_eot           : std_logic;
00182 
00183 signal  dma0_wait_eot2          : std_logic;
00184 signal  dma1_wait_eot2          : std_logic;
00185 
00186 type st_type is ( s0, s01, s1, s2, s3, s4, st0, st1, st20, st2, sc0, sc1, sc2, sc3, sc4, sr0, sr1, sr2, sr3, sr4, sr5, sr6 );
00187 signal  stp             : st_type;       
00188 
00189 ---- Доступ к регистрам ----
00190 ---- 00 - STATUS
00191 ---- 10 - PCI_ADR_L
00192 ---- 11 - LOC_ADR
00193 signal  ram_sel                         : std_logic_vector( 2 downto 0 );
00194 
00195 
00196 type stw_type is ( s0, s01, s02, s03, s1, s2, s3, s4, s5, s6, s7 );
00197 signal  stw             : stw_type;
00198 
00199 
00200 signal  init_compelte   : std_logic;  
00201 
00202 signal  dma_rotate              : std_logic;  
00203 
00204 signal  dma0_block              : std_logic;
00205 signal  dma1_block              : std_logic;
00206 signal  dma0_block_in   : std_logic;
00207 signal  dma1_block_in   : std_logic;
00208 signal  dma0_block_z    : std_logic;
00209 signal  dma1_block_z    : std_logic;
00210 
00211 begin                                    
00212         
00213         
00214         
00215 rstp <= not reset after 1 ns when rising_edge( clk );   
00216 
00217 dma0_ctrl_z     <= dma0_ctrl(0) after 1 ns when rising_edge( clk );
00218 dma1_ctrl_z     <= dma1_ctrl(0) after 1 ns when rising_edge( clk );
00219 
00220 pr_dma_flag_start: process( clk ) begin
00221         if( rising_edge( clk ) ) then
00222                 if( dma0_ctrl(0)='0' or (dma_flag_start_clr='1' and dma_chni='0' ) ) then
00223                         dma0_flag_start <= '0' after 1 ns;
00224                 elsif( dma0_ctrl_z='0' ) then
00225                         dma0_flag_start <= '1' after 1 ns;
00226                 end if;
00227 
00228                 if( dma1_ctrl(0)='0' or (dma_flag_start_clr='1' and dma_chni='1' ) ) then
00229                         dma1_flag_start <= '0' after 1 ns;
00230                 elsif( dma1_ctrl_z='0' ) then
00231                         dma1_flag_start <= '1' after 1 ns;
00232                 end if;
00233         end if;
00234 end process;
00235 
00236 
00237 ---- Выбор канала для обмена ----
00238 pr_chn: process( clk ) begin
00239         if( rising_edge( clk ) ) then
00240                 if( rstp='1' ) then
00241                         dma_chni <= not dma_chni after 1 ns;
00242                         dma_flag_start <= '0' after 1 ns;
00243                         dma_transfer_start <= '0' after 1 ns;  
00244                         dma_rotate <= '0' after  1 ns;
00245                 else
00246                         if( dma_chn_change='1' ) then
00247                                 
00248                                 if( dma_transfer_start='0' and dma_flag_start='0' ) then 
00249                                         if( dma0_flag_start='1' ) then
00250                                                 dma_chni <= '0' after 1 ns;
00251                                                 dma_flag_start <= '1' after 1 ns;
00252                                                 dma_rotate <= '0' after 1 ns;
00253                                         elsif( dma1_flag_start='1' ) then
00254                                                 dma_chni <= '1' after 1 ns;
00255                                                 dma_flag_start <= '1' after 1 ns;
00256                                                 dma_rotate <= '1' after 1 ns;
00257                                         elsif( dma0_transfer_rdy='1' and dma0_sg_eot='0' and dma0_wait_eot='0' and dma0_block_z='0' and dma_rotate='0' ) then
00258                                                 dma_chni <= '0' after  1 ns;
00259                                                 dma_transfer_start <= '1' after 1 ns;
00260                                                 dma_rotate <= '1' after 1 ns;
00261                                         elsif( dma1_transfer_rdy='1' and dma1_sg_eot='0' and dma1_wait_eot='0' and dma1_block_z='0' and dma_rotate='1' ) then
00262                                                 dma_chni <= '1' after  1 ns;
00263                                                 dma_transfer_start <= '1' after 1 ns;
00264                                                 dma_rotate <= '0' after 1 ns;
00265                                         else
00266                                                 dma_rotate <= not dma_rotate after 1 ns;
00267                                         end if;
00268                                 end if;
00269                         else
00270                                 dma_flag_start <= '0' after 1 ns;
00271                                 dma_transfer_start <= '0' after 1 ns;
00272                         end if;
00273                         
00274                                         
00275 
00276                 end if;
00277         end if;
00278 end process;
00279 
00280 dma_chn <= dma_chni;
00281 
00282 ---- Инициализация ----
00283 pr_init: process( clk ) begin
00284         if( rising_edge( clk ) ) then
00285                 case( stw ) is
00286                         when s0 =>              
00287                                 ram_sel <= "000" after 1 ns;     
00288                                 pci_adr_we <= '0' after 1 ns;
00289                                 pci_adr_h_we <= '0' after 1 ns;
00290                                 loc_adr_we <= '0' after 1 ns;            
00291                                 init_compelte <= '0' after 1 ns;
00292                                 if( stp=s1 ) then
00293                                         stw <= s01 after 1 ns;
00294                                 end if;          
00295 
00296                         when s01 =>
00297                                 ram_sel <= "101" after 1 ns;
00298                                 stw <= s02 after 1 ns;
00299                         
00300                         when s02 =>       
00301                                 pci_adr_h_we <= '1' after 1 ns;
00302                                 stw <= s03 after 1 ns;
00303                                 
00304                         when s03 =>
00305                                 pci_adr_h_we <= '0' after 1 ns;
00306                                 stw <= s1 after 1 ns;
00307                                 
00308                                 
00309                         when s1 =>
00310                                 ram_sel <= "100" after 1 ns;
00311                                 stw <= s2 after 1 ns;
00312                         
00313                         when s2 =>        
00314                                 pci_adr_we <= '1' after 1 ns;
00315                                 stw <= s3 after 1 ns;
00316                                 
00317                         when s3 =>
00318                                 pci_adr_we <= '0' after 1 ns;
00319                                 stw <= s4 after 1 ns;
00320                                 
00321                         when s4 =>
00322                                 ram_sel <= "111" after 1 ns;
00323                                 stw <= s5 after 1 ns;
00324                                 
00325                         when s5 =>
00326                                 loc_adr_we <= '1' after 1 ns;
00327                                 stw <= s6 after 1 ns;
00328                                 
00329                         when s6 =>
00330                                 loc_adr_we <= '0' after 1 ns;                           
00331                                 stw <= s7 after 1 ns;
00332                                 
00333                         when s7 =>
00334                                 ram_sel <= "000" after 1 ns;
00335                                 init_compelte <= '1' after 1 ns;
00336                         
00337                 end case;
00338                 
00339                 if( stp=s0 or stp=s01 ) then
00340                         stw <= s0 after 1 ns;
00341                 end if;
00342         end if;
00343 end process;
00344 
00345 ---- Управление переходами ----                     
00346 pr_state: process( clk ) begin
00347         if( rising_edge( clk ) ) then
00348                 
00349                 case( stp ) is
00350                         when s0 => 
00351                                 dma_chn_change <= '1' after 1 ns;
00352                                 if( dma_flag_start='1' ) then
00353                                         stp <= s01 after 1 ns;
00354                                 elsif( dma_transfer_start='1' ) then
00355                                         stp <= st0 after 1 ns;
00356                                 end if;
00357                                 dsc_load_en <= '0' after 1 ns;
00358                                 dma_reg0 <= "110" after 1 ns;            
00359                                 dma_flag_start_clr <= '0' after 1 ns;     
00360                                 dma_change_adr <= '0' after  1 ns;                       
00361                                 dsc_change_adr <= '0' after  1 ns;              
00362                                 dsc_change_mode <= '0' after 1 ns;
00363                                 ram_change <= '0' after 1 ns;
00364                                 dma_sg_eot_set <= '0' after  1 ns;
00365                                 dma_eot_set <= '0' after  1 ns;   
00366                                 
00367                         when s01 => -- Повтор загрузки первого дескриптора --
00368 
00369                                 dsc_load_en <= '0' after 1 ns;
00370                                 dma_reg0 <= "110" after 1 ns;            
00371                                 dma_flag_start_clr <= '0' after 1 ns;     
00372                                 dma_change_adr <= '0' after  1 ns;                       
00373                                 dsc_change_adr <= '0' after  1 ns;              
00374                                 dsc_change_mode <= '0' after 1 ns;
00375                                 ram_change <= '0' after 1 ns;
00376                                 dma_sg_eot_set <= '0' after  1 ns;
00377                                 dma_eot_set <= '0' after  1 ns;   
00378                         
00379                                 if( init_compelte='0' ) then
00380                                         stp <= s1 after 1 ns;   
00381                                 end if;
00382                         
00383                         when s1 => -- Загрузка первого дескриптора --
00384                                 dma_chn_change <= '0' after 1 ns;
00385                                 dsc_load_en <= '1' after 1 ns;           
00386                                 dma_reg0 <= "000" after 1 ns;           
00387                                 
00388                                 dsc_change_mode <= '1' after  1 ns;
00389                                 dsc_change_adr <= '1' after 1 ns;
00390                                 
00391                                 if( init_compelte='1' ) then
00392                                         stp <= s2 after 1 ns;   
00393                                 end if;
00394                                 
00395                                 
00396                         when s2 =>
00397                                 dma_change_adr <= '1' after ns;
00398                                 dsc_change_adr <= '0' after 1 ns;
00399                                 stp <= s3 after 1 ns;
00400                                 
00401                         when s3 =>
00402                                 dma_change_adr <= '0' after ns;
00403                                 dma_reg0 <= "001" after 1 ns;   
00404                                 dsc_load_en <= not dma_status(1) after 1 ns;             
00405                                 if( dma_status(0)='1' ) then
00406                                         if( dma_start='0' ) then
00407                                                 stp <= s0 after 1 ns;
00408                                         else
00409                                                 stp <= s4 after 1 ns;
00410                                                 
00411                                         end if;
00412                                 end if;
00413                                 
00414                         when s4 =>      
00415                                 dma_sg_eot_set <= not dsc_correct after 1 ns;
00416                                 dma_flag_start_clr <= '1' after 1 ns;
00417                                 stp <= sc0 after 1 ns;
00418                                 
00419                         when st0 =>
00420                                 stp <= st1 after 1 ns;
00421                                 dma_chn_change <= '0' after 1 ns;
00422                                 dsc_change_mode <= dsc_cmd(2) after 1 ns;
00423                                 
00424                         when st1 => -- Обмен --
00425                                 dma_reg0 <= "111" after 1 ns;
00426                                 if( dma_status(0)='1' ) then
00427                                         if( dma_start='0' ) then
00428                                                 stp <= s0 after 1 ns;
00429                                         else               
00430                                                 if( dma_status(2)='0' ) then
00431                                                         stp <= sc4 after 1 ns;
00432                                                 else
00433                                                         stp <= st20 after 1 ns;          
00434                                                 end if;
00435                                                 dma_change_adr <= '1' after  1 ns;      
00436                                                 ram_change <= '1' after 1 ns;
00437                                         end if;
00438                                 end if;                  
00439                                 
00440                         when st20 =>
00441                                 dma_reg0 <= "010" after 1 ns;            
00442                                 ram_change <= '0' after 1 ns;
00443                                 if( dma_status(0)='0' ) then
00444                                         stp <= st2 after 1 ns;
00445                                 end if;
00446                                 
00447                         when st2 => -- Обработка дескриптора --
00448                             dma_change_adr <= '0' after  1 ns;           
00449                                 ram_change <= '0' after 1 ns;
00450                                 dsc_change_adr <= '1' after  1 ns;
00451                                 if( dsc_cmd(0)='1' or dsc_cmd(2)='1' ) then     -- переход к следующему дескриптору --
00452                                         stp <= sc0 after  1 ns;  -- запись адреса в ctrl_ext_cmd
00453                                 elsif( dsc_cmd(1)='1' ) then
00454                                         stp <= sr0 after 1 ns;
00455                                 else
00456                                         -- завершение работы DMA канала --           
00457                                         dma_sg_eot_set <= '1' after 1 ns;
00458                                         stp <= sc0 after 1 ns;
00459                                 end if;                                                          
00460                                 
00461                                 dma_eot_set <= dsc_cmd(4) after  1 ns;
00462                                 
00463                                 
00464                         when sc0 => -- запись адреса в ctrl_ext_cmd --
00465                                 dsc_change_adr <= '0' after  1 ns;              
00466                                 dma_eot_set <= '0' after  1 ns;
00467                                 stp <= sc1 after 1 ns;
00468                                 
00469                         when sc1 => 
00470                                 stp <= sc2 after 1 ns;
00471                                 
00472                         when sc2 => 
00473                                 stp <= sc3 after 1 ns;
00474 
00475                         when sc3 => 
00476                                 dma_change_adr <= '1' after 1 ns;
00477                                 stp <= sc4 after 1 ns;
00478                         when sc4 => 
00479                                 dma_change_adr <= '0' after 1 ns;
00480                                 dma_reg0 <= "110" after 1 ns;            
00481                                 ram_change <= '0' after 1 ns;
00482                                 if( dma_status(0)='0' ) then
00483                                         stp <= s0 after 1 ns;
00484                                 end if;
00485                                 
00486 
00487                         when sr0 => -- запись адреса в ctrl_ext_cmd --
00488                                 dsc_change_adr <= '0' after  1 ns;              
00489                                 dma_eot_set <= '0' after  1 ns;
00490                                 stp <= sr1 after 1 ns;
00491                                 
00492                         when sr1 => 
00493                                 stp <= sr2 after 1 ns;
00494                                 
00495                         when sr2 => 
00496                                 stp <= sr3 after 1 ns;                          
00497                                 dsc_change_mode <= '1' after  1 ns;
00498                                 dsc_change_adr <= '1' after 1 ns;
00499                         
00500 
00501                         when sr3 => 
00502                                 dma_change_adr <= '1' after 1 ns;
00503                                 stp <= sr4 after 1 ns;
00504                         when sr4 =>                                              
00505                                 dsc_load_en <= '0' after 1 ns;                                          
00506                                 dma_change_adr <= '0' after 1 ns;
00507                                 dma_reg0 <= "000" after 1 ns;            
00508                                 ram_change <= '0' after 1 ns;
00509                                 if( dma_status(0)='0' ) then
00510                                         stp <= sr5 after 1 ns;
00511                                 end if;
00512                                 
00513                         when sr5 =>
00514                                 dsc_load_en <= not dma_status(1) after 1 ns;                                            
00515                                 dma_reg0 <= "001" after 1 ns;
00516                                 if( dma_status(0)='1' ) then
00517                                                 stp <= sr6 after 1 ns;
00518                                 end if;                   
00519                                 
00520                         when sr6 =>               
00521                                 --dsc_load_en <= '0' after 1 ns;                                                
00522                                 dma_sg_eot_set <= not dsc_correct after 1 ns;
00523                                 stp <= sc0 after 1 ns;
00524                                 
00525                 end case;               
00526                                         
00527                 
00528                 
00529                 if( rstp='1' ) then
00530                         stp <= s0 after 1 ns;
00531                         dma_chn_change <= '0' after 1 ns;
00532                 end if;
00533         end if;
00534 end process;                     
00535 
00536 dma0_block_in <= '1' when stp=st1 and dma_chni='0' else '0';
00537 dma1_block_in <= '1' when stp=st1 and dma_chni='1' else '0';
00538         
00539 xb0:    srl16 port map( clk=>clk, d =>dma0_block_in, q => dma0_block, a0=>'1', a1=>'1', a2=>'0', a3=>'0' );     
00540 xb1:    srl16 port map( clk=>clk, d =>dma1_block_in, q => dma1_block, a0=>'1', a1=>'1', a2=>'0', a3=>'0' );     
00541 
00542 dma0_block_z <= dma0_block after 1 ns when rising_edge( clk );
00543 dma1_block_z <= dma1_block after 1 ns when rising_edge( clk );
00544 
00545 --ram_adr_l(2) <= ram_sel(1);
00546 --ram_adr_l(1 downto 0) <= (others=>ram_sel(0));
00547 ram_adr_l( 2 downto 0 ) <= ram_sel;
00548 
00549 ram_adr( 4 downto 0 ) <= "10" & ram_adr_l;
00550 ram_adr(5) <= dma_chni;
00551 ram_adr( 8 downto 6 ) <= "000";
00552 
00553 --ram_do( 0 ) <= (dma0_start and not dma_chni) or (dma1_start and dma_chni);   -- 1 - канал DMA работает
00554 --ram_do( 1 ) <= '0';
00555 --ram_do( 2 ) <= '0';
00556 --ram_do( 3 ) <= '0';
00557 --
00558 --ram_do( 4 ) <= ((dma0_eot or dma0_wait_eot2) and not dma_chni) or ((dma1_eot or dma1_wait_eot2)and dma_chni);          -- 1 - завершение передачи блока данных
00559 --ram_do( 5 ) <= (dma0_sg_eot and not dma_chni) or (dma1_sg_eot and dma_chni); -- 1 - завершение работы канала DMA
00560 --ram_do( 6 ) <= (dma0_wait_eot and not dma_chni) or (dma1_wait_eot and dma_chni); -- 1 - ожидание сброса dma_eot
00561 --ram_do( 7 ) <= dsc_correct;           
00562 
00563 reg_dma0_status( 0 ) <= dma0_start after 1 ns when rising_edge( clk );                                          -- 1 - канал DMA работает
00564 reg_dma0_status( 1 ) <= '0';
00565 reg_dma0_status( 2 ) <= '0';
00566 reg_dma0_status( 3 ) <= '0';
00567 
00568 reg_dma0_status( 4 ) <= dma0_eot or dma0_wait_eot2 after 1 ns when rising_edge( clk );          -- 1 - завершение передачи блока данных
00569 reg_dma0_status( 5 ) <= dma0_sg_eot after 1 ns when rising_edge( clk );                                         -- 1 - завершение работы канала DMA
00570 reg_dma0_status( 6 ) <= dma0_wait_eot after 1 ns when rising_edge( clk );                                       -- 1 - ожидание сброса dma_eot
00571 reg_dma0_status( 7 ) <= (dma0_eot or dma0_wait_eot2) and dma0_ctrl(5) after 1 ns when rising_edge( clk ); -- 1 - запрос прерывания 
00572 reg_dma0_status( 8 ) <= dsc_correct after 1 ns when rising_edge(clk) and dma_chni='0';          
00573 reg_dma0_status( 15 downto 9 ) <= x"A" & "000";
00574 
00575 reg_dma1_status( 0 ) <= dma1_start after 1 ns when rising_edge( clk );                                          -- 1 - канал DMA работает
00576 reg_dma1_status( 1 ) <= '0';
00577 reg_dma1_status( 2 ) <= '0';
00578 reg_dma1_status( 3 ) <= '0';
00579 
00580 reg_dma1_status( 4 ) <= dma1_eot or dma1_wait_eot2 after 1 ns when rising_edge( clk );          -- 1 - завершение передачи блока данных
00581 reg_dma1_status( 5 ) <= dma1_sg_eot after 1 ns when rising_edge( clk );                                         -- 1 - завершение работы канала DMA
00582 reg_dma1_status( 6 ) <= dma1_wait_eot after 1 ns when rising_edge( clk );                                       -- 1 - ожидание сброса dma_eot
00583 reg_dma1_status( 7 ) <= (dma1_eot or dma1_wait_eot2) and dma1_ctrl(5) after 1 ns when rising_edge( clk ); -- 1 - запрос прерывания 
00584 reg_dma1_status( 8 ) <= dsc_correct after 1 ns when rising_edge(clk) and dma_chni='1';          
00585 reg_dma1_status( 15 downto 9 ) <= x"A" & "000";
00586 
00587 
00588 --ram_we <= not (ram_sel(1) or dma_chn_change);
00589 ram_do <= (others=>'0');
00590 ram_we <= '0';
00591 
00592 pr_dma_eot: process( clk ) begin
00593         if( rising_edge( clk ) ) then
00594                 if( dma0_ctrl(0)='0' or  dma0_eot_clr='1' ) then
00595                         dma0_eot <= '0' after 1 ns;
00596                 elsif( dma_eot_set='1' and dma_chni='0' ) then
00597                         dma0_eot <= '1' after 1 ns;
00598                 end if;
00599                 
00600                 if( dma1_ctrl(0)='0' or  dma1_eot_clr='1' ) then
00601                         dma1_eot <= '0' after 1 ns;
00602                 elsif( dma_eot_set='1' and dma_chni='1' ) then
00603                         dma1_eot <= '1' after 1 ns;
00604                 end if;   
00605                 
00606                 if( dma0_ctrl(0)='0' ) then
00607                         dma0_sg_eot <= '0' after 1 ns;
00608                 elsif( dma_sg_eot_set='1' and dma_chni='0' ) then
00609                         dma0_sg_eot <= '1' after 1 ns;
00610                 end if;
00611 
00612                 if( dma1_ctrl(0)='0' ) then
00613                         dma1_sg_eot <= '0' after 1 ns;
00614                 elsif( dma_sg_eot_set='1' and dma_chni='1' ) then
00615                         dma1_sg_eot <= '1' after 1 ns;
00616                 end if;
00617                 
00618         end if;
00619 end process;    
00620 
00621 pr_dma0_wait_eot: process( clk ) begin
00622         if( rising_edge( clk ) ) then
00623                 if( dma0_ctrl(0)='0' or (dma0_eot_clr='1' and  dma0_wait_eot2='1' ) ) then
00624                         dma0_wait_eot <= '0' after 1 ns;
00625                 elsif( dma_eot_set='1' and dma0_eot='1' and dma_chni='0' ) then
00626                         dma0_wait_eot <= '1' after 1 ns;
00627                 end if;
00628 
00629                 if( dma1_ctrl(0)='0' or (dma1_eot_clr='1' and  dma1_wait_eot2='1' ) ) then
00630                         dma1_wait_eot <= '0' after 1 ns;
00631                 elsif( dma_eot_set='1' and dma1_eot='1' and dma_chni='1' ) then
00632                         dma1_wait_eot <= '1' after 1 ns;
00633                 end if;
00634 
00635                 
00636                 if( dma0_ctrl(0)='0' ) then
00637                         dma0_wait_eot2 <= '0' after  1 ns;
00638                 elsif( dma0_eot_clr='1' ) then
00639                         dma0_wait_eot2 <= dma0_eot and dma0_wait_eot after 1 ns;
00640                 end if;
00641                 
00642                 if( dma1_ctrl(0)='0' ) then
00643                         dma1_wait_eot2 <= '0' after  1 ns;
00644                 elsif( dma1_eot_clr='1' ) then
00645                         dma1_wait_eot2 <= dma1_eot and dma1_wait_eot after 1 ns;
00646                 end if;
00647                         
00648                         
00649                         
00650         end if;
00651 end process;
00652 
00653 pr_dma_start: process( clk ) begin
00654         if( rising_edge( clk ) ) then
00655                 if( dma0_ctrl(0)='0' ) then
00656                         dma0_start <= '0' after 1 ns;
00657                 elsif( dma_flag_start_clr='1' and dma_chni='0' ) then
00658                         dma0_start <= '1' after 1 ns;
00659                 end if;
00660                 if( dma1_ctrl(0)='0' ) then
00661                         dma1_start <= '0' after 1 ns;
00662                 elsif( dma_flag_start_clr='1' and dma_chni='1' ) then
00663                         dma1_start <= '1' after 1 ns;
00664                 end if;
00665         end if;
00666 end process;
00667 
00668 dma_start <= dma0_ctrl_z when dma_chni='0' else dma1_ctrl_z;
00669 
00670 ------ Сохранение текущего состояния канала DMA ----
00671 --pr_ra:process( clk ) begin
00672 --      if( rising_edge( clk ) ) then
00673 --                              
00674 --              
00675 --              if( rstp='1' ) then
00676 --                ra <= x"00" after  1 ns;
00677 --              end if;
00678 --              
00679 --      end if;
00680 --end process;
00681 --
00682 --
00683 --
00684 --gen_repack: for ii in 0 to 7 generate
00685 --
00686 --ram0: ram16x1d 
00687 --              port map(
00688 --                      we      => ra_we,
00689 --                      d       => ra(ii),
00690 --                      wclk => clk,
00691 --                      a0      => dma_chni,
00692 --                      a1      => '0',
00693 --                      a2      => '0',
00694 --                      a3      => '0',
00695 --                      spo => ram_a_adr(ii),
00696 --                      dpra0 => '0',
00697 --                      dpra1 => '0',
00698 --                      dpra2 => '0',
00699 --                      dpra3 => '0'
00700 --              );
00701 --
00702 --end generate;
00703 --
00704 --
00705 ------ Обработка канала DMA ----
00706 --
00707 --ram1: RAMB16_S36_S36 
00708 --  generic map(
00709 --      SIM_COLLISION_CHECK => "NONE"
00710 --    )
00711 --
00712 --  port map(
00713 --    DOA       => ram_a_out( 31 downto 0 ),  --: out std_logic_vector(3 downto 0);
00714 --    --DOB     => ram_b_out( 31 downto 0 ), --: out std_logic_vector(31 downto 0);
00715 --    --DOPB    : out std_logic_vector(3 downto 0);
00716 --
00717 --    ADDRA     => ram_a_adr( 8 downto 0 ), --: in std_logic_vector(11 downto 0);
00718 --    ADDRB     => (others=>'0'),
00719 --    CLKA      => clk,
00720 --    CLKB      => '0',
00721 --    DIA       => (others=>'0'), --: in std_logic_vector(3 downto 0);
00722 --    DIB       => (others=>'0'),
00723 --    DIPA      => (others=>'0'),
00724 --    DIPB      => (others=>'0'),
00725 --    ENA       => '1',
00726 --    ENB       => '0',
00727 --    SSRA      => '0',
00728 --    SSRB      => '0',
00729 --    WEA       => '1',
00730 --    WEB       => '0'
00731 --    );
00732 --      
00733 --      
00734 
00735 
00736 end ctrl_main;