Comportamiento extraño en el diseño de VHDL (valores que aumentan aleatoriamente)

0

Tengo un diseño VHDL bastante simple que se parece a lo siguiente:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity myCode is
    port (
        input_clock : in std_logic;
        do_increment : in std_logic;
        counter_out : out std_logic_vector(4 downto 0)
    );
end myCode;

architecture Behavioral of myCode is

signal internal_counter : unsigned (4 downto 0 ) := (others => '0');
signal do_increment_delay : std_logic := '0';

begin 

counter_out <= std_logic_vector(internal_counter);

process(input_clock)
begin
    if(rising_edge(input_clock)) then
        do_increment_delay <= do_increment;
        if( (do_increment = '1') and (do_increment_delay = '0') ) then
            internal_counter <= 1 + internal_counter;
        end if;
    end if;
end process;
end Behavioral;

El objetivo es incrementar el counter_out en 1 en el flanco ascendente de la señal "aumento_incremento" únicamente.

Cuando veo mi diseño de ejecución en ChipScope (que se ejecuta en Spartan-6 FPGA), veo que el código está haciendo lo que se espera:

Sinembargo,durantelosperíodosdetiempoenquetantodo_incrementcomodo_increment_delaysonbajos,elcontadorcomienzaaaumentarporsísolo:

No hay otra declaración de asignación para counter_out en ninguna parte ... el reloj del chipscopio es el mismo que se usa como input_clock para myCode. He explorado la señal física do_increment en el FPGA y no es ruidoso.

¿Alguna idea?

    
pregunta Michael Kalajian

2 respuestas

3

¿Es do_increment una señal externa? Si es asíncrono a input_clock , entonces debes sincronizar do_increment con tu reloj antes de usarlo en tu lógica.

    
respondido por el amiller856
2

Sospecho que hay ruido en la línea do_increment. La sonda de alcance podría ser suficiente para suprimir el ruido. ¿Se incrementa el contador cuando está viendo la señal de aumento de nivel con el alcance? No se puede confiar en la versión de do_increment del chipscopio porque no proviene de un elemento síncrono sincronizado con el reloj del chipscopio. Como han dicho otros, necesita al menos un registro en el do_increment antes de usarlo en su lógica. Estoy seguro de que hay una advertencia que le dice esto.

    
respondido por el skeptonomicon

Lea otras preguntas en las etiquetas