DS_DMA
pcie_src/pcie_core64_m1/pcie_ctrl/core64_reg_access.vhd
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;