DS_DMA
|
00001 ------------------------------------------------------------------------------- 00002 -- 00003 -- Title : ctrl_ext_ram 00004 -- Author : Dmitry Smekhov 00005 -- Company : Instrumental Systems 00006 -- E-mail : dsmv@insys.ru 00007 -- 00008 -- Version : 1.1 00009 -- 00010 ------------------------------------------------------------------------------- 00011 -- 00012 -- Description : Узел двухпортовой памяти 00013 -- Со стороны шины PLD_BUS - FIFO 00014 -- Со стороны шины PCI_Express - память 00015 -- 00016 ------------------------------------------------------------------------------- 00017 -- 00018 -- Version 1.1 05.04.2010 00019 -- Добавлен параметр is_dsp48 - разрешение использования 00020 -- блоков DSP48 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_ext_ram_pkg is 00031 00032 component ctrl_ext_ram is 00033 generic( 00034 is_dsp48 : in integer:=1 -- 1 - использовать DSP48, 0 - не использовать DSP48 00035 ); 00036 port( 00037 00038 ---- Global ---- 00039 reset : in std_logic; -- 0 - сброс 00040 clk : in std_logic; --! Тактовая частота ядра - 250 МГц 00041 aclk : in std_logic; --! Тактовая частота локальной шины - 266 МГц 00042 00043 ---- ctrl_main ---- 00044 ram_change : in std_logic; -- 1 - изменение блока памяти 00045 loc_adr_we : in std_logic; -- 1 - запись локального адреса 00046 data_in : in std_logic_vector( 31 downto 0 ); -- шина данных памяти 00047 dma_chn : in std_logic; -- номер канала DMA 00048 00049 00050 ---- Регистры управления ---- 00051 dma0_ctrl : in std_logic_vector( 7 downto 0 ); -- Регистр DMA_CTRL, канал 0 00052 dma1_ctrl : in std_logic_vector( 7 downto 0 ); -- Регистр DMA_CTRL, канал 0 00053 00054 00055 dma0_transfer_rdy : out std_logic; -- 1 - канал 0 готов к обмену 00056 dma1_transfer_rdy : out std_logic; -- 1 - канал 1 готов к обмену 00057 00058 00059 ---- PCI-Express ---- 00060 dma_wr_en : in std_logic; -- 1 - разрешение записи по DMA 00061 dma_wr : in std_logic; -- 1 - запись по шине wr_data 00062 dma_wrdata : in std_logic_vector( 63 downto 0 ); -- данные DMA 00063 dma_wraddr : in std_logic_vector( 11 downto 0 ); 00064 00065 dma_rddata : out std_logic_vector( 63 downto 0 ); -- данные FIFO 00066 dma_rdaddr : in std_logic_vector( 11 downto 0 ); -- адрес данных 00067 00068 ---- DISP ---- 00069 ext_fifo_disp : out type_ext_fifo_disp; --! запрос на доступ от узла EXT_FIFO 00070 ext_fifo_disp_back : in type_ext_fifo_disp_back --! ответ на запрос 00071 00072 ); 00073 end component; 00074 00075 end package; 00076 00077 00078 library ieee; 00079 use ieee.std_logic_1164.all; 00080 use ieee.std_logic_arith.all; 00081 use ieee.std_logic_unsigned.all; 00082 00083 library unisim; 00084 use unisim.vcomponents.all; 00085 00086 library work; 00087 use work.core64_type_pkg.all; 00088 00089 00090 00091 use work.ctrl_ram_cmd_pkg.all; 00092 00093 entity ctrl_ext_ram is 00094 generic( 00095 is_dsp48 : in integer:=1 -- 1 - использовать DSP48, 0 - не использовать DSP48 00096 ); 00097 port( 00098 00099 ---- Global ---- 00100 reset : in std_logic; -- 0 - сброс 00101 clk : in std_logic; --! Тактовая частота ядра - 250 МГц 00102 aclk : in std_logic; --! Тактовая частота локальной шины - 266 МГц 00103 00104 ---- ctrl_main ---- 00105 ram_change : in std_logic; -- 1 - изменение блока памяти 00106 loc_adr_we : in std_logic; -- 1 - запись локального адреса 00107 data_in : in std_logic_vector( 31 downto 0 ); -- шина данных памяти 00108 dma_chn : in std_logic; -- номер канала DMA 00109 00110 00111 ---- Регистры управления ---- 00112 dma0_ctrl : in std_logic_vector( 7 downto 0 ); -- Регистр DMA_CTRL, канал 0 00113 dma1_ctrl : in std_logic_vector( 7 downto 0 ); -- Регистр DMA_CTRL, канал 0 00114 00115 00116 dma0_transfer_rdy : out std_logic; -- 1 - канал 0 готов к обмену 00117 dma1_transfer_rdy : out std_logic; -- 1 - канал 1 готов к обмену 00118 00119 00120 ---- PCI-Express ---- 00121 dma_wr_en : in std_logic; -- 1 - разрешение записи по DMA 00122 dma_wr : in std_logic; -- 1 - запись по шине wr_data 00123 dma_wrdata : in std_logic_vector( 63 downto 0 ); -- данные DMA 00124 dma_wraddr : in std_logic_vector( 11 downto 0 ); 00125 00126 dma_rddata : out std_logic_vector( 63 downto 0 ); -- данные FIFO 00127 dma_rdaddr : in std_logic_vector( 11 downto 0 ); -- адрес данных 00128 00129 ---- DISP ---- 00130 ext_fifo_disp : out type_ext_fifo_disp; --! запрос на доступ от узла EXT_FIFO 00131 ext_fifo_disp_back : in type_ext_fifo_disp_back --! ответ на запрос 00132 00133 ); 00134 end ctrl_ext_ram; 00135 00136 00137 architecture ctrl_ext_ram of ctrl_ext_ram is 00138 00139 --signal reg_write : std_logic; 00140 --signal reg_write_C1 : std_logic; 00141 --signal reg_write_C2 : std_logic; 00142 --signal reg_write_C4 : std_logic; 00143 --signal reg_write_C8 : std_logic; 00144 --signal reg_write_D0 : std_logic; 00145 --signal reg_write_E0 : std_logic; 00146 00147 signal reg_ch0_ctrl : std_logic_vector( 7 downto 0 ); 00148 signal reg_ch1_ctrl : std_logic_vector( 7 downto 0 ); 00149 00150 signal pf_chn : std_logic; 00151 00152 signal ram_adra : std_logic_vector( 10 downto 0 ); 00153 signal ram_adrb : std_logic_vector( 10 downto 0 ); 00154 00155 signal ram_we_a : std_logic; 00156 signal ram_we_b : std_logic; 00157 00158 signal pf_repack_di : std_logic_vector( 63 downto 0 ); 00159 00160 signal pf_adr : std_logic_vector( 31 downto 0 ); 00161 signal pf_ram_rd : std_logic; 00162 signal pf_ram_rd_z : std_logic; 00163 00164 begin 00165 00166 00167 reg_ch0_ctrl <= dma0_ctrl; 00168 reg_ch1_ctrl <= dma1_ctrl; 00169 00170 gen_ram_adr: for ii in 0 to 31 generate 00171 00172 ram1: ram16x1d 00173 port map( 00174 we => loc_adr_we, 00175 d => data_in(ii), 00176 wclk => clk, 00177 a0 => dma_chn, 00178 a1 => '0', 00179 a2 => '0', 00180 a3 => '0', 00181 dpra0 => pf_chn, 00182 dpra1 => '0', 00183 dpra2 => '0', 00184 dpra3 => '0', 00185 dpo => pf_adr( ii ) 00186 ); 00187 00188 00189 end generate; 00190 00191 --pf_adr( 7 downto 0 ) <= x"00"; 00192 00193 ram_adra( 8 downto 0 ) <= dma_wraddr( 11 downto 3 ) when dma_wr_en='0' else 00194 dma_rdaddr( 11 downto 3 ); 00195 00196 ram_adra( 10 ) <= dma_chn; 00197 00198 ram_we_a <= dma_wr and not dma_wr_en; 00199 ram_we_b <= ext_fifo_disp_back.data_we; 00200 00201 00202 ext_fifo_disp.data_we <= pf_ram_rd after 1 ns when rising_edge( aclk ); 00203 ext_fifo_disp.adr <= pf_adr; 00204 00205 pf_ram_rd_z <= pf_ram_rd after 1 ns when rising_edge( aclk ); 00206 00207 gen_ram_data: for ii in 0 to 7 generate 00208 00209 ram: RAMB16_S9_S9 00210 generic map( 00211 SIM_COLLISION_CHECK => "NONE" 00212 ) 00213 00214 port map( 00215 DOA => dma_rddata( 7+ii*8 downto ii*8 ), 00216 DOB => ext_fifo_disp.data( 7+ii*8 downto ii*8 ), 00217 00218 ADDRA => ram_adra, 00219 ADDRB => ram_adrb, 00220 CLKA => clk, 00221 CLKB => aclk, 00222 DIA => dma_wrdata( 7+ii*8 downto ii*8 ), 00223 DIB => ext_fifo_disp_back.data ( 7+ii*8 downto ii*8 ), 00224 DIPA => (others=>'0'), 00225 DIPB => (others=>'0'), 00226 00227 ENA => '1', 00228 ENB => '1', 00229 SSRA => '0', 00230 SSRB => '0', 00231 WEA => ram_we_a, 00232 WEB => ram_we_b 00233 ); 00234 00235 end generate; 00236 00237 00238 cmd: ctrl_ram_cmd 00239 generic map( 00240 is_dsp48 => is_dsp48 00241 ) 00242 port map( 00243 ---- Global ---- 00244 reset => reset, -- 0 - сброс 00245 clk => clk, -- Тактовая частота 250 МГц 00246 aclk => aclk, -- Тактовая частота 266 МГц 00247 00248 ---- Picoblaze ---- 00249 dma_chn => dma_chn, -- номер канала DMA 00250 reg_ch0_ctrl => reg_ch0_ctrl, -- регистр управления 00251 reg_ch1_ctrl => reg_ch1_ctrl, -- регистр управления 00252 reg_write_E0 => ram_change, -- 1 - смена блока памяти 00253 dma0_transfer_rdy => dma0_transfer_rdy, -- 1 - блок памяти готов к обмену 00254 dma1_transfer_rdy => dma1_transfer_rdy, -- 1 - блок памяти готов к обмену 00255 00256 ---- PLB_BUS ---- 00257 dmar0 => ext_fifo_disp_back.dmar (0), -- 1 - запрос DMA 0 00258 dmar1 => ext_fifo_disp_back.dmar (1), -- 1 - запрос DMA 1 00259 request_wr => ext_fifo_disp.request_wr, -- 1 - запрос на запись в регистр 00260 request_rd => ext_fifo_disp.request_rd, -- 1 - запрос на чтение из регистра 00261 allow_wr => ext_fifo_disp_back.allow_wr, -- 1 - разрешение записи 00262 00263 00264 pf_repack_we => ext_fifo_disp_back.data_we, -- 1 - запись в память 00265 pf_ram_rd_out => pf_ram_rd, -- 1 - чтение из памяти 00266 00267 ---- Память ---- 00268 ram_adra_a9 => ram_adra(9), -- разряд 9 адреса памяти 00269 ram_adrb => ram_adrb 00270 00271 ); 00272 00273 pf_chn <= ram_adrb(10); 00274 00275 end ctrl_ext_ram;