Descripción sincrónica incorrecta - programa vhdl simple

2

Intento hacer un programa VHDL simple que consiste en incrementar un std_logic_vector en uno cada vez que se presiona el botón A. Cuando se presiona el botón B, se debe restablecer el valor.

Mi idea era hacerlo de esta manera

entity simple is
    Port ( A : in std_logic;
           B : in std_logic;
           CLK : in std_logic;
           debug : out std_logic_vector (7 downto 0));
end simple;

architecture Behavioral of simple is
    signal state: std_logic_vector(7 downto 0) := "00000000";
begin

   increment: process(state, A, B)
    begin
        if (B'event and B = '1') then 
            state <= "00000000";
        end if;
        if (A'event andA = '1') then 
            state <= std_logic_vector(unsigned(state)+1);
         end if;
    end process;


    led_debug: process(CLK)
    begin
        debug <= state;
    end process;    

end Behavioral;

El problema es que estoy recibiendo un error: mala descripción síncrona, que no puedo entender.

    
pregunta Carlton Banks

2 respuestas

0

Me di cuenta de que estaba verificando 2 flancos ascendentes dentro del mismo proceso, lo que hizo que el sistema fuera sensible a 2 relojes, lo que le daba una mala sincronización.

    
respondido por el Carlton Banks
1

Reelaboré tu código en una descripción síncrona completa:

  1. Los diseños síncronos necesitan una señal de reloj, pero una señal de botón no es reloj. Por lo tanto, cada proceso se desencadena en un borde positivo de Clk .
  2. Cambié el tipo de estado para evitar algunas conversiones de tipo.
  3. Si A está activo, entonces el contador se restablece a cero.
  4. De lo contrario, si B está activo, se incrementa.
  5. Supongo que su proceso led_debug debería estar sincronizado, por lo que agregué una condición de aumento de cobertura.

Esta solución no resuelve el siguiente problema, si A y B son cables desde un botón externo:

  • Las señales externas deben sincronizarse con al menos 2 FF, para evitar problemas de metastabilidad.
  • Los botones externos en su mayoría necesitan un circuito de rebote, porque las entradas de los botones rebotan. También hay soluciones eléctricas o mecánicas posibles para resolver el problema. Eche un vistazo a las descripciones y esquemas del tablero.
  • En la mayoría de los casos, usted quiere contar las pulsaciones de los botones. Su solución actual mide cuánto tiempo ha presionado el botón (esto también necesita un contador más grande). Este problema se puede resolver con un circuito de detección de bordes.

Aquí está el código reescrito:

entity simple is
  Port (
    CLK : in std_logic;
    A : in std_logic;
    B : in std_logic;
    debug : out std_logic_vector (7 downto 0)
  );
end entity;

architecture rtl of simple is
  signal state : unsigned(7 downto 0) := (others => '0');

begin
  increment : process(Clk)
  begin
    if rising_edge(Clk) then
      if (B = '1') then 
        state <= "00000000";
      elsif (A = '1') then 
        state <= state + 1;
      end if;
    end if;
  end process;

  led_debug : process(CLK)
  begin
    if rising_edge(Clk) then
      debug <= std_logic_vector(state);
    end if;
  end process;    
end architecture;
    
respondido por el Paebbels

Lea otras preguntas en las etiquetas