DS_DMA
pcie_src/pcie_core64_m1/pcie_fifo_ext/ctrl_dma_ext_cmd.vhd
00001 -------------------------------------------------------------------------------
00002 --
00003 -- Title       : ctrl_dma_ext_cmd
00004 -- Author      : Dmitry Smekhov
00005 -- Company     : Instrumental Systems
00006 -- E-mail      : dsmv@insys.ru
00007 --
00008 -- Version     : 1.0
00009 --
00010 -------------------------------------------------------------------------------
00011 --
00012 -- Description : Узел формирования команды для контроллера DMA PLDA
00013 --                                
00014 --              Узел формирует повторное обращение при ошибочном завершении обмена
00015 --                                                                                 
00016 --              Поле регистра состояния:
00017 --                      0: 1 - завершение обмена
00018 --                      1: 1 - ошибка при обмене 
00019 --                      2: 1 - размер равен 0
00020 --
00021 -------------------------------------------------------------------------------
00022 
00023 
00024 library ieee;
00025 use ieee.std_logic_1164.all;
00026 
00027 library work;
00028 use work.core64_type_pkg.all;
00029 
00030 package ctrl_dma_ext_cmd_pkg is
00031         
00032 component ctrl_dma_ext_cmd is             
00033         generic(
00034                 is_dsp48                : in integer:=1         -- 1 - использовать DSP48, 0 - не использовать DSP48
00035         );
00036         port(                                             
00037                 ---- Global ----
00038                 rstp                            : in std_logic;         --! 1 - сброс
00039                 clk                                     : in std_logic;         --! тактовая частота 250 МГц
00040                 
00041                 ---- CTRL_MAIN ----
00042                 dma_reg0                        : in std_logic_vector( 2 downto 0 );    --! регистр упрравления
00043                                                                                                                                         --! 0:  1 - запуск обмена
00044                                                                                                                                         --! 1:  1 - блок 4 kB, 0 - 512 байт
00045                                                                                                                                         --! 2:  1 - увеличение адреса, 0 - запись адреса из дескриптора
00046                 
00047                 dma_change_adr          : in std_logic  ;       --! 1 - изменение адреса и размера
00048                 dma_cmd_status          : out std_logic_vector( 2 downto 0 );   --! состояние DMA
00049                                                                                                                                 --! 0: 1 - завершение обмена
00050                                                                                                                                 --! 1: 1 - ошибка при обмене
00051                                                                                                                                 --! 2: 1 - размер блока равен 0
00052                 dma_chn                         : in std_logic;                                                 --! номер канала DMA
00053                 
00054                 ---- CTRL_EXT_DESCRIPTOR ----                    
00055                 dsc_adr_h                       : in std_logic_vector( 7 downto 0 );    --! адрес, байт 4
00056                 dsc_adr                         : in std_logic_vector( 23 downto 0 );   --! адрес, байты 3..1
00057                 dsc_size                        : in std_logic_vector( 23 downto 0 );   --! размер, байты 3..1
00058                 
00059 
00060                 ---- TX_ENGINE ----
00061                 tx_ext_fifo                     : in type_tx_ext_fifo;                  --! обмен TX->EXT_FIFO 
00062                 tx_req_wr                       : out std_logic;                                --! 1 - требование записи блока 4 кБ
00063                 tx_req_rd                       : out std_logic;                                --! 1 - требование чтения
00064                 tx_rd_size                      : out std_logic;                                --! 0 - 512 байт, 1 - 4 кБ
00065                 tx_pci_adr                      : out std_logic_vector( 39 downto 8 );  --! адрес на шине PCI 
00066                 
00067                 ---- RX_ENGINE ----
00068                 rx_ext_fifo                     : in type_rx_ext_fifo;                  --! обмен RX->EXT_FIFO 
00069                 
00070                 ---- Контрольные точки ----
00071                 test                            : out std_logic_vector( 3 downto 0 )
00072         );
00073                 
00074         
00075 end component;
00076 
00077 end package;
00078 
00079 
00080 
00081 library ieee;
00082 use ieee.std_logic_1164.all;
00083 use ieee.std_logic_arith.all;
00084 use ieee.std_logic_unsigned.all;                
00085 
00086 library work;
00087 use work.core64_type_pkg.all;
00088 use work.ctrl_dma_adr_pkg.all;
00089 
00090 
00091 entity ctrl_dma_ext_cmd is         
00092         generic(
00093                 is_dsp48                : in integer:=1         -- 1 - использовать DSP48, 0 - не использовать DSP48
00094         );
00095         port(
00096                 ---- Global ----
00097                 rstp                            : in std_logic;         --! 1 - сброс
00098                 clk                                     : in std_logic;         --! тактовая частота 250 МГц
00099                 
00100                 ---- CTRL_MAIN ----
00101                 dma_reg0                        : in std_logic_vector( 2 downto 0 );    --! регистр упрравления
00102                                                                                                                                         --! 0:  1 - запуск обмена
00103                                                                                                                                         --! 1:  1 - блок 4 kB, 0 - 512 байт
00104                                                                                                                                         --! 2:  1 - увеличение адреса, 0 - запись адреса из дескриптора
00105                 dma_change_adr          : in std_logic  ;       --! 1 - изменение адреса и размера
00106                 dma_cmd_status          : out std_logic_vector( 2 downto 0 );   --! состояние DMA
00107                                                                                                                                 --! 0: 1 - завершение обмена
00108                                                                                                                                 --! 1: 1 - ошибка при обмене
00109                                                                                                                                 --! 2: 1 - размер блока равен 0
00110                 dma_chn                         : in std_logic;                                                 --! номер канала DMA
00111                 
00112                 ---- CTRL_EXT_DESCRIPTOR ----                    
00113                 dsc_adr_h                       : in std_logic_vector( 7 downto 0 );    --! адрес, байт 4
00114                 dsc_adr                         : in std_logic_vector( 23 downto 0 );   --! адрес, байты 3..1
00115                 dsc_size                        : in std_logic_vector( 23 downto 0 );   --! размер, байты 3..1
00116                 
00117 
00118                 ---- TX_ENGINE ----
00119                 tx_ext_fifo                     : in type_tx_ext_fifo;                  --! обмен TX->EXT_FIFO 
00120                 tx_req_wr                       : out std_logic;                                --! 1 - требование записи блока 4 кБ
00121                 tx_req_rd                       : out std_logic;                                --! 1 - требование чтения
00122                 tx_rd_size                      : out std_logic;                                --! 0 - 512 байт, 1 - 4 кБ
00123                 tx_pci_adr                      : out std_logic_vector( 39 downto 8 );  --! адрес на шине PCI 
00124                 
00125                 ---- RX_ENGINE ----
00126                 rx_ext_fifo                     : in type_rx_ext_fifo;                  --! обмен RX->EXT_FIFO 
00127                 
00128                 ---- Контрольные точки ----
00129                 test                            : out std_logic_vector( 3 downto 0 )
00130         );
00131                 
00132         
00133 end ctrl_dma_ext_cmd;
00134 
00135 
00136 architecture ctrl_dma_ext_cmd of ctrl_dma_ext_cmd is    
00137 
00138 type stp_type is ( s0, s1, s2, s3 );
00139 
00140 signal  stp             : stp_type;
00141 
00142 
00143 signal  status  : std_logic_vector( 3 downto 0 );         
00144 
00145 signal  dma_rw  : std_logic;      
00146 
00147 signal  cnt_pause       : std_logic_vector( 5 downto 0 );
00148 
00149 signal  dma_cmd_rdy             : std_logic;
00150 signal  dma_cmd_error   : std_logic;
00151 signal  dma_cmd_start   : std_logic;             
00152 
00153 signal  pci_adr                 : std_logic_vector( 39 downto 0 );
00154 signal  pci_size_z              : std_logic;
00155 
00156 signal  size4k                  : std_logic;
00157 
00158 
00159 begin                                   
00160         
00161         
00162 dma_cmd_start <= dma_reg0(0);
00163 
00164 dma_adr: ctrl_dma_adr 
00165         generic map(
00166                 is_dsp48                => is_dsp48
00167         )
00168         port map(
00169                 ---- Global ----
00170                 clk                                     => clk,                 -- тактовая частота
00171                 
00172                 ---- Доступ к PICOBLAZE ----
00173                 dma_chn                 => dma_chn,                             -- номер канала DMA    
00174                 reg0                            => dma_reg0,                    -- регистр DMA_CTRL
00175                 reg41_wr                => dma_change_adr,              -- 1 - запись в регистр 41
00176                 
00177                 ---- CTRL_EXT_DESCRIPTOR ----
00178                 dsc_adr                 => dsc_adr,                             -- адрес, байты 3..1
00179                 dsc_adr_h               => dsc_adr_h,               -- адрес, байт 4
00180                 dsc_size                => dsc_size,                    -- размер, байты 3..1
00181 
00182                 ---- Адрес ----
00183                 pci_adr                 => pci_adr,                             -- текущий адрес 
00184                 pci_size_z              => pci_size_z,                  -- 1 - размер равен 0
00185                 pci_rw                          => dma_rw-- 0 - чтение, 1 - запись  
00186 
00187         );
00188 
00189 
00190 size4k <= dma_reg0(1);
00191 
00192 tx_pci_adr <= pci_adr( 39 downto 8 );
00193 tx_rd_size <= size4k;
00194 
00195 dma_cmd_status(0) <= dma_cmd_rdy;
00196 dma_cmd_status(1) <= dma_cmd_error;              
00197 dma_cmd_status(2) <= pci_size_z;
00198 
00199 pr_state: process( clk ) begin
00200         if( rising_edge( clk ) ) then
00201 
00202                 case( stp ) is
00203                         when s0 =>
00204                                 if( dma_cmd_start='1' ) then
00205                                         stp <= s1 after 1 ns;
00206                                 end if;         
00207                                 
00208                                 tx_req_rd <= '0' after 1 ns;
00209                                 tx_req_wr <= '0' after 1 ns;
00210                                 dma_cmd_rdy <= '0' after 1 ns;
00211                                 dma_cmd_error <= '0' after 1 ns;
00212                                 
00213                         when s1 =>
00214                         
00215                                 tx_req_rd <= (not dma_rw) or (not size4k) after 1 ns;
00216                                 tx_req_wr <= dma_rw and size4k after 1 ns;
00217                                 
00218                                 if( tx_ext_fifo.complete_ok='1' ) then 
00219                                         stp <= s2 after 1 ns;                      
00220                                 elsif( tx_ext_fifo.complete_error='1' ) then
00221                                         stp <= s3 after 1 ns;                      
00222                                 end if;
00223                                 
00224                                 dma_cmd_error <= tx_ext_fifo.complete_error after 1 ns;
00225                                 
00226                         when s2 =>
00227                                 
00228                                 tx_req_rd <= '0' after 1 ns;
00229                                 tx_req_wr <= '0' after 1 ns;
00230                                 
00231                                 dma_cmd_rdy <= '1' after 1 ns;
00232                                 if( dma_cmd_start='0' ) then
00233                                         stp <= s0 after 1 ns;
00234                                 end if;          
00235                                 
00236                         when s3 =>
00237                                 tx_req_rd <= '0' after 1 ns;
00238                                 tx_req_wr <= '0' after 1 ns;   
00239                                 if( tx_ext_fifo.complete_error='0' ) then
00240                                         stp <= s0 after 1 ns;
00241                                 end if;
00242                                 
00243                         
00244                 end case;
00245                                                                         
00246                 
00247                 if( rstp='1' ) then
00248                         stp <= s0 after 1 ns;
00249                 end if;
00250                                 
00251         end if;
00252 end process;
00253 
00254 
00255 
00256 
00257 
00258 end ctrl_dma_ext_cmd;