DS_DMA
pcie_src/components/block_main/block_pe_main.vhd
00001 ---------------------------------------------------------------------------------------------------
00002 --
00003 -- Title       : block_pe_main
00004 -- Author      : Dmitry Smekhov
00005 -- Company     : Instrumental System
00006 -- E-mail      : dsmv@insys.ru
00007 --
00008 -- Version     : 1.1  
00009 --
00010 ---------------------------------------------------------------------------------------------------
00011 --
00012 -- Description : 
00013 --              Блок управления общими ресурсами прошивки с ядром PCI-Express
00014 --              
00015 --              Модификация 1
00016 --              Реализованы регистры BRD_MODE, STATUS 
00017 --                                      
00018 --              
00019 --
00020 ---------------------------------------------------------------------------------------------------
00021 --
00022 --      Version 1.1   26.12.2009
00023 --                                        Добавлен регистр CPL_CNT - число ошибок Completion Timeout
00024 --
00025 ---------------------------------------------------------------------------------------------------
00026 
00027 library ieee;
00028 use ieee.std_logic_1164.all;   
00029 
00030 library work;
00031 use     work.host_pkg.all;
00032 
00033 package block_pe_main_pkg is
00034         
00035 component block_pe_main is                              
00036         generic (
00037                 Device_ID               : in std_logic_vector( 15 downto 0 ):=x"0000"; -- идентификатор модуля
00038                 Revision                : in std_logic_vector( 15 downto 0 ):=x"0000"; -- версия модуля
00039                 PLD_VER                 : in std_logic_vector( 15 downto 0 ):=x"0000"; -- версия ПЛИС
00040                 BLOCK_CNT               : in std_logic_vector( 15 downto 0 ):=x"0000"  -- число блоков управления 
00041                 
00042         );      
00043         port(
00044         
00045                 ---- Global ----
00046                 reset_hr1               : in std_logic;         -- 0 - сброс
00047                 clk                             : in std_logic;         -- Тактовая частота DSP
00048                 pb_reset                : out std_logic;        -- 0 - сброс ведомой ПЛИС
00049                 
00050                 ---- HOST ----
00051                 bl_adr                  : in  std_logic_vector( 4 downto 0 );   -- адрес
00052                 bl_data_in              : in  std_logic_vector( 31 downto 0 );  -- данные
00053                 bl_data_out             : out std_logic_vector( 31 downto 0 );  -- данные
00054                 bl_data_we              : in  std_logic;        -- 1 - запись данных   
00055                 
00056                 ---- Управление ----
00057                 brd_mode                : out std_logic_vector( 15 downto 0 )  -- регистр BRD_MODE
00058 
00059         );      
00060 end component;
00061 
00062 end package;
00063 
00064 
00065 
00066 library ieee;
00067 use ieee.std_logic_1164.all;   
00068 
00069 library work;
00070 use     work.host_pkg.all;
00071 use work.ctrl_ram16_v1_pkg.all;
00072 
00073 library unisim;
00074 use unisim.vcomponents.all;
00075 
00076 
00077 
00078 entity block_pe_main is                         
00079         generic (
00080                 Device_ID               : in std_logic_vector( 15 downto 0 ):=x"0000"; -- идентификатор модуля
00081                 Revision                : in std_logic_vector( 15 downto 0 ):=x"0000"; -- версия модуля
00082                 PLD_VER                 : in std_logic_vector( 15 downto 0 ):=x"0000"; -- версия ПЛИС
00083                 BLOCK_CNT               : in std_logic_vector( 15 downto 0 ):=x"0000"  -- число блоков управления 
00084                 
00085         );      
00086         port(
00087         
00088                 ---- Global ----
00089                 reset_hr1               : in std_logic;         -- 0 - сброс
00090                 clk                             : in std_logic;         -- Тактовая частота DSP
00091                 pb_reset                : out std_logic;        -- 0 - сброс ведомой ПЛИС
00092                 
00093                 ---- HOST ----
00094                 bl_adr                  : in  std_logic_vector( 4 downto 0 );   -- адрес
00095                 bl_data_in              : in  std_logic_vector( 31 downto 0 );  -- данные
00096                 bl_data_out             : out std_logic_vector( 31 downto 0 );  -- данные
00097                 bl_data_we              : in  std_logic;        -- 1 - запись данных   
00098                 
00099                 ---- Управление ----
00100                 brd_mode                : out std_logic_vector( 15 downto 0 )  -- регистр BRD_MODE
00101                 
00102         );      
00103 end block_pe_main;
00104 
00105 
00106 architecture block_pe_main of block_pe_main is                                     
00107 
00108 
00109 
00110 ---- Constant ----
00111 constant BLOCK_ID               : std_logic_vector( 15 downto 0 ):=x"1013"; -- идентификатор блока PE_MAIN
00112 constant BLOCK_VER              : std_logic_vector( 15 downto 0 ):=x"0101"; -- версия блока PE_MAIN
00113 
00114 constant        bl_rom          : bh_rom:=( 0=> BLOCK_ID,
00115                                                                 1=> BLOCK_VER,
00116 --                                                              2=> Device_ID,
00117 --                                                              3=> Revision,
00118 --                                                              4=> PLD_VER,  
00119 
00120 2=> x"5504",
00121 3=> x"0210",
00122 4=> x"0104",
00123                                                                 5=> BLOCK_CNT,
00124                                                                 6=> x"0000",
00125                                                                 7=> x"0000" );
00126 
00127 
00128 
00129                                                                 
00130         ---- PLX ----
00131 signal  bl_ram_out              : std_logic_vector( 15 downto 0 );      -- выход констант и командных
00132                                                                                                                 -- регистров
00133 signal  bl_reg_out              : std_logic_vector( 31 downto 0 );      -- выход непосредственных регистров
00134 
00135 
00136                                 
00137 signal  c_brd_mode              : std_logic_vector( 15 downto 0 );      -- регистр BRD_MODE
00138 
00139         ---- Reset ----
00140 signal  dsp_reg_reset   : std_logic_vector( 11 downto 0 );
00141 signal  reset_flag              : std_logic_vector( 7 downto 0 );
00142 signal  reset_val               : std_logic_vector( 7 downto 0 );
00143 signal  reset_val_0             : std_logic_vector( 7 downto 0 );
00144 signal  reset_val_1             : std_logic_vector( 7 downto 0 );
00145 signal  reset_host              : std_logic_vector( 7 downto 0 );
00146 
00147 
00148 
00149 
00150 signal  brd_status_i    : std_logic_vector( 15 downto 0 );
00151 
00152 attribute       tig : string;
00153 attribute       tig             of reset_hr1    : signal        is "yes";
00154 
00155 
00156 begin
00157 
00158         
00159 bl_ram: ctrl_ram16_v1 
00160         generic map(
00161                 rom                     => bl_rom-- значения констант
00162         )
00163         port map(
00164                 clk                     => clk,         -- Тактовая частота
00165                 
00166                 adr                     => bl_adr,                      -- адрес 
00167                 data_in                 => bl_data_in( 15 downto 0 ),   -- вход данных
00168                 data_out        => bl_ram_out,          -- выход данных
00169                 
00170                 data_we         => bl_data_we-- 1 - запись данных
00171         );
00172         
00173 
00174         
00175         
00176 pr_data_out: process( clk )
00177 begin
00178         
00179         if( rising_edge( clk ) ) then
00180                 if( bl_adr(4)='0' ) then
00181                         bl_data_out( 15 downto 0 ) <= bl_ram_out after 1 ns;
00182                         bl_data_out( 31 downto 16 ) <= (others=>'0') after 1 ns;
00183                 else
00184                         case bl_adr( 3 downto 0 ) is
00185                                 when "0000"     =>      -- BRD_STATUS
00186                                                 bl_data_out(15 downto 0 )<=brd_status_i after 1 ns;
00187                                                 bl_data_out( 31 downto 16 ) <= (others=>'0') after 1 ns;
00188                                                 
00189                                 when "0110"     =>  -- SPD_CTRL
00190                                                 bl_data_out( 31 downto 0 ) <= (others=>'1') after 1 ns;
00191                                 
00192                                 when "1000"     =>  -- SPD_DATA
00193                                                 bl_data_out( 31 downto 0 ) <= (others=>'1') after 1 ns;
00194 
00195                                 when others => bl_data_out<=(others=>'-');
00196                         end case;
00197                 end if;
00198         end if;
00199 end process;   
00200 
00201         
00202 
00203 
00204 pr_reg: process( reset_hr1, clk ) 
00205         
00206 begin
00207         if( reset_hr1='0' ) then
00208                 c_brd_mode<=(others=>'0');
00209         elsif( rising_edge( clk ) ) then
00210                 if( bl_data_we='1' ) then
00211                         case bl_adr( 4 downto 0 ) is
00212                                 when "01000"    => -- BRD_MODE
00213                                                 c_brd_mode <= bl_data_in( 15 downto 0 ) after 1 ns;
00214                                 when others => null;
00215                         end case;
00216                 end if;
00217                 
00218         end if;
00219 end process;
00220                                 
00221 
00222 brd_mode <=c_brd_mode;
00223 
00224 brd_status_i( 0 ) <= '1';
00225 brd_status_i( 7 downto 1 ) <= (others=>'0');
00226 brd_status_i( 9 downto 8 ) <= c_brd_mode( 9 downto 8 );
00227 brd_status_i( 14 downto 10 ) <= (others=>'0');
00228 brd_status_i( 15 ) <= '1';
00229 
00230 
00231 end block_pe_main;
00232