Construindo um Temporizador Confiável em VHDL: Contando Ciclos de Clock até Horas
Em tutoriais anteriores, usamos a declaração wait for para atrasar tempo em simulação. No entanto, wait for não pode ser empregado em designs de produção porque um circuito real não pode ser instruído a pausar. A maneira prática de medir tempo em um módulo VHDL é contar ciclos de clock.
Todo design digital tem acesso a um sinal de clock estável que oscila em uma frequência conhecida. Se o clock roda a 100 MHz, um segundo equivale a 100 milhões de ticks de clock. Contando esses ticks, podemos gerar confiavelmente segundos, minutos, horas e além.
Este artigo é parte da série Tutoriais Básicos de VHDL.
Implementamos um contador que incrementa a cada borda de subida do clock. Quando o contador atinge o valor da frequência do clock, um segundo se passou e um contador secundário "Segundos" é incrementado. Uma abordagem similar é usada para minutos (incrementar após 60 segundos) e horas (incrementar após 60 minutos). Contadores adicionais podem ser encadeados para dias, semanas ou meses, limitados apenas por recursos de FPGA/ASIC e largura do contador requerida.
Embora contadores mais longos consumam mais recursos lógicos, eles também aumentam o atraso de propagação. O caminho crítico através da cadeia de contadores deve caber dentro do período do clock, caso contrário a síntese falhará.
Exercício: Implementando o Temporizador
O seguinte testbench VHDL demonstra um clock simples de 10 Hz para manter o tempo de simulação razoável. O DUT é um temporizador que saída sinais Seconds, Minutes e Hours.
library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity T18_TimerTb is end entity; architecture sim of T18_TimerTb is -- Clock lento para simulação rápida constant ClockFrequencyHz : integer := 10; -- 10 Hz constant ClockPeriod : time := 1000 ms / ClockFrequencyHz; signal Clk : std_logic := '1'; signal nRst : std_logic := '0'; signal Seconds : integer; signal Minutes : integer; signal Hours : integer; begin -- Device Under Test (DUT) i_Timer : entity work.T18_Timer(rtl) generic map(ClockFrequencyHz => ClockFrequencyHz) port map ( Clk => Clk, nRst => nRst, Seconds => Seconds, Minutes => Minutes, Hours => Hours); -- Gerador de clock Clk <= not Clk after ClockPeriod / 2; -- Sequência do testbench process is begin wait until rising_edge(Clk); wait until rising_edge(Clk); -- Liberar reset nRst <= '1'; wait; end process; end architecture; Abaixo está o módulo temporizador em si. Ele conta ticks, segundos, minutos e horas, resetando todos os contadores quando o reset negativo (nRst) é asserido.
library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity T18_Timer is generic(ClockFrequencyHz : integer); port( Clk : in std_logic; nRst : in std_logic; -- Reset negativo Seconds : inout integer; Minutes : inout integer; Hours : inout integer); end entity; architecture rtl of T18_Timer is -- Contar períodos de clock signal Ticks : integer; begin process(Clk) is begin if rising_edge(Clk) then if nRst = '0' then Ticks <= 0; Seconds <= 0; Minutes <= 0; Hours <= 0; else if Ticks = ClockFrequencyHz - 1 then Ticks <= 0; if Seconds = 59 then Seconds <= 0; if Minutes = 59 then Minutes <= 0; if Hours = 23 then Hours <= 0; else Hours <= Hours + 1; end if; else Minutes <= Minutes + 1; end if; else Seconds <= Seconds + 1; end if; else Ticks <= Ticks + 1; end if; end if; end process; end architecture; Formas de onda confirmam a operação correta: Seconds incrementa a cada tick, Minutes após 60 segundos, e Hours após 60 minutos.
Na simulação, rodamos um teste de 50 horas com run 50 hr no ModelSim, usando um clock de 10 Hz para manter o tempo de execução gerenciável. Ajustar a frequência do clock no testbench é uma estratégia comum para acelerar a verificação.
Em hardware real, a cadeia de contadores deve terminar dentro de um período de clock. À medida que a largura do contador cresce, o atraso de propagação aumenta, potencialmente excedendo o período e causando violações de tempo. O limite exato depende da família FPGA/ASIC e da velocidade do clock.
Principais Conclusões
- Medição de tempo em VHDL é alcançada contando ciclos de clock.
- Reduzir a frequência do clock do testbench acelera a simulação sem alterar o design.
Prossiga para o próximo tutorial para recursos avançados de temporizador.
VHDL
- Criando Listas de Strings em VHDL: Boas Práticas e Exemplo
- Criando um Testbench Dirigido por Tcl para um Módulo Code-Lock VHDL
- Finalizando Graciosamente uma Simulação de Testbench VHDL
- Implementando um Controlador PWM em VHDL: Projeto, Simulação e Demo em FPGA
- Gerando Números Aleatórios em VHDL: De Uniforme a OSVVM
- Projetando um FIFO Ring Buffer Robusto em VHDL com Block RAM
- Como Construir um Testbench de Auto-Verificação em VHDL – Guia Prático
- Implementando Lista Encadeada Dinâmica em VHDL com Tipos Protegidos e Ponteiros de Acesso
- Aproveitando Procedimentos In-Process para Design de FSM em VHDL Mais Limpo
- Dominando Funções VHDL: Guia Prático para Design Eficiente