AMBPEX5_v20_SX50T_CORE
adm/trd_test_ctrl/ctrl_freq.vhd
00001 -------------------------------------------------------------------------------
00002 --
00003 -- Title       : ctrl_freq
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 --
00014 -------------------------------------------------------------------------------
00015 --
00016 -- Version   1.1  01.11.2008
00017 --                       Исправлен сигнал new_cnt
00018 --
00019 -------------------------------------------------------------------------------
00020 --
00021 -- Version   1.0  Mon Jun  2 10:00:19 2008
00022 --
00023 -------------------------------------------------------------------------------
00024 
00025 library ieee;
00026 use ieee.std_logic_1164.all;
00027 
00028 package ctrl_freq_pkg is
00029 
00030 component ctrl_freq is
00031         generic(
00032                 SystemFreq      : integer:= 1250;       -- значение системной тактовой частоты
00033                 FreqDiv         : integer:= 2           -- коэффициент деления входной частоты
00034                                                                                 -- ( 2 - на вход подаётся половина измеряемой частоты )
00035         );
00036         
00037         port( 
00038                 reset           : in std_logic;         -- 0 - сброс
00039                 clk_sys         : in std_logic;         -- системная тактовая частота
00040                 clk_in          : in std_logic;         -- входная тактовая частота АЦП
00041                 
00042                 freq_adc        : out std_logic_vector(15 downto 0);    -- ориентировочное значение тактовой частоты АЦП в МГц
00043                 freq_en         : out std_logic         -- 1 - подсчитано значение тактовой частоты
00044                 
00045         );
00046 end component;
00047 
00048 end package;
00049 
00050 
00051 
00052 library ieee;
00053 use ieee.std_logic_1164.all;
00054 use ieee.std_logic_arith.all;
00055 use ieee.std_logic_unsigned.all;
00056 
00057 entity ctrl_freq is
00058         generic(
00059                 SystemFreq      : integer:= 1250;       -- значение системной тактовой частоты
00060                 FreqDiv         : integer:= 2           -- коэффициент деления входной частоты
00061                                                                                 -- ( 2 - на вход подаётся половина измеряемой частоты )
00062         );
00063         
00064         port( 
00065                 reset           : in std_logic;         -- 0 - сброс
00066                 clk_sys         : in std_logic;         -- системная тактовая частота
00067                 clk_in          : in std_logic;         -- входная тактовая частота АЦП
00068                 
00069                 freq_adc        : out std_logic_vector(15 downto 0);    -- ориентировочное значение тактовой частоты АЦП в МГц
00070                 freq_en         : out std_logic         -- 1 - подсчитано значение тактовой частоты
00071                 
00072         );
00073 end ctrl_freq;
00074 
00075 
00076 architecture ctrl_freq of ctrl_freq is
00077 
00078 component ctrl_multiplier_v1_0
00079         port (
00080         clk: IN std_logic;
00081         a: IN std_logic_VECTOR(15 downto 0);
00082         b: IN std_logic_VECTOR(10 downto 0);
00083         p: OUT std_logic_VECTOR(26 downto 0));
00084 end component;  
00085 
00086 constant        Freq                    : integer:=SystemFreq*FreqDiv/2;
00087 
00088 signal cnt_value                        : std_logic_vector(12 downto 0); 
00089 signal cnt_value_adc,cnt_value_adc0             : std_logic_vector(15 downto 0);  
00090 signal freq_sys                         : std_logic_vector(10 downto 0); 
00091 signal result_freq                      : std_logic_vector(26 downto 0);
00092 signal new_cnt_c                        : std_logic_vector(3 downto 0);
00093 signal new_cnt                          : std_logic;    
00094 signal new_cnt_z                        : std_logic;    
00095 signal new_cnt_z1                       : std_logic;    
00096 signal new_cnt_z2                       : std_logic;    
00097 
00098 
00099 begin
00100         
00101 -- определение ориентировочного значения тактовой частоты АЦП в МГц    
00102 
00103 pr_value: process(clk_sys,reset)
00104 begin           
00105         if(reset='0')then                
00106                 new_cnt<='0';
00107                 cnt_value<=(others=>'0');
00108                 new_cnt_c<=(others=>'0');
00109                 freq_adc<=(others=>'0');          
00110                 freq_en <= '0';
00111         elsif(rising_edge(clk_sys))then   
00112                 if(new_cnt='0')then
00113                         cnt_value<=cnt_value+'1';
00114                         new_cnt_c<=(others=>'0');
00115                         
00116                         new_cnt<=cnt_value(12);
00117                 else    
00118                         if( new_cnt_z2='1' ) then
00119                                 new_cnt_c<=new_cnt_c+'1';
00120                         end if;
00121                         
00122                         cnt_value<=(others=>'0');  
00123                         --new_cnt_c<=new_cnt_c+'1';
00124                         new_cnt<= not new_cnt_c(3);     
00125                         
00126                 end if;
00127                 if(new_cnt_c(2)='1')then
00128                         freq_adc(15 downto 0)<= result_freq(26 downto 11)+result_freq(10);
00129                 end if;
00130                 
00131                 freq_en <= new_cnt_c(3) after 1 ns;             
00132         
00133         end if;
00134 end process;    
00135 
00136 new_cnt_z <= new_cnt after 1 ns when rising_edge( clk_in );
00137 new_cnt_z1 <= new_cnt_z after 1 ns when rising_edge( clk_in );
00138 new_cnt_z2 <= new_cnt_z1 after 1 ns when rising_edge( clk_sys );
00139 
00140 pr_value_adc: process(clk_in)
00141 begin           
00142         if(rising_edge(clk_in))then       
00143                 if(new_cnt_z='0' and reset='1')then
00144                         cnt_value_adc<=cnt_value_adc+'1'; 
00145                         cnt_value_adc0<= cnt_value_adc; 
00146                 else    
00147                         cnt_value_adc<=(others=>'0');
00148                 end if;
00149         end if;
00150 end process;  
00151 
00152 
00153 freq_sys<=      conv_std_logic_vector( Freq, 11 );
00154 
00155 
00156 x_mult:ctrl_multiplier_v1_0
00157         port map(
00158         clk=> clk_sys,
00159         a => cnt_value_adc0,
00160         b => freq_sys,
00161         p => result_freq
00162 );  
00163         
00164         
00165         
00166         
00167 end ctrl_freq;