AMBPEX5_v20_SX50T_CORE
adm/dio64/trd_admdio64_out_v4.vhd
00001 ---------------------------------------------------------------------------------------------------
00002 --
00003 -- Title       : trd_admdio64_out_v1
00004 -- Author      : Ilya Ivanov
00005 -- Company     : Instrumental System
00006 --
00007 -- Version     : 1.3
00008 --
00009 ---------------------------------------------------------------------------------------------------
00010 --
00011 -- Description :  Тетрада цифрового ввода.
00012 --                                Модификация 1 - Используется FIFO 1024x64
00013 --                              
00014 ---------------------------------------------------------------------------------------------------
00015 --
00016 --      Версия 1.3        18.07.2007      Dmitry Smekhov
00017 --                              Добавлены выходы cmd_data_out2, start, bx_clk
00018 --                              Убран вход b_clk
00019 --
00020 ---------------------------------------------------------------------------------------------------
00021 --
00022 --      Версия 1.2        18.08.2006      Dmitry Smekhov
00023 --                              Используется cl_fifo1024x64_v2
00024 --
00025 ---------------------------------------------------------------------------------------------------
00026 --
00027 --      Версия 1.1        07.09.2005      Dmitry Smekhov
00028 --                              Добавлен выход fifo_cnt - число слов в FIFO      
00029 --                              и выходы регистров MODE0, MODE1, MODE2, MODE3
00030 --
00031 ---------------------------------------------------------------------------------------------------
00032 
00033 library ieee;
00034 use ieee.std_logic_1164.all;
00035 use IEEE.std_logic_unsigned.all ;
00036 
00037                                                                    
00038         
00039 
00040 library work;
00041 use work.cl_chn_v3_pkg.all;                             
00042 use work.adm2_pkg.all;
00043 
00044 package trd_admdio64_out_v4_pkg is
00045         
00046 constant  ID_DIO_OUT            : std_logic_vector( 15 downto 0 ):=x"0012"; -- идентификатор тетрады
00047 constant  ID_MODE_DIO_OUT       : std_logic_vector( 15 downto 0 ):=x"0001"; -- модификатор тетрады
00048 constant  VER_DIO_OUT           : std_logic_vector( 15 downto 0 ):=x"0103";     -- версия тетрады
00049 constant  RES_DIO_OUT           : std_logic_vector( 15 downto 0 ):=x"0020";     -- ресурсы тетрады
00050 constant  FIFO_DIO_OUT          : std_logic_vector( 15 downto 0 ):=x"0400"; -- размер FIFO
00051 constant  FTYPE_DIO_OUT         : std_logic_vector( 15 downto 0 ):=x"0040"; -- ширина FIFO
00052 
00053 component trd_admdio64_out_v4 is 
00054         port(           
00055         
00056                 -- GLOBAL
00057                 reset                   : in std_logic;         -- 0 - сброс
00058                 clk                             : in std_logic;         -- тактовая частота
00059                 
00060                 -- Управление тетрадой
00061                 data_in                 : in std_logic_vector( 63 downto 0 ); -- шина данных DATA
00062                 cmd_data_in             : in std_logic_vector( 15 downto 0 ); -- шина данных CMD_DATA
00063                 cmd                             : in bl_cmd;            -- сигналы управления
00064                 
00065                 cmd_data_out    : out std_logic_vector( 15 downto 0 ); -- выходы регистров, через буфер
00066                 cmd_data_out2   : out std_logic_vector( 15 downto 0 ); -- выходы регистров, без буфера
00067                 
00068                 bx_irq                  : out std_logic;        -- 1 - прерывание от тетрады
00069                 bx_drq                  : out bl_drq;           -- управление DMA       
00070                 
00071                 mode0                   : out std_logic_vector( 15 downto 0 );  -- регистр MODE0
00072                 mode1                   : out std_logic_vector( 15 downto 0 );  -- регистр MODE1
00073                 mode2                   : out std_logic_vector( 15 downto 0 );  -- регистр MODE2
00074                 mode3                   : out std_logic_vector( 15 downto 0 );  -- регистр MODE3
00075                 
00076                 fifo_rst                : out std_logic;        -- 0 - сброс FIFO
00077                 start                   : out std_logic;        --  1 - разрешение работы (MODE0[5])
00078                 
00079                 -- Чтение из FIFO
00080                 data_out                : out std_logic_vector(63 downto 0);    -- шина данных FIFO
00081                 data_cs         : in std_logic;                                                 -- 0 - чтение данных
00082                 flag_rd         : out bl_fifo_flag;                                             -- флаги FIFO
00083                 clk_rd          : in std_logic;                                                 -- тактовая частота чтения данных
00084                 fifo_cnt                : out std_logic_vector( 12 downto 0 );  -- число слов в FIFO
00085                 
00086                 -- Тестовые выводы -- 
00087                 test                    : out std_logic_vector(7 downto 0)              
00088                 --------------------------------------------
00089             );
00090 end component;
00091 
00092 end trd_admdio64_out_v4_pkg;
00093 
00094 
00095 library ieee;
00096 use ieee.std_logic_1164.all;
00097 use IEEE.std_logic_unsigned.all ;
00098 
00099 library unisim;
00100 use unisim.vcomponents.all;
00101 
00102 library work;
00103 use work.cl_chn_v4_pkg.all;                             
00104 use work.adm2_pkg.all;
00105 use work.cl_fifo1024x65_v5_pkg.all;
00106 
00107 entity trd_admdio64_out_v4 is 
00108         port(           
00109         
00110                 -- GLOBAL
00111                 reset                   : in std_logic;         -- 0 - сброс
00112                 clk                             : in std_logic;         -- тактовая частота
00113                 
00114                 -- Управление тетрадой
00115                 data_in                 : in std_logic_vector( 63 downto 0 ); -- шина данных DATA
00116                 cmd_data_in             : in std_logic_vector( 15 downto 0 ); -- шина данных CMD_DATA
00117                 cmd                             : in bl_cmd;            -- сигналы управления
00118                 
00119                 cmd_data_out    : out std_logic_vector( 15 downto 0 ); -- выходы регистров, через буфер
00120                 cmd_data_out2   : out std_logic_vector( 15 downto 0 ); -- выходы регистров, без буфера
00121                 
00122                 bx_irq                  : out std_logic;        -- 1 - прерывание от тетрады
00123                 bx_drq                  : out bl_drq;           -- управление DMA       
00124                 
00125                 mode0                   : out std_logic_vector( 15 downto 0 );  -- регистр MODE0
00126                 mode1                   : out std_logic_vector( 15 downto 0 );  -- регистр MODE1
00127                 mode2                   : out std_logic_vector( 15 downto 0 );  -- регистр MODE2
00128                 mode3                   : out std_logic_vector( 15 downto 0 );  -- регистр MODE3
00129                 
00130                 fifo_rst                : out std_logic;        -- 0 - сброс FIFO
00131                 start                   : out std_logic;        --  1 - разрешение работы (MODE0[5])
00132                 
00133                 -- Чтение из FIFO
00134                 data_out                : out std_logic_vector(63 downto 0);    -- шина данных FIFO
00135                 data_cs         : in std_logic;                                                 -- 0 - чтение данных
00136                 flag_rd         : out bl_fifo_flag;                                             -- флаги FIFO
00137                 clk_rd          : in std_logic;                                                 -- тактовая частота чтения данных
00138                 fifo_cnt                : out std_logic_vector( 12 downto 0 );  -- число слов в FIFO
00139                 
00140                 -- Тестовые выводы -- 
00141                 test                    : out std_logic_vector(7 downto 0)              
00142                 --------------------------------------------
00143             );
00144 end trd_admdio64_out_v4;
00145                                                                                                                  
00146 
00147 architecture trd_admdio64_out_v4 of trd_admdio64_out_v4 is 
00148 
00149 
00150 component ctrl_start_v3 is              
00151         port(                                   
00152         
00153                 reset   : in std_logic;                                                 -- 0 - сброс
00154                 mode0   : in std_logic_vector( 15 downto 0 );   -- регистр MODE0
00155                 stmode  : in std_logic_vector( 15 downto 0 );   -- регистр STMODE
00156                 fmode   : in std_logic_vector(  5 downto 0 );   -- регистр FMODE
00157                 fdiv    : in std_logic_vector( 15 downto 0 );   -- регистр FDIV
00158                 fdiv_we : in std_logic;                                                 -- 1 - запись в регистр FDIV
00159                 
00160                 cnt0    : in std_logic_vector( 15 downto 0 );   -- счётчик начальной задержки
00161                 cnt1    : in std_logic_vector( 15 downto 0 );   -- счётчик принимаемых слов
00162                 cnt2    : in std_logic_vector( 15 downto 0 );   -- счётчик пропускаемых слов
00163                 
00164                 b_clk   : in std_logic_vector( 15 downto 0 );   -- входы тактовой частоты
00165                 b_start : in std_logic_vector( 15 downto 0 );   -- входы сигнала START
00166                 
00167                 bx_clk  : out std_logic;                        -- выход тактовой частоты, глобальный
00168                 bi_clk  : out std_logic;                        -- выход тактовой частота, опережает bx_clk
00169                 bx_start                : out std_logic;        -- выход сигнала start синхронный с bx_clk
00170                 bx_start_a              : out std_logic;        -- асинхронный выход сигнала start 
00171                 bx_start_sync   : out std_logic;        -- импульс синхронизации
00172                 
00173                 goe0    : out std_logic;                        -- включение генератора 60MHz
00174                 goe1    : out std_logic                         -- включение генератора 50MHz
00175                 
00176         );
00177         
00178 end  component; 
00179 
00180 component cl_fifo1024x64_v3 is
00181         port(                           
00182                 -- сброс
00183                  reset                          : in std_logic;         -- 0 - сброс
00184                  
00185                 -- запись
00186                  clk_wr                         : in std_logic;         -- тактовая частота
00187                  data_in                        : in std_logic_vector(63 downto 0); -- данные
00188                  data_en                        : in std_logic;         -- 1 - запись в fifo
00189                  flag_wr                        : out bl_fifo_flag;     -- флаги fifo, синхронно с clk_wr
00190                  cnt_wr                         : out std_logic_vector( 9 downto 0 ); -- счётчик слов
00191                  
00192                  -- чтение
00193                  clk_rd                         : in std_logic;         -- тактовая частота
00194                  data_out                       : out std_logic_vector(63 downto 0);   -- данные
00195                  data_cs                        : in std_logic;         -- 0 - чтение из fifo
00196                  flag_rd                        : out bl_fifo_flag;     -- флаги fifo, синхронно с clk_rd
00197                  cnt_rd                         : out std_logic_vector( 9 downto 0 ); -- счётчик слов 
00198                  
00199                  cnt_pae                        : in std_logic_vector(12 downto 0);     -- номер слова FIFO при котором оно еще почти пустое
00200                  cnt_paf                        : in std_logic_vector(12 downto 0);     -- номер слова FIFO при котором оно почти полное
00201                  rt_mode                        : in std_logic          -- 1 - retransmit  
00202                  
00203             );
00204 end component;
00205 
00206 signal rst,fifo_rst0            : std_logic;
00207 signal flag_wr                  : bl_fifo_flag; 
00208 signal c_mode0                          : std_logic_vector(15 downto 0);
00209 signal fdiv,stmode,fmode        : std_logic_vector(15 downto 0);
00210 signal status                           : std_logic_vector(15 downto 0);
00211 signal cnt0,cnt1,cnt2           : std_logic_vector(15 downto 0);
00212 signal fdiv_we                          : std_logic;   
00213 signal clk_trd,start_trd        : std_logic; 
00214 signal clk_d,cw,cw0                     : std_logic;
00215 signal cnt_wr                       : std_logic_vector( 9 downto 0 );
00216 signal cnt_rd                       : std_logic_vector( 9 downto 0 );     
00217 signal  sflag_pae                       : std_logic_vector( 15 downto 0 );
00218 signal  sflag_paf                       : std_logic_vector( 15 downto 0 );
00219 
00220 
00221 begin              
00222         
00223 xstatus: ctrl_buft16 port map( 
00224         t => cmd.status_cs,
00225         i =>  status,
00226         o => cmd_data_out );
00227         
00228 cmd_data_out2 <= status;        
00229         
00230 chn: cl_chn_v4 
00231         generic map(                                     
00232           -- 2 - out - для тетрады вывода
00233           -- 1 - in  - для тетрады ввода
00234           chn_type                      => 2 
00235         )
00236 
00237         port map (
00238                 reset                           => reset,
00239                 clk                             => clk,
00240                 -- Флаги
00241                 cmd_rdy                         => '1',
00242                 rdy                             => '1', --flag_wr.hf,
00243                 fifo_flag               => flag_wr,
00244                 --st9                           => ready,
00245                 -- Тетрада       
00246                 data_in                 => cmd_data_in,
00247                 cmd                             => cmd,
00248                 bx_irq                  => bx_irq,
00249                 bx_drq                  => bx_drq,
00250                 status                  => status,
00251                 -- Управление
00252                 mode0                   => c_mode0,      
00253                 mode1                   => mode1,
00254                 mode2                   => mode2,
00255                 mode3                   => mode3,
00256                 sflag_pae               => sflag_pae,
00257                 sflag_paf               => sflag_paf,
00258                 fdiv                    => fdiv ,         
00259                 fdiv_we                  => fdiv_we ,
00260                 fmode                           => fmode,
00261                 stmode                          => stmode,
00262                 rst                                     => rst,
00263                 fifo_rst                => fifo_rst0
00264         );
00265 
00266                 
00267 x_fifo: cl_fifo1024x65_v5
00268         port map(                               
00269                 -- сброс
00270                  reset                  => fifo_rst0,
00271                 -- запись
00272                  clk_wr                 => clk,
00273                  data_in                => data_in,
00274                  data_en                => cmd.data_we,
00275                  flag_wr                => flag_wr,
00276                  --cnt_wr         => cnt_wr,
00277                  -- чтение
00278                  clk_rd                 => clk_rd,
00279                  data_out               => data_out,
00280                  data_cs                        => data_cs,
00281                  flag_rd                        => flag_rd
00282                  --cnt_rd                       => cnt_rd
00283                  
00284             );   
00285 
00286 fifo_rst<=fifo_rst0;
00287 
00288 fifo_cnt( 9 downto 0 ) <= cnt_rd;
00289 fifo_cnt( 12 downto 10 ) <= (others=>'0');
00290 
00291 mode0 <= c_mode0;
00292 start <= c_mode0(5);
00293 
00294 end trd_admdio64_out_v4;
00295 
00296