Estoy tratando de 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, el valor debe restablecerse.
mi idea era hacerlo asi
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 recibo un error: descripción sincrónica incorrecta, que no puedo entender.
Reelaboré su código en una descripción sincrónica completa:
Clk
.A
está activo, el contador se pone a cero.B
está activo, se incrementa.led_debug
proceso debe estar cronometrado, así que agregué una condición de borde ascendente.Esta solución no resuelve el siguiente problema, si A
y B
son cables de un botón externo:
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;
Me di cuenta de que estaba verificando en 2 flancos ascendentes dentro del mismo proceso, lo que hacía que el sistema fuera sensible a 2 relojes, lo que le estaba dando una mala sincronía.
mkrieger1
debug
no es del todo necesario.Paebbels