OpenCores
URL https://opencores.org/ocsvn/pcie_ds_dma/pcie_ds_dma/trunk

Subversion Repositories pcie_ds_dma

[/] [pcie_ds_dma/] [trunk/] [core/] [adm/] [trd_test_ctrl/] [ctrl_freq.vhd] - Rev 2

Compare with Previous | Blame | View Log

-------------------------------------------------------------------------------
--
-- Title       : ctrl_freq
-- Author      : Dmitry Smekhov
-- Company     : Instrumental Systems
-- E-mail      : dsmv@insys.ru
--
-- Version     : 1.1
--
-------------------------------------------------------------------------------
--
-- Description :  Определение значения тактовой частоты
--
-------------------------------------------------------------------------------
--
-- Version   1.1  01.11.2008
--			 Исправлен сигнал new_cnt
--
-------------------------------------------------------------------------------
--
-- Version   1.0  Mon Jun  2 10:00:19 2008
--
-------------------------------------------------------------------------------
 
library ieee;
use ieee.std_logic_1164.all;
 
package	ctrl_freq_pkg is
 
component ctrl_freq is
	generic(
		SystemFreq 	: integer:= 1250;  	-- значение системной тактовой частоты
		FreqDiv		: integer:= 2    	-- коэффициент деления входной частоты
										-- ( 2 - на вход подаётся половина измеряемой частоты )
	);
 
	port( 
		reset		: in std_logic;		-- 0 - сброс
		clk_sys		: in std_logic;		-- системная тактовая частота
		clk_in		: in std_logic;		-- входная тактовая частота АЦП
 
		freq_adc	: out std_logic_vector(15 downto 0);	-- ориентировочное значение тактовой частоты АЦП в МГц
		freq_en		: out std_logic		-- 1 - подсчитано значение тактовой частоты
 
	);
end component;
 
end package;
 
 
 
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
 
entity ctrl_freq is
	generic(
		SystemFreq 	: integer:= 1250;  	-- значение системной тактовой частоты
		FreqDiv		: integer:= 2    	-- коэффициент деления входной частоты
										-- ( 2 - на вход подаётся половина измеряемой частоты )
	);
 
	port( 
		reset		: in std_logic;		-- 0 - сброс
		clk_sys		: in std_logic;		-- системная тактовая частота
		clk_in		: in std_logic;		-- входная тактовая частота АЦП
 
		freq_adc	: out std_logic_vector(15 downto 0);	-- ориентировочное значение тактовой частоты АЦП в МГц
		freq_en		: out std_logic		-- 1 - подсчитано значение тактовой частоты
 
	);
end ctrl_freq;
 
 
architecture ctrl_freq of ctrl_freq is
 
component ctrl_multiplier_v1_0
	port (
	clk: IN std_logic;
	a: IN std_logic_VECTOR(15 downto 0);
	b: IN std_logic_VECTOR(10 downto 0);
	p: OUT std_logic_VECTOR(26 downto 0));
end component;	
 
constant	Freq			: integer:=SystemFreq*FreqDiv/2;
 
signal cnt_value			: std_logic_vector(12 downto 0); 
signal cnt_value_adc,cnt_value_adc0		: std_logic_vector(15 downto 0);  
signal freq_sys				: std_logic_vector(10 downto 0); 
signal result_freq			: std_logic_vector(26 downto 0);
signal new_cnt_c			: std_logic_vector(3 downto 0);
signal new_cnt				: std_logic;	
signal new_cnt_z			: std_logic;	
signal new_cnt_z1			: std_logic;	
signal new_cnt_z2			: std_logic;	
 
 
begin
 
-- определение ориентировочного значения тактовой частоты АЦП в МГц	
 
pr_value: process(clk_sys,reset)
begin		
	if(reset='0')then		 
		new_cnt<='0';
		cnt_value<=(others=>'0');
		new_cnt_c<=(others=>'0');
		freq_adc<=(others=>'0');	  
		freq_en <= '0';
	elsif(rising_edge(clk_sys))then	  
		if(new_cnt='0')then
			cnt_value<=cnt_value+'1';
			new_cnt_c<=(others=>'0');
 
			new_cnt<=cnt_value(12);
		else	
			if( new_cnt_z2='1' ) then
				new_cnt_c<=new_cnt_c+'1';
			end if;
 
			cnt_value<=(others=>'0');  
			--new_cnt_c<=new_cnt_c+'1';
			new_cnt<= not new_cnt_c(3);	
 
		end if;
		if(new_cnt_c(2)='1')then
			freq_adc(15 downto 0)<= result_freq(26 downto 11)+result_freq(10);
		end if;
 
		freq_en <= new_cnt_c(3) after 1 ns;		
 
	end if;
end process;	
 
new_cnt_z <= new_cnt after 1 ns when rising_edge( clk_in );
new_cnt_z1 <= new_cnt_z after 1 ns when rising_edge( clk_in );
new_cnt_z2 <= new_cnt_z1 after 1 ns when rising_edge( clk_sys );
 
pr_value_adc: process(clk_in)
begin		
	if(rising_edge(clk_in))then	  
		if(new_cnt_z='0' and reset='1')then
			cnt_value_adc<=cnt_value_adc+'1'; 
			cnt_value_adc0<= cnt_value_adc;	
		else	
			cnt_value_adc<=(others=>'0');
		end if;
	end if;
end process;  
 
 
freq_sys<=	conv_std_logic_vector( Freq, 11 );
 
 
x_mult:ctrl_multiplier_v1_0
	port map(
	clk=> clk_sys,
	a=> cnt_value_adc0,
	b=> freq_sys,
	p=> result_freq
);  
 
 
 
 
end ctrl_freq;
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.