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