Делитель управляемый кодом на VHDL

Делитель управляемый кодомТема счетчиков на VHDL была немного раскрыта на данном ресурсе. В этом посте будет показано как сделать делитель управляемый кодом. В чем суть? Суть в том, что нужно запустить на счет мнгоразрядный счетчик и в момент определяемый кодом обнулить его сформировав перенос равный периоду или даже половине периода тактовой частоты. На базе такого рода счетчика вполне возможно сделать цифровую систему ФАПЧ или просто простейший синтезатор частоты.

В коде на VHDL это выглядит предельно просто:


--------------------------------------------------------------------
-- Project 	: Делитель управляемый кодом
-- Date 		: 29/10/13 
-- File 		: codecounter.vhd
--------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity codecounter is
	Generic
	(
		--размерность счетчиа
		code_width 	: integer := 16
	);
  Port 
  (
		-- входной клок	
		clk 		: in std_logic;
		-- глобальный сброс 
		clr 		: in std_logic;  
		-- код
    code_in 		: in std_logic_vector(code_width - 1 downto 0); 
		-- выход 
    cnt_out 		: out std_logic 
  );
end entity codecounter;

architecture behavioural of codecounter is

	signal s_cnt_out 			: std_logic; 	
	signal s_div 					: std_logic_vector (code_width - 1 downto 0); 	
	
begin

--------------------------------------------------------------------
-- делитель управляемый кодом
--------------------------------------------------------------------
process (clk, clr)
begin
	if clr = '0' then
		s_div <= (others => '0');
		s_cnt_out <= '0';
	elsif clk'event and clk = '1' then
		s_div <= s_div + 1;
		-- сравнение текущего состояния с кодом
		if s_div = code_in - 1 then 
			s_div <= (others => '0');
			-- перенос
			s_cnt_out <= '0';
		else	
			s_cnt_out <= '1';
		end if;
	end if;

end process ;

	-- выход
	cnt_out <= s_cnt_out;

end behavioural;

Диаграмма работы делителя выглядит примерно так:

Синтезатор частоты

Можно делитель выполнить в виде счетчика загружаемого кодом, тогда все будет выглядеть примерно так:


--------------------------------------------------------------------
-- Project 	: Делитель управляемый кодом
-- Date 		: 29/10/13 
-- File 		: codecounter.vhd
--------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity codecounter is
	Generic
	(
		--размерность счетчиа
		code_width 	: integer := 16
	);
  Port 
  (
		-- входной клок	
		clk 		: in std_logic;
		-- глобальный сброс 
		clr 		: in std_logic;  
		-- код
    code_in 		: in std_logic_vector(code_width - 1 downto 0); 
		-- выход 
    cnt_out 		: out std_logic 
  );
end entity codecounter;

architecture behavioural of codecounter is

	signal s_cnt_out 			: std_logic; 	
	signal s_div 					: std_logic_vector (code_width - 1 downto 0); 	
	
begin

--------------------------------------------------------------------
-- делитель управляемый кодом
--------------------------------------------------------------------
process (clk, clr)
begin
	if clr = '0' then
		s_div <= (others => '0');
		s_cnt_out <= '0';
	elsif clk'event and clk = '1' then
		s_div <= s_div - 1;
		-- сравнение текущего состояния с кодом
		if s_div = 0 then 
			s_div <= code_in - 1;
			-- перенос
			s_cnt_out <= '0';
		else	
			s_cnt_out <= '1';
		end if;
	end if;

end process ;

	-- выход
	cnt_out <= s_cnt_out;

end behavioural;

Загружаемый кодом делитель

Для лучшего понимания как все крутится можно опробовать готовый проект делителя для Quartus90. Кому проектик пригодился оставьте свой коммент. Предложения и замечания тоже по ссылке для добавления комментов.

Top.Mail.Ru