DS_DMA
|
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