DS_DMA
pcie_src/pcie_core64_m1/pcie_fifo_ext/block_pe_fifo_ext.vhd
00001 --------------------------------------------------------------------------------------------------
00002 --
00003 -- Title       : block_pe_fifo_ext
00004 -- Author      : Dmitry Smekhov
00005 -- Company     : Instrumental System
00006 -- E-mail      : dsmv@insys.ru
00007 --
00008 -- Version     : 1.0
00009 --
00010 ---------------------------------------------------------------------------------------------------
00011 --
00012 -- Description : 
00013 --              Блок управления FIFO для прошивки с ядром PCI-Express
00014 --              
00015 --              Модификация 2 - только режим автоинициализации   
00016 --                                        - для проекта DS_DMA64 
00017 --
00018 --              Регистры:
00019 --                              0x08 - DMA_MODE
00020 --                                                      бит 0:   CG_MODE             1 - работа в режиме автоинициализации
00021 --                                                      бит 1:   DEMAND_MODE 1 - работа в режиме по запросам
00022 --                                                      бит 2:   DIRECT                      1 - передача ADM->HOST, 0 - передача HOST->ADM
00023 --                              
00024 --                                                      бит 5:   DMA_INT_ENABLE  1 - разрешение формирования прерываний по флагу EOT
00025 --
00026 --                              0x09 - DMA_CTRL
00027 --                                                      бит 0:   DMA_START            - 1 - разрешение работы DMA
00028 --                                                      бит 1:   DMA_STOP             - 1 - требование останова
00029 --
00030 --                                                      бит 3:   PAUSE                        - 1 - приостановка обмена
00031 --                                                      бит 4:   RESET_FIFO           - 1 - сброс внутреннего FIFO канала DMA
00032 --                              
00033 --                              0x0A - BLOCK_CNT - число блоков для обмена
00034 --
00035 --
00036 --                              0x10 - STATUS
00037 --                                                      биты 3..0:  DMA_STATUS
00038 --                                                      бит  4:          DMA_EOT             - 1 - завершение DMA
00039 --                                                      бит  5:      DMA_SG_EOT              - 1 - завершение DMA в режиме SG       
00040 --                                                      бит  6:     DMA_INT_ERROR    - 1 - пропуск обработки прерывания от DMA_EOT
00041 --                                                      бит  7:     INT_REQ                  - 1 - запрос DMA
00042 --                                                      бит  8:     DSC_CORRECT      - 1 - блок дескрипторов правильный
00043 --
00044 --                                                      биты 15..12:  SIG                   - сигнатура 0xA
00045 --                                         
00046 --                              0x11 - FLAG_CLR
00047 --                                                      бит  4:      DMA_EOT         - 1 - сброс бита DMA_EOT в регистре STATUS
00048 --
00049 --                              0x14 - PCI_ADRL
00050 --                              0x15 - PCI_ADRH
00051 --                              
00052 --                              0x17 - LOCAL_ADR
00053 --                                      
00054 --
00055 --
00056 ---------------------------------------------------------------------------------------------------
00057 
00058 library ieee;
00059 use ieee.std_logic_1164.all;   
00060 
00061 library work;
00062 use work.core64_type_pkg.all;
00063 
00064 package block_pe_fifo_ext_pkg is
00065         
00066 component block_pe_fifo_ext is                          
00067         generic(
00068                 is_dsp48                        : in integer:=1                 --! 1 - использовать DSP48, 0 - не использовать DSP48
00069         );
00070         port(
00071         
00072                 ---- Global ----
00073                 rstp                            : in std_logic;         --! 1 - сброс
00074                 clk                                     : in std_logic;         --! Тактовая частота ядра - 250 МГц
00075                 aclk                            : in std_logic;         --! Тактовая частота локальной шины - 266 МГц
00076                 
00077                 ---- TX_ENGINE ----
00078                 tx_ext_fifo                     : in type_tx_ext_fifo;                  --! обмен TX->EXT_FIFO 
00079                 tx_ext_fifo_back        : out type_tx_ext_fifo_back;    --! обмен TX->EXT_FIFO 
00080                 
00081                 ---- RX_ENGINE ----
00082                 rx_ext_fifo                     : in type_rx_ext_fifo;                  --! обмен RX->EXT_FIFO 
00083                 
00084                 ---- REG ----
00085                 reg_ext_fifo            : in  type_reg_ext_fifo;                --! запрос на доступ к блокам управления EXT_FIFO 
00086                 reg_ext_fifo_back       : out type_reg_ext_fifo_back;   --! ответ на запрос 
00087                         
00088                 ---- DISP  ----
00089                 ext_fifo_disp           : out type_ext_fifo_disp;               --! запрос на доступ от узла EXT_FIFO 
00090                 ext_fifo_disp_back      : in  type_ext_fifo_disp_back;  --! ответ на запрос
00091                 
00092                 irq                                     : out std_logic;                                --! 1 - запрос прерывания
00093                 
00094                 test                            : out std_logic_vector( 7 downto 0 )
00095                 
00096                 
00097                                                            
00098         );      
00099 end component;
00100 
00101 end package;
00102 
00103 
00104 
00105 library ieee;
00106 use ieee.std_logic_1164.all;   
00107 use ieee.std_logic_arith.all;
00108 use ieee.std_logic_unsigned.all;
00109 
00110 
00111 library work;
00112 use work.ctrl_dma_ext_cmd_pkg.all;                
00113 use work.ctrl_ext_descriptor_pkg.all;  
00114 use work.ctrl_ext_ram_pkg.all;          
00115 use work.ctrl_main_pkg.all;
00116 
00117 library unisim;
00118 use unisim.vcomponents.all;
00119 
00120 use work.core64_type_pkg.all;
00121 
00122 entity block_pe_fifo_ext is     
00123         generic(
00124                 is_dsp48                        : in integer:=1                 --! 1 - использовать DSP48, 0 - не использовать DSP48
00125         );
00126         port(
00127         
00128                 ---- Global ----
00129                 rstp                            : in std_logic;         --! 1 - сброс
00130                 clk                                     : in std_logic;         --! Тактовая частота ядра - 250 МГц
00131                 aclk                            : in std_logic;         --! Тактовая частота локальной шины - 266 МГц
00132                 
00133                 ---- TX_ENGINE ----
00134                 tx_ext_fifo                     : in type_tx_ext_fifo;                  --! обмен TX->EXT_FIFO 
00135                 tx_ext_fifo_back        : out type_tx_ext_fifo_back;    --! обмен TX->EXT_FIFO 
00136                 
00137                 ---- RX_ENGINE ----
00138                 rx_ext_fifo                     : in type_rx_ext_fifo;                  --! обмен RX->EXT_FIFO 
00139                 
00140                 ---- REG ----
00141                 reg_ext_fifo            : in  type_reg_ext_fifo;                --! запрос на доступ к блокам управления EXT_FIFO 
00142                 reg_ext_fifo_back       : out type_reg_ext_fifo_back;   --! ответ на запрос 
00143                         
00144                 ---- DISP  ----
00145                 ext_fifo_disp           : out type_ext_fifo_disp;               --! запрос на доступ от узла EXT_FIFO 
00146                 ext_fifo_disp_back      : in  type_ext_fifo_disp_back;  --! ответ на запрос
00147 
00148                 irq                                     : out std_logic;                                --! 1 - запрос прерывания
00149                 
00150                 test                            : out std_logic_vector( 7 downto 0 )
00151                 
00152         );              
00153 end block_pe_fifo_ext;
00154 
00155 
00156 architecture block_pe_fifo_ext of block_pe_fifo_ext is                                     
00157 
00158 
00159 
00160 signal  ram_adra        : std_logic_vector( 8 downto 0 );
00161 signal  ram_adrb        : std_logic_vector( 8 downto 0 );
00162 signal  ram_di_a        : std_logic_vector( 31 downto 0 );
00163 signal  ram_do_a        : std_logic_vector( 31 downto 0 );
00164 signal  ram_we_a        : std_logic;
00165 signal  ram_do_b        : std_logic_vector( 31 downto 0 );
00166 signal  reg_dma0_status : std_logic_vector( 15 downto 0 );
00167 signal  reg_dma1_status : std_logic_vector( 15 downto 0 );
00168 
00169 ------------------------------------------------------------------------------------
00170 --
00171 -- declaration of KCPSM3
00172 --
00173   component kcpsm3
00174     Port (      address : out std_logic_vector(9 downto 0);
00175             instruction : in std_logic_vector(17 downto 0);
00176                 port_id : out std_logic_vector(7 downto 0);
00177            write_strobe : out std_logic;
00178                out_port : out std_logic_vector(7 downto 0);
00179             read_strobe : out std_logic;
00180                 in_port : in std_logic_vector(7 downto 0);
00181               interrupt : in std_logic;
00182           interrupt_ack : out std_logic;
00183                   reset : in std_logic;
00184                     clk : in std_logic);
00185     end component;
00186 --
00187 -- declaration of program ROM
00188 --
00189   component p_fifo
00190     Port (      address : in std_logic_vector(9 downto 0);
00191             instruction : out std_logic_vector(17 downto 0);
00192                     clk : in std_logic);
00193     end component;
00194 --
00195 ------------------------------------------------------------------------------------
00196 --
00197 -- Signals used to connect KCPSM3 to program ROM
00198 --
00199 signal     address : std_logic_vector(9 downto 0);
00200 signal instruction : std_logic_vector(17 downto 0);
00201 signal  port_id         : std_logic_vector( 7 downto 0 );
00202 signal  write_strobe    : std_logic;
00203 signal  read_strobe             : std_logic;
00204 signal  interrupt               : std_logic;
00205 signal  interrupt_ack   : std_logic;
00206 signal  kc_reset                : std_logic;
00207 signal  in_port                 : std_logic_vector( 7 downto 0 );
00208 signal  out_port                : std_logic_vector( 7 downto 0 );
00209 
00210 signal  reg4_do                 : std_logic_vector( 7 downto 0 );
00211 signal  reg8_do                 : std_logic_vector( 7 downto 0 );
00212 signal  ram0_wr                 : std_logic;
00213 signal  ram1_wr                 : std_logic;
00214 signal  ram_adr                 : std_logic_vector( 10 downto 0 );
00215 
00216 signal  reg_dma_chn             : std_logic_vector( 1 downto 0 );
00217 signal  reg_status              : std_logic_vector( 7 downto 0 );
00218 signal  reg_dma_status  : std_logic_vector( 3 downto 0 );
00219 signal  reg_descriptor_status   : std_logic_vector( 1 downto 0 );                
00220 signal  dsc_adr_h               : std_logic_vector( 7 downto 0 );    -- адрес, байт 4
00221 signal  dsc_adr                 : std_logic_vector( 23 downto 0 );
00222 signal  dsc_size                : std_logic_vector( 23 downto 0 ); 
00223 
00224 signal  dma0_rs0                : std_logic_vector( 7 downto 0 );
00225 signal  dma1_rs0                : std_logic_vector( 7 downto 0 );                  
00226 signal  dma0_rs0x               : std_logic_vector( 7 downto 0 );
00227 signal  dma1_rs0x               : std_logic_vector( 7 downto 0 );                  
00228 signal  dma_rs0                 : std_logic_vector( 7 downto 0 );
00229 signal  reg_test                : std_logic_vector( 7 downto 0 );
00230 
00231 signal  dx                              : std_logic_vector( 7 downto 0 );       
00232 signal  ram_transfer_rdy        : std_logic;
00233 
00234 signal  dma0_transfer_rdy       : std_logic;
00235 signal  dma1_transfer_rdy       : std_logic;
00236 signal  dma0_eot_clr            : std_logic;
00237 signal  dma1_eot_clr            : std_logic;
00238 signal  dma0_ctrl                       : std_logic_vector( 7 downto 0 );
00239 signal  dma1_ctrl                       : std_logic_vector( 7 downto 0 );
00240 signal  ram_change                      : std_logic;    -- 1 - изменение блока памяти
00241 signal  reg_dma0_ctrl           : std_logic_vector( 7 downto 0 );
00242 signal  reg_dma1_ctrl           : std_logic_vector( 7 downto 0 );
00243 signal  reg_dma0_mode           : std_logic_vector( 7 downto 0 );
00244 signal  reg_dma1_mode           : std_logic_vector( 7 downto 0 );
00245                 
00246                 ---- ctrl_ext_descriptor ----
00247 signal  dsc_correct                     : std_logic;            -- 1 - загружен правильный дескриптор
00248 signal  dsc_cmd                         : std_logic_vector( 7 downto 0 );       -- командное слово дескриптора
00249 signal  dsc_change_adr          : std_logic;    -- 1 - смена адреса дескриптора
00250 signal  dsc_change_mode         : std_logic;    -- Режим изменения адреса:
00251                                                                                                 -- 0: - увеличение
00252                                                         -- 1: - переход к нулевомй дескриптору
00253 signal  dsc_load_en                     : std_logic;    -- 1 - разрешение записи дескриптора
00254                 
00255                 ---- ctrl_dma_ext_cmd ----                                               
00256 signal  dma_reg0                        : std_logic_vector( 2 downto 0 );       -- регистр упрравления
00257 signal  dma_change_adr          : std_logic     ;       -- 1 - изменение адреса и размера
00258 signal  dma_cmd_status          : std_logic_vector( 2 downto 0 );       -- состояние DMA
00259 signal  dma_chn                         : std_logic;
00260 
00261 signal  pci_adr_we                      : std_logic;                     
00262 signal  pci_adr_h_we            : std_logic;    -- 1 - запись старших разрядов адреса
00263 signal  loc_adr_we                      : std_logic;
00264 
00265 signal  ack_cnt                         : std_logic_vector( 4 downto 0 );
00266 
00267 signal  reset                           : std_logic;
00268 
00269 signal  dma_wraddr                      : std_logic_vector( 11 downto 0 );
00270 signal  dma_rdaddr                      : std_logic_vector( 11 downto 0 );       
00271 signal  dma_wrdata                      : std_logic_vector( 63 downto 0 );
00272 --
00273 ------------------------------------------------------------------------------------
00274 
00275 
00276 begin   
00277 
00278 reset <= not rstp after 1 ns when rising_edge( clk );
00279 
00280 
00281 --test( 7 downto 4 ) <= (others=>'-');  
00282 
00283 test(4) <= dsc_correct;
00284 test(5) <= dma_chn;
00285 test(6) <= dsc_load_en;  
00286 test(7) <= dsc_change_adr;
00287 
00288 ram_adrb( 8 downto 7 ) <= (others=>'0');
00289 ram_adrb( 6 downto 0 ) <= reg_ext_fifo.adr;
00290         
00291 dma_wraddr( 11 downto 0 ) <= rx_ext_fifo.adr & "000";
00292 dma_rdaddr( 11 downto 0 ) <= tx_ext_fifo.adr & "000";
00293 dma_wrdata <= rx_ext_fifo.data;
00294 
00295 ram0_wr <= rx_ext_fifo.data_we ;         
00296 ram1_wr <= rx_ext_fifo.data_we and dma_reg0(1);
00297 
00298 ram: RAMB16_S36_S36 
00299   generic map(
00300     SIM_COLLISION_CHECK => "NONE",
00301         INIT_00  =>  x"000000000000000000000000" & x"00000002" & x"00000000" & x"00003400" & x"00000102" & x"00001018"          ,
00302         INIT_04  =>  x"000000000000000000000000" & x"00000002" & x"00000001" & x"00003400" & x"00000102" & x"00001018"          
00303     )
00304 
00305   port map(
00306     DOA   => ram_do_a,
00307     DOB   => ram_do_b, --: out std_logic_vector(15 downto 0);
00308         
00309     ADDRA => ram_adra,
00310     ADDRB => ram_adrb,
00311     CLKA  => clk,
00312     CLKB   => clk,
00313     DIA    => ram_di_a,
00314     DIB    => reg_ext_fifo.data,
00315     ENA   => '1',
00316     ENB   => '1',
00317     DIPA  => (others=>'0'),
00318     DIPB  => (others=>'0'),              
00319     SSRA  => '0',
00320     SSRB  => '0',
00321     WEA   => ram_we_a,
00322     WEB   => reg_ext_fifo.data_we
00323         
00324         
00325     --ADDRA : in std_logic_vector(10 downto 0);
00326     --ADDRB : in std_logic_vector(9 downto 0);
00327  
00328     );
00329         
00330         
00331 reg_ext_fifo_back.data( 15 downto 0 )   <=      reg_dma0_status when  ram_adrb="0010000" else
00332                                                                                         reg_dma1_status when  ram_adrb="0110000" else
00333                                                                                         ram_do_b( 15 downto 0 );
00334  
00335 reg_ext_fifo_back.data( 31 downto 16 ) <= ram_do_b( 31 downto 16 );
00336 
00337 
00338 test(0) <= ram_di_a(4);
00339 test(1) <= dma0_transfer_rdy;     
00340 test(2) <= dma_cmd_status(0);
00341 test(3) <= dma_cmd_status(1);
00342 
00343 
00344 
00345 pr_dma_ctrl: process( clk ) begin
00346         if( rising_edge( clk ) ) then
00347                 dma0_eot_clr <= '0' after 1 ns;
00348                 dma1_eot_clr <= '0' after 1 ns;
00349                 if( rstp='1' ) then
00350                         reg_dma0_ctrl <= x"00" after 1 ns;
00351                         reg_dma1_ctrl <= x"00" after 1 ns;
00352                         reg_dma0_mode <= x"00" after 1 ns;
00353                         reg_dma1_mode <= x"00" after 1 ns;
00354                 elsif( reg_ext_fifo.data_we='1' ) then  
00355                         case( reg_ext_fifo.adr ) is
00356                                 when "0001000" => reg_dma0_mode <= reg_ext_fifo.data( 7 downto 0 ) after 1 ns;
00357                                 when "0001001" => reg_dma0_ctrl <= reg_ext_fifo.data( 7 downto 0 ) after 1 ns;
00358                                 when "0010001" => dma0_eot_clr  <= reg_ext_fifo.data(4) after 1 ns;
00359                                 when "0101000" => reg_dma1_mode <= reg_ext_fifo.data( 7 downto 0 ) after 1 ns;
00360                                 when "0101001" => reg_dma1_ctrl <= reg_ext_fifo.data( 7 downto 0 ) after 1 ns;
00361                                 when "0110001" => dma1_eot_clr  <= reg_ext_fifo.data(4) after 1 ns;
00362                                 when others => null;
00363                         end case;
00364                 end if;
00365         end if;
00366 end process;
00367 
00368 dma0_ctrl(0) <= reg_dma0_ctrl(0); -- DMA_START   
00369 dma0_ctrl(1) <= reg_dma0_mode(1); -- DEMAND_MODE
00370 dma0_ctrl(2) <= reg_dma0_mode(2); -- DIRECT
00371 dma0_ctrl(3) <= reg_dma0_ctrl(3); -- PAUSE
00372 dma0_ctrl(4) <= reg_dma0_ctrl(4); -- RESET_FIFO
00373 dma0_ctrl(5) <= reg_dma0_mode(5); -- DMA_INT_ENABLE
00374 dma0_ctrl(6) <= '0';
00375 dma0_ctrl(7) <= '0';
00376 
00377 
00378 dma1_ctrl(0) <= reg_dma1_ctrl(0); -- DMA_START   
00379 dma1_ctrl(1) <= reg_dma1_mode(1); -- DEMAND_MODE
00380 dma1_ctrl(2) <= reg_dma1_mode(2); -- DIRECT
00381 dma1_ctrl(3) <= reg_dma1_ctrl(3); -- PAUSE
00382 dma1_ctrl(4) <= reg_dma1_ctrl(4); -- RESET_FIFO
00383 dma1_ctrl(5) <= reg_dma1_mode(5); -- DMA_INT_ENABLE
00384 dma1_ctrl(6) <= '0';
00385 dma1_ctrl(7) <= '0';
00386 
00387 
00388 
00389 main: ctrl_main 
00390         port map(
00391                 ---- Global ----
00392                 reset                           => reset,       -- 0 - сброс
00393                 clk                                     => clk,         -- тактовая частота
00394 
00395                 ---- Регистры управления ----
00396                 dma0_ctrl                       => dma0_ctrl,           -- Регистр DMA_CTRL, канал 0
00397                 dma1_ctrl                       => dma1_ctrl,           -- Регистр DMA_CTRL, канал 0
00398                 
00399                 ---- ctrl_ext_ram ----
00400                 dma0_transfer_rdy       => dma0_transfer_rdy,   -- 1 - канал 0 готов к обмену
00401                 dma1_transfer_rdy       => dma1_transfer_rdy,   -- 1 - канал 1 готов к обмену
00402                 
00403                 ---- Управление DMA ----
00404                 dma_chn                         => dma_chn,                     -- номер канала DMA для текущего обмена
00405                 ram_do                          => ram_di_a( 7 downto 0 ),              -- данные для записи в регистр STATUS
00406                 ram_adr                         => ram_adra,            -- адрес для записи в регистр STATUS
00407                 ram_we                          => ram_we_a,            -- 1 - запись в память
00408                 dma0_eot_clr            => dma0_eot_clr,        -- 1 - сброс флага DMA0_EOT
00409                 dma1_eot_clr            => dma1_eot_clr,        -- 1 - сброс флага DMA1_EOT
00410                 
00411                 reg_dma0_status         => reg_dma0_status,     -- регистр STATUS канала 0
00412                 reg_dma1_status         => reg_dma1_status,     -- регистр STATUS канала 1
00413                 
00414                 ---- ctrl_ext_ram       ----
00415                 ram_change                      => ram_change,          -- 1 - изменение блока памяти
00416                 loc_adr_we                      => loc_adr_we,          -- 1 - запись локального адреса
00417                 
00418                 ---- ctrl_ext_descriptor ----
00419                 pci_adr_we                      => pci_adr_we,          -- 1 - запись адреса
00420                 pci_adr_h_we                    => pci_adr_h_we,        -- 1 - запись старших разрядов адреса
00421                 dsc_correct                             => dsc_correct,         -- 1 - загружен правильный дескриптор
00422                 dsc_cmd                         => dsc_cmd,                     -- командное слово дескриптора
00423                 dsc_change_adr          => dsc_change_adr,      -- 1 - смена адреса дескриптора
00424                 dsc_change_mode         => dsc_change_mode,     -- Режим изменения адреса:
00425                                                                                                 -- 0: - увеличение
00426                                                         -- 1: - переход к нулевомй дескриптору
00427                 dsc_load_en                             => dsc_load_en,         -- 1 - разрешение записи дескриптора
00428                 
00429                 ---- ctrl_dma_ext_cmd ----                                               
00430                 dma_reg0                        => dma_reg0,            -- регистр упрравления
00431                 dma_change_adr          => dma_change_adr,      -- 1 - изменение адреса и размера
00432                 dma_status                      => dma_cmd_status-- состояние DMA
00433                                                                                                                                         -- 0: 1 - завершение обмена
00434                                                                                                                                         -- 1: 1 - ошибка при обмене
00435                                                                                                                                         -- 2: 1 - размер блока равен 0
00436         );              
00437 
00438         
00439 cmd: ctrl_dma_ext_cmd 
00440         generic map(
00441                 is_dsp48                => is_dsp48
00442         )
00443         port map(                                                 
00444                 ---- Global ----
00445                 rstp                            => rstp,                        -- 1 - сброс
00446                 clk                              => clk,                                -- тактовая частота
00447                 
00448                 ---- CTRL_MAIN ----
00449                 dma_reg0                 => dma_reg0,           -- регистр упрравления
00450                 dma_change_adr  => dma_change_adr,      -- 1 - изменение адреса и размера
00451                 dma_cmd_status  => dma_cmd_status,      -- состояние DMA
00452                                                                                                                                 -- 0: 1 - завершение обмена
00453                                                                                                                                 -- 1: 1 - ошибка при обмене
00454                                                                                                                                 -- 2: 1 - размер блока равен 0
00455                 dma_chn                 => dma_chn,             -- номер канала DMA
00456                 
00457                 
00458                 ---- CTRL_EXT_DESCRIPTOR ----
00459                 dsc_adr_h               => dsc_adr_h,       -- адрес, байт 4
00460                 dsc_adr                 => dsc_adr,                             -- адрес, байты 3..1
00461                 dsc_size                => dsc_size,                    -- размер, байты 3..1
00462                 
00463                 
00464                 ---- TX_ENGINE ----
00465                 tx_ext_fifo                     => tx_ext_fifo,         
00466                 tx_req_wr                       => tx_ext_fifo_back.req_wr,     
00467                 tx_req_rd                       => tx_ext_fifo_back.req_rd,     
00468                 tx_rd_size                      => tx_ext_fifo_back.rd_size,    
00469                 tx_pci_adr                      => tx_ext_fifo_back.pci_adr,    
00470                 
00471                 ---- RX_ENGINE ----
00472                 rx_ext_fifo                     => rx_ext_fifo
00473                 
00474                 ---- Контрольные точки ----
00475                 --test                  : out std_logic_vector( 3 downto 0 )
00476         );
00477         
00478 dsc: ctrl_ext_descriptor 
00479         generic map(
00480                 is_dsp48                => is_dsp48
00481         )
00482         port map(
00483                 ---- Global ----
00484                 reset                           => reset,       -- 0 - сброс
00485                 clk                             => clk,         -- тактовая частота
00486                 
00487                 ---- Запись адреса ----
00488                 data_in                         => ram_do_a,     -- шина данных памяти
00489                 pci_adr_we                      => pci_adr_we,          -- 1 - запись адреса
00490                 pci_adr_h_we            => pci_adr_h_we,        -- 1 - запись старших разрядов адреса
00491                 
00492                 ---- ctrl_main ----
00493                 dma_chn                                 => dma_chn,                     -- номер канала DMA
00494                 dsc_correct                     => dsc_correct,         -- 1 - загружен правильный дескриптор
00495                 dsc_cmd                         => dsc_cmd,                     -- командное слово дескриптора
00496                 dsc_change_adr          => dsc_change_adr,      -- 1 - смена адреса дескриптора
00497                 dsc_change_mode         => dsc_change_mode,     -- Режим изменения адреса:
00498                                                                                                 -- 0: - увеличение
00499                                                         -- 1: - переход к нулевомй дескриптору
00500                 dsc_load_en                     => dsc_load_en,         -- 1 - разрешение записи дескриптора
00501 
00502                 
00503                 ---- ctrl_dma_ext_cmd ---
00504                 ram0_wr                 => ram0_wr,                     -- 1 - запись в память дескрипторов
00505                 dma_wraddr              => dma_wraddr( 11 downto 0 ),   -- адрес памяти
00506                 dma_wrdata              => dma_wrdata,          -- данные DMA
00507                 dsc_adr_h               => dsc_adr_h,       -- адрес, байт 4
00508                 dsc_adr                 => dsc_adr,                     -- адрес, байты 3..1
00509                 dsc_size                => dsc_size-- размер, байты 3..1
00510                 
00511 --              ---- Контрольные точки ----
00512 --              test                    : out std_logic_vector( 3 downto 0 )
00513 
00514         
00515         );      
00516         
00517 
00518         
00519 ram_data: ctrl_ext_ram 
00520         generic map(
00521                 is_dsp48                => is_dsp48
00522         )
00523         port map(
00524         
00525                 ---- Global ----
00526                 reset                           => reset,       -- 0 - сброс
00527                 clk                             => clk,         -- Тактовая частота      250 МГц 
00528                 aclk                     => aclk,       -- Тактовая частота 266 МГц
00529                 
00530                 
00531                 ---- ctrl_main ----
00532                 ram_change              => ram_change,          -- 1 - изменение блока памяти
00533                 loc_adr_we              => loc_adr_we,          -- 1 - запись локального адреса
00534                 data_in                         => ram_do_a,            -- шина данных памяти
00535                 dma_chn                 => dma_chn,                     -- номер канала DMA
00536                 
00537                 
00538                 ---- Регистры управления ----
00539                 dma0_ctrl               => dma0_ctrl,           -- Регистр DMA_CTRL, канал 0
00540                 dma1_ctrl               => dma1_ctrl,           -- Регистр DMA_CTRL, канал 0
00541                 
00542                 
00543                 dma0_transfer_rdy       => dma0_transfer_rdy,   -- 1 - канал 0 готов к обмену
00544                 dma1_transfer_rdy       => dma1_transfer_rdy,   -- 1 - канал 1 готов к обмену
00545                 
00546                 
00547                 ---- PCI-Express ----
00548                 dma_wr_en               => dsc_size(0),         -- 1 - чтение, 0 - запись
00549                 dma_wr                  => ram1_wr,                     -- 1 - запись по шине wr_data
00550                 dma_wrdata              => dma_wrdata,          -- данные DMA
00551                 dma_wraddr              => dma_wraddr ,
00552                 
00553                 dma_rddata              => tx_ext_fifo_back.data,       -- данные FIFO
00554                 dma_rdaddr              => dma_rdaddr,                          -- адрес данных
00555                 
00556                 ---- DISP  ----
00557                 ext_fifo_disp           => ext_fifo_disp,               -- запрос на доступ от узла EXT_FIFO 
00558                 ext_fifo_disp_back      => ext_fifo_disp_back-- ответ на запрос
00559                 
00560         );              
00561         
00562 
00563 
00564 irq <= reg_dma0_status(7) or reg_dma1_status(7) or ext_fifo_disp_back.irq after 1 ns when rising_edge( clk );
00565 
00566 end block_pe_fifo_ext;