DS_DMA
pcie_src/pcie_core64_m1/pcie_fifo_ext/ctrl_ext_ram.vhd
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;