FPGA Synchronized Digit Counter se pone asíncrono!

0

Estoy tratando de implementar un contador de un dígito de 0 a 9 utilizando una placa FPGA. El dígito se incrementa cuando se establece la señal "pulso". La señal de "pulso" se establece cada número fijo N de ciclos de reloj. La frecuencia de reloj es de 5 MHz. Sin embargo, el contador salta de manera inconsistente en función del período de "pulso". Por ejemplo, cuando se establece en 1000000, el el contador funciona bien y el dígito se incrementa cada 1/5 de segundo. Cuando el período es diferente, no se comporta como se espera. Incluso si el período es más largo, cada 5000000 ciclos de reloj, salta de 0 a 1 a 0 ... ¡el incremento es de 10!

Aquí está el código VHDL que incrementa el contador según el pulso.

process(clk, reset)
begin
    if (reset = '1') then
        digit_reg <= (others => '0');
    elsif rising_edge(clk) then 
        digit_reg <= next_digit;
    end if;
end process;

process(pulse, digit_reg)
begin
    if (pulse = '1') then
        if (digit_reg >= 9) then 
            next_digit <= (others => '0');
        else 
            next_digit <= digit_reg + 1;
        end if;
    end if;
end process;

¿Alguna idea de cuál podría ser el problema?

Gracias.

    
pregunta Joseph

1 respuesta

-2

Agregue una rama else para corregir la descripción del proceso combinatorio rota:

process(pulse, digit_reg)
begin
    if (pulse = '1') then
        if (digit_reg >= 9) then 
            next_digit <= (others => '0');
        else 
            next_digit <= digit_reg + 1;
        end if;
    else
        next_digit <= digit_reg;
    end if;
end process;

Su implementación no se ajustará a ningún hardware FPGA existente porque usa un reinicio sincrónico y .

Esta es la forma de describir un totalmente contador síncrono módulo 9 con reinicio síncrono y habilitación de reloj ( pulse ):

process(clk)
begin
    if rising_edge(clk) then
        if ((reset = '1') or (digit_reg >= 9)) then
            digit_reg <= (others => '0');
        elsif (pulse = '1') then
            digit_reg <= digit_reg + 1;
        end if;
    end if;
end process;
    
respondido por el Paebbels

Lea otras preguntas en las etiquetas