DS_DMA
|
00001 ------------------------------------------------------------------------------- 00002 -- 00003 -- Title : core64_pb_transaction 00004 -- Author : Dmitry Smekhov 00005 -- Company : Instrumental Systems 00006 -- E-mail : dsmv@insys.ru 00007 -- 00008 -- Version : 1.0 00009 -- 00010 ------------------------------------------------------------------------------- 00011 -- 00012 -- Description : Узел управления локальной шиной 00013 -- 00014 -- pb_master.cmd - команда управления, сопровождается стробом stb0 00015 -- 0: - 1 запись данных 00016 -- 1: - 1 чтение данных 00017 -- 2: - 0 - одно слово, 1 - пакет 512 слов (4096 байт) 00018 -- 00019 ------------------------------------------------------------------------------- 00020 00021 00022 library ieee; 00023 use ieee.std_logic_1164.all; 00024 00025 use work.core64_type_pkg.all; 00026 00027 package core64_pb_transaction_pkg is 00028 00029 component core64_pb_transaction is 00030 port( 00031 reset : in std_logic; --! 0 - сброс 00032 clk : in std_logic; --! тактовая частота локальной шины - 266 МГц 00033 00034 ---- BAR1 ---- 00035 pb_master : in type_pb_master; --! запрос 00036 pb_slave : out type_pb_slave; --! ответ 00037 00038 ---- локальная шина ----- 00039 lc_adr : out std_logic_vector( 31 downto 0 ); --! шина адреса 00040 lc_host_data : out std_logic_vector( 63 downto 0 ); --! шина данных - выход 00041 lc_data : in std_logic_vector( 63 downto 0 ); --! шина данных - вход 00042 lc_wr : out std_logic; --! 1 - запись 00043 lc_rd : out std_logic; --! 1 - чтение, данные должны быть на шестой такт после rd 00044 lc_dma_req : in std_logic_vector( 1 downto 0 ); --! 1 - запрос DMA 00045 lc_irq : in std_logic --! 1 - запрос прерывания 00046 00047 00048 ); 00049 00050 end component; 00051 00052 end package; 00053 00054 00055 library ieee; 00056 use ieee.std_logic_1164.all; 00057 use ieee.std_logic_arith.all; 00058 use ieee.std_logic_unsigned.all; 00059 00060 library unisim; 00061 use unisim.vcomponents.all; 00062 00063 use work.core64_type_pkg.all; 00064 00065 entity core64_pb_transaction is 00066 port( 00067 reset : in std_logic; --! 0 - сброс 00068 clk : in std_logic; --! тактовая частота локальной шины - 266 МГц 00069 00070 ---- BAR1 ---- 00071 pb_master : in type_pb_master; --! запрос 00072 pb_slave : out type_pb_slave; --! ответ 00073 00074 ---- локальная шина ----- 00075 lc_adr : out std_logic_vector( 31 downto 0 ); --! шина адреса 00076 lc_host_data : out std_logic_vector( 63 downto 0 ); --! шина данных - выход 00077 lc_data : in std_logic_vector( 63 downto 0 ); --! шина данных - вход 00078 lc_wr : out std_logic; --! 1 - запись 00079 lc_rd : out std_logic; --! 1 - чтение, данные должны быть на шестой такт после rd 00080 lc_dma_req : in std_logic_vector( 1 downto 0 ); --! 1 - запрос DMA 00081 lc_irq : in std_logic --! 1 - запрос прерывания 00082 00083 00084 ); 00085 00086 end core64_pb_transaction; 00087 00088 00089 architecture core64_pb_transaction of core64_pb_transaction is 00090 00091 signal cnt_start : std_logic; 00092 signal cnt : std_logic_vector( 9 downto 0 ); 00093 signal rstp : std_logic; 00094 signal rd_start : std_logic; 00095 signal rd_start_z : std_logic; 00096 00097 begin 00098 00099 rstp <= not reset after 1 ns when rising_edge( clk ); 00100 --rstp <= '1', '0' after 30 us; 00101 00102 lc_adr <= pb_master.adr after 1 ns when rising_edge( clk ); 00103 lc_host_data <= pb_master.data after 1 ns when rising_edge( clk ); 00104 lc_wr <= pb_master.stb1 after 1 ns when rising_edge( clk ); 00105 lc_rd <= rd_start after 1 ns when rising_edge( clk ); 00106 00107 pr_cnt: process( clk ) begin 00108 if( rising_edge( clk ) ) then 00109 if( cnt_start='0' ) then 00110 if( pb_master.cmd(2)='0' ) then 00111 cnt <= "0111111111" after 1 ns; 00112 else 00113 cnt <= "0000000000" after 1 ns; 00114 end if; 00115 else 00116 cnt <= cnt + 1 after 1 ns; 00117 end if; 00118 end if; 00119 end process; 00120 00121 pr_cnt_start: process( clk ) begin 00122 if( rising_edge( clk ) ) then 00123 if( rstp='1' or cnt(9)='1' ) then 00124 cnt_start <= '0' after 1 ns; 00125 elsif( pb_master.cmd(1)='1' and pb_master.stb0='1' ) then 00126 cnt_start <= '1' after 1 ns; 00127 end if; 00128 end if; 00129 end process; 00130 00131 rd_start <= cnt_start and not cnt(9); 00132 00133 xrdz: srl16 port map( q =>rd_start_z, clk=>clk, d =>rd_start, a3=>'0', a2=>'1', a1=>'0', a0=>'1' ); 00134 00135 pb_slave.stb0 <= pb_master.stb0 after 1 ns when rising_edge( clk ); 00136 pb_slave.stb1 <= rd_start_z after 1 ns when rising_edge( clk ); 00137 pb_slave.data <= lc_data after 1 ns when rising_edge( clk ); 00138 pb_slave.dmar <= lc_dma_req; 00139 pb_slave.irq <= lc_irq; 00140 00141 00142 end core64_pb_transaction;