Estoy intentando implementar una interfaz de tacómetro que acepte pulsos digitales como entrada. Simplemente cuento clk arcos ascendentes (50Mhz) entre cada borde ascendente de los pulsos de tacómetro (1Mhz). He encontrado ejemplos en la web que logran lo que tengo que hacer, pero en un intento por no cometer los mismos errores en el futuro, me gustaría entender por qué esta solución no funciona.
Cuando digo que no funciona, me refiero a que la simulación funcional posterior a la síntesis no produce los resultados que yo esperaría. La simulación de comportamiento genera los valores que esperaba.
En resumen, la síntesis parece ignorar mi intento de restablecer una variable a 0 (vea el comentario 'esto no parece ejecutarse' a continuación). La salida tacho_count aumenta sin reiniciar. Vea los gráficos de simulación a continuación.
entity tacho_interface is
Generic (
FREQ_DIVISOR : integer := 6;
MIN_RPM : integer := 200
);
Port (
enable : in STD_LOGIC;
clk : in STD_LOGIC;
pump_tacho : in STD_LOGIC;
tacho_count : out STD_LOGIC_VECTOR(31 downto 0);
error: out STD_LOGIC := '0'
);
end tacho_interface;
architecture Behavioral of tacho_interface is
begin
process
variable last_tacho : std_logic := '1';
variable tracking_cntr : integer := 0;
begin
if (clk'event and clk = '1') then
if (pump_tacho = '1' and pump_tacho /= last_tacho) then
tacho_count <= std_logic_vector(to_unsigned(tracking_cntr * FREQ_DIVISOR, tacho_count'length));
wait for 0ns;
tracking_cntr := 0; --this does not execute
end if;
last_tacho := pump_tacho;
tracking_cntr := tracking_cntr + 1;
end if;
wait on clk;
end process;
end Behavioral;
Simulación posterior a la síntesis que ilustra un problema (acumulación sin restablecer a 0)
Simulacióndecomportamientoqueilustraloqueesperaba