DS_DMA
|
00001 ------------------------------------------------------------------------------- 00002 -- 00003 -- Title : core64_reg_access 00004 -- Author : Dmitry Smekhov 00005 -- Company : Instrumental Systems 00006 -- E-mail : dsmv@insys.ru 00007 -- 00008 -- Version : 1.0 00009 -- 00010 ------------------------------------------------------------------------------- 00011 -- 00012 -- Description : Узел доступа к регистрам в пространствах BAR0, BAR1 00013 -- 00014 ------------------------------------------------------------------------------- 00015 00016 library ieee; 00017 use ieee.std_logic_1164.all; 00018 00019 use work.core64_type_pkg.all; 00020 00021 package core64_reg_access_pkg is 00022 00023 component core64_reg_access is 00024 port( 00025 --- General --- 00026 rstp : in std_logic; --! 1 - сброс 00027 clk : in std_logic; --! тактовая частота ядра - 250 MHz 00028 00029 --- RX_ENGINE ---- 00030 reg_access : in type_reg_access; --! запрос на доступ к регистрам 00031 00032 --- TX_ENGINE ---- 00033 reg_access_back : out type_reg_access_back; --! ответ на запрос 00034 00035 ---- PB_DISP ---- 00036 reg_disp : out type_reg_disp; --! запрос на доступ к регистрам из BAR1 00037 reg_disp_back : in type_reg_disp_back; --! ответ на запрос 00038 00039 ---- BLOCK EXT_FIFO ---- 00040 reg_ext_fifo : out type_reg_ext_fifo; --! запрос на доступ к блокам управления EXT_FIFO 00041 reg_ext_fifo_back : in type_reg_ext_fifo_back; --! ответ на запрос 00042 00043 ---- BAR0 - блоки управления ---- 00044 bp_host_data : out std_logic_vector( 31 downto 0 ); --! шина данных - выход 00045 bp_data : in std_logic_vector( 31 downto 0 ); --! шина данных - вход 00046 bp_adr : out std_logic_vector( 19 downto 0 ); --! адрес регистра 00047 bp_we : out std_logic_vector( 3 downto 0 ); --! 1 - запись в регистры 00048 bp_rd : out std_logic_vector( 3 downto 0 ); --! 1 - чтение из регистров блока 00049 bp_sel : out std_logic_vector( 1 downto 0 ); --! номер блока для чтения 00050 bp_reg_we : out std_logic; --! 1 - запись в регистр по адресам 0x100000 - 0x1FFFFF 00051 bp_reg_rd : out std_logic; --! 1 - чтение из регистра по адресам 0x100000 - 0x1FFFFF 00052 bp_irq : in std_logic --! 1 - запрос прерывания 00053 ); 00054 00055 end component; 00056 00057 end package; 00058 00059 00060 00061 library ieee; 00062 use ieee.std_logic_1164.all; 00063 00064 use work.core64_type_pkg.all; 00065 00066 entity core64_reg_access is 00067 port( 00068 00069 --- General --- 00070 rstp : in std_logic; --! 1 - сброс 00071 clk : in std_logic; --! тактовая частота ядра - 250 MHz 00072 00073 --- RX_ENGINE ---- 00074 reg_access : in type_reg_access; --! запрос на доступ к регистрам 00075 00076 --- TX_ENGINE ---- 00077 reg_access_back : out type_reg_access_back; --! ответ на запрос 00078 00079 ---- PB_DISP ---- 00080 reg_disp : out type_reg_disp; --! запрос на доступ к регистрам из BAR1 00081 reg_disp_back : in type_reg_disp_back; --! ответ на запрос 00082 00083 ---- BLOCK EXT_FIFO ---- 00084 reg_ext_fifo : out type_reg_ext_fifo; --! запрос на доступ к блокам управления EXT_FIFO 00085 reg_ext_fifo_back : in type_reg_ext_fifo_back; --! ответ на запрос 00086 00087 ---- BAR0 - блоки управления ---- 00088 bp_host_data : out std_logic_vector( 31 downto 0 ); --! шина данных - выход 00089 bp_data : in std_logic_vector( 31 downto 0 ); --! шина данных - вход 00090 bp_adr : out std_logic_vector( 19 downto 0 ); --! адрес регистра 00091 bp_we : out std_logic_vector( 3 downto 0 ); --! 1 - запись в регистры 00092 bp_rd : out std_logic_vector( 3 downto 0 ); --! 1 - чтение из регистров блока 00093 bp_sel : out std_logic_vector( 1 downto 0 ); --! номер блока для чтения 00094 bp_reg_we : out std_logic; --! 1 - запись в регистр по адресам 0x100000 - 0x1FFFFF 00095 bp_reg_rd : out std_logic; --! 1 - чтение из регистра по адресам 0x100000 - 0x1FFFFF 00096 bp_irq : in std_logic --! 1 - запрос прерывания 00097 ); 00098 00099 end core64_reg_access; 00100 00101 00102 architecture core64_reg_access of core64_reg_access is 00103 00104 signal bar0_complete : std_logic; 00105 signal bar1_complete : std_logic; 00106 signal adr : std_logic_vector( 31 downto 0 ); 00107 00108 signal bar0_write : std_logic; 00109 signal bar0_read : std_logic; 00110 signal bar1_read : std_logic; 00111 signal bar0i_data : std_logic_vector( 31 downto 0 ); 00112 signal bar0_data : std_logic_vector( 31 downto 0 ); 00113 00114 signal bar1_data : std_logic_vector( 31 downto 0 ); 00115 00116 type stp_type is ( s0, s1, s2 ); 00117 signal stp : stp_type; 00118 signal st1p : stp_type; 00119 00120 signal disp_complete : std_logic; 00121 00122 00123 begin 00124 00125 bp_adr <= reg_access.adr( 22 downto 3 ); 00126 bp_sel <= reg_access.adr( 9 downto 8 ); 00127 reg_disp.adr <= reg_access.adr( 31 downto 0 ); 00128 reg_ext_fifo.adr <= reg_access.adr( 9 downto 3 ); 00129 00130 bp_host_data <= reg_access.data; 00131 reg_disp.data <= reg_access.data; 00132 reg_ext_fifo.data <= reg_access.data; 00133 00134 reg_access_back.complete <= bar0_complete or bar1_complete after 1 ns when rising_edge( clk ); 00135 00136 adr <= reg_access.adr; 00137 00138 bp_reg_we <= bar0_write and adr(20) after 1 ns when rising_edge( clk ); 00139 00140 bp_we(0) <= bar0_write and not adr(20) and not adr(10) and not adr(9) and not adr(8) after 1 ns when rising_edge( clk ); 00141 bp_we(1) <= bar0_write and not adr(20) and not adr(10) and not adr(9) and adr(8) after 1 ns when rising_edge( clk ); 00142 bp_we(2) <= bar0_write and not adr(20) and not adr(10) and adr(9) and not adr(8) after 1 ns when rising_edge( clk ); 00143 bp_we(3) <= bar0_write and not adr(20) and not adr(10) and adr(9) and adr(8) after 1 ns when rising_edge( clk ); 00144 00145 bp_reg_rd <= bar0_write and adr(20) after 1 ns when rising_edge( clk ); 00146 00147 bp_rd(0) <= bar0_read and not adr(20) and not adr(10) and not adr(9) and not adr(8) after 1 ns when rising_edge( clk ); 00148 bp_rd(1) <= bar0_read and not adr(20) and not adr(10) and not adr(9) and adr(8) after 1 ns when rising_edge( clk ); 00149 bp_rd(2) <= bar0_read and not adr(20) and not adr(10) and adr(9) and not adr(8) after 1 ns when rising_edge( clk ); 00150 bp_rd(3) <= bar0_read and not adr(20) and not adr(10) and adr(9) and adr(8) after 1 ns when rising_edge( clk ); 00151 00152 00153 reg_ext_fifo.data_we <= bar0_write and not adr(20) and adr(10) after 1 ns when rising_edge( clk ); 00154 00155 00156 bar0i_data <= bp_data when adr(20)='1' or adr(10)='0' else 00157 reg_ext_fifo_back.data; 00158 00159 bar0_data <= bar0i_data after 1 ns when rising_edge( clk ) and bar0_read='1'; 00160 bar1_data <= reg_disp_back.data after 1 ns when rising_edge( clk ) and reg_disp_back.data_we='1'; 00161 00162 reg_access_back.data <= bar0_data when reg_access.req_rd(0)='1' else bar1_data; 00163 reg_access_back.data_we <= bar0_read or bar1_read after 1 ns when rising_edge( clk ); 00164 00165 00166 pr0_state: process( clk ) begin 00167 if( rising_edge( clk ) ) then 00168 00169 case( stp ) is 00170 00171 when s0 => 00172 bar0_complete <= '0' after 1 ns; 00173 bar0_write <= '0' after 1 ns; 00174 bar0_read <= '0' after 1 ns; 00175 00176 if( reg_access.req_wr(0)='1' or reg_access.req_rd(0)='1' ) then 00177 stp <= s1 after 1 ns; 00178 end if; 00179 00180 when s1 => 00181 bar0_write <= reg_access.req_wr(0) after 1 ns; 00182 bar0_read <= reg_access.req_rd(0) after 1 ns; 00183 stp <= s2 after 1 ns; 00184 00185 00186 when s2 => 00187 bar0_write <= '0' after 1 ns; 00188 bar0_read <= '0' after 1 ns; 00189 bar0_complete <= '1' after 1 ns; 00190 if( reg_access.req_wr(0)='0' and reg_access.req_rd(0)='0' ) then 00191 stp <= s0 after 1 ns; 00192 end if; 00193 00194 end case; 00195 00196 if( rstp='1' ) then 00197 stp <= s0 after 1 ns; 00198 end if; 00199 00200 end if; 00201 end process; 00202 00203 disp_complete <= reg_disp_back.complete after 1 ns when rising_edge( clk ); 00204 00205 pr1_state: process( clk ) begin 00206 if( rising_edge( clk ) ) then 00207 00208 case( st1p ) is 00209 00210 when s0 => 00211 bar1_complete <= '0' after 1 ns; 00212 bar1_read <= '0' after 1 ns; 00213 reg_disp.request_reg_wr <= '0' after 1 ns; 00214 reg_disp.request_reg_rd <= '0' after 1 ns; 00215 00216 if( reg_access.req_wr(1)='1' or reg_access.req_rd(1)='1' ) then 00217 st1p <= s1 after 1 ns; 00218 end if; 00219 00220 when s1 => 00221 reg_disp.request_reg_wr <= reg_access.req_wr(1) after 1 ns; 00222 reg_disp.request_reg_rd <= reg_access.req_rd(1) after 1 ns; 00223 bar1_read <= '1' after 1 ns; 00224 00225 if( disp_complete='1' ) then 00226 st1p <= s2 after 1 ns; 00227 end if; 00228 00229 00230 when s2 => 00231 reg_disp.request_reg_wr <= '0' after 1 ns; 00232 reg_disp.request_reg_rd <= '0' after 1 ns; 00233 bar1_read <= '0' after 1 ns; 00234 bar1_complete <= '1' after 1 ns; 00235 if( reg_access.req_wr(1)='0' and reg_access.req_rd(1)='0' ) then 00236 st1p <= s0 after 1 ns; 00237 end if; 00238 00239 end case; 00240 00241 if( rstp='1' ) then 00242 st1p <= s0 after 1 ns; 00243 end if; 00244 00245 end if; 00246 end process; 00247 00248 00249 00250 end core64_reg_access;