DS_DMA
pcie_src/components/rtl/core64_pb_transaction.vhd
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;