Счетчики на VHDL

Счетчики на VHDL Счетчики на VHDL - один из возможных поисковых запросов. VHDL счетчики присутствуют в любой IDE для ПЛИС в разделе шаблонов. И тем не менее, поскольку все же народ ищет VHDL код счетчиков то вполне можно рассмотреть варианты альтернативные шаблонным. В данном посте попробуем сворганить VHDL делитель, счетчик с запуском и остановом, делитель с бездребезговым переносом.

Начнем с простого делителя, который может поделить частоту так, чтобы сразу получился меандр. Это вполне может пригодиться для формирования частоты бод для USART.


library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity clock is
	generic
	(
		clk_gen     	: integer := 5000000;	-- частота генератора 
		baud_rate 		: integer := 19200;		-- необходимая частота бод
		baud_mul 	    : integer := 16		  	-- множитель частоты бод
	);
	port
	(
		clk 		: in std_logic;			-- вход частоты 
		rst		: in std_logic;			-- внешний сброс		

		clk_out 	: out std_logic			-- выход частоты
	);

end clock;

architecture Behavioral of clock is

	-- начальное состояние счета
	constant min_count : integer := 0;				
	-- определение полупериода частоты бод 
	constant max_count : integer := (((clk_gen / baud_rate)/(2*baud_mul)) - 1);
	-- частота бод
	signal bclk        : std_logic;	

begin

-- если счетчик досчитал до max_count
-- то bclk меняет свое состояние (частота бод)
process(clk,bclk,rst)
	variable   cnt	: integer range min_count to max_count;
begin
	if rst = '1' then 
		bclk <= '0';
		cnt := 0;
	elsif clk'event and clk = '1' then
		if cnt = max_count then
			cnt := 0;
	    if bclk = '1' then bclk <= '0';
			else bclk <= '1';
			end if;
		else
			cnt := cnt + 1;
		end if;
	end if;
	clk_out <= bclk;
end process;

end Behavioral;

Делитель на VHDL

Втрой вариант VHDL счетчика это счетчик с запуском и остановом.


library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity reset is
	generic
	(
		min_count 		: integer := 0		-- начальное состояние счета
	);
	port
	(
		clk : in std_logic;				-- вход частоты 

		rst_out : out std_logic		--  сброс
	);
end reset;

architecture Behavioral of reset is

-- внутренний сброс				
signal rclk        : std_logic := '0';	
-- сигнал блокировки сброса (1 раз после вкл. питания) 				
signal rblock      : std_logic := '0';					

begin

process(clk,rclk)
	variable   rcnt	: integer range min_count to 8;
begin
	if clk'event and clk = '1' then
		if rblock = '0' then
			rcnt := rcnt + 1;
			rclk <= '1';
		end if;	
	  if rcnt = 8 then
			rclk <= '0';
			rblock <= '1';
		end if;
	end if;
	rst_out <= rclk;
end process;

end Behavioral;

Формирователь сброса на VHDL

Третий вариант VHDL счетчика это делитель с бездребезговым переносом.


library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity tinkle is
	Generic
		(
			count_int : integer := 20	
		);
    Port( 	
		clk 			: in  std_logic;
      load 			: in  std_logic;

      rs_out 		: out  std_logic;
      centr_out 	: out  std_logic_vector(7 downto 0)
			);
end tinkle;

architecture Behavioral of tinkle is

	signal rs      : std_logic;					
	signal count 	: std_logic_vector(7 downto 0);

begin

-- счетчик с бездребезговым переносом
process(clk,rs,load,count)
begin
	if load = '1' then 
		count <= (others => '0');
	elsif clk'event and clk = '1' then
		if rs = '0' then
	    	count <= (others => '0');
		else
		   count <= count + 1;
		end if;
		if count = conv_integer(count_int) then
			rs <= '0';
		else
			rs <= '1';
		end if;
	centr_out <= count;
	end if;
	rs_out <= rs;
end process;

end Behavioral;

Делитель с переносом на VHDL

Собственно проект VHDL счетчики под ISE13.1.и литература по VHDL Verilog.

Top.Mail.Ru