Gerador de Clock utlizando FPGA

Olá Galera!

Vou apresentar um rápido tutorial de como gerar um clock de 0.5Hz e 1Hz proveniente de um clock de entrada de 27MHz utilizando o Kit DE1 da Altera. Esta é uma maneira de gerar frequência, porém existe outras maneiras de gerar frequências como por exemplo, NCO (Numerically Control Oscillator). A figura abaixo mostra o diagrama em blocos do circuito.

Diagrama em Bloco.
Diagrama em Bloco.

O código abaixo está a entidade do projeto onde estamos utilizando o clock de entrada de 27MHz, uma chave SW0 (‘0’=1Hz e ‘1’=0.5Hz) e dez leds para como saída.

-- Entidade
entity GeradorDeClock is
port (
      iCLOCK : in std_logic;       -- Clock de 27MHz
      iSW    : in std_logic;       -- Chave (0 = 1Hz e 1 = 0.5Hz)
      oLEDS  : out std_logic_vector(9 downto 0) -- Leds Vermelho
);

Neste projeto iremos criar 3 sinais internos sendo:

  1. sCount_Pulses : Contador de pulsos de clock de 27MHz;
  2. sSelect : Representa a quantidade de pulsos de 27MHz em 1Hz e 0.5Hz;
  3. sSlow_Clock : Clock de saída de 1Hz ou 0.5Hz.

O código é dividido em 2 processos sendo o primeiro a contagem dos pulsos de 27MHz e para isto foi utilizado a Equação 1 que calcula o valor de “sSelect” como mostra abaixo:

sSelect = ((Freq_in / Freq_out)/2) - 1                     Eq. 1

Logo “sSelect” será:

  • Para 1Hz => sSelect = 13499999
  • Para 0.5Hz => sSelect = 26999999

A seguir o primeiro processo.

-- Processo: Gera Clock
Clock:	process (iCLOCK)
		begin
		if rising_edge (iCLOCK) then

			if (iSW = '0') then
				sSelect <= 13499999;  -- Seleciona Freq = 1Hz
			else
				sSelect <= 26999999;  -- Seleciona Freq = 0.5Hz
			end if;

			if (sCount_Pulses = sSelect) then
				sSlow_Clock <= not (sSlow_Clock);
				sCount_Pulses <= 0;
			else
				sCount_Pulses <= sCount_Pulses + 1;
			end if;
		end if;
	end process;

O seguinte processo será acionar os leds de acordo com com o valor de “sSlow_Clock”.

-- Processo: Liga/Desliga os Leds
Leds:	process (iCLOCK)
		begin
		if rising_edge (iCLOCK) then
			if (sSlow_Clock = '1') then
				oLEDS <= "1111111111";
			else
				oLEDS <= "0000000000";
			end if;
		end if;
	end process;

A seguir está o código completo do projeto:

-- Inclusão de Bibliotecas
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

-- Entidade
entity GeradorDeClock is
port (
	iCLOCK 	: in 	std_logic;						-- Clock de 27MHz
	iSW 	: in 	std_logic;						-- Chave (0 = 1Hz e 1 = 0.5Hz)
	oLEDS 	: out   std_logic_vector(9 downto 0)    -- Leds
);
end GeradorDeClock;

-- Arquitetura
architecture Behavior of GeradorDeClock is
-- Signals
signal sCount_Pulses 	: integer range 0 to 27000000 := 0;	-- Contador de Pulsos de 27MHz
signal sSelect 	  		: integer range 0 to 27000000 := 0;	-- Seleciona o valor máx da contagem de pulsos
signal sSlow_Clock 		: std_logic := '0';					-- Clock de saída
begin
-- Processo: Gera Clock
Clock:	process (iCLOCK)
		begin
		if rising_edge (iCLOCK) then

			if (iSW = '0') then
				sSelect <= 13499999;  -- Seleciona Freq = 1Hz
			else
				sSelect <= 26999999;  -- Seleciona Freq = 0.5Hz
			end if;

			if (sCount_Pulses = sSelect) then
				sSlow_Clock <= not (sSlow_Clock);
				sCount_Pulses <= 0;
			else
				sCount_Pulses <= sCount_Pulses + 1;
			end if;
		end if;
	end process;

-- Processo: Liga/Desliga os Leds
Leds:	process (iCLOCK)
		begin
		if rising_edge (iCLOCK) then
			if (sSlow_Clock = '1') then
				oLEDS <= "1111111111";
			else
				oLEDS <= "0000000000";
			end if;
		end if;
	end process;
end Behavior;

Este projeto é simples mas muito útil para gerar frequências partindo de um clock de entrada que pode ser utilizado em seus projetos.

Até a próxima.

Anúncios

Um comentário sobre “Gerador de Clock utlizando FPGA

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s