AMBPEX5_v20_SX50T_CORE
adm/main/cl_test0_v4.vhd
00001 ---------------------------------------------------------------------------------------------------
00002 --
00003 -- Title       : cl_test0_v4
00004 -- Author      : Dmitry Smekhov
00005 -- Company     : Instrumental Systems
00006 -- E-mail      : dsmv@insys.ru
00007 --
00008 -- Version     : 1.1
00009 --
00010 ---------------------------------------------------------------------------------------------------
00011 --
00012 -- Description : Модуль начального тестирования.
00013 --               Модификация 4 - шина данных 64 разряда, шина адреса 7 разрядов
00014 --                           Есть отдельный сброс тестового регистра
00015 --
00016 ---------------------------------------------------------------------------------------------------
00017 --
00018 --   Version 1.1        10.06.2010
00019 --                                      Добавлен режим формирования псевдослучайной последовательности
00020 --
00021 ---------------------------------------------------------------------------------------------------
00022 
00023 library ieee;
00024 use ieee.std_logic_1164.all;
00025 
00026 package cl_test0_v4_pkg is
00027 
00028 component cl_test0_v4 is
00029         port( 
00030                 reset                   : in std_logic;                 -- 0 - общий сброс, переход в режим по test_mode_init
00031                 reset_reg               : in std_logic;                 -- 0 - сброс сдвигового регистра
00032                 clk                             : in std_logic;                 -- Тактовая частота
00033                 reg_test_mode   : in std_logic:='0';    -- 1 - формирование псевдослучайной последовательности
00034                 
00035                 adr_in                  : in std_logic_vector( 6 downto 0 );    -- шина адреса
00036                 data_in                 : in std_logic_vector( 63 downto 0 );   -- шина данных, вход
00037                 data_en                 : in std_logic;                 -- 1 - запись в регистр
00038                 data_cs                 : in std_logic;                 -- 0 - чтение
00039                 
00040                 data_out                : out std_logic_vector( 63 downto 0 );  -- шина данных, выход
00041                 test_mode_init  : in std_logic;                 -- начальное состояние
00042                 test_mode               : out std_logic                 -- 1 - тестовый режим
00043         );
00044                 
00045 end component;
00046 
00047 end package;
00048 
00049 
00050 library ieee;
00051 use ieee.std_logic_1164.all;
00052 
00053 entity cl_test0_v4 is
00054         port( 
00055                 reset                   : in std_logic;                 -- 0 - общий сброс, переход в режим по test_mode_init
00056                 reset_reg               : in std_logic;                 -- 0 - сброс сдвигового регистра
00057                 clk                             : in std_logic;                 -- Тактовая частота
00058                 reg_test_mode   : in std_logic:='0';    -- 1 - формирование псевдослучайной последовательности
00059                 
00060                 adr_in                  : in std_logic_vector( 6 downto 0 );    -- шина адреса
00061                 data_in                 : in std_logic_vector( 63 downto 0 );   -- шина данных, вход
00062                 data_en                 : in std_logic;                 -- 1 - запись в регистр
00063                 data_cs                 : in std_logic;                 -- 0 - чтение
00064                 
00065                 data_out                : out std_logic_vector( 63 downto 0 );  -- шина данных, выход
00066                 test_mode_init  : in std_logic;                 -- начальное состояние
00067                 test_mode               : out std_logic                 -- 1 - тестовый режим
00068         );
00069                 
00070 end cl_test0_v4;
00071 
00072 
00073 architecture cl_test0_v4 of cl_test0_v4 is
00074 
00075 signal reg: std_logic_vector( 63 downto 0 );
00076 
00077 signal reg_en2, reg_sen: std_logic;
00078 signal tmode, tmode1: std_logic;    -- 1 - режим тестирования
00079 signal reg_clr: std_logic;                      -- 1 - сброс регистра
00080 
00081 begin
00082 
00083 
00084 
00085 
00086         
00087         
00088 pr_tmode: process( reset, clk ) begin
00089         if( reset='0' ) then
00090                 tmode<=test_mode_init;
00091         elsif( rising_edge( clk ) ) then
00092                 if( tmode='1' ) then
00093                         if( data_en='1' )  then
00094                                 tmode <= not data_in(0);
00095                         end if;
00096                 else
00097                         if( data_en='1' )  then
00098                                 tmode<= data_in(1);
00099                         end if;
00100                 end if;                                 
00101         end if;
00102 end process;
00103 
00104 
00105 test_mode<=tmode;
00106 
00107 pr_reg: process( reset, reset_reg, tmode, clk ) begin
00108         if( reset='0' or reset_reg='0' or reg_clr='1' ) then
00109                 reg<=( 1=>reg_test_mode, others=>'0' );
00110         elsif( rising_edge( clk ) ) then
00111                 if( data_en='1' ) then
00112                         reg( 6 downto 0 )<=adr_in( 6 downto 0 ) after 1 ns;
00113                         reg( 63 downto 7 )<=data_in( 63 downto 7 ) after 1 ns;
00114                 elsif( reg_sen='1' ) then
00115                         for i in 63 downto 1 loop
00116                                 reg( i )<=reg(i-1);
00117                         end loop;                          
00118                         if( reg_test_mode='0' ) then
00119                                 reg( 0 )<= not reg( 63 ) after 1 ns;
00120                         else
00121                                 reg(0) <= reg(63) xor reg(62) xor reg(60) xor reg(59) after 1 ns;
00122                         end if;
00123                 end if;
00124         end if;   
00125 end process;
00126                 
00127 reg_sen<=data_cs;                
00128 
00129 pr_tmode1: process( clk ) begin
00130         if( rising_edge( clk ) ) then
00131                 tmode1<=tmode;
00132         end if;
00133 end process;
00134 
00135 reg_clr<=tmode xor tmode1;
00136 
00137         
00138 data_out<=reg;  
00139                 
00140          
00141 
00142 end cl_test0_v4;