Estoy escribiendo un código VHDL de un contador simple que recibe como entrada un número y es un tiempo en ms y un reloj de 50 MHz, por ejemplo, si se reciben 200, debe contar 200 ms, por lo que 200 * 50e3 ciclos, entonces tiene que dar una salida llamada Terminal_count_end que debe permanecer alta hasta que se dé una nueva señal de reinicio (que por cierto está activa cuando '0')
Creé un banco de pruebas para probarlo y descubrí que Terminal_count_end se convierte en 1 pero solo por un período del reloj, luego vuelve a 0 para siempre.
Soy un principiante en VHDL y realmente no sé qué estoy haciendo mal, ¡así que agradezco de antemano a cualquiera que pueda ayudarme con este código!
El código es:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity counter_start is
generic (N : integer := 16);
port (enable,clearn, Clk : in std_logic;
end_time_ms : in unsigned (7 downto 0);
Terminal_count_end : out std_logic);
end counter_start;
architecture behavior of counter_start is
signal count : unsigned (N-1 downto 0);
signal cifra : unsigned (3 downto 0);
signal T_c : std_logic;
signal T_c_end : std_logic;
begin
process(clk,clearn)
begin
if clearn = '0' then
T_c <= '0';
count <= (others => '0');
elsif (Clk'event and clk = '1') then
if T_c = '1' then
T_c <= '0';
count <= (others => '0');
elsif (enable = '1') then
count <= count + 1;
if count = to_unsigned(49999, N) then
T_c <= '1';
end if;
end if;
end if;
end process;
cifra_process: process(clk,clearn)
begin
if clearn = '0' then
cifra <= "0000";
t_c_end <= '0';
elsif clk'event and clk = '1' then
if (T_c = '1') then
cifra <= cifra + 1;
if cifra = end_time_ms-1 then
cifra <= "0000";
T_c_end <= '1';
end if;
end if;
end if;
end process;
terminal_count_end <= T_c_end;
end behavior;