AMBPEX5_v20_SX50T_CORE
|
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;