DS_DMA
|
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;