>> Tecnologia Eletrônica >  >> TVs >> Conversores de TV

Código VHDL para Gerador de Onda Quadrada Parametrizável

Gerador de Onda Quadrada Sintetizável em VHDL

Abaixo está uma implementação limpa e parametrizável usando abordagem baseada em contador. Suporta ajuste de frequência em tempo de execução via porta de entrada e inclui reset síncrono ativo-alto.

library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity square_wave_gen is generic ( CLK_FREQ_HZ : positive := 50_000_000; -- Frequência do clock de entrada CNT_WIDTH : positive := 24 -- Largura do contador em bits (período máximo) ); port ( clk : in std_logic; rst_n : in std_logic; -- Reset síncrono ativo-baixo freq_hz : in positive range 1 to CLK_FREQ_HZ/2; -- Frequência de saída wave_out : out std_logic ); end entity square_wave_gen; architecture rtl of square_wave_gen is constant MAX_CNT : natural := CLK_FREQ_HZ / 2; -- Meio-período máximo a 1 Hz signal half_period : natural range 1 to MAX_CNT; signal ctr : natural range 0 to MAX_CNT; begin -- Cálculo combinacional do meio-período (sintetiza para divisor ou LUT) half_period <= CLK_FREQ_HZ / (2 * freq_hz); process (clk) begin if rising_edge(clk) then if rst_n = '0' then ctr <= 0; wave_out <= '0'; elsif ctr = half_period - 1 then ctr <= 0; wave_out <= not wave_out; else ctr <= ctr + 1; end if; end if; end process; end architecture rtl; 

Notas de Projeto

  • Genéricos: CLK_FREQ_HZ e CNT_WIDTH tornam-no portável entre domínios de clock (ex.: 50 MHz, 100 MHz, 125 MHz).
  • Frequência em Tempo de Execução: Entrada freq_hz permite reconfiguração dinâmica (ex.: via CPU, UART, chaves DIP). Faixa limitada a valores válidos.
  • Reset Ativo-Baixo: rst_n segue convenção comum de FPGA; síncrono para fechamento de tempo.
  • Ciclo de Trabalho 50%: Contador alterna saída em half_period → onda quadrada simétrica.
  • Sem Latches: Totalmente síncrono, processo de clock único.
  • Uso de Recursos: ~1 registrador contador + comparador + somador + 1 FF. Mínimos LUTs/FFs.

Trecho de Testbench

-- Estímulo: clk 50 MHz, gerar 1 kHz → 10 kHz → 100 kHz freq_hz <= 1_000; wait for 5 ms; freq_hz <= 10_000; wait for 5 ms; freq_hz <= 100_000; wait for 5 ms; 

Armadilhas Comuns a Evitar

  • Usar std_logic_vector para frequência sem conversão unsigned.
  • Fixar frequência de clock (use genérico).
  • Reset assíncrono sem tratamento adequado de CDC.
  • Esquecer comparação half_period - 1 (off-by-one → erro de frequência).
  • Não limitar faixa de freq_hz → síntese infere divisor enorme.

Extensões

  • Adicionar genérico/entrada duty_cycle para PWM (contadores alto/baixo separados).
  • Adicionar phase_offset para geração multi-fase.
  • Usar fatia DSP para divisão se CLK_FREQ_HZ grande e faixa dinâmica ampla.